From ad6d31ce81183b855906df0756aa25974d4ffaf8 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Tue, 2 Feb 2021 03:09:40 +0100 Subject: [PATCH 001/619] Bullseye: Misc updates in control file --- debian/control | 27 +++++++++++++-------------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/debian/control b/debian/control index ef5061fe7..63853b161 100644 --- a/debian/control +++ b/debian/control @@ -2,7 +2,7 @@ Source: yunohost Section: utils Priority: extra Maintainer: YunoHost Contributors -Build-Depends: debhelper (>=9), dh-systemd, dh-python, python3-all (>= 3.7), python3-yaml, python3-jinja2 +Build-Depends: debhelper (>=9), dh-python, python3-all (>= 3.7), python3-yaml, python3-jinja2 Standards-Version: 3.9.6 Homepage: https://yunohost.org/ @@ -13,10 +13,10 @@ Depends: ${python3:Depends}, ${misc:Depends} , moulinette (>= 4.2), ssowat (>= 4.0) , python3-psutil, python3-requests, python3-dnspython, python3-openssl , python3-miniupnpc, python3-dbus, python3-jinja2 - , python3-toml, python3-packaging, python3-publicsuffix + , python3-toml, python3-packaging, python3-publicsuffix2 , apt, apt-transport-https, apt-utils, dirmngr - , php7.3-common, php7.3-fpm, php7.3-ldap, php7.3-intl - , mariadb-server, php7.3-mysql + , php7.4-common, php7.4-fpm, php7.4-ldap, php7.4-intl + , mariadb-server, php7.4-mysql , openssh-server, iptables, fail2ban, dnsutils, bind9utils , openssl, ca-certificates, netcat-openbsd, iproute2 , slapd, ldap-utils, sudo-ldap, libnss-ldapd, unscd, libpam-ldapd @@ -25,28 +25,27 @@ Depends: ${python3:Depends}, ${misc:Depends} , dovecot-core, dovecot-ldap, dovecot-lmtpd, dovecot-managesieved, dovecot-antispam , rspamd, opendkim-tools, postsrsd, procmail, mailutils , redis-server - , metronome (>=3.14.0) , acl , git, curl, wget, cron, unzip, jq, bc, at , lsb-release, haveged, fake-hwclock, equivs, lsof, whois Recommends: yunohost-admin , ntp, inetutils-ping | iputils-ping , bash-completion, rsyslog - , php7.3-gd, php7.3-curl, php-gettext + , php7.4-gd, php7.4-curl, php-gettext , python3-pip , unattended-upgrades , libdbd-ldap-perl, libnet-dns-perl -Suggests: htop, vim, rsync, acpi-support-base, udisks2 + , metronome (>=3.14.0) Conflicts: iptables-persistent , apache2 , bind9 - , nginx-extras (>= 1.16) - , openssl (>= 1.1.1g) - , slapd (>= 2.4.49) - , dovecot-core (>= 1:2.3.7) - , redis-server (>= 5:5.0.7) - , fail2ban (>= 0.11) - , iptables (>= 1.8.3) + , nginx-extras (>= 1.19) + , openssl (>= 1.1.1i-3) + , slapd (>= 2.4.58) + , dovecot-core (>= 1:2.3.14) + , redis-server (>= 5:6.0.10) + , fail2ban (>= 0.11.3) + , iptables (>= 1.8.8) Description: manageable and configured self-hosting server YunoHost aims to make self-hosting accessible to everyone. It configures an email, Web and IM server alongside a LDAP base. It also provides From 876ce488378d96dd4d146c24f133b5a1bbb5aecd Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Fri, 5 Feb 2021 00:05:00 +0100 Subject: [PATCH 002/619] Update changelog for 11.0 --- debian/changelog | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/debian/changelog b/debian/changelog index 9a143f962..15af50303 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,9 @@ +yunohost (11.0.0~alpha) unstable; urgency=low + + - Placeholder for 11.0 + + -- Alexandre Aubin Fri, 05 Feb 2021 00:02:38 +0100 + yunohost (4.2.5.2) stable; urgency=low - Fix install in chroot ... *again* (806b7acf) From 726f4605d2a6f787a6d38cdbb63f4f810071afa1 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Fri, 5 Feb 2021 02:09:59 +0100 Subject: [PATCH 003/619] Bullseye: idk what i'm doing but let's try to bump compat to 13 --- debian/compat | 1 - debian/control | 2 +- debian/rules | 18 +++--------------- 3 files changed, 4 insertions(+), 17 deletions(-) delete mode 100644 debian/compat diff --git a/debian/compat b/debian/compat deleted file mode 100644 index ec635144f..000000000 --- a/debian/compat +++ /dev/null @@ -1 +0,0 @@ -9 diff --git a/debian/control b/debian/control index 63853b161..4216f400c 100644 --- a/debian/control +++ b/debian/control @@ -2,7 +2,7 @@ Source: yunohost Section: utils Priority: extra Maintainer: YunoHost Contributors -Build-Depends: debhelper (>=9), dh-python, python3-all (>= 3.7), python3-yaml, python3-jinja2 +Build-Depends: debhelper (>=9), debhelper-compat (= 13), dh-python, python3-all (>= 3.7), python3-yaml, python3-jinja2 Standards-Version: 3.9.6 Homepage: https://yunohost.org/ diff --git a/debian/rules b/debian/rules index 3790c0ef2..341ba2b01 100755 --- a/debian/rules +++ b/debian/rules @@ -1,11 +1,8 @@ #!/usr/bin/make -f # -*- makefile -*- -# Uncomment this to turn on verbose mode. -#export DH_VERBOSE=1 - %: - dh ${@} --with=python3,systemd + dh ${@} --with python3 override_dh_auto_build: # Generate bash completion file @@ -13,14 +10,5 @@ override_dh_auto_build: python3 doc/generate_manpages.py --gzip --output doc/yunohost.8.gz override_dh_installinit: - dh_installinit -pyunohost --name=yunohost-api --restart-after-upgrade - dh_installinit -pyunohost --name=yunohost-firewall --noscripts - -override_dh_systemd_enable: - dh_systemd_enable --name=yunohost-api \ - yunohost-api.service - dh_systemd_enable --name=yunohost-firewall --no-enable \ - yunohost-firewall.service - -#override_dh_systemd_start: -# dh_systemd_start --restart-after-upgrade yunohost-api.service + dh_installsystemd -pyunohost --name=yunohost-api --restart-after-upgrade + dh_installsystemd -pyunohost --name=yunohost-firewall --noscripts From 70174af9746d0f83b8d9396bc1b31c22bb93c28a Mon Sep 17 00:00:00 2001 From: Kayou Date: Mon, 8 Mar 2021 19:29:26 +0100 Subject: [PATCH 004/619] bump conflict --- debian/control | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/debian/control b/debian/control index 4216f400c..08daecbbe 100644 --- a/debian/control +++ b/debian/control @@ -40,7 +40,7 @@ Conflicts: iptables-persistent , apache2 , bind9 , nginx-extras (>= 1.19) - , openssl (>= 1.1.1i-3) + , openssl (>= 1.1.1j-2) , slapd (>= 2.4.58) , dovecot-core (>= 1:2.3.14) , redis-server (>= 5:6.0.10) From ffea5e40486229204d4a143fef73b064da74300a Mon Sep 17 00:00:00 2001 From: Kayou Date: Tue, 9 Mar 2021 14:26:03 +0100 Subject: [PATCH 005/619] php-gettext -> php-php-gettext --- debian/control | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/debian/control b/debian/control index 08daecbbe..e557c9ff6 100644 --- a/debian/control +++ b/debian/control @@ -31,7 +31,7 @@ Depends: ${python3:Depends}, ${misc:Depends} Recommends: yunohost-admin , ntp, inetutils-ping | iputils-ping , bash-completion, rsyslog - , php7.4-gd, php7.4-curl, php-gettext + , php7.4-gd, php7.4-curl, php-php-gettext , python3-pip , unattended-upgrades , libdbd-ldap-perl, libnet-dns-perl From 065966759072a11bd58580c49d5a348cf57e82c5 Mon Sep 17 00:00:00 2001 From: Kayou Date: Tue, 9 Mar 2021 14:48:54 +0100 Subject: [PATCH 006/619] Update the conflict version of redis-server --- debian/control | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/debian/control b/debian/control index e557c9ff6..e78718d66 100644 --- a/debian/control +++ b/debian/control @@ -43,7 +43,7 @@ Conflicts: iptables-persistent , openssl (>= 1.1.1j-2) , slapd (>= 2.4.58) , dovecot-core (>= 1:2.3.14) - , redis-server (>= 5:6.0.10) + , redis-server (>= 5:6.0.12) , fail2ban (>= 0.11.3) , iptables (>= 1.8.8) Description: manageable and configured self-hosting server From 1f284d74c4b4960d196e3048954bba9ea0b79e39 Mon Sep 17 00:00:00 2001 From: Kay0u Date: Tue, 9 Mar 2021 18:10:30 +0100 Subject: [PATCH 007/619] php 7.3 -> 7.4 --- data/helpers.d/php | 2 +- data/hooks/conf_regen/10-apt | 4 ++-- data/templates/yunohost/services.yml | 6 ++--- locales/ca.json | 2 +- locales/en.json | 2 +- locales/fr.json | 2 +- locales/it.json | 2 +- src/yunohost/app.py | 33 +++++++++++++++------------- src/yunohost/backup.py | 2 +- 9 files changed, 29 insertions(+), 26 deletions(-) diff --git a/data/helpers.d/php b/data/helpers.d/php index 40a023e9d..bf12cd4d6 100644 --- a/data/helpers.d/php +++ b/data/helpers.d/php @@ -1,6 +1,6 @@ #!/bin/bash -readonly YNH_DEFAULT_PHP_VERSION=7.3 +readonly YNH_DEFAULT_PHP_VERSION=7.4 # Declare the actual PHP version to use. # A packager willing to use another version of PHP can override the variable into its _common.sh. YNH_PHP_VERSION=${YNH_PHP_VERSION:-$YNH_DEFAULT_PHP_VERSION} diff --git a/data/hooks/conf_regen/10-apt b/data/hooks/conf_regen/10-apt index bb5caf67f..c7d1f0174 100755 --- a/data/hooks/conf_regen/10-apt +++ b/data/hooks/conf_regen/10-apt @@ -53,8 +53,8 @@ Pin-Priority: -1 do_post_regen() { regen_conf_files=$1 - # Make sure php7.3 is the default version when using php in cli - update-alternatives --set php /usr/bin/php7.3 + # Make sure php7.4 is the default version when using php in cli + update-alternatives --set php /usr/bin/php7.4 } FORCE=${2:-0} diff --git a/data/templates/yunohost/services.yml b/data/templates/yunohost/services.yml index 7df563c67..b6ce7c117 100644 --- a/data/templates/yunohost/services.yml +++ b/data/templates/yunohost/services.yml @@ -22,9 +22,9 @@ nginx: test_conf: nginx -t needs_exposed_ports: [80, 443] category: web -php7.3-fpm: - log: /var/log/php7.3-fpm.log - test_conf: php-fpm7.3 --test +php7.4-fpm: + log: /var/log/php7.4-fpm.log + test_conf: php-fpm7.4 --test category: web postfix: log: [/var/log/mail.log,/var/log/mail.err] diff --git a/locales/ca.json b/locales/ca.json index 189053d94..0f0b60426 100644 --- a/locales/ca.json +++ b/locales/ca.json @@ -572,7 +572,7 @@ "migration_description_0015_migrate_to_buster": "Actualitza els sistema a Debian Buster i YunoHost 4.x", "regenconf_need_to_explicitly_specify_ssh": "La configuració ssh ha estat modificada manualment, però heu d'especificar explícitament la categoria «ssh» amb --force per fer realment els canvis.", "migration_0015_weak_certs": "S'han trobat els següents certificats que encara utilitzen algoritmes de signatura febles i s'han d'actualitzar per a ser compatibles amb la propera versió de nginx: {certs}", - "service_description_php7.3-fpm": "Executa aplicacions escrites en PHP amb NGINX", + "service_description_php7.4-fpm": "Executa aplicacions escrites en PHP amb NGINX", "migration_0018_failed_to_reset_legacy_rules": "No s'ha pogut restaurar les regles legacy iptables: {error}", "migration_0018_failed_to_migrate_iptables_rules": "No s'ha pogut migrar les regles legacy iptables a nftables: {error}", "migration_0017_not_enough_space": "Feu suficient espai disponible en {path} per a realitzar la migració.", diff --git a/locales/en.json b/locales/en.json index 84a01dfaa..813688a87 100644 --- a/locales/en.json +++ b/locales/en.json @@ -562,7 +562,7 @@ "service_description_metronome": "Manage XMPP instant messaging accounts", "service_description_mysql": "Stores app data (SQL database)", "service_description_nginx": "Serves or provides access to all the websites hosted on your server", - "service_description_php7.3-fpm": "Runs apps written in PHP with NGINX", + "service_description_php7.4-fpm": "Runs apps written in PHP with NGINX", "service_description_postfix": "Used to send and receive e-mails", "service_description_redis-server": "A specialized database used for rapid data access, task queue, and communication between programs", "service_description_rspamd": "Filters spam, and other e-mail related features", diff --git a/locales/fr.json b/locales/fr.json index 715d82a35..130f91129 100644 --- a/locales/fr.json +++ b/locales/fr.json @@ -574,7 +574,7 @@ "migration_0015_weak_certs": "Il a été constaté que les certificats suivants utilisent encore des algorithmes de signature peu robustes et doivent être mis à jour pour être compatibles avec la prochaine version de NGINX : {certs}", "global_settings_setting_backup_compress_tar_archives": "Compresser les archives (.tar.gz) au lieu des archives non-compressées lors de la création des backups. N.B. : activer cette option permet d'obtenir des sauvegardes plus légères, mais leur création sera significativement plus longue et plus gourmande en CPU.", "migration_description_0018_xtable_to_nftable": "Migrer les anciennes règles de trafic réseau vers le nouveau système basé sur nftables", - "service_description_php7.3-fpm": "Exécute les applications écrites en PHP avec NGINX", + "service_description_php7.4-fpm": "Exécute les applications écrites en PHP avec NGINX", "migration_0018_failed_to_reset_legacy_rules": "La réinitialisation des règles iptable par défaut a échoué : {error}", "migration_0018_failed_to_migrate_iptables_rules": "Échec de la migration des anciennes règles iptables vers nftables : {error}", "migration_0017_not_enough_space": "Laissez suffisamment d'espace disponible dans {path} avant de lancer la migration.", diff --git a/locales/it.json b/locales/it.json index 6b15dd900..d160997df 100644 --- a/locales/it.json +++ b/locales/it.json @@ -424,7 +424,7 @@ "service_description_rspamd": "Filtra SPAM, e altre funzionalità legate alle mail", "service_description_redis-server": "Un database specializzato usato per un veloce accesso ai dati, task queue, e comunicazioni tra programmi", "service_description_postfix": "Usato per inviare e ricevere email", - "service_description_php7.3-fpm": "Esegue app scritte in PHP con NGINX", + "service_description_php7.4-fpm": "Esegue app scritte in PHP con NGINX", "service_description_nginx": "Serve o permette l'accesso a tutti i siti pubblicati sul tuo server", "service_description_mysql": "Memorizza i dati delle app (database SQL)", "service_description_metronome": "Gestisce gli account di messaggistica instantanea XMPP", diff --git a/src/yunohost/app.py b/src/yunohost/app.py index 5f001c12a..62a339315 100644 --- a/src/yunohost/app.py +++ b/src/yunohost/app.py @@ -3410,10 +3410,10 @@ def _assert_system_is_sane_for_app(manifest, when): services = manifest.get("services", []) - # Some apps use php-fpm or php5-fpm which is now php7.0-fpm + # Some apps use php-fpm, php5-fpm or php7.x-fpm which is now php7.4-fpm def replace_alias(service): - if service in ["php-fpm", "php5-fpm", "php7.0-fpm"]: - return "php7.3-fpm" + if service in ["php-fpm", "php5-fpm", "php7.0-fpm", "php7.3-fpm"]: + return "php7.4-fpm" else: return service @@ -3422,7 +3422,7 @@ def _assert_system_is_sane_for_app(manifest, when): # We only check those, mostly to ignore "custom" services # (added by apps) and because those are the most popular # services - service_filter = ["nginx", "php7.3-fpm", "mysql", "postfix"] + service_filter = ["nginx", "php7.4-fpm", "mysql", "postfix"] services = [str(s) for s in services if s in service_filter] if "nginx" not in services: @@ -3465,19 +3465,22 @@ def _assert_system_is_sane_for_app(manifest, when): LEGACY_PHP_VERSION_REPLACEMENTS = [ - ("/etc/php5", "/etc/php/7.3"), - ("/etc/php/7.0", "/etc/php/7.3"), - ("/var/run/php5-fpm", "/var/run/php/php7.3-fpm"), - ("/var/run/php/php7.0-fpm", "/var/run/php/php7.3-fpm"), - ("php5", "php7.3"), - ("php7.0", "php7.3"), + ("/etc/php5", "/etc/php/7.4"), + ("/etc/php/7.0", "/etc/php/7.4"), + ("/etc/php/7.3", "/etc/php/7.4"), + ("/var/run/php5-fpm", "/var/run/php/php7.4-fpm"), + ("/var/run/php/php7.0-fpm", "/var/run/php/php7.4-fpm"), + ("/var/run/php/php7.3-fpm", "/var/run/php/php7.4-fpm"), + ("php5", "php7.4"), + ("php7.0", "php7.4"), + ("php7.3", "php7.4"), ( 'phpversion="${phpversion:-7.0}"', - 'phpversion="${phpversion:-7.3}"', + 'phpversion="${phpversion:-7.4}"', ), # Many helpers like the composer ones use 7.0 by default ... ( '"$phpversion" == "7.0"', - '$(bc <<< "$phpversion >= 7.3") -eq 1', + '$(bc <<< "$phpversion >= 7.4") -eq 1', ), # patch ynh_install_php to refuse installing/removing php <= 7.3 ] @@ -3514,11 +3517,11 @@ def _patch_legacy_php_versions_in_settings(app_folder): settings = read_yaml(os.path.join(app_folder, "settings.yml")) if settings.get("fpm_config_dir") == "/etc/php/7.0/fpm": - settings["fpm_config_dir"] = "/etc/php/7.3/fpm" + settings["fpm_config_dir"] = "/etc/php/7.4/fpm" if settings.get("fpm_service") == "php7.0-fpm": - settings["fpm_service"] = "php7.3-fpm" + settings["fpm_service"] = "php7.4-fpm" if settings.get("phpversion") == "7.0": - settings["phpversion"] = "7.3" + settings["phpversion"] = "7.4" # We delete these checksums otherwise the file will appear as manually modified list_to_remove = ["checksum__etc_php_7.0_fpm_pool", "checksum__etc_nginx_conf.d"] diff --git a/src/yunohost/backup.py b/src/yunohost/backup.py index 3978e835d..862c07690 100644 --- a/src/yunohost/backup.py +++ b/src/yunohost/backup.py @@ -1183,7 +1183,7 @@ class RestoreManager: def _patch_legacy_php_versions_in_csv_file(self): """ - Apply dirty patch to redirect php5 and php7.0 files to php7.3 + Apply dirty patch to redirect php5 and php7.0 files to php7.4 """ backup_csv = os.path.join(self.work_dir, "backup.csv") From c70420438aa21d7dd13b7b98d6bc0029939f425a Mon Sep 17 00:00:00 2001 From: Kay0u Date: Tue, 9 Mar 2021 18:10:55 +0100 Subject: [PATCH 008/619] add python-is-python3 dependency --- debian/control | 1 + 1 file changed, 1 insertion(+) diff --git a/debian/control b/debian/control index e78718d66..21485b114 100644 --- a/debian/control +++ b/debian/control @@ -14,6 +14,7 @@ Depends: ${python3:Depends}, ${misc:Depends} , python3-psutil, python3-requests, python3-dnspython, python3-openssl , python3-miniupnpc, python3-dbus, python3-jinja2 , python3-toml, python3-packaging, python3-publicsuffix2 + , python-is-python3 , apt, apt-transport-https, apt-utils, dirmngr , php7.4-common, php7.4-fpm, php7.4-ldap, php7.4-intl , mariadb-server, php7.4-mysql From a27a4c26df9b273089f5a9fc0e7499f135015599 Mon Sep 17 00:00:00 2001 From: Kay0u Date: Tue, 9 Mar 2021 18:39:57 +0100 Subject: [PATCH 009/619] yaml load -> safe_load --- data/actionsmap/yunohost_completion.py | 2 +- data/helpers.d/setting | 4 ++-- data/hooks/conf_regen/01-yunohost | 4 ++-- src/yunohost/app.py | 4 ++-- src/yunohost/firewall.py | 2 +- src/yunohost/regenconf.py | 2 +- src/yunohost/service.py | 2 +- tests/test_actionmap.py | 2 +- tests/test_i18n_keys.py | 2 +- 9 files changed, 12 insertions(+), 12 deletions(-) diff --git a/data/actionsmap/yunohost_completion.py b/data/actionsmap/yunohost_completion.py index bc32028d3..3891aee9c 100644 --- a/data/actionsmap/yunohost_completion.py +++ b/data/actionsmap/yunohost_completion.py @@ -32,7 +32,7 @@ def get_dict_actions(OPTION_SUBTREE, category): with open(ACTIONSMAP_FILE, "r") as stream: # Getting the dictionary containning what actions are possible per category - OPTION_TREE = yaml.load(stream) + OPTION_TREE = yaml.safe_load(stream) CATEGORY = [ category for category in OPTION_TREE.keys() if not category.startswith("_") diff --git a/data/helpers.d/setting b/data/helpers.d/setting index 2950b3829..66bce9717 100644 --- a/data/helpers.d/setting +++ b/data/helpers.d/setting @@ -86,7 +86,7 @@ key, value = os.environ['KEY'], os.environ.get('VALUE', None) setting_file = "/etc/yunohost/apps/%s/settings.yml" % app assert os.path.exists(setting_file), "Setting file %s does not exists ?" % setting_file with open(setting_file) as f: - settings = yaml.load(f) + settings = yaml.safe_load(f) if action == "get": if key in settings: print(settings[key]) @@ -96,7 +96,7 @@ else: del settings[key] elif action == "set": if key in ['redirected_urls', 'redirected_regex']: - value = yaml.load(value) + value = yaml.safe_load(value) settings[key] = value else: raise ValueError("action should either be get, set or delete") diff --git a/data/hooks/conf_regen/01-yunohost b/data/hooks/conf_regen/01-yunohost index 3d65d34cd..9196e3de9 100755 --- a/data/hooks/conf_regen/01-yunohost +++ b/data/hooks/conf_regen/01-yunohost @@ -202,10 +202,10 @@ import yaml with open('services.yml') as f: - new_services = yaml.load(f) + new_services = yaml.safe_load(f) with open('/etc/yunohost/services.yml') as f: - services = yaml.load(f) or {} + services = yaml.safe_load(f) or {} updated = False diff --git a/src/yunohost/app.py b/src/yunohost/app.py index 62a339315..f405641c4 100644 --- a/src/yunohost/app.py +++ b/src/yunohost/app.py @@ -1510,7 +1510,7 @@ def app_setting(app, key, value=None, delete=False): # SET else: if key in ["redirected_urls", "redirected_regex"]: - value = yaml.load(value) + value = yaml.safe_load(value) app_settings[key] = value _set_app_settings(app, app_settings) @@ -2167,7 +2167,7 @@ def _get_app_settings(app_id): ) try: with open(os.path.join(APPS_SETTING_PATH, app_id, "settings.yml")) as f: - settings = yaml.load(f) + settings = yaml.safe_load(f) # If label contains unicode char, this may later trigger issues when building strings... # FIXME: this should be propagated to read_yaml so that this fix applies everywhere I think... settings = {k: v for k, v in settings.items()} diff --git a/src/yunohost/firewall.py b/src/yunohost/firewall.py index b800cd42c..a153689a6 100644 --- a/src/yunohost/firewall.py +++ b/src/yunohost/firewall.py @@ -179,7 +179,7 @@ def firewall_list(raw=False, by_ip_version=False, list_forwarded=False): """ with open(FIREWALL_FILE) as f: - firewall = yaml.load(f) + firewall = yaml.safe_load(f) if raw: return firewall diff --git a/src/yunohost/regenconf.py b/src/yunohost/regenconf.py index 924818e44..0608bcf8c 100644 --- a/src/yunohost/regenconf.py +++ b/src/yunohost/regenconf.py @@ -444,7 +444,7 @@ def _get_regenconf_infos(): """ try: with open(REGEN_CONF_FILE, "r") as f: - return yaml.load(f) + return yaml.safe_load(f) except Exception: return {} diff --git a/src/yunohost/service.py b/src/yunohost/service.py index e6e960a57..912662600 100644 --- a/src/yunohost/service.py +++ b/src/yunohost/service.py @@ -670,7 +670,7 @@ def _get_services(): """ try: with open("/etc/yunohost/services.yml", "r") as f: - services = yaml.load(f) or {} + services = yaml.safe_load(f) or {} except Exception: return {} diff --git a/tests/test_actionmap.py b/tests/test_actionmap.py index bf6755979..0b8abb152 100644 --- a/tests/test_actionmap.py +++ b/tests/test_actionmap.py @@ -2,4 +2,4 @@ import yaml def test_yaml_syntax(): - yaml.load(open("data/actionsmap/yunohost.yml")) + yaml.safe_load(open("data/actionsmap/yunohost.yml")) diff --git a/tests/test_i18n_keys.py b/tests/test_i18n_keys.py index 2ad56a34e..7b5ad1956 100644 --- a/tests/test_i18n_keys.py +++ b/tests/test_i18n_keys.py @@ -108,7 +108,7 @@ def find_expected_string_keys(): yield m # Keys for the actionmap ... - for category in yaml.load(open("data/actionsmap/yunohost.yml")).values(): + for category in yaml.safe_load(open("data/actionsmap/yunohost.yml")).values(): if "actions" not in category.keys(): continue for action in category["actions"].values(): From b7703c32a1e8b7b4c649ad2d7017a249923bbc9f Mon Sep 17 00:00:00 2001 From: Kay0u Date: Tue, 9 Mar 2021 18:52:24 +0100 Subject: [PATCH 010/619] publicsuffix -> publicsuffix2 --- data/hooks/diagnosis/12-dnsrecords.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/hooks/diagnosis/12-dnsrecords.py b/data/hooks/diagnosis/12-dnsrecords.py index 719ce4d6a..795ca1621 100644 --- a/data/hooks/diagnosis/12-dnsrecords.py +++ b/data/hooks/diagnosis/12-dnsrecords.py @@ -4,7 +4,7 @@ import os import re from datetime import datetime, timedelta -from publicsuffix import PublicSuffixList +from publicsuffix2 import PublicSuffixList from moulinette.utils.process import check_output From 8aae99472090a0cdddedf6785e463c6858576c70 Mon Sep 17 00:00:00 2001 From: Kay0u Date: Wed, 10 Mar 2021 11:24:11 +0100 Subject: [PATCH 011/619] dirty patch to wait for services to finish reloading --- src/yunohost/app.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/yunohost/app.py b/src/yunohost/app.py index f405641c4..4e2cd5317 100644 --- a/src/yunohost/app.py +++ b/src/yunohost/app.py @@ -3432,6 +3432,7 @@ def _assert_system_is_sane_for_app(manifest, when): # Wait if a service is reloading test_nb = 0 + while test_nb < 16: if not any(s for s in services if service_status(s)["status"] == "reloading"): break From 7ff1ce5432d7fb64d04a77e7b1bbadfa5401dfac Mon Sep 17 00:00:00 2001 From: Kay0u Date: Wed, 10 Mar 2021 11:30:28 +0100 Subject: [PATCH 012/619] change python version in tests from 3.7 to 3.9 --- .gitlab/ci/lint.gitlab-ci.yml | 13 ++++++------- tox.ini | 14 +++++++------- 2 files changed, 13 insertions(+), 14 deletions(-) diff --git a/.gitlab/ci/lint.gitlab-ci.yml b/.gitlab/ci/lint.gitlab-ci.yml index 9c48bd912..03861eca1 100644 --- a/.gitlab/ci/lint.gitlab-ci.yml +++ b/.gitlab/ci/lint.gitlab-ci.yml @@ -3,21 +3,20 @@ ######################################## # later we must fix lint and format-check jobs and remove "allow_failure" ---- -lint37: +lint39: stage: lint image: "before-install" needs: [] allow_failure: true script: - - tox -e py37-lint + - tox -e py39-lint -invalidcode37: +invalidcode39: stage: lint image: "before-install" needs: [] script: - - tox -e py37-invalidcode + - tox -e py39-invalidcode format-check: stage: lint @@ -25,7 +24,7 @@ format-check: allow_failure: true needs: [] script: - - tox -e py37-black-check + - tox -e py39-black-check format-run: stage: lint @@ -40,7 +39,7 @@ format-run: script: # create a local branch that will overwrite distant one - git checkout -b "ci-format-${CI_COMMIT_REF_NAME}" --no-track - - tox -e py37-black-run + - tox -e py39-black-run - '[ $(git diff | wc -l) != 0 ] || exit 0' # stop if there is nothing to commit - git commit -am "[CI] Format code" || true - git push -f origin "ci-format-${CI_COMMIT_REF_NAME}":"ci-format-${CI_COMMIT_REF_NAME}" diff --git a/tox.ini b/tox.ini index c25d8bf8f..0af648d63 100644 --- a/tox.ini +++ b/tox.ini @@ -1,13 +1,13 @@ [tox] -envlist = py37-{lint,invalidcode},py37-black-{run,check} +envlist = py39-{lint,invalidcode},py39-black-{run,check} [testenv] skip_install=True deps = - py37-{lint,invalidcode}: flake8 - py37-black-{run,check}: black + py39-{lint,invalidcode}: flake8 + py39-black-{run,check}: black commands = - py37-lint: flake8 src doc data tests --ignore E402,E501,E203,W503 --exclude src/yunohost/vendor - py37-invalidcode: flake8 src data --exclude src/yunohost/tests,src/yunohost/vendor --select F - py37-black-check: black --check --diff src doc data tests - py37-black-run: black src doc data tests + py39-lint: flake8 src doc data tests --ignore E402,E501,E203,W503 --exclude src/yunohost/vendor + py39-invalidcode: flake8 src data --exclude src/yunohost/tests,src/yunohost/vendor --select F + py39-black-check: black --check --diff src doc data tests + py39-black-run: black src doc data tests From 3fa96fc91b4d288a474ff8c60f167bda8020e959 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Fri, 28 May 2021 01:32:33 +0200 Subject: [PATCH 013/619] Naive attempt to fix test by adding an apt update --- .gitlab/ci/build.gitlab-ci.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitlab/ci/build.gitlab-ci.yml b/.gitlab/ci/build.gitlab-ci.yml index 717a5ee73..82def4eb3 100644 --- a/.gitlab/ci/build.gitlab-ci.yml +++ b/.gitlab/ci/build.gitlab-ci.yml @@ -5,6 +5,7 @@ YNH_SOURCE: "https://github.com/yunohost" before_script: - mkdir -p $YNH_BUILD_DIR + - DEBIAN_FRONTEND=noninteractive apt update artifacts: paths: - $YNH_BUILD_DIR/*.deb From 1051dbb3cc839604d05d1e904488129addf1571d Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Fri, 28 May 2021 02:17:40 +0200 Subject: [PATCH 014/619] Misc legacy cleanup --- data/actionsmap/yunohost.yml | 95 ------ data/helpers.d/backup | 13 - data/helpers.d/utils | 52 ---- data/hooks/conf_regen/01-yunohost | 12 - data/hooks/conf_regen/03-ssh | 8 - data/hooks/conf_regen/06-slapd | 5 - data/hooks/conf_regen/15-nginx | 14 - data/hooks/conf_regen/34-mysql | 23 -- src/yunohost/app.py | 144 +-------- .../data_migrations/0015_migrate_to_buster.py | 291 ------------------ .../0016_php70_to_php73_pools.py | 83 ----- .../0017_postgresql_9p6_to_11.py | 82 ----- .../data_migrations/0018_xtable_to_nftable.py | 126 -------- .../0019_extend_permissions_features.py | 107 ------- .../0020_ssh_sftp_permissions.py | 100 ------ src/yunohost/dyndns.py | 12 - src/yunohost/service.py | 36 --- src/yunohost/tools.py | 33 +- src/yunohost/user.py | 7 - src/yunohost/utils/legacy.py | 239 -------------- 20 files changed, 10 insertions(+), 1472 deletions(-) delete mode 100644 src/yunohost/data_migrations/0015_migrate_to_buster.py delete mode 100644 src/yunohost/data_migrations/0016_php70_to_php73_pools.py delete mode 100644 src/yunohost/data_migrations/0017_postgresql_9p6_to_11.py delete mode 100644 src/yunohost/data_migrations/0018_xtable_to_nftable.py delete mode 100644 src/yunohost/data_migrations/0019_extend_permissions_features.py delete mode 100644 src/yunohost/data_migrations/0020_ssh_sftp_permissions.py delete mode 100644 src/yunohost/utils/legacy.py diff --git a/data/actionsmap/yunohost.yml b/data/actionsmap/yunohost.yml index 5df1c0877..0631a20c9 100644 --- a/data/actionsmap/yunohost.yml +++ b/data/actionsmap/yunohost.yml @@ -97,9 +97,6 @@ user: pattern: &pattern_lastname - !!str ^([^\W\d_]{1,30}[ ,.'-]{0,3})+$ - "pattern_lastname" - -m: - full: --mail - help: (Deprecated, see --domain) Main unique email address -p: full: --password help: User password @@ -596,9 +593,6 @@ app: app: help: Name, local path or git URL of the app to fetch the manifest of - fetchlist: - deprecated: true - ### app_list() list: action_help: List installed apps @@ -770,36 +764,6 @@ app: new_label: help: New app label - ### app_addaccess() TODO: Write help - addaccess: - action_help: Grant access right to users (everyone by default) - deprecated: true - arguments: - apps: - nargs: "+" - -u: - full: --users - nargs: "*" - - ### app_removeaccess() TODO: Write help - removeaccess: - action_help: Revoke access right to users (everyone by default) - deprecated: true - arguments: - apps: - nargs: "+" - -u: - full: --users - nargs: "*" - - ### app_clearaccess() - clearaccess: - action_help: Reset access rights for the app - deprecated: true - arguments: - apps: - nargs: "+" - subcategories: action: @@ -1023,13 +987,6 @@ service: full: --log help: Absolute path to log file to display nargs: "+" - -t: - full: --log_type - help: Type of the log (file or systemd) - nargs: "+" - choices: - - file - - systemd --test_status: help: Specify a custom bash command to check the status of the service. Note that it only makes sense to specify this if the corresponding systemd service does not return the proper information already. --test_conf: @@ -1043,9 +1000,6 @@ service: full: --need_lock help: Use this option to prevent deadlocks if the service does invoke yunohost commands. action: store_true - -s: - full: --status - help: Deprecated, old option. Does nothing anymore. Possibly check the --test_status option. ### service_remove() remove: @@ -1147,35 +1101,6 @@ service: default: 50 type: int - ### service_regen_conf() - regen-conf: - action_help: Regenerate the configuration file(s) for a service - deprecated_alias: - - regenconf - arguments: - names: - help: Services name to regenerate configuration of - nargs: "*" - metavar: NAME - -d: - full: --with-diff - help: Show differences in case of configuration changes - action: store_true - -f: - full: --force - help: > - Override all manual modifications in configuration - files - action: store_true - -n: - full: --dry-run - help: Show what would have been regenerated - action: store_true - -p: - full: --list-pending - help: List pending configuration files and exit - action: store_true - ############################# # Firewall # ############################# @@ -1351,14 +1276,6 @@ dyndns: full: --ipv6 help: IPv6 address to send - ### dyndns_installcron() - installcron: - deprecated: true - - ### dyndns_removecron() - removecron: - deprecated: true - ############################# # Tools # @@ -1438,12 +1355,6 @@ tools: nargs: "?" metavar: TARGET default: all - --apps: - help: (Deprecated, see first positional arg) Fetch the application list to check which apps can be upgraded - action: store_true - --system: - help: (Deprecated, see first positional arg) Fetch available system packages upgrades (equivalent to apt update) - action: store_true ### tools_upgrade() upgrade: @@ -1456,12 +1367,6 @@ tools: - apps - system nargs: "?" - --apps: - help: (Deprecated, see first positional arg) Upgrade all applications - action: store_true - --system: - help: (Deprecated, see first positional arg) Upgrade only the system packages - action: store_true ### tools_shell() shell: diff --git a/data/helpers.d/backup b/data/helpers.d/backup index 17da0fb2e..156f12dfb 100644 --- a/data/helpers.d/backup +++ b/data/helpers.d/backup @@ -9,7 +9,6 @@ CAN_BIND=${CAN_BIND:-1} # | arg: -d, --dest_path= - destination file or directory inside the backup dir # | arg: -b, --is_big - Indicate data are big (mail, video, image ...) # | arg: -m, --not_mandatory - Indicate that if the file is missing, the backup can ignore it. -# | arg: arg - Deprecated arg # # This helper can be used both in a system backup hook, and in an app backup script # @@ -303,18 +302,6 @@ ynh_restore_file () { fi } -# Deprecated helper since it's a dangerous one! -# -# [internal] -# -ynh_bind_or_cp() { - local AS_ROOT=${3:-0} - local NO_ROOT=0 - [[ "${AS_ROOT}" = "1" ]] || NO_ROOT=1 - ynh_print_warn --message="This helper is deprecated, you should use ynh_backup instead" - ynh_backup "$1" "$2" 1 -} - # Calculate and store a file checksum into the app settings # # usage: ynh_store_file_checksum --file=file diff --git a/data/helpers.d/utils b/data/helpers.d/utils index 00bec89ac..3b2f49abf 100644 --- a/data/helpers.d/utils +++ b/data/helpers.d/utils @@ -503,26 +503,6 @@ ynh_get_debian_release () { echo $(lsb_release --codename --short) } -# Create a directory under /tmp -# -# [internal] -# -# Deprecated helper -# -# usage: ynh_mkdir_tmp -# | ret: the created directory path -ynh_mkdir_tmp() { - ynh_print_warn --message="The helper ynh_mkdir_tmp is deprecated." - ynh_print_warn --message="You should use 'mktemp -d' instead and manage permissions \ -properly with chmod/chown." - local TMP_DIR=$(mktemp --directory) - - # Give rights to other users could be a security risk. - # But for retrocompatibility we need it. (This helpers is deprecated) - chmod 755 $TMP_DIR - echo $TMP_DIR -} - # Remove a file or a directory securely # # usage: ynh_secure_remove --file=path_to_remove @@ -565,38 +545,6 @@ ynh_secure_remove () { fi } -# Extract a key from a plain command output -# -# [internal] -# -# (Deprecated, use --output-as json and jq instead) -ynh_get_plain_key() { - local prefix="#" - local founded=0 - # We call this key_ so that it's not caught as - # an info to be redacted by the core - local key_=$1 - shift - while read line - do - if [[ "$founded" == "1" ]] - then - [[ "$line" =~ ^${prefix}[^#] ]] && return - echo $line - elif [[ "$line" =~ ^${prefix}${key_}$ ]] - then - if [[ -n "${1:-}" ]] - then - prefix+="#" - key_=$1 - shift - else - founded=1 - fi - fi - done -} - # Read the value of a key in a ynh manifest file # # usage: ynh_read_manifest --manifest="manifest.json" --key="key" diff --git a/data/hooks/conf_regen/01-yunohost b/data/hooks/conf_regen/01-yunohost index 9196e3de9..2c9df2a64 100755 --- a/data/hooks/conf_regen/01-yunohost +++ b/data/hooks/conf_regen/01-yunohost @@ -113,11 +113,6 @@ SHELL=/bin/bash EOF fi - # legacy stuff to avoid yunohost reporting etckeeper as manually modified - # (this make sure that the hash is null / file is flagged as to-delete) - mkdir -p $pending_dir/etc/etckeeper - touch $pending_dir/etc/etckeeper/etckeeper.conf - # Skip ntp if inside a container (inspired from the conf of systemd-timesyncd) mkdir -p ${pending_dir}/etc/systemd/system/ntp.service.d/ echo " @@ -242,13 +237,6 @@ for service, conf in new_services.items(): if conffiles: services[service]['conffiles'] = conffiles - # Remove legacy /var/log/daemon.log and /var/log/syslog from log entries - # because they are too general. Instead, now the journalctl log is - # returned by default which is more relevant. - if "log" in services[service]: - if services[service]["log"] in ["/var/log/syslog", "/var/log/daemon.log"]: - del services[service]["log"] - if updated: with open('/etc/yunohost/services.yml-new', 'w') as f: yaml.safe_dump(services, f, default_flow_style=False) diff --git a/data/hooks/conf_regen/03-ssh b/data/hooks/conf_regen/03-ssh index d0c4bd31c..6b0445fd0 100755 --- a/data/hooks/conf_regen/03-ssh +++ b/data/hooks/conf_regen/03-ssh @@ -7,10 +7,6 @@ set -e do_pre_regen() { pending_dir=$1 - # If the (legacy) 'from_script' flag is here, - # we won't touch anything in the ssh config. - [[ ! -f /etc/yunohost/from_script ]] || return 0 - cd /usr/share/yunohost/templates/ssh # do not listen to IPv6 if unavailable @@ -34,10 +30,6 @@ do_pre_regen() { do_post_regen() { regen_conf_files=$1 - # If the (legacy) 'from_script' flag is here, - # we won't touch anything in the ssh config. - [[ ! -f /etc/yunohost/from_script ]] || return 0 - # If no file changed, there's nothing to do [[ -n "$regen_conf_files" ]] || return 0 diff --git a/data/hooks/conf_regen/06-slapd b/data/hooks/conf_regen/06-slapd index 3fa3a0fd2..06f89cec5 100755 --- a/data/hooks/conf_regen/06-slapd +++ b/data/hooks/conf_regen/06-slapd @@ -110,11 +110,6 @@ do_pre_regen() { schema_dir="${ldap_dir}/schema" mkdir -p "$ldap_dir" "$schema_dir" - # remove legacy configuration file - [ ! -f /etc/ldap/slapd-yuno.conf ] || touch "${ldap_dir}/slapd-yuno.conf" - [ ! -f /etc/ldap/slapd.conf ] || touch "${ldap_dir}/slapd.conf" - [ ! -f /etc/ldap/schema/yunohost.schema ] || touch "${schema_dir}/yunohost.schema" - cd /usr/share/yunohost/templates/slapd # copy configuration files diff --git a/data/hooks/conf_regen/15-nginx b/data/hooks/conf_regen/15-nginx index 8875693c6..64af48257 100755 --- a/data/hooks/conf_regen/15-nginx +++ b/data/hooks/conf_regen/15-nginx @@ -119,20 +119,6 @@ do_post_regen() { mkdir -p "/etc/nginx/conf.d/${domain}.d" done - # Get rid of legacy lets encrypt snippets - for domain in $YNH_DOMAINS; do - # If the legacy letsencrypt / acme-challenge domain-specific snippet is still there - if [ -e /etc/nginx/conf.d/${domain}.d/000-acmechallenge.conf ] - then - # And if we're effectively including the new domain-independant snippet now - if grep -q "include /etc/nginx/conf.d/acme-challenge.conf.inc;" /etc/nginx/conf.d/${domain}.conf - then - # Delete the old domain-specific snippet - rm /etc/nginx/conf.d/${domain}.d/000-acmechallenge.conf - fi - fi - done - # Reload nginx if conf looks good, otherwise display error and exit unhappy nginx -t 2>/dev/null || { nginx -t; exit 1; } pgrep nginx && systemctl reload nginx || { journalctl --no-pager --lines=10 -u nginx >&2; exit 1; } diff --git a/data/hooks/conf_regen/34-mysql b/data/hooks/conf_regen/34-mysql index d5180949e..136207cc8 100755 --- a/data/hooks/conf_regen/34-mysql +++ b/data/hooks/conf_regen/34-mysql @@ -30,29 +30,6 @@ do_post_regen() { echo "" | mysql && echo "Can't connect to mysql using unix_socket auth ... something went wrong during initial configuration of mysql !?" >&2 fi - # Legacy code to get rid of /etc/yunohost/mysql ... - # Nowadays, we can simply run mysql while being run as root of unix_socket/auth_socket is enabled... - if [ -f /etc/yunohost/mysql ]; then - - # This is a trick to check if we're able to use mysql without password - # Expect instances installed in stretch to already have unix_socket - #configured, but not old instances from the jessie/wheezy era - if ! echo "" | mysql 2>/dev/null - then - password="$(cat /etc/yunohost/mysql)" - # Enable plugin unix_socket for root on localhost - mysql -u root -p"$password" <<< "GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED WITH unix_socket WITH GRANT OPTION;" - fi - - # If now we're able to login without password, drop the mysql password - if echo "" | mysql 2>/dev/null - then - rm /etc/yunohost/mysql - else - echo "Can't connect to mysql using unix_socket auth ... something went wrong while trying to get rid of mysql password !?" >&2 - fi - fi - # mysql is supposed to be an alias to mariadb... but in some weird case is not # c.f. https://forum.yunohost.org/t/mysql-ne-fonctionne-pas/11661 # Playing with enable/disable allows to recreate the proper symlinks. diff --git a/src/yunohost/app.py b/src/yunohost/app.py index 4e2cd5317..0a0b73668 100644 --- a/src/yunohost/app.py +++ b/src/yunohost/app.py @@ -137,40 +137,13 @@ def app_search(string): return catalog_of_apps -# Old legacy function... -def app_fetchlist(): - logger.warning( - "'yunohost app fetchlist' is deprecated. Please use 'yunohost tools update --apps' instead" - ) - from yunohost.tools import tools_update - - tools_update(target="apps") - - -def app_list(full=False, installed=False, filter=None): +def app_list(full=False): """ List installed apps """ - # Old legacy argument ... app_list was a combination of app_list and - # app_catalog before 3.8 ... - if installed: - logger.warning( - "Argument --installed ain't needed anymore when using 'yunohost app list'. It directly returns the list of installed apps.." - ) - - # Filter is a deprecated option... - if filter: - logger.warning( - "Using -f $appname in 'yunohost app list' is deprecated. Just use 'yunohost app list | grep -q 'id: $appname' to check a specific app is installed" - ) - out = [] for app_id in sorted(_installed_apps()): - - if filter and not app_id.startswith(filter): - continue - try: app_info_dict = app_info(app_id, full=full) except Exception as e: @@ -1258,64 +1231,6 @@ def app_remove(operation_logger, app): _assert_system_is_sane_for_app(manifest, "post") -def app_addaccess(apps, users=[]): - """ - Grant access right to users (everyone by default) - - Keyword argument: - users - apps - - """ - from yunohost.permission import user_permission_update - - output = {} - for app in apps: - permission = user_permission_update( - app + ".main", add=users, remove="all_users" - ) - output[app] = permission["corresponding_users"] - - return {"allowed_users": output} - - -def app_removeaccess(apps, users=[]): - """ - Revoke access right to users (everyone by default) - - Keyword argument: - users - apps - - """ - from yunohost.permission import user_permission_update - - output = {} - for app in apps: - permission = user_permission_update(app + ".main", remove=users) - output[app] = permission["corresponding_users"] - - return {"allowed_users": output} - - -def app_clearaccess(apps): - """ - Reset access rights for the app - - Keyword argument: - apps - - """ - from yunohost.permission import user_permission_reset - - output = {} - for app in apps: - permission = user_permission_reset(app + ".main") - output[app] = permission["corresponding_users"] - - return {"allowed_users": output} - - @is_unit_operation() def app_makedefault(operation_logger, app, domain=None): """ @@ -1643,10 +1558,6 @@ def app_ssowatconf(): write_to_json("/etc/ssowat/conf.json", conf_dict, sort_keys=True, indent=4) - from .utils.legacy import translate_legacy_rules_in_ssowant_conf_json_persistent - - translate_legacy_rules_in_ssowant_conf_json_persistent() - logger.debug(m18n.n("ssowat_conf_generated")) @@ -3542,36 +3453,10 @@ def _patch_legacy_helpers(app_folder): files_to_patch.extend(glob.glob("%s/scripts/.*" % app_folder)) stuff_to_replace = { - # Replace - # sudo yunohost app initdb $db_user -p $db_pwd - # by - # ynh_mysql_setup_db --db_user=$db_user --db_name=$db_user --db_pwd=$db_pwd - "yunohost app initdb": { - "pattern": r"(sudo )?yunohost app initdb \"?(\$\{?\w+\}?)\"?\s+-p\s\"?(\$\{?\w+\}?)\"?", - "replace": r"ynh_mysql_setup_db --db_user=\2 --db_name=\2 --db_pwd=\3", - "important": True, - }, - # Replace - # sudo yunohost app checkport whaterver - # by - # ynh_port_available whatever - "yunohost app checkport": { - "pattern": r"(sudo )?yunohost app checkport", - "replace": r"ynh_port_available", - "important": True, - }, - # We can't migrate easily port-available - # .. but at the time of writing this code, only two non-working apps are using it. + "yunohost app initdb": {"important": True}, + "yunohost app checkport": {"important": True}, "yunohost tools port-available": {"important": True}, - # Replace - # yunohost app checkurl "${domain}${path_url}" -a "${app}" - # by - # ynh_webpath_register --app=${app} --domain=${domain} --path_url=${path_url} - "yunohost app checkurl": { - "pattern": r"(sudo )?yunohost app checkurl \"?(\$\{?\w+\}?)\/?(\$\{?\w+\}?)\"?\s+-a\s\"?(\$\{?\w+\}?)\"?", - "replace": r"ynh_webpath_register --app=\4 --domain=\2 --path_url=\3", - "important": True, - }, + "yunohost app checkurl": {"important": True}, # Remove # Automatic diagnosis data from YunoHost # __PRE_TAG1__$(yunohost tools diagnosis | ...)__PRE_TAG2__" @@ -3582,26 +3467,11 @@ def _patch_legacy_helpers(app_folder): "important": False, }, # Old $1, $2 in backup/restore scripts... - "app=$2": { - "only_for": ["scripts/backup", "scripts/restore"], - "pattern": r"app=\$2", - "replace": r"app=$YNH_APP_INSTANCE_NAME", - "important": True, - }, + "app=$2": {"only_for": ["scripts/backup", "scripts/restore"], "important": True}, # Old $1, $2 in backup/restore scripts... - "backup_dir=$1": { - "only_for": ["scripts/backup", "scripts/restore"], - "pattern": r"backup_dir=\$1", - "replace": r"backup_dir=.", - "important": True, - }, + "backup_dir=$1": {"only_for": ["scripts/backup", "scripts/restore"], "important": True}, # Old $1, $2 in backup/restore scripts... - "restore_dir=$1": { - "only_for": ["scripts/restore"], - "pattern": r"restore_dir=\$1", - "replace": r"restore_dir=.", - "important": True, - }, + "restore_dir=$1": {"only_for": ["scripts/restore"], "important": True}, # Old $1, $2 in install scripts... # We ain't patching that shit because it ain't trivial to patch all args... "domain=$1": {"only_for": ["scripts/install"], "important": True}, diff --git a/src/yunohost/data_migrations/0015_migrate_to_buster.py b/src/yunohost/data_migrations/0015_migrate_to_buster.py deleted file mode 100644 index 4f2d4caf8..000000000 --- a/src/yunohost/data_migrations/0015_migrate_to_buster.py +++ /dev/null @@ -1,291 +0,0 @@ -import glob -import os - -from moulinette import m18n -from yunohost.utils.error import YunohostError -from moulinette.utils.log import getActionLogger -from moulinette.utils.process import check_output, call_async_output -from moulinette.utils.filesystem import read_file - -from yunohost.tools import Migration, tools_update, tools_upgrade -from yunohost.app import unstable_apps -from yunohost.regenconf import manually_modified_files -from yunohost.utils.filesystem import free_space_in_directory -from yunohost.utils.packages import ( - get_ynh_package_version, - _list_upgradable_apt_packages, -) - -logger = getActionLogger("yunohost.migration") - - -class MyMigration(Migration): - - "Upgrade the system to Debian Buster and Yunohost 4.x" - - mode = "manual" - - def run(self): - - self.check_assertions() - - logger.info(m18n.n("migration_0015_start")) - - # - # Make sure certificates do not use weak signature hash algorithms (md5, sha1) - # otherwise nginx will later refuse to start which result in - # catastrophic situation - # - self.validate_and_upgrade_cert_if_necessary() - - # - # Patch sources.list - # - logger.info(m18n.n("migration_0015_patching_sources_list")) - self.patch_apt_sources_list() - tools_update(target="system") - - # Tell libc6 it's okay to restart system stuff during the upgrade - os.system( - "echo 'libc6 libraries/restart-without-asking boolean true' | debconf-set-selections" - ) - - # Don't send an email to root about the postgresql migration. It should be handled automatically after. - os.system( - "echo 'postgresql-common postgresql-common/obsolete-major seen true' | debconf-set-selections" - ) - - # - # Specific packages upgrades - # - logger.info(m18n.n("migration_0015_specific_upgrade")) - - # Update unscd independently, was 0.53-1+yunohost on stretch (custom build of ours) but now it's 0.53-1+b1 on vanilla buster, - # which for apt appears as a lower version (hence the --allow-downgrades and the hardcoded version number) - unscd_version = check_output( - 'dpkg -s unscd | grep "^Version: " | cut -d " " -f 2' - ) - if "yunohost" in unscd_version: - new_version = check_output( - "LC_ALL=C apt policy unscd 2>/dev/null | grep -v '\\*\\*\\*' | grep http -B1 | head -n 1 | awk '{print $1}'" - ).strip() - if new_version: - self.apt_install("unscd=%s --allow-downgrades" % new_version) - else: - logger.warning("Could not identify which version of unscd to install") - - # Upgrade libpam-modules independently, small issue related to willing to overwrite a file previously provided by Yunohost - libpammodules_version = check_output( - 'dpkg -s libpam-modules | grep "^Version: " | cut -d " " -f 2' - ) - if not libpammodules_version.startswith("1.3"): - self.apt_install('libpam-modules -o Dpkg::Options::="--force-overwrite"') - - # - # Main upgrade - # - logger.info(m18n.n("migration_0015_main_upgrade")) - - apps_packages = self.get_apps_equivs_packages() - self.hold(apps_packages) - tools_upgrade(target="system", allow_yunohost_upgrade=False) - - if self.debian_major_version() == 9: - raise YunohostError("migration_0015_still_on_stretch_after_main_upgrade") - - # Clean the mess - logger.info(m18n.n("migration_0015_cleaning_up")) - os.system("apt autoremove --assume-yes") - os.system("apt clean --assume-yes") - - # - # Yunohost upgrade - # - logger.info(m18n.n("migration_0015_yunohost_upgrade")) - self.unhold(apps_packages) - tools_upgrade(target="system") - - def debian_major_version(self): - # The python module "platform" and lsb_release are not reliable because - # on some setup, they may still return Release=9 even after upgrading to - # buster ... (Apparently this is related to OVH overriding some stuff - # with /etc/lsb-release for instance -_-) - # Instead, we rely on /etc/os-release which should be the raw info from - # the distribution... - return int( - check_output( - "grep VERSION_ID /etc/os-release | head -n 1 | tr '\"' ' ' | cut -d ' ' -f2" - ) - ) - - def yunohost_major_version(self): - return int(get_ynh_package_version("yunohost")["version"].split(".")[0]) - - def check_assertions(self): - - # Be on stretch (9.x) and yunohost 3.x - # NB : we do both check to cover situations where the upgrade crashed - # in the middle and debian version could be > 9.x but yunohost package - # would still be in 3.x... - if ( - not self.debian_major_version() == 9 - and not self.yunohost_major_version() == 3 - ): - raise YunohostError("migration_0015_not_stretch") - - # Have > 1 Go free space on /var/ ? - if free_space_in_directory("/var/") / (1024 ** 3) < 1.0: - raise YunohostError("migration_0015_not_enough_free_space") - - # Check system is up to date - # (but we don't if 'stretch' is already in the sources.list ... - # which means maybe a previous upgrade crashed and we're re-running it) - if " buster " not in read_file("/etc/apt/sources.list"): - tools_update(target="system") - upgradable_system_packages = list(_list_upgradable_apt_packages()) - if upgradable_system_packages: - raise YunohostError("migration_0015_system_not_fully_up_to_date") - - @property - def disclaimer(self): - - # Avoid having a super long disclaimer + uncessary check if we ain't - # on stretch / yunohost 3.x anymore - # NB : we do both check to cover situations where the upgrade crashed - # in the middle and debian version could be >= 10.x but yunohost package - # would still be in 3.x... - if ( - not self.debian_major_version() == 9 - and not self.yunohost_major_version() == 3 - ): - return None - - # Get list of problematic apps ? I.e. not official or community+working - problematic_apps = unstable_apps() - problematic_apps = "".join(["\n - " + app for app in problematic_apps]) - - # Manually modified files ? (c.f. yunohost service regen-conf) - modified_files = manually_modified_files() - modified_files = "".join(["\n - " + f for f in modified_files]) - - message = m18n.n("migration_0015_general_warning") - - message = ( - "N.B.: This migration has been tested by the community over the last few months but has only been declared stable recently. If your server hosts critical services and if you are not too confident with debugging possible issues, we recommend you to wait a little bit more while we gather more feedback and polish things up. If on the other hand you are relatively confident with debugging small issues that may arise, you are encouraged to run this migration ;)! You can read about remaining known issues and feedback from the community here: https://forum.yunohost.org/t/12195\n\n" - + message - ) - - if problematic_apps: - message += "\n\n" + m18n.n( - "migration_0015_problematic_apps_warning", - problematic_apps=problematic_apps, - ) - - if modified_files: - message += "\n\n" + m18n.n( - "migration_0015_modified_files", manually_modified_files=modified_files - ) - - return message - - def patch_apt_sources_list(self): - - sources_list = glob.glob("/etc/apt/sources.list.d/*.list") - sources_list.append("/etc/apt/sources.list") - - # This : - # - replace single 'stretch' occurence by 'buster' - # - comments lines containing "backports" - # - replace 'stretch/updates' by 'strech/updates' (or same with -) - for f in sources_list: - command = ( - "sed -i -e 's@ stretch @ buster @g' " - "-e '/backports/ s@^#*@#@' " - "-e 's@ stretch/updates @ buster/updates @g' " - "-e 's@ stretch-@ buster-@g' " - "{}".format(f) - ) - os.system(command) - - def get_apps_equivs_packages(self): - - command = ( - "dpkg --get-selections" - " | grep -v deinstall" - " | awk '{print $1}'" - " | { grep 'ynh-deps$' || true; }" - ) - - output = check_output(command) - - return output.split("\n") if output else [] - - def hold(self, packages): - for package in packages: - os.system("apt-mark hold {}".format(package)) - - def unhold(self, packages): - for package in packages: - os.system("apt-mark unhold {}".format(package)) - - def apt_install(self, cmd): - def is_relevant(line): - return "Reading database ..." not in line.rstrip() - - callbacks = ( - lambda l: logger.info("+ " + l.rstrip() + "\r") - if is_relevant(l) - else logger.debug(l.rstrip() + "\r"), - lambda l: logger.warning(l.rstrip()), - ) - - cmd = ( - "LC_ALL=C DEBIAN_FRONTEND=noninteractive APT_LISTCHANGES_FRONTEND=none apt install --quiet -o=Dpkg::Use-Pty=0 --fix-broken --assume-yes " - + cmd - ) - - logger.debug("Running: %s" % cmd) - - call_async_output(cmd, callbacks, shell=True) - - def validate_and_upgrade_cert_if_necessary(self): - - active_certs = set( - check_output("grep -roh '/.*crt.pem' /etc/nginx/").split("\n") - ) - - cmd = "LC_ALL=C openssl x509 -in %s -text -noout | grep -i 'Signature Algorithm:' | awk '{print $3}' | uniq" - - default_crt = "/etc/yunohost/certs/yunohost.org/crt.pem" - default_key = "/etc/yunohost/certs/yunohost.org/key.pem" - default_signature = ( - check_output(cmd % default_crt) if default_crt in active_certs else None - ) - if default_signature is not None and ( - default_signature.startswith("md5") or default_signature.startswith("sha1") - ): - logger.warning( - "%s is using a pretty old certificate incompatible with newer versions of nginx ... attempting to regenerate a fresh one" - % default_crt - ) - - os.system("mv %s %s.old" % (default_crt, default_crt)) - os.system("mv %s %s.old" % (default_key, default_key)) - ret = os.system("/usr/share/yunohost/hooks/conf_regen/02-ssl init") - - if ret != 0 or not os.path.exists(default_crt): - logger.error("Upgrading the certificate failed ... reverting") - os.system("mv %s.old %s" % (default_crt, default_crt)) - os.system("mv %s.old %s" % (default_key, default_key)) - - signatures = {cert: check_output(cmd % cert) for cert in active_certs} - - def cert_is_weak(cert): - sig = signatures[cert] - return sig.startswith("md5") or sig.startswith("sha1") - - weak_certs = [cert for cert in signatures.keys() if cert_is_weak(cert)] - if weak_certs: - raise YunohostError( - "migration_0015_weak_certs", certs=", ".join(weak_certs) - ) diff --git a/src/yunohost/data_migrations/0016_php70_to_php73_pools.py b/src/yunohost/data_migrations/0016_php70_to_php73_pools.py deleted file mode 100644 index 6b424f211..000000000 --- a/src/yunohost/data_migrations/0016_php70_to_php73_pools.py +++ /dev/null @@ -1,83 +0,0 @@ -import os -import glob -from shutil import copy2 - -from moulinette.utils.log import getActionLogger - -from yunohost.app import _is_installed, _patch_legacy_php_versions_in_settings -from yunohost.tools import Migration -from yunohost.service import _run_service_command - -logger = getActionLogger("yunohost.migration") - -PHP70_POOLS = "/etc/php/7.0/fpm/pool.d" -PHP73_POOLS = "/etc/php/7.3/fpm/pool.d" - -PHP70_SOCKETS_PREFIX = "/run/php/php7.0-fpm" -PHP73_SOCKETS_PREFIX = "/run/php/php7.3-fpm" - -MIGRATION_COMMENT = ( - "; YunoHost note : this file was automatically moved from {}".format(PHP70_POOLS) -) - - -class MyMigration(Migration): - - "Migrate php7.0-fpm 'pool' conf files to php7.3" - - dependencies = ["migrate_to_buster"] - - def run(self): - # Get list of php7.0 pool files - php70_pool_files = glob.glob("{}/*.conf".format(PHP70_POOLS)) - - # Keep only basenames - php70_pool_files = [os.path.basename(f) for f in php70_pool_files] - - # Ignore the "www.conf" (default stuff, probably don't want to touch it ?) - php70_pool_files = [f for f in php70_pool_files if f != "www.conf"] - - for f in php70_pool_files: - - # Copy the files to the php7.3 pool - src = "{}/{}".format(PHP70_POOLS, f) - dest = "{}/{}".format(PHP73_POOLS, f) - copy2(src, dest) - - # Replace the socket prefix if it's found - c = "sed -i -e 's@{}@{}@g' {}".format( - PHP70_SOCKETS_PREFIX, PHP73_SOCKETS_PREFIX, dest - ) - os.system(c) - - # Also add a comment that it was automatically moved from php7.0 - # (for human traceability and backward migration) - c = "sed -i '1i {}' {}".format(MIGRATION_COMMENT, dest) - os.system(c) - - app_id = os.path.basename(f)[: -len(".conf")] - if _is_installed(app_id): - _patch_legacy_php_versions_in_settings( - "/etc/yunohost/apps/%s/" % app_id - ) - - nginx_conf_files = glob.glob("/etc/nginx/conf.d/*.d/%s.conf" % app_id) - for f in nginx_conf_files: - # Replace the socket prefix if it's found - c = "sed -i -e 's@{}@{}@g' {}".format( - PHP70_SOCKETS_PREFIX, PHP73_SOCKETS_PREFIX, f - ) - os.system(c) - - os.system( - "rm /etc/logrotate.d/php7.0-fpm" - ) # We remove this otherwise the logrotate cron will be unhappy - - # Reload/restart the php pools - _run_service_command("restart", "php7.3-fpm") - _run_service_command("enable", "php7.3-fpm") - os.system("systemctl stop php7.0-fpm") - os.system("systemctl disable php7.0-fpm") - - # Reload nginx - _run_service_command("reload", "nginx") diff --git a/src/yunohost/data_migrations/0017_postgresql_9p6_to_11.py b/src/yunohost/data_migrations/0017_postgresql_9p6_to_11.py deleted file mode 100644 index cbdfabb1f..000000000 --- a/src/yunohost/data_migrations/0017_postgresql_9p6_to_11.py +++ /dev/null @@ -1,82 +0,0 @@ -import subprocess - -from moulinette import m18n -from yunohost.utils.error import YunohostError, YunohostValidationError -from moulinette.utils.log import getActionLogger - -from yunohost.tools import Migration -from yunohost.utils.filesystem import free_space_in_directory, space_used_by_directory - -logger = getActionLogger("yunohost.migration") - - -class MyMigration(Migration): - - "Migrate DBs from Postgresql 9.6 to 11 after migrating to Buster" - - dependencies = ["migrate_to_buster"] - - def run(self): - - if not self.package_is_installed("postgresql-9.6"): - logger.warning(m18n.n("migration_0017_postgresql_96_not_installed")) - return - - if not self.package_is_installed("postgresql-11"): - raise YunohostValidationError("migration_0017_postgresql_11_not_installed") - - # Make sure there's a 9.6 cluster - try: - self.runcmd("pg_lsclusters | grep -q '^9.6 '") - except Exception: - logger.warning( - "It looks like there's not active 9.6 cluster, so probably don't need to run this migration" - ) - return - - if not space_used_by_directory( - "/var/lib/postgresql/9.6" - ) > free_space_in_directory("/var/lib/postgresql"): - raise YunohostValidationError( - "migration_0017_not_enough_space", path="/var/lib/postgresql/" - ) - - self.runcmd("systemctl stop postgresql") - self.runcmd( - "LC_ALL=C pg_dropcluster --stop 11 main || true" - ) # We do not trigger an exception if the command fails because that probably means cluster 11 doesn't exists, which is fine because it's created during the pg_upgradecluster) - self.runcmd("LC_ALL=C pg_upgradecluster -m upgrade 9.6 main") - self.runcmd("LC_ALL=C pg_dropcluster --stop 9.6 main") - self.runcmd("systemctl start postgresql") - - def package_is_installed(self, package_name): - - (returncode, out, err) = self.runcmd( - "dpkg --list | grep '^ii ' | grep -q -w {}".format(package_name), - raise_on_errors=False, - ) - return returncode == 0 - - def runcmd(self, cmd, raise_on_errors=True): - - logger.debug("Running command: " + cmd) - - p = subprocess.Popen( - cmd, - shell=True, - executable="/bin/bash", - stdout=subprocess.PIPE, - stderr=subprocess.PIPE, - ) - - out, err = p.communicate() - returncode = p.returncode - if raise_on_errors and returncode != 0: - raise YunohostError( - "Failed to run command '{}'.\nreturncode: {}\nstdout:\n{}\nstderr:\n{}\n".format( - cmd, returncode, out, err - ) - ) - - out = out.strip().split("\n") - return (returncode, out, err) diff --git a/src/yunohost/data_migrations/0018_xtable_to_nftable.py b/src/yunohost/data_migrations/0018_xtable_to_nftable.py deleted file mode 100644 index 94b47d944..000000000 --- a/src/yunohost/data_migrations/0018_xtable_to_nftable.py +++ /dev/null @@ -1,126 +0,0 @@ -import os -import subprocess - -from moulinette import m18n -from yunohost.utils.error import YunohostError -from moulinette.utils.log import getActionLogger - -from yunohost.firewall import firewall_reload -from yunohost.service import service_restart -from yunohost.tools import Migration - -logger = getActionLogger("yunohost.migration") - - -class MyMigration(Migration): - - "Migrate legacy iptables rules from stretch that relied on xtable and should now rely on nftable" - - dependencies = ["migrate_to_buster"] - - def run(self): - - self.do_ipv4 = os.system("iptables -w -L >/dev/null") == 0 - self.do_ipv6 = os.system("ip6tables -w -L >/dev/null") == 0 - - if not self.do_ipv4: - logger.warning(m18n.n("iptables_unavailable")) - if not self.do_ipv6: - logger.warning(m18n.n("ip6tables_unavailable")) - - backup_folder = "/home/yunohost.backup/premigration/xtable_to_nftable/" - if not os.path.exists(backup_folder): - os.makedirs(backup_folder, 0o750) - self.backup_rules_ipv4 = os.path.join(backup_folder, "legacy_rules_ipv4") - self.backup_rules_ipv6 = os.path.join(backup_folder, "legacy_rules_ipv6") - - # Backup existing legacy rules to be able to rollback - if self.do_ipv4 and not os.path.exists(self.backup_rules_ipv4): - self.runcmd( - "iptables-legacy -L >/dev/null" - ) # For some reason if we don't do this, iptables-legacy-save is empty ? - self.runcmd("iptables-legacy-save > %s" % self.backup_rules_ipv4) - assert ( - open(self.backup_rules_ipv4).read().strip() - ), "Uhoh backup of legacy ipv4 rules is empty !?" - if self.do_ipv6 and not os.path.exists(self.backup_rules_ipv6): - self.runcmd( - "ip6tables-legacy -L >/dev/null" - ) # For some reason if we don't do this, iptables-legacy-save is empty ? - self.runcmd("ip6tables-legacy-save > %s" % self.backup_rules_ipv6) - assert ( - open(self.backup_rules_ipv6).read().strip() - ), "Uhoh backup of legacy ipv6 rules is empty !?" - - # We inject the legacy rules (iptables-legacy) into the new iptable (just "iptables") - try: - if self.do_ipv4: - self.runcmd("iptables-legacy-save | iptables-restore") - if self.do_ipv6: - self.runcmd("ip6tables-legacy-save | ip6tables-restore") - except Exception as e: - self.rollback() - raise YunohostError( - "migration_0018_failed_to_migrate_iptables_rules", error=e - ) - - # Reset everything in iptables-legacy - # Stolen from https://serverfault.com/a/200642 - try: - if self.do_ipv4: - self.runcmd( - "iptables-legacy-save | awk '/^[*]/ { print $1 }" # Keep lines like *raw, *filter and *nat - ' /^:[A-Z]+ [^-]/ { print $1 " ACCEPT" ; }' # Turn all policies to accept - " /COMMIT/ { print $0; }'" # Keep the line COMMIT - " | iptables-legacy-restore" - ) - if self.do_ipv6: - self.runcmd( - "ip6tables-legacy-save | awk '/^[*]/ { print $1 }" # Keep lines like *raw, *filter and *nat - ' /^:[A-Z]+ [^-]/ { print $1 " ACCEPT" ; }' # Turn all policies to accept - " /COMMIT/ { print $0; }'" # Keep the line COMMIT - " | ip6tables-legacy-restore" - ) - except Exception as e: - self.rollback() - raise YunohostError("migration_0018_failed_to_reset_legacy_rules", error=e) - - # You might be wondering "uh but is it really useful to - # iptables-legacy-save | iptables-restore considering firewall_reload() - # flush/resets everything anyway ?" - # But the answer is : firewall_reload() only resets the *filter table. - # On more complex setups (e.g. internet cube or docker) you will also - # have rules in the *nat (or maybe *raw?) sections of iptables. - firewall_reload() - service_restart("fail2ban") - - def rollback(self): - - if self.do_ipv4: - self.runcmd("iptables-legacy-restore < %s" % self.backup_rules_ipv4) - if self.do_ipv6: - self.runcmd("iptables-legacy-restore < %s" % self.backup_rules_ipv6) - - def runcmd(self, cmd, raise_on_errors=True): - - logger.debug("Running command: " + cmd) - - p = subprocess.Popen( - cmd, - shell=True, - executable="/bin/bash", - stdout=subprocess.PIPE, - stderr=subprocess.PIPE, - ) - - out, err = p.communicate() - returncode = p.returncode - if raise_on_errors and returncode != 0: - raise YunohostError( - "Failed to run command '{}'.\nreturncode: {}\nstdout:\n{}\nstderr:\n{}\n".format( - cmd, returncode, out, err - ) - ) - - out = out.strip().split(b"\n") - return (returncode, out, err) diff --git a/src/yunohost/data_migrations/0019_extend_permissions_features.py b/src/yunohost/data_migrations/0019_extend_permissions_features.py deleted file mode 100644 index 5d4343deb..000000000 --- a/src/yunohost/data_migrations/0019_extend_permissions_features.py +++ /dev/null @@ -1,107 +0,0 @@ -from moulinette import m18n -from moulinette.utils.log import getActionLogger - -from yunohost.tools import Migration -from yunohost.permission import user_permission_list -from yunohost.utils.legacy import migrate_legacy_permission_settings - -logger = getActionLogger("yunohost.migration") - - -class MyMigration(Migration): - """ - Add protected attribute in LDAP permission - """ - - @Migration.ldap_migration - def run(self, backup_folder): - - # Update LDAP database - self.add_new_ldap_attributes() - - # Migrate old settings - migrate_legacy_permission_settings() - - def add_new_ldap_attributes(self): - - from yunohost.utils.ldap import _get_ldap_interface - from yunohost.regenconf import regen_conf, BACKUP_CONF_DIR - - # Check if the migration can be processed - ldap_regen_conf_status = regen_conf(names=["slapd"], dry_run=True) - # By this we check if the have been customized - if ldap_regen_conf_status and ldap_regen_conf_status["slapd"]["pending"]: - logger.warning( - m18n.n( - "migration_0019_slapd_config_will_be_overwritten", - conf_backup_folder=BACKUP_CONF_DIR, - ) - ) - - # Update LDAP schema restart slapd - logger.info(m18n.n("migration_update_LDAP_schema")) - regen_conf(names=["slapd"], force=True) - - logger.info(m18n.n("migration_0019_add_new_attributes_in_ldap")) - ldap = _get_ldap_interface() - permission_list = user_permission_list(full=True)["permissions"] - - for permission in permission_list: - system_perms = { - "mail": "E-mail", - "xmpp": "XMPP", - "ssh": "SSH", - "sftp": "STFP", - } - if permission.split(".")[0] in system_perms: - update = { - "authHeader": ["FALSE"], - "label": [system_perms[permission.split(".")[0]]], - "showTile": ["FALSE"], - "isProtected": ["TRUE"], - } - else: - app, subperm_name = permission.split(".") - if permission.endswith(".main"): - update = { - "authHeader": ["TRUE"], - "label": [ - app - ], # Note that this is later re-changed during the call to migrate_legacy_permission_settings() if a 'label' setting exists - "showTile": ["TRUE"], - "isProtected": ["FALSE"], - } - else: - update = { - "authHeader": ["TRUE"], - "label": [subperm_name.title()], - "showTile": ["FALSE"], - "isProtected": ["TRUE"], - } - - ldap.update("cn=%s,ou=permission" % permission, update) - - introduced_in_version = "4.1" - - def run_after_system_restore(self): - # Update LDAP database - self.add_new_ldap_attributes() - - def run_before_app_restore(self, app_id): - from yunohost.app import app_setting - from yunohost.utils.legacy import migrate_legacy_permission_settings - - # Migrate old settings - legacy_permission_settings = [ - "skipped_uris", - "unprotected_uris", - "protected_uris", - "skipped_regex", - "unprotected_regex", - "protected_regex", - ] - if any( - app_setting(app_id, setting) is not None - for setting in legacy_permission_settings - ): - migrate_legacy_permission_settings(app=app_id) diff --git a/src/yunohost/data_migrations/0020_ssh_sftp_permissions.py b/src/yunohost/data_migrations/0020_ssh_sftp_permissions.py deleted file mode 100644 index f1dbcd1e7..000000000 --- a/src/yunohost/data_migrations/0020_ssh_sftp_permissions.py +++ /dev/null @@ -1,100 +0,0 @@ -import subprocess -import os - -from moulinette import m18n -from moulinette.utils.log import getActionLogger - -from yunohost.tools import Migration -from yunohost.permission import user_permission_update, permission_sync_to_user -from yunohost.regenconf import manually_modified_files - -logger = getActionLogger("yunohost.migration") - -################################################### -# Tools used also for restoration -################################################### - - -class MyMigration(Migration): - """ - Add new permissions around SSH/SFTP features - """ - - introduced_in_version = "4.2.2" - dependencies = ["extend_permissions_features"] - - @Migration.ldap_migration - def run(self, *args): - - from yunohost.utils.ldap import _get_ldap_interface - - ldap = _get_ldap_interface() - - existing_perms_raw = ldap.search( - "ou=permission,dc=yunohost,dc=org", "(objectclass=permissionYnh)", ["cn"] - ) - existing_perms = [perm["cn"][0] for perm in existing_perms_raw] - - # Add SSH and SFTP permissions - if "sftp.main" not in existing_perms: - ldap.add( - "cn=sftp.main,ou=permission", - { - "cn": "sftp.main", - "gidNumber": "5004", - "objectClass": ["posixGroup", "permissionYnh"], - "groupPermission": [], - "authHeader": "FALSE", - "label": "SFTP", - "showTile": "FALSE", - "isProtected": "TRUE", - }, - ) - - if "ssh.main" not in existing_perms: - ldap.add( - "cn=ssh.main,ou=permission", - { - "cn": "ssh.main", - "gidNumber": "5003", - "objectClass": ["posixGroup", "permissionYnh"], - "groupPermission": [], - "authHeader": "FALSE", - "label": "SSH", - "showTile": "FALSE", - "isProtected": "TRUE", - }, - ) - - # Add a bash terminal to each users - users = ldap.search( - "ou=users,dc=yunohost,dc=org", - filter="(loginShell=*)", - attrs=["dn", "uid", "loginShell"], - ) - for user in users: - if user["loginShell"][0] == "/bin/false": - dn = user["dn"][0].replace(",dc=yunohost,dc=org", "") - ldap.update(dn, {"loginShell": ["/bin/bash"]}) - else: - user_permission_update( - "ssh.main", add=user["uid"][0], sync_perm=False - ) - - permission_sync_to_user() - - # Somehow this is needed otherwise the PAM thing doesn't forget about the - # old loginShell value ? - subprocess.call(["nscd", "-i", "passwd"]) - - if ( - "/etc/ssh/sshd_config" in manually_modified_files() - and os.system( - "grep -q '^ *AllowGroups\\|^ *AllowUsers' /etc/ssh/sshd_config" - ) - != 0 - ): - logger.error(m18n.n("diagnosis_sshd_config_insecure")) - - def run_after_system_restore(self): - self.run() diff --git a/src/yunohost/dyndns.py b/src/yunohost/dyndns.py index c8249e439..ae49759d2 100644 --- a/src/yunohost/dyndns.py +++ b/src/yunohost/dyndns.py @@ -375,18 +375,6 @@ def dyndns_update( ) -def dyndns_installcron(): - logger.warning( - "This command is deprecated. The dyndns cron job should automatically be added/removed by the regenconf depending if there's a private key in /etc/yunohost/dyndns. You can run the regenconf yourself with 'yunohost tools regen-conf yunohost'." - ) - - -def dyndns_removecron(): - logger.warning( - "This command is deprecated. The dyndns cron job should automatically be added/removed by the regenconf depending if there's a private key in /etc/yunohost/dyndns. You can run the regenconf yourself with 'yunohost tools regen-conf yunohost'." - ) - - def _guess_current_dyndns_domain(dyn_host): """ This function tries to guess which domain should be updated by diff --git a/src/yunohost/service.py b/src/yunohost/service.py index 912662600..62f40d29c 100644 --- a/src/yunohost/service.py +++ b/src/yunohost/service.py @@ -48,12 +48,10 @@ def service_add( name, description=None, log=None, - log_type=None, test_status=None, test_conf=None, needs_exposed_ports=None, need_lock=False, - status=None, ): """ Add a custom service @@ -62,12 +60,10 @@ def service_add( name -- Service name to add description -- description of the service log -- Absolute path to log file to display - log_type -- (deprecated) Specify if the corresponding log is a file or a systemd log test_status -- Specify a custom bash command to check the status of the service. N.B. : it only makes sense to specify this if the corresponding systemd service does not return the proper information. test_conf -- Specify a custom bash command to check if the configuration of the service is valid or broken, similar to nginx -t. needs_exposed_ports -- A list of ports that needs to be publicly exposed for the service to work as intended. need_lock -- Use this option to prevent deadlocks if the service does invoke yunohost commands. - status -- Deprecated, doesn't do anything anymore. Use test_status instead. """ services = _get_services() @@ -77,15 +73,6 @@ def service_add( if not isinstance(log, list): log = [log] - # Deprecated log_type stuff - if log_type is not None: - logger.warning( - "/!\\ Packagers! --log_type is deprecated. You do not need to specify --log_type systemd anymore ... Yunohost now automatically fetch the journalctl of the systemd service by default." - ) - # Usually when adding such a service, the service name will be provided so we remove it as it's not a log file path - if name in log: - log.remove(name) - service["log"] = log if not description: @@ -535,29 +522,6 @@ def service_log(name, number=50): return result -def service_regen_conf( - names=[], with_diff=False, force=False, dry_run=False, list_pending=False -): - - services = _get_services() - - if isinstance(names, str): - names = [names] - - for name in names: - if name not in services.keys(): - raise YunohostValidationError("service_unknown", service=name) - - if names is []: - names = list(services.keys()) - - logger.warning(m18n.n("service_regen_conf_is_deprecated")) - - from yunohost.regenconf import regen_conf - - return regen_conf(names, with_diff, force, dry_run, list_pending) - - def _run_service_command(action, service): """ Run services management command (start, stop, enable, disable, restart, reload) diff --git a/src/yunohost/tools.py b/src/yunohost/tools.py index d9e057875..95b89acd0 100644 --- a/src/yunohost/tools.py +++ b/src/yunohost/tools.py @@ -329,24 +329,12 @@ def tools_regen_conf( return regen_conf(names, with_diff, force, dry_run, list_pending) -def tools_update(target=None, apps=False, system=False): +def tools_update(target=None): """ Update apps & system package cache """ - # Legacy options (--system, --apps) - if apps or system: - logger.warning( - "Using 'yunohost tools update' with --apps / --system is deprecated, just write 'yunohost tools update apps system' (no -- prefix anymore)" - ) - if apps and system: - target = "all" - elif apps: - target = "apps" - else: - target = "system" - - elif not target: + if not target: target = "all" if target not in ["system", "apps", "all"]: @@ -455,7 +443,7 @@ def _list_upgradable_apps(): @is_unit_operation() def tools_upgrade( - operation_logger, target=None, apps=False, system=False, allow_yunohost_upgrade=True + operation_logger, target=None, allow_yunohost_upgrade=True ): """ Update apps & package cache, then display changelog @@ -473,21 +461,6 @@ def tools_upgrade( if not packages.dpkg_lock_available(): raise YunohostValidationError("dpkg_lock_not_available") - # Legacy options management (--system, --apps) - if target is None: - - logger.warning( - "Using 'yunohost tools upgrade' with --apps / --system is deprecated, just write 'yunohost tools upgrade apps' or 'system' (no -- prefix anymore)" - ) - - if (system, apps) == (True, True): - raise YunohostValidationError("tools_upgrade_cant_both") - - if (system, apps) == (False, False): - raise YunohostValidationError("tools_upgrade_at_least_one") - - target = "apps" if apps else "system" - if target not in ["apps", "system"]: raise Exception( "Uhoh ?! tools_upgrade should have 'apps' or 'system' value for argument target" diff --git a/src/yunohost/user.py b/src/yunohost/user.py index 266c2774c..e7422acfd 100644 --- a/src/yunohost/user.py +++ b/src/yunohost/user.py @@ -98,7 +98,6 @@ def user_create( domain, password, mailbox_quota="0", - mail=None, ): from yunohost.domain import domain_list, _get_maindomain @@ -109,12 +108,6 @@ def user_create( # Ensure sufficiently complex password assert_password_is_strong_enough("user", password) - if mail is not None: - logger.warning( - "Packagers ! Using --mail in 'yunohost user create' is deprecated ... please use --domain instead." - ) - domain = mail.split("@")[-1] - # Validate domain used for email address/xmpp account if domain is None: if msettings.get("interface") == "api": diff --git a/src/yunohost/utils/legacy.py b/src/yunohost/utils/legacy.py deleted file mode 100644 index eb92dd71f..000000000 --- a/src/yunohost/utils/legacy.py +++ /dev/null @@ -1,239 +0,0 @@ -import os -from moulinette import m18n -from moulinette.utils.log import getActionLogger -from moulinette.utils.filesystem import write_to_json, read_yaml - -from yunohost.user import user_list -from yunohost.app import ( - _installed_apps, - _get_app_settings, - _set_app_settings, -) -from yunohost.permission import ( - permission_create, - user_permission_update, - permission_sync_to_user, -) - -logger = getActionLogger("yunohost.legacy") - -LEGACY_PERMISSION_LABEL = { - ("nextcloud", "skipped"): "api", # .well-known - ("libreto", "skipped"): "pad access", # /[^/]+ - ("leed", "skipped"): "api", # /action.php, for cron task ... - ("mailman", "protected"): "admin", # /admin - ("prettynoemiecms", "protected"): "admin", # /admin - ("etherpad_mypads", "skipped"): "admin", # /admin - ("baikal", "protected"): "admin", # /admin/ - ("couchpotato", "unprotected"): "api", # /api - ("freshrss", "skipped"): "api", # /api/, - ("portainer", "skipped"): "api", # /api/webhooks/ - ("jeedom", "unprotected"): "api", # /core/api/jeeApi.php - ("bozon", "protected"): "user interface", # /index.php - ( - "limesurvey", - "protected", - ): "admin", # /index.php?r=admin,/index.php?r=plugins,/scripts - ("kanboard", "unprotected"): "api", # /jsonrpc.php - ("seafile", "unprotected"): "medias", # /media - ("ttrss", "skipped"): "api", # /public.php,/api,/opml.php?op=publish - ("libreerp", "protected"): "admin", # /web/database/manager - ("z-push", "skipped"): "api", # $domain/[Aa]uto[Dd]iscover/.* - ("radicale", "skipped"): "?", # $domain$path_url - ( - "jirafeau", - "protected", - ): "user interface", # $domain$path_url/$","$domain$path_url/admin.php.*$ - ("opensondage", "protected"): "admin", # $domain$path_url/admin/ - ( - "lstu", - "protected", - ): "user interface", # $domain$path_url/login$","$domain$path_url/logout$","$domain$path_url/api$","$domain$path_url/extensions$","$domain$path_url/stats$","$domain$path_url/d/.*$","$domain$path_url/a$","$domain$path_url/$ - ( - "lutim", - "protected", - ): "user interface", # $domain$path_url/stats/?$","$domain$path_url/manifest.webapp/?$","$domain$path_url/?$","$domain$path_url/[d-m]/.*$ - ( - "lufi", - "protected", - ): "user interface", # $domain$path_url/stats$","$domain$path_url/manifest.webapp$","$domain$path_url/$","$domain$path_url/d/.*$","$domain$path_url/m/.*$ - ( - "gogs", - "skipped", - ): "api", # $excaped_domain$excaped_path/[%w-.]*/[%w-.]*/git%-receive%-pack,$excaped_domain$excaped_path/[%w-.]*/[%w-.]*/git%-upload%-pack,$excaped_domain$excaped_path/[%w-.]*/[%w-.]*/info/refs -} - - -def legacy_permission_label(app, permission_type): - return LEGACY_PERMISSION_LABEL.get( - (app, permission_type), "Legacy %s urls" % permission_type - ) - - -def migrate_legacy_permission_settings(app=None): - - logger.info(m18n.n("migrating_legacy_permission_settings")) - apps = _installed_apps() - - if app: - if app not in apps: - logger.error( - "Can't migrate permission for app %s because it ain't installed..." - % app - ) - apps = [] - else: - apps = [app] - - for app in apps: - - settings = _get_app_settings(app) or {} - if settings.get("label"): - user_permission_update( - app + ".main", label=settings["label"], sync_perm=False - ) - del settings["label"] - - def _setting(name): - s = settings.get(name) - return s.split(",") if s else [] - - skipped_urls = [uri for uri in _setting("skipped_uris") if uri != "/"] - skipped_urls += ["re:" + regex for regex in _setting("skipped_regex")] - unprotected_urls = [uri for uri in _setting("unprotected_uris") if uri != "/"] - unprotected_urls += ["re:" + regex for regex in _setting("unprotected_regex")] - protected_urls = [uri for uri in _setting("protected_uris") if uri != "/"] - protected_urls += ["re:" + regex for regex in _setting("protected_regex")] - - if skipped_urls != []: - permission_create( - app + ".legacy_skipped_uris", - additional_urls=skipped_urls, - auth_header=False, - label=legacy_permission_label(app, "skipped"), - show_tile=False, - allowed="visitors", - protected=True, - sync_perm=False, - ) - if unprotected_urls != []: - permission_create( - app + ".legacy_unprotected_uris", - additional_urls=unprotected_urls, - auth_header=True, - label=legacy_permission_label(app, "unprotected"), - show_tile=False, - allowed="visitors", - protected=True, - sync_perm=False, - ) - if protected_urls != []: - permission_create( - app + ".legacy_protected_uris", - additional_urls=protected_urls, - auth_header=True, - label=legacy_permission_label(app, "protected"), - show_tile=False, - allowed=[], - protected=True, - sync_perm=False, - ) - - legacy_permission_settings = [ - "skipped_uris", - "unprotected_uris", - "protected_uris", - "skipped_regex", - "unprotected_regex", - "protected_regex", - ] - for key in legacy_permission_settings: - if key in settings: - del settings[key] - - _set_app_settings(app, settings) - - permission_sync_to_user() - - -def translate_legacy_rules_in_ssowant_conf_json_persistent(): - - persistent_file_name = "/etc/ssowat/conf.json.persistent" - if not os.path.exists(persistent_file_name): - return - - # Ugly hack because for some reason so many people have tabs in their conf.json.persistent ... - os.system(r"sed -i 's/\t/ /g' /etc/ssowat/conf.json.persistent") - - # Ugly hack to try not to misarably fail migration - persistent = read_yaml(persistent_file_name) - - legacy_rules = [ - "skipped_urls", - "unprotected_urls", - "protected_urls", - "skipped_regex", - "unprotected_regex", - "protected_regex", - ] - - if not any(legacy_rule in persistent for legacy_rule in legacy_rules): - return - - if not isinstance(persistent.get("permissions"), dict): - persistent["permissions"] = {} - - skipped_urls = persistent.get("skipped_urls", []) + [ - "re:" + r for r in persistent.get("skipped_regex", []) - ] - protected_urls = persistent.get("protected_urls", []) + [ - "re:" + r for r in persistent.get("protected_regex", []) - ] - unprotected_urls = persistent.get("unprotected_urls", []) + [ - "re:" + r for r in persistent.get("unprotected_regex", []) - ] - - known_users = list(user_list()["users"].keys()) - - for legacy_rule in legacy_rules: - if legacy_rule in persistent: - del persistent[legacy_rule] - - if skipped_urls: - persistent["permissions"]["custom_skipped"] = { - "users": [], - "label": "Custom permissions - skipped", - "show_tile": False, - "auth_header": False, - "public": True, - "uris": skipped_urls - + persistent["permissions"].get("custom_skipped", {}).get("uris", []), - } - - if unprotected_urls: - persistent["permissions"]["custom_unprotected"] = { - "users": [], - "label": "Custom permissions - unprotected", - "show_tile": False, - "auth_header": True, - "public": True, - "uris": unprotected_urls - + persistent["permissions"].get("custom_unprotected", {}).get("uris", []), - } - - if protected_urls: - persistent["permissions"]["custom_protected"] = { - "users": known_users, - "label": "Custom permissions - protected", - "show_tile": False, - "auth_header": True, - "public": False, - "uris": protected_urls - + persistent["permissions"].get("custom_protected", {}).get("uris", []), - } - - write_to_json(persistent_file_name, persistent, sort_keys=True, indent=4) - - logger.warning( - "YunoHost automatically translated some legacy rules in /etc/ssowat/conf.json.persistent to match the new permission system" - ) From 91d3d15c32a9d5739bad3596e426ebda3b19c010 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Fri, 28 May 2021 17:22:55 +0200 Subject: [PATCH 015/619] Bump conflict version for openssl because version in bullseye repo is now 1.1.1k --- debian/control | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/debian/control b/debian/control index 21485b114..f123239eb 100644 --- a/debian/control +++ b/debian/control @@ -41,7 +41,7 @@ Conflicts: iptables-persistent , apache2 , bind9 , nginx-extras (>= 1.19) - , openssl (>= 1.1.1j-2) + , openssl (>= 1.1.1l-1) , slapd (>= 2.4.58) , dovecot-core (>= 1:2.3.14) , redis-server (>= 5:6.0.12) From e2a3a0bedf4b0ca532578201727eca70075b81a6 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Sun, 30 May 2021 17:55:39 +0200 Subject: [PATCH 016/619] Fix 'from_version' issue because of ~alpha in current bullseye version name --- src/yunohost/backup.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/yunohost/backup.py b/src/yunohost/backup.py index 862c07690..b94eda683 100644 --- a/src/yunohost/backup.py +++ b/src/yunohost/backup.py @@ -860,9 +860,13 @@ class RestoreManager: # FIXME this way to get the info is not compatible with copy or custom # backup methods self.info = backup_info(name, with_details=True) - if not self.info["from_yunohost_version"] or version.parse( - self.info["from_yunohost_version"] - ) < version.parse("3.8.0"): + + from_version = self.info.get("from_yunohost_version", "") + # Remove any '~foobar' in the version ... c.f ~alpha, ~beta version during + # early dev for next debian version + from_version = re.sub(r'~\w+', '', from_version) + + if not from_version or version.parse(from_version) < version.parse("3.8.0"): raise YunohostValidationError("restore_backup_too_old") self.archive_path = self.info["path"] From cb129e2bf17de6997833555f09e5caa5d030b37e Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Sun, 30 May 2021 18:48:26 +0200 Subject: [PATCH 017/619] Fix compat issue in equivs helper --- data/helpers.d/apt | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/data/helpers.d/apt b/data/helpers.d/apt index c3439a583..da87e7bad 100644 --- a/data/helpers.d/apt +++ b/data/helpers.d/apt @@ -181,8 +181,9 @@ ynh_package_install_from_equivs () { # Build and install the package local TMPDIR=$(mktemp --directory) - # Force the compatibility level at 10, levels below are deprecated - echo 10 > /usr/share/equivs/template/debian/compat + # Make sure to delete the legacy compat file + # It's now handle somewhat magically through the control file + rm -f /usr/share/equivs/template/debian/compat # Note that the cd executes into a sub shell # Create a fake deb package with equivs-build and the given control file From 5046e49c8b8dd051319bd35f7f7b5b70c7d39c90 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Sun, 30 May 2021 19:03:44 +0200 Subject: [PATCH 018/619] Many app explicitly specify YNH_PHP_VERSION=7.3, then trying to install php7.3-foo which doesn't exist ... so gotta yolopatch that definition ... --- src/yunohost/app.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/yunohost/app.py b/src/yunohost/app.py index 4e2cd5317..eafff1db3 100644 --- a/src/yunohost/app.py +++ b/src/yunohost/app.py @@ -3475,6 +3475,7 @@ LEGACY_PHP_VERSION_REPLACEMENTS = [ ("php5", "php7.4"), ("php7.0", "php7.4"), ("php7.3", "php7.4"), + ('YNH_PHP_VERSION="7.3"', 'YNH_PHP_VERSION="7.4"'), ( 'phpversion="${phpversion:-7.0}"', 'phpversion="${phpversion:-7.4}"', From ba2428d9b9db734e1fa394f973a0d2fec6bd9d34 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Sun, 30 May 2021 19:07:30 +0200 Subject: [PATCH 019/619] equivs-build now sends its logs to stderr but we don't really care about what it says, redirect to debug --- data/helpers.d/apt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/helpers.d/apt b/data/helpers.d/apt index da87e7bad..4f48c2172 100644 --- a/data/helpers.d/apt +++ b/data/helpers.d/apt @@ -192,7 +192,7 @@ ynh_package_install_from_equivs () { ynh_wait_dpkg_free cp "$controlfile" "${TMPDIR}/control" (cd "$TMPDIR" - LC_ALL=C equivs-build ./control 1> /dev/null + LC_ALL=C equivs-build ./control 2>&1 LC_ALL=C dpkg --force-depends --install "./${pkgname}_${pkgversion}_all.deb" 2>&1 | tee ./dpkg_log) ynh_package_install --fix-broken || \ From c794e63f67b06407c9e180f6cbce99d3a40ced42 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Mon, 31 May 2021 16:00:23 +0200 Subject: [PATCH 020/619] Re-add missing nginx dependency in debian/control ..\! --- debian/control | 1 + 1 file changed, 1 insertion(+) diff --git a/debian/control b/debian/control index f123239eb..cc39a838c 100644 --- a/debian/control +++ b/debian/control @@ -15,6 +15,7 @@ Depends: ${python3:Depends}, ${misc:Depends} , python3-miniupnpc, python3-dbus, python3-jinja2 , python3-toml, python3-packaging, python3-publicsuffix2 , python-is-python3 + , nginx, nginx-extras (>=1.18) , apt, apt-transport-https, apt-utils, dirmngr , php7.4-common, php7.4-fpm, php7.4-ldap, php7.4-intl , mariadb-server, php7.4-mysql From 473bff6e5dfeecd744d5fb88d686867669a1e722 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Mon, 31 May 2021 18:46:28 +0200 Subject: [PATCH 021/619] Draft for bullseye migration --- .../0021_migrate_to_bullseye.py | 252 ++++++++++++++++++ 1 file changed, 252 insertions(+) create mode 100644 src/yunohost/data_migrations/0021_migrate_to_bullseye.py diff --git a/src/yunohost/data_migrations/0021_migrate_to_bullseye.py b/src/yunohost/data_migrations/0021_migrate_to_bullseye.py new file mode 100644 index 000000000..289e9d765 --- /dev/null +++ b/src/yunohost/data_migrations/0021_migrate_to_bullseye.py @@ -0,0 +1,252 @@ +import glob +import os + +from moulinette import m18n +from yunohost.utils.error import YunohostError +from moulinette.utils.log import getActionLogger +from moulinette.utils.process import check_output, call_async_output +from moulinette.utils.filesystem import read_file + +from yunohost.tools import Migration, tools_update, tools_upgrade +from yunohost.app import unstable_apps +from yunohost.regenconf import manually_modified_files +from yunohost.utils.filesystem import free_space_in_directory +from yunohost.utils.packages import ( + get_ynh_package_version, + _list_upgradable_apt_packages, +) + +logger = getActionLogger("yunohost.migration") + +N_CURRENT_DEBIAN = 10 +N_CURRENT_YUNOHOST = 4 + +N_NEXT_DEBAN = 11 +N_NEXT_YUNOHOST == 11 + +class MyMigration(Migration): + + "Upgrade the system to Debian Bullseye and Yunohost 11.x" + + mode = "manual" + + def run(self): + + self.check_assertions() + + logger.info(m18n.n("migration_0021_start")) + + # + # Patch sources.list + # + logger.info(m18n.n("migration_0021_patching_sources_list")) + self.patch_apt_sources_list() + tools_update(target="system") + + # Tell libc6 it's okay to restart system stuff during the upgrade + os.system( + "echo 'libc6 libraries/restart-without-asking boolean true' | debconf-set-selections" + ) + + # Don't send an email to root about the postgresql migration. It should be handled automatically after. + os.system( + "echo 'postgresql-common postgresql-common/obsolete-major seen true' | debconf-set-selections" + ) + + # + # Specific packages upgrades + # + logger.info(m18n.n("migration_0021_specific_upgrade")) + + # + # Main upgrade + # + logger.info(m18n.n("migration_0021_main_upgrade")) + + self.patch_yunohost_conflicts() + + apps_packages = self.get_apps_equivs_packages() + self.hold(apps_packages) + tools_upgrade(target="system", allow_yunohost_upgrade=False) + + if self.debian_major_version() == N_CURRENT_DEBIAN: + raise YunohostError("migration_0021_still_on_buster_after_main_upgrade") + + # Clean the mess + logger.info(m18n.n("migration_0021_cleaning_up")) + os.system("apt autoremove --assume-yes") + os.system("apt clean --assume-yes") + + # + # Yunohost upgrade + # + logger.info(m18n.n("migration_0021_yunohost_upgrade")) + self.unhold(apps_packages) + tools_upgrade(target="system") + + def debian_major_version(self): + # The python module "platform" and lsb_release are not reliable because + # on some setup, they may still return Release=9 even after upgrading to + # buster ... (Apparently this is related to OVH overriding some stuff + # with /etc/lsb-release for instance -_-) + # Instead, we rely on /etc/os-release which should be the raw info from + # the distribution... + return int( + check_output( + "grep VERSION_ID /etc/os-release | head -n 1 | tr '\"' ' ' | cut -d ' ' -f2" + ) + ) + + def yunohost_major_version(self): + return int(get_ynh_package_version("yunohost")["version"].split(".")[0]) + + def check_assertions(self): + + # Be on buster (10.x) and yunohost 4.x + # NB : we do both check to cover situations where the upgrade crashed + # in the middle and debian version could be > 9.x but yunohost package + # would still be in 3.x... + if ( + not self.debian_major_version() == N_CURRENT_DEBIAN + and not self.yunohost_major_version() == N_CURRENT_YUNOHOST + ): + raise YunohostError("migration_0021_not_buster") + + # Have > 1 Go free space on /var/ ? + if free_space_in_directory("/var/") / (1024 ** 3) < 1.0: + raise YunohostError("migration_0021_not_enough_free_space") + + # Check system is up to date + # (but we don't if 'bullseye' is already in the sources.list ... + # which means maybe a previous upgrade crashed and we're re-running it) + if " bullseye " not in read_file("/etc/apt/sources.list"): + tools_update(target="system") + upgradable_system_packages = list(_list_upgradable_apt_packages()) + if upgradable_system_packages: + raise YunohostError("migration_0021_system_not_fully_up_to_date") + + @property + def disclaimer(self): + + # Avoid having a super long disclaimer + uncessary check if we ain't + # on buster / yunohost 4.x anymore + # NB : we do both check to cover situations where the upgrade crashed + # in the middle and debian version could be >= 10.x but yunohost package + # would still be in 4.x... + if ( + not self.debian_major_version() == N_CURRENT_DEBIAN + and not self.yunohost_major_version() == N_CURRENT_YUNOHOST + ): + return None + + # Get list of problematic apps ? I.e. not official or community+working + problematic_apps = unstable_apps() + problematic_apps = "".join(["\n - " + app for app in problematic_apps]) + + # Manually modified files ? (c.f. yunohost service regen-conf) + modified_files = manually_modified_files() + modified_files = "".join(["\n - " + f for f in modified_files]) + + message = m18n.n("migration_0021_general_warning") + + # FIXME: re-enable this message with updated topic link once we release the migration as stable + #message = ( + # "N.B.: This migration has been tested by the community over the last few months but has only been declared stable recently. If your server hosts critical services and if you are not too confident with debugging possible issues, we recommend you to wait a little bit more while we gather more feedback and polish things up. If on the other hand you are relatively confident with debugging small issues that may arise, you are encouraged to run this migration ;)! You can read about remaining known issues and feedback from the community here: https://forum.yunohost.org/t/12195\n\n" + # + message + #) + + if problematic_apps: + message += "\n\n" + m18n.n( + "migration_0021_problematic_apps_warning", + problematic_apps=problematic_apps, + ) + + if modified_files: + message += "\n\n" + m18n.n( + "migration_0021_modified_files", manually_modified_files=modified_files + ) + + return message + + def patch_apt_sources_list(self): + + sources_list = glob.glob("/etc/apt/sources.list.d/*.list") + sources_list.append("/etc/apt/sources.list") + + # This : + # - replace single 'buster' occurence by 'bulleye' + # - comments lines containing "backports" + # - replace 'buster/updates' by 'bullseye/updates' (or same with -) + for f in sources_list: + command = ( + f"sed -i {f} " + "-e 's@ buster @ bullseye @g' " + "-e '/backports/ s@^#*@#@' " + "-e 's@ buster/updates @ bullseye/updates @g' " + "-e 's@ buster-@ bullseye-@g' " + ) + os.system(command) + + def get_apps_equivs_packages(self): + + command = ( + "dpkg --get-selections" + " | grep -v deinstall" + " | awk '{print $1}'" + " | { grep 'ynh-deps$' || true; }" + ) + + output = check_output(command) + + return output.split("\n") if output else [] + + def hold(self, packages): + for package in packages: + os.system("apt-mark hold {}".format(package)) + + def unhold(self, packages): + for package in packages: + os.system("apt-mark unhold {}".format(package)) + + def apt_install(self, cmd): + def is_relevant(line): + return "Reading database ..." not in line.rstrip() + + callbacks = ( + lambda l: logger.info("+ " + l.rstrip() + "\r") + if is_relevant(l) + else logger.debug(l.rstrip() + "\r"), + lambda l: logger.warning(l.rstrip()), + ) + + cmd = ( + "LC_ALL=C DEBIAN_FRONTEND=noninteractive APT_LISTCHANGES_FRONTEND=none apt install --quiet -o=Dpkg::Use-Pty=0 --fix-broken --assume-yes " + + cmd + ) + + logger.debug("Running: %s" % cmd) + + call_async_output(cmd, callbacks, shell=True) + + + def patch_yunohost_conflicts(self): + # + # This is a super dirty hack to remove the conflicts from yunohost's debian/control file + # Those conflicts are there to prevent mistakenly upgrading critical packages + # such as dovecot, postfix, nginx, openssl, etc... usually related to mistakenly + # using backports etc. + # + # The hack consists in savagely removing the conflicts directly in /var/lib/dpkg/status + # + + # We only patch the conflict if we're on yunohost 4.x + if self.yunohost_major_version() != N_CURRENT_YUNOHOST: + return + + conflicts = check_output("dpkg-query -s yunohost | grep '^Conflicts:'").strip() + if conflicts: + # We want to keep conflicting with apache/bind9 tho + new_conflicts = "Conflicts: apache2, bind9" + + command = f"sed -i /var/lib/dpkg/status 's@{conflicts}@{new_conflicts}@g'" + os.system(command) From d6baad6f45abf70b8f062fcd73f32a2cad975261 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Mon, 31 May 2021 19:02:05 +0200 Subject: [PATCH 022/619] Postgresql version is 13 in bullseye --- data/helpers.d/postgresql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/helpers.d/postgresql b/data/helpers.d/postgresql index 12738a922..e190ce419 100644 --- a/data/helpers.d/postgresql +++ b/data/helpers.d/postgresql @@ -1,7 +1,7 @@ #!/bin/bash PSQL_ROOT_PWD_FILE=/etc/yunohost/psql -PSQL_VERSION=11 +PSQL_VERSION=13 # Open a connection as a user # From da57653a01770e130a53c6e732ee6dac61035790 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Mon, 31 May 2021 19:12:08 +0200 Subject: [PATCH 023/619] Misc fixes after tests on the battlefield --- .../data_migrations/0021_migrate_to_bullseye.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/yunohost/data_migrations/0021_migrate_to_bullseye.py b/src/yunohost/data_migrations/0021_migrate_to_bullseye.py index 289e9d765..a5bb1e523 100644 --- a/src/yunohost/data_migrations/0021_migrate_to_bullseye.py +++ b/src/yunohost/data_migrations/0021_migrate_to_bullseye.py @@ -22,7 +22,7 @@ N_CURRENT_DEBIAN = 10 N_CURRENT_YUNOHOST = 4 N_NEXT_DEBAN = 11 -N_NEXT_YUNOHOST == 11 +N_NEXT_YUNOHOST = 11 class MyMigration(Migration): @@ -54,17 +54,17 @@ class MyMigration(Migration): ) # - # Specific packages upgrades + # Patch yunohost conflicts # - logger.info(m18n.n("migration_0021_specific_upgrade")) + logger.info(m18n.n("migration_0021_patch_yunohost_conflicts")) + + self.patch_yunohost_conflicts() # # Main upgrade # logger.info(m18n.n("migration_0021_main_upgrade")) - self.patch_yunohost_conflicts() - apps_packages = self.get_apps_equivs_packages() self.hold(apps_packages) tools_upgrade(target="system", allow_yunohost_upgrade=False) @@ -248,5 +248,6 @@ class MyMigration(Migration): # We want to keep conflicting with apache/bind9 tho new_conflicts = "Conflicts: apache2, bind9" - command = f"sed -i /var/lib/dpkg/status 's@{conflicts}@{new_conflicts}@g'" + command = f"sed -i /var/lib/dpkg/status -e 's@{conflicts}@{new_conflicts}@g'" + logger.debug(f"Running: {command}") os.system(command) From 24211a90bc6ea250c904454fbc6bf8ba1bc7287a Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Fri, 4 Jun 2021 17:17:27 +0200 Subject: [PATCH 024/619] Yolo php7.3 -> php7.4 migration --- locales/en.json | 1 + src/yunohost/app.py | 16 +++- .../0022_php73_to_php74_pools.py | 83 +++++++++++++++++++ 3 files changed, 96 insertions(+), 4 deletions(-) create mode 100644 src/yunohost/data_migrations/0022_php73_to_php74_pools.py diff --git a/locales/en.json b/locales/en.json index 813688a87..922ece34a 100644 --- a/locales/en.json +++ b/locales/en.json @@ -426,6 +426,7 @@ "migration_description_0018_xtable_to_nftable": "Migrate old network traffic rules to the new nftable system", "migration_description_0019_extend_permissions_features": "Extend/rework the app permission management system", "migration_description_0020_ssh_sftp_permissions": "Add SSH and SFTP permissions support", + "migration_description_0022_php73_to_php74_pools": "Migrate php7.3-fpm 'pool' conf files to php7.4", "migration_ldap_backup_before_migration": "Creating a backup of LDAP database and apps settings prior to the actual migration.", "migration_ldap_can_not_backup_before_migration": "The backup of the system could not be completed before the migration failed. Error: {error:s}", "migration_ldap_migration_failed_trying_to_rollback": "Could not migrate... trying to roll back the system.", diff --git a/src/yunohost/app.py b/src/yunohost/app.py index eafff1db3..98a8053e7 100644 --- a/src/yunohost/app.py +++ b/src/yunohost/app.py @@ -3480,10 +3480,18 @@ LEGACY_PHP_VERSION_REPLACEMENTS = [ 'phpversion="${phpversion:-7.0}"', 'phpversion="${phpversion:-7.4}"', ), # Many helpers like the composer ones use 7.0 by default ... + ( + 'phpversion="${phpversion:-7.3}"', + 'phpversion="${phpversion:-7.4}"', + ), # Many helpers like the composer ones use 7.0 by default ... ( '"$phpversion" == "7.0"', '$(bc <<< "$phpversion >= 7.4") -eq 1', ), # patch ynh_install_php to refuse installing/removing php <= 7.3 + ( + '"$phpversion" == "7.3"', + '$(bc <<< "$phpversion >= 7.4") -eq 1', + ), # patch ynh_install_php to refuse installing/removing php <= 7.3 ] @@ -3518,15 +3526,15 @@ def _patch_legacy_php_versions_in_settings(app_folder): settings = read_yaml(os.path.join(app_folder, "settings.yml")) - if settings.get("fpm_config_dir") == "/etc/php/7.0/fpm": + if settings.get("fpm_config_dir") in ["/etc/php/7.0/fpm", "/etc/php/7.3/fpm"]: settings["fpm_config_dir"] = "/etc/php/7.4/fpm" - if settings.get("fpm_service") == "php7.0-fpm": + if settings.get("fpm_service") in ["php7.0-fpm", "php7.3-fpm"]: settings["fpm_service"] = "php7.4-fpm" - if settings.get("phpversion") == "7.0": + if settings.get("phpversion") in ["7.0", "7.3"]: settings["phpversion"] = "7.4" # We delete these checksums otherwise the file will appear as manually modified - list_to_remove = ["checksum__etc_php_7.0_fpm_pool", "checksum__etc_nginx_conf.d"] + list_to_remove = ["checksum__etc_php_7.3_fpm_pool", "checksum__etc_php_7.0_fpm_pool", "checksum__etc_nginx_conf.d"] settings = { k: v for k, v in settings.items() diff --git a/src/yunohost/data_migrations/0022_php73_to_php74_pools.py b/src/yunohost/data_migrations/0022_php73_to_php74_pools.py new file mode 100644 index 000000000..0157fa275 --- /dev/null +++ b/src/yunohost/data_migrations/0022_php73_to_php74_pools.py @@ -0,0 +1,83 @@ +import os +import glob +from shutil import copy2 + +from moulinette.utils.log import getActionLogger + +from yunohost.app import _is_installed, _patch_legacy_php_versions_in_settings +from yunohost.tools import Migration +from yunohost.service import _run_service_command + +logger = getActionLogger("yunohost.migration") + +OLDPHP_POOLS = "/etc/php/7.3/fpm/pool.d" +NEWPHP_POOLS = "/etc/php/7.4/fpm/pool.d" + +OLDPHP_SOCKETS_PREFIX = "/run/php/php7.3-fpm" +NEWPHP_SOCKETS_PREFIX = "/run/php/php7.4-fpm" + +MIGRATION_COMMENT = ( + "; YunoHost note : this file was automatically moved from {}".format(OLDPHP_POOLS) +) + + +class MyMigration(Migration): + + "Migrate php7.3-fpm 'pool' conf files to php7.4" + + dependencies = ["migrate_to_bullseye"] + + def run(self): + # Get list of php7.3 pool files + oldphp_pool_files = glob.glob("{}/*.conf".format(OLDPHP_POOLS)) + + # Keep only basenames + oldphp_pool_files = [os.path.basename(f) for f in oldphp_pool_files] + + # Ignore the "www.conf" (default stuff, probably don't want to touch it ?) + oldphp_pool_files = [f for f in oldphp_pool_files if f != "www.conf"] + + for f in oldphp_pool_files: + + # Copy the files to the php7.4 pool + src = "{}/{}".format(OLDPHP_POOLS, f) + dest = "{}/{}".format(NEWPHP_POOLS, f) + copy2(src, dest) + + # Replace the socket prefix if it's found + c = "sed -i -e 's@{}@{}@g' {}".format( + OLDPHP_SOCKETS_PREFIX, NEWPHP_SOCKETS_PREFIX, dest + ) + os.system(c) + + # Also add a comment that it was automatically moved from php7.3 + # (for human traceability and backward migration) + c = "sed -i '1i {}' {}".format(MIGRATION_COMMENT, dest) + os.system(c) + + app_id = os.path.basename(f)[: -len(".conf")] + if _is_installed(app_id): + _patch_legacy_php_versions_in_settings( + "/etc/yunohost/apps/%s/" % app_id + ) + + nginx_conf_files = glob.glob("/etc/nginx/conf.d/*.d/%s.conf" % app_id) + for f in nginx_conf_files: + # Replace the socket prefix if it's found + c = "sed -i -e 's@{}@{}@g' {}".format( + OLDPHP_SOCKETS_PREFIX, NEWPHP_SOCKETS_PREFIX, f + ) + os.system(c) + + os.system( + "rm /etc/logrotate.d/php7.3-fpm" + ) # We remove this otherwise the logrotate cron will be unhappy + + # Reload/restart the php pools + _run_service_command("restart", "php7.4-fpm") + _run_service_command("enable", "php7.4-fpm") + os.system("systemctl stop php7.3-fpm") + os.system("systemctl disable php7.3-fpm") + + # Reload nginx + _run_service_command("reload", "nginx") From 4e2e54676a1c23475903823ad621f765d36c3b3a Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Fri, 4 Jun 2021 17:23:09 +0200 Subject: [PATCH 025/619] Yolo postgresql 11 -> 13 cluster migration --- locales/en.json | 4 + .../0023_postgresql_11_to_13.py | 82 +++++++++++++++++++ 2 files changed, 86 insertions(+) create mode 100644 src/yunohost/data_migrations/0023_postgresql_11_to_13.py diff --git a/locales/en.json b/locales/en.json index 922ece34a..1ab813bc4 100644 --- a/locales/en.json +++ b/locales/en.json @@ -427,6 +427,7 @@ "migration_description_0019_extend_permissions_features": "Extend/rework the app permission management system", "migration_description_0020_ssh_sftp_permissions": "Add SSH and SFTP permissions support", "migration_description_0022_php73_to_php74_pools": "Migrate php7.3-fpm 'pool' conf files to php7.4", + "migration_description_0023_postgresql_11_to_13": "Migrate databases from PostgreSQL 11 to 13", "migration_ldap_backup_before_migration": "Creating a backup of LDAP database and apps settings prior to the actual migration.", "migration_ldap_can_not_backup_before_migration": "The backup of the system could not be completed before the migration failed. Error: {error:s}", "migration_ldap_migration_failed_trying_to_rollback": "Could not migrate... trying to roll back the system.", @@ -453,6 +454,9 @@ "migration_0018_failed_to_reset_legacy_rules": "Failed to reset legacy iptables rules: {error}", "migration_0019_add_new_attributes_in_ldap": "Add new attributes for permissions in LDAP database", "migration_0019_slapd_config_will_be_overwritten": "It looks like you manually edited the slapd configuration. For this critical migration, YunoHost needs to force the update of the slapd configuration. The original files will be backuped in {conf_backup_folder}.", + "migration_0023_postgresql_11_not_installed": "PostgreSQL was not installed on your system. Nothing to do.", + "migration_0023_postgresql_13_not_installed": "PostgreSQL 11 is installed, but not postgresql 13!? Something weird might have happened on your system :(...", + "migration_0023_not_enough_space": "Make sufficient space available in {path} to run the migration.", "migrations_already_ran": "Those migrations are already done: {ids}", "migrations_cant_reach_migration_file": "Could not access migrations files at the path '%s'", "migrations_dependencies_not_satisfied": "Run these migrations: '{dependencies_id}', before migration {id}.", diff --git a/src/yunohost/data_migrations/0023_postgresql_11_to_13.py b/src/yunohost/data_migrations/0023_postgresql_11_to_13.py new file mode 100644 index 000000000..30527f0c8 --- /dev/null +++ b/src/yunohost/data_migrations/0023_postgresql_11_to_13.py @@ -0,0 +1,82 @@ +import subprocess + +from moulinette import m18n +from yunohost.utils.error import YunohostError, YunohostValidationError +from moulinette.utils.log import getActionLogger + +from yunohost.tools import Migration +from yunohost.utils.filesystem import free_space_in_directory, space_used_by_directory + +logger = getActionLogger("yunohost.migration") + + +class MyMigration(Migration): + + "Migrate DBs from Postgresql 11 to 13 after migrating to Bullseye" + + dependencies = ["migrate_to_bullseye"] + + def run(self): + + if not self.package_is_installed("postgresql-11"): + logger.warning(m18n.n("migration_0023_postgresql_11_not_installed")) + return + + if not self.package_is_installed("postgresql-13"): + raise YunohostValidationError("migration_0023_postgresql_13_not_installed") + + # Make sure there's a 11 cluster + try: + self.runcmd("pg_lsclusters | grep -q '^11 '") + except Exception: + logger.warning( + "It looks like there's not active 11 cluster, so probably don't need to run this migration" + ) + return + + if not space_used_by_directory( + "/var/lib/postgresql/11" + ) > free_space_in_directory("/var/lib/postgresql"): + raise YunohostValidationError( + "migration_0023_not_enough_space", path="/var/lib/postgresql/" + ) + + self.runcmd("systemctl stop postgresql") + self.runcmd( + "LC_ALL=C pg_dropcluster --stop 13 main || true" + ) # We do not trigger an exception if the command fails because that probably means cluster 13 doesn't exists, which is fine because it's created during the pg_upgradecluster) + self.runcmd("LC_ALL=C pg_upgradecluster -m upgrade 11 main") + self.runcmd("LC_ALL=C pg_dropcluster --stop 11 main") + self.runcmd("systemctl start postgresql") + + def package_is_installed(self, package_name): + + (returncode, out, err) = self.runcmd( + "dpkg --list | grep '^ii ' | grep -q -w {}".format(package_name), + raise_on_errors=False, + ) + return returncode == 0 + + def runcmd(self, cmd, raise_on_errors=True): + + logger.debug("Running command: " + cmd) + + p = subprocess.Popen( + cmd, + shell=True, + executable="/bin/bash", + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + ) + + out, err = p.communicate() + returncode = p.returncode + if raise_on_errors and returncode != 0: + raise YunohostError( + "Failed to run command '{}'.\nreturncode: {}\nstdout:\n{}\nstderr:\n{}\n".format( + cmd, returncode, out, err + ) + ) + + out = out.strip().split("\n") + return (returncode, out, err) From b233c7c08ccf689c620e46bbc8431970711e42db Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Fri, 4 Jun 2021 17:35:29 +0200 Subject: [PATCH 026/619] Stale strings --- locales/en.json | 32 -------------------------------- 1 file changed, 32 deletions(-) diff --git a/locales/en.json b/locales/en.json index 813688a87..2921e91ef 100644 --- a/locales/en.json +++ b/locales/en.json @@ -419,39 +419,10 @@ "mail_unavailable": "This e-mail address is reserved and shall be automatically allocated to the very first user", "main_domain_change_failed": "Unable to change the main domain", "main_domain_changed": "The main domain has been changed", - "migrating_legacy_permission_settings": "Migrating legacy permission settings...", - "migration_description_0015_migrate_to_buster": "Upgrade the system to Debian Buster and YunoHost 4.x", - "migration_description_0016_php70_to_php73_pools": "Migrate php7.0-fpm 'pool' conf files to php7.3", - "migration_description_0017_postgresql_9p6_to_11": "Migrate databases from PostgreSQL 9.6 to 11", - "migration_description_0018_xtable_to_nftable": "Migrate old network traffic rules to the new nftable system", - "migration_description_0019_extend_permissions_features": "Extend/rework the app permission management system", - "migration_description_0020_ssh_sftp_permissions": "Add SSH and SFTP permissions support", "migration_ldap_backup_before_migration": "Creating a backup of LDAP database and apps settings prior to the actual migration.", "migration_ldap_can_not_backup_before_migration": "The backup of the system could not be completed before the migration failed. Error: {error:s}", "migration_ldap_migration_failed_trying_to_rollback": "Could not migrate... trying to roll back the system.", "migration_ldap_rollback_success": "System rolled back.", - "migration_update_LDAP_schema": "Updating LDAP schema...", - "migration_0015_start" : "Starting migration to Buster", - "migration_0015_patching_sources_list": "Patching the sources.lists...", - "migration_0015_main_upgrade": "Starting main upgrade...", - "migration_0015_still_on_stretch_after_main_upgrade": "Something went wrong during the main upgrade, the system appears to still be on Debian Stretch", - "migration_0015_yunohost_upgrade" : "Starting YunoHost core upgrade...", - "migration_0015_not_stretch" : "The current Debian distribution is not Stretch!", - "migration_0015_not_enough_free_space" : "Free space is pretty low in /var/! You should have at least 1GB free to run this migration.", - "migration_0015_system_not_fully_up_to_date": "Your system is not fully up-to-date. Please perform a regular upgrade before running the migration to Buster.", - "migration_0015_general_warning": "Please note that this migration is a delicate operation. The YunoHost team did its best to review and test it, but the migration might still break parts of the system or its apps.\n\nTherefore, it is recommended to:\n - Perform a backup of any critical data or app. More info on https://yunohost.org/backup;\n - Be patient after launching the migration: Depending on your Internet connection and hardware, it might take up to a few hours for everything to upgrade.", - "migration_0015_problematic_apps_warning": "Please note that the following possibly problematic installed apps were detected. It looks like those were not installed from the YunoHost app catalog, or are not flagged as 'working'. Consequently, it cannot be guaranteed that they will still work after the upgrade: {problematic_apps}", - "migration_0015_modified_files": "Please note that the following files were found to be manually modified and might be overwritten following the upgrade: {manually_modified_files}", - "migration_0015_specific_upgrade": "Starting upgrade of system packages that needs to be upgrade independently...", - "migration_0015_cleaning_up": "Cleaning up cache and packages not useful anymore...", - "migration_0015_weak_certs": "The following certificates were found to still use weak signature algorithms and have to be upgraded to be compatible with the next version of nginx: {certs}", - "migration_0017_postgresql_96_not_installed": "PostgreSQL was not installed on your system. Nothing to do.", - "migration_0017_postgresql_11_not_installed": "PostgreSQL 9.6 is installed, but not postgresql 11‽ Something weird might have happened on your system :(...", - "migration_0017_not_enough_space": "Make sufficient space available in {path} to run the migration.", - "migration_0018_failed_to_migrate_iptables_rules": "Failed to migrate legacy iptables rules to nftables: {error}", - "migration_0018_failed_to_reset_legacy_rules": "Failed to reset legacy iptables rules: {error}", - "migration_0019_add_new_attributes_in_ldap": "Add new attributes for permissions in LDAP database", - "migration_0019_slapd_config_will_be_overwritten": "It looks like you manually edited the slapd configuration. For this critical migration, YunoHost needs to force the update of the slapd configuration. The original files will be backuped in {conf_backup_folder}.", "migrations_already_ran": "Those migrations are already done: {ids}", "migrations_cant_reach_migration_file": "Could not access migrations files at the path '%s'", "migrations_dependencies_not_satisfied": "Run these migrations: '{dependencies_id}', before migration {id}.", @@ -574,7 +545,6 @@ "service_disabled": "The service '{service:s}' will not be started anymore when system boots.", "service_enable_failed": "Could not make the service '{service:s}' automatically start at boot.\n\nRecent service logs:{logs:s}", "service_enabled": "The service '{service:s}' will now be automatically started during system boots.", - "service_regen_conf_is_deprecated": "'yunohost service regen-conf' is deprecated! Please use 'yunohost tools regen-conf' instead.", "service_remove_failed": "Could not remove the service '{service:s}'", "service_removed": "Service '{service:s}' removed", "service_reload_failed": "Could not reload the service '{service:s}'\n\nRecent service logs:{logs:s}", @@ -595,8 +565,6 @@ "system_upgraded": "System upgraded", "system_username_exists": "Username already exists in the list of system users", "this_action_broke_dpkg": "This action broke dpkg/APT (the system package managers)... You can try to solve this issue by connecting through SSH and running `sudo apt install --fix-broken` and/or `sudo dpkg --configure -a`.", - "tools_upgrade_at_least_one": "Please specify 'apps', or 'system'", - "tools_upgrade_cant_both": "Cannot upgrade both system and apps at the same time", "tools_upgrade_cant_hold_critical_packages": "Could not hold critical packages…", "tools_upgrade_cant_unhold_critical_packages": "Could not unhold critical packages…", "tools_upgrade_regular_packages": "Now upgrading 'regular' (non-yunohost-related) packages…", From 11a638ed70c767a8d8cbe4e326d69ecf25b51659 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Fri, 4 Jun 2021 18:22:48 +0200 Subject: [PATCH 027/619] Fix 'apps' undefined --- src/yunohost/tools.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/yunohost/tools.py b/src/yunohost/tools.py index 95b89acd0..a7b79bb28 100644 --- a/src/yunohost/tools.py +++ b/src/yunohost/tools.py @@ -484,7 +484,7 @@ def tools_upgrade( # Actually start the upgrades try: - app_upgrade(app=apps) + app_upgrade(app=upgradable_apps) except Exception as e: logger.warning("unable to upgrade apps: %s" % str(e)) logger.error(m18n.n("app_upgrade_some_app_failed")) From fd3a10489deec0c99f2566408c134f1bca78c4d6 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Mon, 7 Jun 2021 16:17:58 +0200 Subject: [PATCH 028/619] Add i18n strings for bullseye migration --- locales/en.json | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/locales/en.json b/locales/en.json index 84a01dfaa..a479672d7 100644 --- a/locales/en.json +++ b/locales/en.json @@ -426,6 +426,7 @@ "migration_description_0018_xtable_to_nftable": "Migrate old network traffic rules to the new nftable system", "migration_description_0019_extend_permissions_features": "Extend/rework the app permission management system", "migration_description_0020_ssh_sftp_permissions": "Add SSH and SFTP permissions support", + "migration_description_0021_migrate_to_bullseye": "Upgrade the system to Debian Bullseye and YunoHost 11.x", "migration_ldap_backup_before_migration": "Creating a backup of LDAP database and apps settings prior to the actual migration.", "migration_ldap_can_not_backup_before_migration": "The backup of the system could not be completed before the migration failed. Error: {error:s}", "migration_ldap_migration_failed_trying_to_rollback": "Could not migrate... trying to roll back the system.", @@ -452,6 +453,21 @@ "migration_0018_failed_to_reset_legacy_rules": "Failed to reset legacy iptables rules: {error}", "migration_0019_add_new_attributes_in_ldap": "Add new attributes for permissions in LDAP database", "migration_0019_slapd_config_will_be_overwritten": "It looks like you manually edited the slapd configuration. For this critical migration, YunoHost needs to force the update of the slapd configuration. The original files will be backuped in {conf_backup_folder}.", + "migration_0021_start" : "Starting migration to Bullseye", + "migration_0021_patching_sources_list": "Patching the sources.lists...", + "migration_0021_main_upgrade": "Starting main upgrade...", + "migration_0021_still_on_buster_after_main_upgrade": "Something went wrong during the main upgrade, the system appears to still be on Debian Buster", + "migration_0021_yunohost_upgrade" : "Starting YunoHost core upgrade...", + "migration_0021_not_buster" : "The current Debian distribution is not Buster!", + "migration_0021_not_enough_free_space" : "Free space is pretty low in /var/! You should have at least 1GB free to run this migration.", + "migration_0021_system_not_fully_up_to_date": "Your system is not fully up-to-date. Please perform a regular upgrade before running the migration to Bullseye.", + "migration_0021_general_warning": "Please note that this migration is a delicate operation. The YunoHost team did its best to review and test it, but the migration might still break parts of the system or its apps.\n\nTherefore, it is recommended to:\n - Perform a backup of any critical data or app. More info on https://yunohost.org/backup;\n - Be patient after launching the migration: Depending on your Internet connection and hardware, it might take up to a few hours for everything to upgrade.", + "migration_0021_problematic_apps_warning": "Please note that the following possibly problematic installed apps were detected. It looks like those were not installed from the YunoHost app catalog, or are not flagged as 'working'. Consequently, it cannot be guaranteed that they will still work after the upgrade: {problematic_apps}", + "migration_0021_modified_files": "Please note that the following files were found to be manually modified and might be overwritten following the upgrade: {manually_modified_files}", + "migration_0021_specific_upgrade": "Starting upgrade of system packages that needs to be upgrade independently...", + "migration_0021_cleaning_up": "Cleaning up cache and packages not useful anymore...", + "migration_0021_weak_certs": "The following certificates were found to still use weak signature algorithms and have to be upgraded to be compatible with the next version of nginx: {certs}", + "migration_0021_patch_yunohost_conflicts": "Applying patch to workaround conflict issue...", "migrations_already_ran": "Those migrations are already done: {ids}", "migrations_cant_reach_migration_file": "Could not access migrations files at the path '%s'", "migrations_dependencies_not_satisfied": "Run these migrations: '{dependencies_id}', before migration {id}.", From 8e25895cbff9a2e374c47b9aa959574066d58248 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Mon, 7 Jun 2021 16:31:39 +0200 Subject: [PATCH 029/619] Fix helpers test: SimpleHTTPServer was python2 only, use http.server for python3/bullseye --- tests/test_helpers.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_helpers.sh b/tests/test_helpers.sh index 55d26483e..153ce1386 100644 --- a/tests/test_helpers.sh +++ b/tests/test_helpers.sh @@ -35,7 +35,7 @@ trap cleanup EXIT SIGINT HTTPSERVER_DIR=$(mktemp -d) HTTPSERVER_PORT=1312 pushd "$HTTPSERVER_DIR" >/dev/null -python -m SimpleHTTPServer $HTTPSERVER_PORT &>/dev/null & +python3 -m http.server $HTTPSERVER_PORT --bind 127.0.0.1 &>/dev/null & HTTPSERVER="$!" popd >/dev/null From a24ea4dafa90932675765c56ffb0f822bf56b675 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Mon, 7 Jun 2021 16:39:06 +0200 Subject: [PATCH 030/619] Stupid python3 issue in helpers --- data/helpers.d/backup | 4 ++-- data/helpers.d/network | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/data/helpers.d/backup b/data/helpers.d/backup index 17da0fb2e..ae746a37b 100644 --- a/data/helpers.d/backup +++ b/data/helpers.d/backup @@ -207,14 +207,14 @@ ynh_restore () { # usage: _get_archive_path ORIGIN_PATH _get_archive_path () { # For security reasons we use csv python library to read the CSV - python -c " + python3 -c " import sys import csv with open(sys.argv[1], 'r') as backup_file: backup_csv = csv.DictReader(backup_file, fieldnames=['source', 'dest']) for row in backup_csv: if row['source']==sys.argv[2].strip('\"'): - print row['dest'] + print(row['dest']) sys.exit(0) raise Exception('Original path for %s not found' % sys.argv[2]) " "${YNH_BACKUP_CSV}" "$1" diff --git a/data/helpers.d/network b/data/helpers.d/network index 2011d502b..4e536a8db 100644 --- a/data/helpers.d/network +++ b/data/helpers.d/network @@ -80,7 +80,7 @@ ynh_validate_ip() [ "$family" == "4" ] || [ "$family" == "6" ] || return 1 - python /dev/stdin << EOF + python3 /dev/stdin << EOF import socket import sys family = { "4" : socket.AF_INET, "6" : socket.AF_INET6 } From 43d924252fa0dc4d6ffdcfcbcb32a3a4f3ee18eb Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Mon, 7 Jun 2021 17:41:57 +0200 Subject: [PATCH 031/619] Fix patch of security repo in sources.list --- src/yunohost/data_migrations/0021_migrate_to_bullseye.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/yunohost/data_migrations/0021_migrate_to_bullseye.py b/src/yunohost/data_migrations/0021_migrate_to_bullseye.py index a5bb1e523..6678fa040 100644 --- a/src/yunohost/data_migrations/0021_migrate_to_bullseye.py +++ b/src/yunohost/data_migrations/0021_migrate_to_bullseye.py @@ -177,12 +177,14 @@ class MyMigration(Migration): # - replace single 'buster' occurence by 'bulleye' # - comments lines containing "backports" # - replace 'buster/updates' by 'bullseye/updates' (or same with -) + # Special note about the security suite: + # https://www.debian.org/releases/bullseye/amd64/release-notes/ch-information.en.html#security-archive for f in sources_list: command = ( f"sed -i {f} " "-e 's@ buster @ bullseye @g' " "-e '/backports/ s@^#*@#@' " - "-e 's@ buster/updates @ bullseye/updates @g' " + "-e 's@ buster/updates @ bullseye-security @g' " "-e 's@ buster-@ bullseye-@g' " ) os.system(command) From 43ef4f4a29e53f139439b4ab46004384abcfcf76 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Mon, 7 Jun 2021 17:44:24 +0200 Subject: [PATCH 032/619] Unecessary i18n strings --- locales/en.json | 2 -- 1 file changed, 2 deletions(-) diff --git a/locales/en.json b/locales/en.json index a479672d7..a739b93c4 100644 --- a/locales/en.json +++ b/locales/en.json @@ -464,9 +464,7 @@ "migration_0021_general_warning": "Please note that this migration is a delicate operation. The YunoHost team did its best to review and test it, but the migration might still break parts of the system or its apps.\n\nTherefore, it is recommended to:\n - Perform a backup of any critical data or app. More info on https://yunohost.org/backup;\n - Be patient after launching the migration: Depending on your Internet connection and hardware, it might take up to a few hours for everything to upgrade.", "migration_0021_problematic_apps_warning": "Please note that the following possibly problematic installed apps were detected. It looks like those were not installed from the YunoHost app catalog, or are not flagged as 'working'. Consequently, it cannot be guaranteed that they will still work after the upgrade: {problematic_apps}", "migration_0021_modified_files": "Please note that the following files were found to be manually modified and might be overwritten following the upgrade: {manually_modified_files}", - "migration_0021_specific_upgrade": "Starting upgrade of system packages that needs to be upgrade independently...", "migration_0021_cleaning_up": "Cleaning up cache and packages not useful anymore...", - "migration_0021_weak_certs": "The following certificates were found to still use weak signature algorithms and have to be upgraded to be compatible with the next version of nginx: {certs}", "migration_0021_patch_yunohost_conflicts": "Applying patch to workaround conflict issue...", "migrations_already_ran": "Those migrations are already done: {ids}", "migrations_cant_reach_migration_file": "Could not access migrations files at the path '%s'", From e22c683c3449b4d659fac5376959c05c550cd4d0 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Mon, 7 Jun 2021 19:17:31 +0200 Subject: [PATCH 033/619] Fix conflict issue on redis-server because bullseye version changed --- debian/control | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/debian/control b/debian/control index cc39a838c..09926c961 100644 --- a/debian/control +++ b/debian/control @@ -45,7 +45,7 @@ Conflicts: iptables-persistent , openssl (>= 1.1.1l-1) , slapd (>= 2.4.58) , dovecot-core (>= 1:2.3.14) - , redis-server (>= 5:6.0.12) + , redis-server (>= 5:6.1) , fail2ban (>= 0.11.3) , iptables (>= 1.8.8) Description: manageable and configured self-hosting server From 0d8b8f6ca340e25d277b1bd2a369850af1cf3d5c Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Mon, 7 Jun 2021 19:22:15 +0200 Subject: [PATCH 034/619] (Re)Drop legacy --others_var --- data/helpers.d/fail2ban | 9 ++------- data/helpers.d/systemd | 6 +----- 2 files changed, 3 insertions(+), 12 deletions(-) diff --git a/data/helpers.d/fail2ban b/data/helpers.d/fail2ban index 6ac7ae6d0..5e3eca706 100644 --- a/data/helpers.d/fail2ban +++ b/data/helpers.d/fail2ban @@ -10,9 +10,8 @@ # # ----------------------------------------------------------------------------- # -# usage 2: ynh_add_fail2ban_config --use_template [--others_var="list of others variables to replace"] +# usage 2: ynh_add_fail2ban_config --use_template # | arg: -t, --use_template - Use this helper in template mode -# | arg: -v, --others_var= - List of others variables to replace separeted by a space for example : 'var_1 var_2 ...' # # This will use a template in `../conf/f2b_jail.conf` and `../conf/f2b_filter.conf` # See the documentation of `ynh_add_config` for a description of the template @@ -65,22 +64,18 @@ ynh_add_fail2ban_config () { # Declare an array to define the options of this helper. local legacy_args=lrmptv - local -A args_array=( [l]=logpath= [r]=failregex= [m]=max_retry= [p]=ports= [t]=use_template [v]=others_var=) + local -A args_array=( [l]=logpath= [r]=failregex= [m]=max_retry= [p]=ports= [t]=use_template) local logpath local failregex local max_retry local ports - local others_var local use_template # Manage arguments with getopts ynh_handle_getopts_args "$@" max_retry=${max_retry:-3} ports=${ports:-http,https} - others_var="${others_var:-}" use_template="${use_template:-0}" - [[ -z "$others_var" ]] || ynh_print_warn --message="Packagers: using --others_var is unecessary since YunoHost 4.2" - if [ $use_template -ne 1 ] then # Usage 1, no template. Build a config file from scratch. diff --git a/data/helpers.d/systemd b/data/helpers.d/systemd index a1baff4b0..3b3a663e2 100644 --- a/data/helpers.d/systemd +++ b/data/helpers.d/systemd @@ -15,17 +15,13 @@ ynh_add_systemd_config () { # Declare an array to define the options of this helper. local legacy_args=stv - local -A args_array=( [s]=service= [t]=template= [v]=others_var=) + local -A args_array=( [s]=service= [t]=template=) local service local template - local others_var # Manage arguments with getopts ynh_handle_getopts_args "$@" service="${service:-$app}" template="${template:-systemd.service}" - others_var="${others_var:-}" - - [[ -z "$others_var" ]] || ynh_print_warn --message="Packagers: using --others_var is unecessary since YunoHost 4.2" ynh_add_config --template="$YNH_APP_BASEDIR/conf/$template" --destination="/etc/systemd/system/$service.service" From f6857625decd69f63bc9a783409003bb2922aeac Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Mon, 7 Jun 2021 22:06:54 +0200 Subject: [PATCH 035/619] Stupid encoding issue in migration 0023 --- src/yunohost/data_migrations/0023_postgresql_11_to_13.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/yunohost/data_migrations/0023_postgresql_11_to_13.py b/src/yunohost/data_migrations/0023_postgresql_11_to_13.py index 30527f0c8..145f15558 100644 --- a/src/yunohost/data_migrations/0023_postgresql_11_to_13.py +++ b/src/yunohost/data_migrations/0023_postgresql_11_to_13.py @@ -78,5 +78,5 @@ class MyMigration(Migration): ) ) - out = out.strip().split("\n") + out = out.strip().split(b"\n") return (returncode, out, err) From 653d7e8127e3485ea562802f11246c21ce813f83 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Sat, 12 Jun 2021 16:23:40 +0200 Subject: [PATCH 036/619] Switch to backups from 4.2 --- src/yunohost/backup.py | 2 +- src/yunohost/tests/test_backuprestore.py | 48 ++++++++++++------------ 2 files changed, 25 insertions(+), 25 deletions(-) diff --git a/src/yunohost/backup.py b/src/yunohost/backup.py index b94eda683..3eb564734 100644 --- a/src/yunohost/backup.py +++ b/src/yunohost/backup.py @@ -866,7 +866,7 @@ class RestoreManager: # early dev for next debian version from_version = re.sub(r'~\w+', '', from_version) - if not from_version or version.parse(from_version) < version.parse("3.8.0"): + if not from_version or version.parse(from_version) < version.parse("4.2.0"): raise YunohostValidationError("restore_backup_too_old") self.archive_path = self.info["path"] diff --git a/src/yunohost/tests/test_backuprestore.py b/src/yunohost/tests/test_backuprestore.py index 30204fa86..2a88e4042 100644 --- a/src/yunohost/tests/test_backuprestore.py +++ b/src/yunohost/tests/test_backuprestore.py @@ -47,8 +47,8 @@ def setup_function(function): for m in function.__dict__.get("pytestmark", []) } - if "with_wordpress_archive_from_3p8" in markers: - add_archive_wordpress_from_3p8() + if "with_wordpress_archive_from_4p2" in markers: + add_archive_wordpress_from_4p2() assert len(backup_list()["archives"]) == 1 if "with_legacy_app_installed" in markers: @@ -70,8 +70,8 @@ def setup_function(function): ) assert app_is_installed("backup_recommended_app") - if "with_system_archive_from_3p8" in markers: - add_archive_system_from_3p8() + if "with_system_archive_from_4p2" in markers: + add_archive_system_from_4p2() assert len(backup_list()["archives"]) == 1 if "with_permission_app_installed" in markers: @@ -148,7 +148,7 @@ def backup_test_dependencies_are_met(): # Dummy test apps (or backup archives) assert os.path.exists( - os.path.join(get_test_apps_dir(), "backup_wordpress_from_3p8") + os.path.join(get_test_apps_dir(), "backup_wordpress_from_4p2") ) assert os.path.exists(os.path.join(get_test_apps_dir(), "legacy_app_ynh")) assert os.path.exists( @@ -217,25 +217,25 @@ def install_app(app, path, additionnal_args=""): ) -def add_archive_wordpress_from_3p8(): +def add_archive_wordpress_from_4p2(): os.system("mkdir -p /home/yunohost.backup/archives") os.system( "cp " - + os.path.join(get_test_apps_dir(), "backup_wordpress_from_3p8/backup.tar.gz") - + " /home/yunohost.backup/archives/backup_wordpress_from_3p8.tar.gz" + + os.path.join(get_test_apps_dir(), "backup_wordpress_from_4p2/backup.tar") + + " /home/yunohost.backup/archives/backup_wordpress_from_4p2.tar" ) -def add_archive_system_from_3p8(): +def add_archive_system_from_4p2(): os.system("mkdir -p /home/yunohost.backup/archives") os.system( "cp " - + os.path.join(get_test_apps_dir(), "backup_system_from_3p8/backup.tar.gz") - + " /home/yunohost.backup/archives/backup_system_from_3p8.tar.gz" + + os.path.join(get_test_apps_dir(), "backup_system_from_4p2/backup.tar") + + " /home/yunohost.backup/archives/backup_system_from_4p2.tar" ) @@ -305,8 +305,8 @@ def test_backup_and_restore_all_sys(mocker): # -@pytest.mark.with_system_archive_from_3p8 -def test_restore_system_from_Ynh3p8(monkeypatch, mocker): +@pytest.mark.with_system_archive_from_4p2 +def test_restore_system_from_Ynh4p2(monkeypatch, mocker): # Backup current system with message(mocker, "backup_created"): @@ -451,9 +451,9 @@ def test_backup_using_copy_method(mocker): # -@pytest.mark.with_wordpress_archive_from_3p8 +@pytest.mark.with_wordpress_archive_from_4p2 @pytest.mark.with_custom_domain("yolo.test") -def test_restore_app_wordpress_from_Ynh3p8(mocker): +def test_restore_app_wordpress_from_Ynh4p2(mocker): with message(mocker, "restore_complete"): backup_restore( @@ -461,7 +461,7 @@ def test_restore_app_wordpress_from_Ynh3p8(mocker): ) -@pytest.mark.with_wordpress_archive_from_3p8 +@pytest.mark.with_wordpress_archive_from_4p2 @pytest.mark.with_custom_domain("yolo.test") def test_restore_app_script_failure_handling(monkeypatch, mocker): def custom_hook_exec(name, *args, **kwargs): @@ -482,7 +482,7 @@ def test_restore_app_script_failure_handling(monkeypatch, mocker): assert not _is_installed("wordpress") -@pytest.mark.with_wordpress_archive_from_3p8 +@pytest.mark.with_wordpress_archive_from_4p2 def test_restore_app_not_enough_free_space(monkeypatch, mocker): def custom_free_space_in_directory(dirpath): return 0 @@ -501,7 +501,7 @@ def test_restore_app_not_enough_free_space(monkeypatch, mocker): assert not _is_installed("wordpress") -@pytest.mark.with_wordpress_archive_from_3p8 +@pytest.mark.with_wordpress_archive_from_4p2 def test_restore_app_not_in_backup(mocker): assert not _is_installed("wordpress") @@ -517,7 +517,7 @@ def test_restore_app_not_in_backup(mocker): assert not _is_installed("yoloswag") -@pytest.mark.with_wordpress_archive_from_3p8 +@pytest.mark.with_wordpress_archive_from_4p2 @pytest.mark.with_custom_domain("yolo.test") def test_restore_app_already_installed(mocker): @@ -627,7 +627,7 @@ def test_restore_archive_with_no_json(mocker): # Create a backup with no info.json associated os.system("touch /tmp/afile") - os.system("tar -czvf /home/yunohost.backup/archives/badbackup.tar.gz /tmp/afile") + os.system("tar -cvf /home/yunohost.backup/archives/badbackup.tar /tmp/afile") assert "badbackup" in backup_list()["archives"] @@ -635,18 +635,18 @@ def test_restore_archive_with_no_json(mocker): backup_restore(name="badbackup", force=True) -@pytest.mark.with_wordpress_archive_from_3p8 +@pytest.mark.with_wordpress_archive_from_4p2 def test_restore_archive_with_bad_archive(mocker): # Break the archive os.system( - "head -n 1000 /home/yunohost.backup/archives/backup_wordpress_from_3p8.tar.gz > /home/yunohost.backup/archives/backup_wordpress_from_3p8_bad.tar.gz" + "head -n 1000 /home/yunohost.backup/archives/backup_wordpress_from_4p2.tar > /home/yunohost.backup/archives/backup_wordpress_from_4p2_bad.tar" ) - assert "backup_wordpress_from_3p8_bad" in backup_list()["archives"] + assert "backup_wordpress_from_4p2_bad" in backup_list()["archives"] with raiseYunohostError(mocker, "backup_archive_corrupted"): - backup_restore(name="backup_wordpress_from_3p8_bad", force=True) + backup_restore(name="backup_wordpress_from_4p2_bad", force=True) clean_tmp_backup_directory() From 82812bac2fb607a2ce2573efb96135b79c88e1ed Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Sat, 12 Jun 2021 18:01:43 +0200 Subject: [PATCH 037/619] Change service status hack for postgresql, 11 -> 13 --- src/yunohost/service.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/yunohost/service.py b/src/yunohost/service.py index 62f40d29c..b015d37cd 100644 --- a/src/yunohost/service.py +++ b/src/yunohost/service.py @@ -665,7 +665,7 @@ def _get_services(): if "postgresql" in services: if "description" in services["postgresql"]: del services["postgresql"]["description"] - services["postgresql"]["actual_systemd_service"] = "postgresql@11-main" + services["postgresql"]["actual_systemd_service"] = "postgresql@13-main" return services From 0843d35cc56dd19300dd33623caaee7e07984ee8 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Sat, 12 Jun 2021 18:02:12 +0200 Subject: [PATCH 038/619] Remove old hack for vpnclient --- src/yunohost/service.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/yunohost/service.py b/src/yunohost/service.py index b015d37cd..302b96167 100644 --- a/src/yunohost/service.py +++ b/src/yunohost/service.py @@ -653,9 +653,6 @@ def _get_services(): # Dirty hack to check the status of ynh-vpnclient if "ynh-vpnclient" in services: - status_check = "systemctl is-active openvpn@client.service" - if "test_status" not in services["ynh-vpnclient"]: - services["ynh-vpnclient"]["test_status"] = status_check if "log" not in services["ynh-vpnclient"]: services["ynh-vpnclient"]["log"] = ["/var/log/ynh-vpnclient.log"] From 20b5843b42dff6bea64200cc3fa367b517e9004d Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Sat, 12 Jun 2021 18:06:22 +0200 Subject: [PATCH 039/619] Remove php7.3-fpm from service list --- data/templates/yunohost/services.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/data/templates/yunohost/services.yml b/data/templates/yunohost/services.yml index b6ce7c117..5e19cd4c6 100644 --- a/data/templates/yunohost/services.yml +++ b/data/templates/yunohost/services.yml @@ -67,4 +67,5 @@ spamassassin: null rmilter: null php5-fpm: null php7.0-fpm: null +php7.3-fpm: nslcd: null From a274b6a8fca4ceebac9f685b57d862c4554be67f Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Sat, 3 Jul 2021 18:14:24 +0200 Subject: [PATCH 040/619] fix: Remove legacy --installed / filter for app_list in actionmap --- data/actionsmap/yunohost.yml | 6 ------ 1 file changed, 6 deletions(-) diff --git a/data/actionsmap/yunohost.yml b/data/actionsmap/yunohost.yml index 0631a20c9..f86db5495 100644 --- a/data/actionsmap/yunohost.yml +++ b/data/actionsmap/yunohost.yml @@ -602,12 +602,6 @@ app: full: --full help: Display all details, including the app manifest and various other infos action: store_true - -i: - full: --installed - help: Dummy argument, does nothing anymore (still there only for backward compatibility) - action: store_true - filter: - nargs: '?' ### app_info() info: From 713612a6898d7fd9ed1b70d6c679ea65da134990 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Fri, 9 Jul 2021 21:50:41 +0200 Subject: [PATCH 041/619] Get rid of legacy script to reset ldap password --- debian/install | 1 - sbin/yunohost-reset-ldap-password | 3 --- 2 files changed, 4 deletions(-) delete mode 100755 sbin/yunohost-reset-ldap-password diff --git a/debian/install b/debian/install index 1691a4849..bc3cc1f48 100644 --- a/debian/install +++ b/debian/install @@ -1,5 +1,4 @@ bin/* /usr/bin/ -sbin/* /usr/sbin/ data/bash-completion.d/yunohost /etc/bash_completion.d/ doc/yunohost.8.gz /usr/share/man/man8/ data/actionsmap/* /usr/share/moulinette/actionsmap/ diff --git a/sbin/yunohost-reset-ldap-password b/sbin/yunohost-reset-ldap-password deleted file mode 100755 index 95f84875f..000000000 --- a/sbin/yunohost-reset-ldap-password +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/bash -echo "Warning: this script is now deprecated. You can simply type 'yunohost tools adminpw' to change the root/admin password." -yunohost tools adminpw From 16b0411ea98732e36b71e76353a889768a824cb8 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Wed, 11 Aug 2021 15:45:35 +0200 Subject: [PATCH 042/619] Re-add legacy_permission_label so that we don't break the old legacy permission settings --- src/yunohost/utils/legacy.py | 51 ++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 src/yunohost/utils/legacy.py diff --git a/src/yunohost/utils/legacy.py b/src/yunohost/utils/legacy.py new file mode 100644 index 000000000..f3243eb52 --- /dev/null +++ b/src/yunohost/utils/legacy.py @@ -0,0 +1,51 @@ +LEGACY_PERMISSION_LABEL = { + ("nextcloud", "skipped"): "api", # .well-known + ("libreto", "skipped"): "pad access", # /[^/]+ + ("leed", "skipped"): "api", # /action.php, for cron task ... + ("mailman", "protected"): "admin", # /admin + ("prettynoemiecms", "protected"): "admin", # /admin + ("etherpad_mypads", "skipped"): "admin", # /admin + ("baikal", "protected"): "admin", # /admin/ + ("couchpotato", "unprotected"): "api", # /api + ("freshrss", "skipped"): "api", # /api/, + ("portainer", "skipped"): "api", # /api/webhooks/ + ("jeedom", "unprotected"): "api", # /core/api/jeeApi.php + ("bozon", "protected"): "user interface", # /index.php + ( + "limesurvey", + "protected", + ): "admin", # /index.php?r=admin,/index.php?r=plugins,/scripts + ("kanboard", "unprotected"): "api", # /jsonrpc.php + ("seafile", "unprotected"): "medias", # /media + ("ttrss", "skipped"): "api", # /public.php,/api,/opml.php?op=publish + ("libreerp", "protected"): "admin", # /web/database/manager + ("z-push", "skipped"): "api", # $domain/[Aa]uto[Dd]iscover/.* + ("radicale", "skipped"): "?", # $domain$path_url + ( + "jirafeau", + "protected", + ): "user interface", # $domain$path_url/$","$domain$path_url/admin.php.*$ + ("opensondage", "protected"): "admin", # $domain$path_url/admin/ + ( + "lstu", + "protected", + ): "user interface", # $domain$path_url/login$","$domain$path_url/logout$","$domain$path_url/api$","$domain$path_url/extensions$","$domain$path_url/stats$","$domain$path_url/d/.*$","$domain$path_url/a$","$domain$path_url/$ + ( + "lutim", + "protected", + ): "user interface", # $domain$path_url/stats/?$","$domain$path_url/manifest.webapp/?$","$domain$path_url/?$","$domain$path_url/[d-m]/.*$ + ( + "lufi", + "protected", + ): "user interface", # $domain$path_url/stats$","$domain$path_url/manifest.webapp$","$domain$path_url/$","$domain$path_url/d/.*$","$domain$path_url/m/.*$ + ( + "gogs", + "skipped", + ): "api", # $excaped_domain$excaped_path/[%w-.]*/[%w-.]*/git%-receive%-pack,$excaped_domain$excaped_path/[%w-.]*/[%w-.]*/git%-upload%-pack,$excaped_domain$excaped_path/[%w-.]*/[%w-.]*/info/refs +} + + +def legacy_permission_label(app, permission_type): + return LEGACY_PERMISSION_LABEL.get( + (app, permission_type), "Legacy %s urls" % permission_type + ) From 996a399f94f3e15f507dbf1334ebff37c4fa2e22 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Fri, 13 Aug 2021 17:58:46 +0200 Subject: [PATCH 043/619] bullseye migration: add new apg .deb signing key --- src/yunohost/data_migrations/0021_migrate_to_bullseye.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/yunohost/data_migrations/0021_migrate_to_bullseye.py b/src/yunohost/data_migrations/0021_migrate_to_bullseye.py index 6678fa040..4b40fcbe0 100644 --- a/src/yunohost/data_migrations/0021_migrate_to_bullseye.py +++ b/src/yunohost/data_migrations/0021_migrate_to_bullseye.py @@ -36,6 +36,13 @@ class MyMigration(Migration): logger.info(m18n.n("migration_0021_start")) + # + # Add new apt .deb signing key + # + + new_apt_key = "https://forge.yunohost.org/yunohost_bullseye.asc" + check_output(f"wget -O- {new_apt_key} -q | apt-key add -qq -") + # # Patch sources.list # From 9bcb7e0b9ef6e54e9eb6b42913343cfd14e742cc Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Tue, 21 Sep 2021 16:08:24 +0200 Subject: [PATCH 044/619] certificate.py: drop legacy 000-acmechallenge.conf stuff --- src/yunohost/certificate.py | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/src/yunohost/certificate.py b/src/yunohost/certificate.py index 817f9d57a..eb9d19c0b 100644 --- a/src/yunohost/certificate.py +++ b/src/yunohost/certificate.py @@ -500,13 +500,7 @@ Subject: %s def _check_acme_challenge_configuration(domain): domain_conf = "/etc/nginx/conf.d/%s.conf" % domain - if "include /etc/nginx/conf.d/acme-challenge.conf.inc" in read_file(domain_conf): - return True - else: - # This is for legacy setups which haven't updated their domain conf to - # the new conf that include the acme snippet... - legacy_acme_conf = "/etc/nginx/conf.d/%s.d/000-acmechallenge.conf" % domain - return os.path.exists(legacy_acme_conf) + return "include /etc/nginx/conf.d/acme-challenge.conf.inc" in read_file(domain_conf) def _fetch_and_enable_new_certificate(domain, staging=False, no_checks=False): From a6c72566a5f2e733aa1377497e36208a68f47d59 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Tue, 21 Sep 2021 16:09:06 +0200 Subject: [PATCH 045/619] services.py: drop legacy hack for glances --- src/yunohost/regenconf.py | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/src/yunohost/regenconf.py b/src/yunohost/regenconf.py index ef3c29b32..afcfb4360 100644 --- a/src/yunohost/regenconf.py +++ b/src/yunohost/regenconf.py @@ -125,16 +125,6 @@ def regen_conf( if not names: names = hook_list("conf_regen", list_by="name", show_info=False)["hooks"] - # Dirty hack for legacy code : avoid attempting to regen the conf for - # glances because it got removed ... This is only needed *once* - # during the upgrade from 3.7 to 3.8 because Yunohost will attempt to - # regen glance's conf *before* it gets automatically removed from - # services.yml (which will happens only during the regen-conf of - # 'yunohost', so at the very end of the regen-conf cycle) Anyway, - # this can be safely removed once we're in >= 4.0 - if "glances" in names: - names.remove("glances") - # [Optimization] We compute and feed the domain list to the conf regen # hooks to avoid having to call "yunohost domain list" so many times which # ends up in wasted time (about 3~5 seconds per call on a RPi2) @@ -451,10 +441,6 @@ def _save_regenconf_infos(infos): categories -- A dict containing the regenconf infos """ - # Ugly hack to get rid of legacy glances stuff - if "glances" in infos: - del infos["glances"] - try: with open(REGEN_CONF_FILE, "w") as f: yaml.safe_dump(infos, f, default_flow_style=False) From 2318ffc49356309683141d5dbd5b12fa3b950df4 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Tue, 21 Sep 2021 16:12:21 +0200 Subject: [PATCH 046/619] regenconf: drop old legacy code --- data/hooks/conf_regen/01-yunohost | 4 ---- data/hooks/conf_regen/37-mdns | 6 ------ 2 files changed, 10 deletions(-) diff --git a/data/hooks/conf_regen/01-yunohost b/data/hooks/conf_regen/01-yunohost index ef0bc09fc..6301708d5 100755 --- a/data/hooks/conf_regen/01-yunohost +++ b/data/hooks/conf_regen/01-yunohost @@ -71,10 +71,6 @@ do_pre_regen() { cd /usr/share/yunohost/templates/yunohost - # Legacy code that can be removed once on bullseye - touch /etc/yunohost/services.yml - yunohost tools shell -c "from yunohost.service import _get_services, _save_services; _save_services(_get_services())" - mkdir -p $pending_dir/etc/systemd/system mkdir -p $pending_dir/etc/cron.d/ mkdir -p $pending_dir/etc/cron.daily/ diff --git a/data/hooks/conf_regen/37-mdns b/data/hooks/conf_regen/37-mdns index 17f7bb8e2..a9ae402fb 100755 --- a/data/hooks/conf_regen/37-mdns +++ b/data/hooks/conf_regen/37-mdns @@ -51,12 +51,6 @@ do_post_regen() { systemctl daemon-reload fi - # Legacy stuff to enable the new yunomdns service on legacy systems - if [[ -e /etc/avahi/avahi-daemon.conf ]] && grep -q 'yunohost' /etc/avahi/avahi-daemon.conf - then - systemctl enable yunomdns - fi - [[ -z "$regen_conf_files" ]] \ || systemctl restart yunomdns } From f597bfe556b42c676d3cc16599327c8060992485 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Tue, 21 Sep 2021 16:32:00 +0200 Subject: [PATCH 047/619] No sbin anymore --- debian/install | 1 - 1 file changed, 1 deletion(-) diff --git a/debian/install b/debian/install index 8c6ba01dd..4680bc6be 100644 --- a/debian/install +++ b/debian/install @@ -1,5 +1,4 @@ bin/* /usr/bin/ -sbin/* /usr/sbin/ data/* /usr/share/yunohost/ data/bash-completion.d/yunohost /etc/bash_completion.d/ doc/yunohost.8.gz /usr/share/man/man8/ From bf21f9d0f2289f1d9385d55c96875c84c01ad433 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Sat, 2 Oct 2021 20:46:34 +0200 Subject: [PATCH 048/619] Stale i18n string --- locales/en.json | 30 ------------------------------ 1 file changed, 30 deletions(-) diff --git a/locales/en.json b/locales/en.json index caf19b44b..54d46f342 100644 --- a/locales/en.json +++ b/locales/en.json @@ -485,28 +485,6 @@ "mailbox_used_space_dovecot_down": "The Dovecot mailbox service needs to be up if you want to fetch used mailbox space", "main_domain_change_failed": "Unable to change the main domain", "main_domain_changed": "The main domain has been changed", - "migrating_legacy_permission_settings": "Migrating legacy permission settings...", - "migration_0015_cleaning_up": "Cleaning up cache and packages not useful anymore...", - "migration_0015_general_warning": "Please note that this migration is a delicate operation. The YunoHost team did its best to review and test it, but the migration might still break parts of the system or its apps.\n\nTherefore, it is recommended to:\n - Perform a backup of any critical data or app. More info on https://yunohost.org/backup;\n - Be patient after launching the migration: Depending on your Internet connection and hardware, it might take up to a few hours for everything to upgrade.", - "migration_0015_main_upgrade": "Starting main upgrade...", - "migration_0015_modified_files": "Please note that the following files were found to be manually modified and might be overwritten following the upgrade: {manually_modified_files}", - "migration_0015_not_enough_free_space": "Free space is pretty low in /var/! You should have at least 1GB free to run this migration.", - "migration_0015_not_stretch": "The current Debian distribution is not Stretch!", - "migration_0015_patching_sources_list": "Patching the sources.lists...", - "migration_0015_problematic_apps_warning": "Please note that the following possibly problematic installed apps were detected. It looks like those were not installed from the YunoHost app catalog, or are not flagged as 'working'. Consequently, it cannot be guaranteed that they will still work after the upgrade: {problematic_apps}", - "migration_0015_specific_upgrade": "Starting upgrade of system packages that needs to be upgrade independently...", - "migration_0015_start": "Starting migration to Buster", - "migration_0015_still_on_stretch_after_main_upgrade": "Something went wrong during the main upgrade, the system appears to still be on Debian Stretch", - "migration_0015_system_not_fully_up_to_date": "Your system is not fully up-to-date. Please perform a regular upgrade before running the migration to Buster.", - "migration_0015_weak_certs": "The following certificates were found to still use weak signature algorithms and have to be upgraded to be compatible with the next version of nginx: {certs}", - "migration_0015_yunohost_upgrade": "Starting YunoHost core upgrade...", - "migration_0017_not_enough_space": "Make sufficient space available in {path} to run the migration.", - "migration_0017_postgresql_11_not_installed": "PostgreSQL 9.6 is installed, but not postgresql 11‽ Something weird might have happened on your system :(...", - "migration_0017_postgresql_96_not_installed": "PostgreSQL was not installed on your system. Nothing to do.", - "migration_0018_failed_to_migrate_iptables_rules": "Failed to migrate legacy iptables rules to nftables: {error}", - "migration_0018_failed_to_reset_legacy_rules": "Failed to reset legacy iptables rules: {error}", - "migration_0019_add_new_attributes_in_ldap": "Add new attributes for permissions in LDAP database", - "migration_0019_slapd_config_will_be_overwritten": "It looks like you manually edited the slapd configuration. For this critical migration, YunoHost needs to force the update of the slapd configuration. The original files will be backuped in {conf_backup_folder}.", "migration_0021_start" : "Starting migration to Bullseye", "migration_0021_patching_sources_list": "Patching the sources.lists...", "migration_0021_main_upgrade": "Starting main upgrade...", @@ -523,12 +501,6 @@ "migration_0023_postgresql_11_not_installed": "PostgreSQL was not installed on your system. Nothing to do.", "migration_0023_postgresql_13_not_installed": "PostgreSQL 11 is installed, but not postgresql 13!? Something weird might have happened on your system :(...", "migration_0023_not_enough_space": "Make sufficient space available in {path} to run the migration.", - "migration_description_0015_migrate_to_buster": "Upgrade the system to Debian Buster and YunoHost 4.x", - "migration_description_0016_php70_to_php73_pools": "Migrate php7.0-fpm 'pool' conf files to php7.3", - "migration_description_0017_postgresql_9p6_to_11": "Migrate databases from PostgreSQL 9.6 to 11", - "migration_description_0018_xtable_to_nftable": "Migrate old network traffic rules to the new nftable system", - "migration_description_0019_extend_permissions_features": "Extend/rework the app permission management system", - "migration_description_0020_ssh_sftp_permissions": "Add SSH and SFTP permissions support", "migration_description_0021_migrate_to_bullseye": "Upgrade the system to Debian Bullseye and YunoHost 11.x", "migration_description_0022_php73_to_php74_pools": "Migrate php7.3-fpm 'pool' conf files to php7.4", "migration_description_0023_postgresql_11_to_13": "Migrate databases from PostgreSQL 11 to 13", @@ -536,7 +508,6 @@ "migration_ldap_can_not_backup_before_migration": "The backup of the system could not be completed before the migration failed. Error: {error}", "migration_ldap_migration_failed_trying_to_rollback": "Could not migrate... trying to roll back the system.", "migration_ldap_rollback_success": "System rolled back.", - "migration_update_LDAP_schema": "Updating LDAP schema...", "migrations_already_ran": "Those migrations are already done: {ids}", "migrations_cant_reach_migration_file": "Could not access migrations files at the path '%s'", "migrations_dependencies_not_satisfied": "Run these migrations: '{dependencies_id}', before migration {id}.", @@ -659,7 +630,6 @@ "service_enable_failed": "Could not make the service '{service}' automatically start at boot.\n\nRecent service logs:{logs}", "service_enabled": "The service '{service}' will now be automatically started during system boots.", "service_not_reloading_because_conf_broken": "Not reloading/restarting service '{name}' because its configuration is broken: {errors}", - "service_regen_conf_is_deprecated": "'yunohost service regen-conf' is deprecated! Please use 'yunohost tools regen-conf' instead.", "service_reload_failed": "Could not reload the service '{service}'\n\nRecent service logs:{logs}", "service_reload_or_restart_failed": "Could not reload or restart the service '{service}'\n\nRecent service logs:{logs}", "service_reloaded": "Service '{service}' reloaded", From 8375ef7d5b95d37f4cfa9cddc81b547b636f8462 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Sat, 2 Oct 2021 20:49:26 +0200 Subject: [PATCH 049/619] Re-drop app_fetchlist legacy --- src/yunohost/app.py | 1 - src/yunohost/app_catalog.py | 10 ---------- 2 files changed, 11 deletions(-) diff --git a/src/yunohost/app.py b/src/yunohost/app.py index 57e5698d0..3ca7f13d0 100644 --- a/src/yunohost/app.py +++ b/src/yunohost/app.py @@ -66,7 +66,6 @@ from yunohost.app_catalog import ( # noqa app_catalog, app_search, _load_apps_catalog, - app_fetchlist, ) logger = getActionLogger("yunohost.app") diff --git a/src/yunohost/app_catalog.py b/src/yunohost/app_catalog.py index e4ffa1db6..e73493366 100644 --- a/src/yunohost/app_catalog.py +++ b/src/yunohost/app_catalog.py @@ -23,16 +23,6 @@ APPS_CATALOG_API_VERSION = 2 APPS_CATALOG_DEFAULT_URL = "https://app.yunohost.org/default" -# Old legacy function... -def app_fetchlist(): - logger.warning( - "'yunohost app fetchlist' is deprecated. Please use 'yunohost tools update --apps' instead" - ) - from yunohost.tools import tools_update - - tools_update(target="apps") - - def app_catalog(full=False, with_categories=False): """ Return a dict of apps available to installation from Yunohost's app catalog From b677157924defca575aa0632fb9f9f45ebde1a6b Mon Sep 17 00:00:00 2001 From: Kay0u Date: Mon, 4 Oct 2021 15:17:59 +0200 Subject: [PATCH 050/619] fix mypy test --- .gitlab/ci/lint.gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab/ci/lint.gitlab-ci.yml b/.gitlab/ci/lint.gitlab-ci.yml index bffd3d7c4..0010e756a 100644 --- a/.gitlab/ci/lint.gitlab-ci.yml +++ b/.gitlab/ci/lint.gitlab-ci.yml @@ -23,7 +23,7 @@ mypy: image: "before-install" needs: [] script: - - tox -e py37-mypy + - tox -e py39-mypy format-check: stage: lint From 9c22329e2b02f9a1fe65bcfdb85ed53b95b9c88e Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Tue, 19 Oct 2021 12:44:50 +0200 Subject: [PATCH 051/619] Moar fixes... --- src/yunohost/domain.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/yunohost/domain.py b/src/yunohost/domain.py index acb0f0168..8eb14a36f 100644 --- a/src/yunohost/domain.py +++ b/src/yunohost/domain.py @@ -462,9 +462,9 @@ class DomainConfigPanel(ConfigPanel): toml = super()._get_toml() toml["feature"]["xmpp"]["xmpp"]["default"] = ( - 1 if self.domain == _get_maindomain() else 0 + 1 if self.entity == _get_maindomain() else 0 ) - toml["dns"]["registrar"] = _get_registrar_config_section(self.domain) + toml["dns"]["registrar"] = _get_registrar_config_section(self.entity) # FIXME: Ugly hack to save the registar id/value and reinject it in _load_current_values ... self.registar_id = toml["dns"]["registrar"]["registrar"]["value"] From d09e3e79b33c124e48deae69ddbb3913d94e3414 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Tue, 19 Oct 2021 12:46:38 +0200 Subject: [PATCH 052/619] ci: test now returns a YunohostError instead of YunohostValidationError --- src/yunohost/tests/test_domains.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/yunohost/tests/test_domains.py b/src/yunohost/tests/test_domains.py index 02d60ead4..50a6eef34 100644 --- a/src/yunohost/tests/test_domains.py +++ b/src/yunohost/tests/test_domains.py @@ -114,5 +114,5 @@ def test_domain_config_set(): def test_domain_configs_unknown(): - with pytest.raises(YunohostValidationError): + with pytest.raises(YunohostError): domain_config_get(TEST_DOMAINS[2], "feature.xmpp.xmpp.xmpp") From 41876f950aec38025d8c784745b59ec6dc97f23d Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Tue, 19 Oct 2021 14:25:54 +0200 Subject: [PATCH 053/619] ci/tests: sigh, YunohostError undefined --- src/yunohost/tests/test_domains.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/yunohost/tests/test_domains.py b/src/yunohost/tests/test_domains.py index 50a6eef34..95a33e0ba 100644 --- a/src/yunohost/tests/test_domains.py +++ b/src/yunohost/tests/test_domains.py @@ -3,7 +3,7 @@ import os from moulinette.core import MoulinetteError -from yunohost.utils.error import YunohostValidationError +from yunohost.utils.error import YunohostError, YunohostValidationError from yunohost.domain import ( DOMAIN_SETTINGS_DIR, _get_maindomain, From 3d19c9f8e00a15f9000fb917f7b7bbae741f0517 Mon Sep 17 00:00:00 2001 From: punkrockgirl Date: Mon, 18 Oct 2021 23:38:25 +0000 Subject: [PATCH 054/619] Translated using Weblate (Basque) Currently translated at 34.2% (242 of 706 strings) Translation: YunoHost/core Translate-URL: https://translate.yunohost.org/projects/yunohost/core/eu/ --- locales/eu.json | 240 +++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 239 insertions(+), 1 deletion(-) diff --git a/locales/eu.json b/locales/eu.json index 0eac41bf4..99735e9ce 100644 --- a/locales/eu.json +++ b/locales/eu.json @@ -6,5 +6,243 @@ "admin_password_change_failed": "Ezinezkoa izan da pasahitza aldatzea", "additional_urls_already_added": "'{url}' URL gehigarria '{permission}' baimenerako gehitu da dagoeneko", "additional_urls_already_removed": "'{url}' URL gehigarriari '{permission}' baimena kendu zaio dagoeneko", - "admin_password": "Administrazio-pasahitza" + "admin_password": "Administrazio-pasahitza", + "diagnosis_ip_global": "IP orokorra: {global}", + "app_argument_password_no_default": "Errorea egon da '{name}' pasahitzaren argumentua ikuskatzean: pasahitzaren argumentuak ezin du balio hori izan segurtasun urria duela-eta", + "app_extraction_failed": "Ezinezkoa izan da instalazio fitxategiak ateratzea", + "app_requirements_unmeet": "{app}(e)k behar dituen baldintzak ez dira betetzen, {pkgname} ({version}) paketea {spec} izan behar da", + "backup_deleted": "Babeskopia ezabatuta", + "app_argument_required": "'{name}' argumentua beharrezkoa da", + "certmanager_acme_not_configured_for_domain": "Ezin da ACME azterketa {domain} domeinurako burutu une honetan nginx konfigurazioak ez duelako beharrezko kodea… Baieztatu nginx-en konfigurazioa egunean dagoela 'yunohost tools regen-conf nginx --dry-run --with-diff' komandoa exekutatuz.", + "certmanager_domain_dns_ip_differs_from_public_ip": "'{domain}' domeinurako DNS balioak ez datoz bat zerbitzariaren IParekin. Mesedez, egiaztatu 'DNS balioak' (oinarrizkoa) kategoria diagnostikoen atalean. A balioak duela gutxi aldatu badituzu, itxaron hedatu daitezen (badaude DNSen hedapena ikusteko erramintak interneten). (Zertan ari zeren baldin badakizu, erabili '--no-checks' egiaztapen horiek desgaitzeko.)", + "confirm_app_install_thirdparty": "KONTUZ! Aplikazio hau ez da YunoHosten aplikazioen katalogokoa. Kanpoko aplikazioek sistemaren integritate eta segurtasuna arriskuan jarri dezakete. Ziur asko EZ zenuke instalatu beharko zertan ari zaren ez badakizu. Aplikazio hau ez badabil edo sistema hondatzen badu EZ DA LAGUNTZARIK EMANGO… aurrera jarraitu nahi duzu hala ere? Aukeratu '{answers}'", + "app_start_remove": "{app} ezabatzen…", + "diagnosis_http_hairpinning_issue_details": "Litekeena da erantzulea zure kable-modem / routerra izatea. Honen eraginez, saretik kanpo daudenek zerbitzaria arazorik gabe erabili ahal izango dute, baina sarean bertan daudenek (ziur asko zure kasua) ezingo dute kanpoko IPa edo domeinu izena erabili zerbitzarira konektatzeko. Egoera hobetu edo guztiz konpontzeko, irakurri dokumentazioa. [Itzultzailearen oharra: SBC merke batean Pi-Hole instalatu eta bertako Local DNS > DNS records baliatu arazo hau ekiditeko]", + "diagnosis_http_special_use_tld": "{domain} domeinua top-level domain (TLD) motakoa da .local edo .test bezala eta ez du sare lokaletik kanpo eskuragarri zertan egon.", + "diagnosis_ip_weird_resolvconf_details": "/etc/resolv.conf fitxategia symlink bat izan beharko litzateke /etc/resolvconf/run/resolv.conf fitxategira 127.0.0.1ra adi dagoena (dnsmasq). DNS ebazleak eskuz konfiguratu nahi badituzu, mesedez aldatu /etc/resolv.dnsmasq.conf fitxategia.", + "diagnosis_ip_connected_ipv4": "Zerbitzaria IPv4 bidez dago internetera konektatuta!", + "diagnosis_basesystem_ynh_inconsistent_versions": "YunoHost paketeen bertsioak ez datoz bat… ziur asko noizbait eguneraketa batek kale egin edo erabat amaitu ez zuelako.", + "diagnosis_high_number_auth_failures": "Azken aldian kale egin duten saio-hasiera saiakera ugari egon dira. Egiaztatu fail2ban martxan dabilela eta egoki konfiguratuta dagoela, edo erabili beste ataka bat SSHrako dokumentazioan azaldu bezala.", + "diagnosis_mail_ehlo_could_not_diagnose": "Ezin izan da egiaztatu postfix posta zerbitzaria IPv{ipversion}az kanpo eskuragarri dagoenik.", + "app_id_invalid": "Aplikazio ID okerra", + "app_install_files_invalid": "Fitxategi hauek ezin dira instalatu", + "diagnosis_description_ip": "Internet konexioa", + "diagnosis_description_dnsrecords": "DNS erregistroak", + "app_label_deprecated": "Komando hau zaharkitua dago! Mesedez erabili 'yunohost user permission update' komando berria aplikazioaren etiketa kudeatzeko.", + "confirm_app_install_danger": "KONTUZ! Aplikazio hau esperimentala da (edo ez dabil)! Ez zenuke instalatu beharko zertan ari zaren ez badakizu. Aplikazio hau ez badabil edo sistema hondatzen badu, EZ DA LAGUNTZARIK EMANGO… aurrera jarraitu nahi al duzu hala ere? Aukeratu '{answers}'", + "diagnosis_description_systemresources": "Sistemaren baliabideak", + "backup_csv_addition_failed": "Ezin izan dira fitxategiak CSV fitxategira kopiatu", + "backup_no_uncompress_archive_dir": "Ez dago horrelako deskonprimatutako fitxategi katalogorik", + "danger": "Arriskua:", + "diagnosis_dns_discrepancy": "Ez dirudi ondorengo DNS balioak bat datozenik proposatutako konfigurazioarekin:
Mota: {type}
Izena: {name}
Oraingo balioa: {current}
Proposatutako balioa: {value}", + "diagnosis_dns_specialusedomain": "{domain} domeinua top-level domain (TLD) erabilera berezikoa da .local edo .test bezala eta horregatik ez du DNS erregistrorik erabiltzen.", + "diagnosis_http_bad_status_code": "Badirudi zerbitzaria ez den beste gailu batek erantzun diola eskaerari (agian routerrak).
1. Honen arrazoi ohikoena 80 (eta 443) ataka zerbitzarira ondo birbidaltzen ez dela da.
2. Konfigurazio konplexua badarabilzu, egiaztatu suebakiak edo reverse-proxyk oztopatzen ez dutela.", + "diagnosis_http_timeout": "Denbora agortu da sare lokaletik kanpo zure zerbitzarira konexioa gauzatzeko ahaleginean. Eskuragarri ez dagoela dirudi.
1. 80 (eta 443) ataka zerbitzarira modu egokian birbidaltzen ez direla da ohiko arrazoia.
2. Badaezpada egiaztatu nginx martxan dagoela.
3. Konfigurazio konplexuetan, egiaztatu suebakiak edo reverse-proxyk konexioa oztopatzen ez dutela.", + "app_sources_fetch_failed": "Ezin izan dira fitxategiak eskuratu, zuzena al da URLa?", + "app_make_default_location_already_used": "Ezinezkoa izan da '{app}' domeinuko aplikazio nagusi ezartzea, '{other_app}'(e)k dagoeneko '{domain}' erabiltzen duelako", + "app_already_installed_cant_change_url": "Aplikazio hau instalatuta dago dagoeneko. URLa ezin da aldatu aukera honekin. Markatu `app changeurl` markatzeko moduan badago.", + "diagnosis_ip_not_connected_at_all": "Badirudi zerbitzaria ez dagoela internetera konektatuta!?", + "app_already_up_to_date": "{app} aplikazioa egunean da dagoeneko", + "app_change_url_success": "{app} aplikazioaren URLa {domain}{path} da orain", + "admin_password_too_long": "Mesedez aukeratu 127 karaktere baino laburragoa den pasahitz bat", + "app_action_broke_system": "Ekintza honek {services} zerbitzu garrantzitsuak hondatu dituela dirudi", + "diagnosis_basesystem_hardware_model": "Zerbitzariaren modeloa {model} da", + "already_up_to_date": "Ez dago egiteko ezer. Guztia dago egunean.", + "backup_permission": "{app}(r)entzat babeskopia baimena", + "config_validate_date": "UUUU-HH-EE formatua duen data bat izan behar da", + "config_validate_email": "Benetazko posta elektronikoa izan behar da", + "config_validate_time": "OO:MM formatua duen ordu bat izan behar da", + "config_validate_url": "Benetazko URL bat izan behar da", + "config_version_not_supported": "Ezin da konfigurazio-panelaren '{version}' bertsioa erabili.", + "app_restore_script_failed": "Errorea gertatu da aplikazioa lehengoratzeko aginduan", + "app_upgrade_some_app_failed": "Ezin izan dira aplikazio batzuk eguneratu", + "app_install_failed": "Ezinezkoa izan da {app} instalatzea: {error}", + "diagnosis_basesystem_kernel": "Zerbitzariak Linuxen {kernel_version} kernela darabil", + "app_argument_invalid": "Aukeratu balio onargarri bat {name}' argumenturako: {error}", + "app_already_installed": "{app} instalatuta dago dagoeneko", + "app_config_unable_to_apply": "Ezinezkoa izan da konfigurazio aukerak ezartzea.", + "app_config_unable_to_read": "Ezinezkoa izan da konfigurazio aukerak irakurtzea.", + "config_apply_failed": "Ezin izan da konfigurazio berria ezarri: {error}", + "config_cant_set_value_on_section": "Ezin da balio bakar bat ezarri konfigurazio atal oso batean.", + "config_no_panel": "Ez da konfigurazio-panelik aurkitu.", + "diagnosis_found_errors_and_warnings": "{category} atalari dago(z)kion {errors} arazoa(k) (eta {warnings} abisua(k)) aurkitu d(ir)a!", + "diagnosis_description_regenconf": "Sistemaren ezarpenak", + "app_upgrade_script_failed": "Errore bat gertatu da aplikazioaren eguneratze aginduan", + "diagnosis_basesystem_hardware": "Zerbitzariaren arkitektura {virt} {arch} da", + "diagnosis_mail_ehlo_ok": "SMTP posta zerbitzaria eskuragarri dago kanpoko saretik eta beraz, posta elektronikoa jasotzeko gai da!", + "app_unknown": "Aplikazio ezezaguna", + "diagnosis_mail_ehlo_bad_answer": "SMTP ez den zerbitzu batek erantzun du IPv{ipversion}ko 25. atakan", + "diagnosis_mail_ehlo_could_not_diagnose_details": "Errorea: {error}", + "diagnosis_mail_blacklist_ok": "Zerbitzari honek darabiltzan IPak eta domeinuak ez dirudi inolako zerrenda beltzetan daudenik", + "diagnosis_domain_expiration_error": "Domeinu batzuk IRAUNGITZEAR daude!", + "diagnosis_domain_expiration_success": "Domeinuak erregistratuta daude eta ez dira oraingoz iraungiko.", + "app_manifest_install_ask_is_public": "Saiorik hasi gabeko bisitarientzat ikusgai egon beharko litzateke aplikazio hau?", + "diagnosis_domain_expires_in": "{domain} {days} egun barru iraungiko da.", + "app_manifest_install_ask_domain": "Aukeratu zein domeinutan instalatu nahi duzun aplikazio hau", + "custom_app_url_required": "URL bat zehaztu behar duzu {app} eguneratzeko", + "app_change_url_identical_domains": "Domeinu zahar eta berriaren bidea bera dira: ('{domain}{path}'), ez dago ezer egitekorik.", + "app_upgrade_failed": "Ezinezkoa {app} eguneratzea: {error}", + "app_upgrade_app_name": "Orain {app} eguneratzen…", + "app_upgraded": "{app} eguneratu da", + "ask_firstname": "Izena", + "ask_lastname": "Abizena", + "ask_main_domain": "Domeinu nagusia", + "config_forbidden_keyword": "'{keyword}' etiketa sistemak bakarrik erabil dezake; ezin da ID hau daukan baliorik sortu edo erabili.", + "config_unknown_filter_key": "'{filter_key}' filtroaren kakoa ez da zuzena.", + "config_validate_color": "RGB hamaseitar kolore bat izan behar da", + "diagnosis_cant_run_because_of_dep": "Ezin da diagnosia abiarazi {category} atalerako {dep}(r)i lotutako arazo garrantzitsuek dirauen artean.", + "diagnosis_dns_missing_record": "Proposatutako DNS konfigurazioaren arabera, ondorengo informazioa gehitu beharko zenuke DNS erregistroan:
Mota: {type}
Izena: {name}
Balioa: {value}", + "diagnosis_http_nginx_conf_not_up_to_date": "Domeinu honen nginx konfigurazioa eskuz moldatu dela dirudi eta YunoHostek ezin du egiaztatu HTTP bidez eskuragarri dagoen.", + "ask_new_admin_password": "Administrazio-pasahitz berria", + "ask_new_domain": "Domeinu berria", + "ask_new_path": "Bide berria", + "ask_password": "Pasahitza", + "backup_abstract_method": "Babeskopia modu hau oraindik ez da go erabilgarri", + "backup_applying_method_custom": "'{method}' neurrira egindako babeskopia sortzen…", + "backup_applying_method_copy": "Babeskopiarako fitxategi guztiak kopiatzen…", + "backup_archive_app_not_found": "Ezin izan da {app} aurkitu babeskopia fitxategian", + "backup_applying_method_tar": "Babeskopiaren TAR fitxategia sortzen…", + "backup_archive_broken_link": "Ezin izan da babeskopiaren fitxategia eskuratu ({path}ra esteka okerra)", + "backup_creation_failed": "Ezin izan da babeskopiaren fitxategia sortu", + "backup_csv_creation_failed": "Ezin izan da lehengoratzeko beharrezkoak diren CSV fitxategiak sortu", + "backup_custom_mount_error": "Neurrira egindako babeskopiak ezin izan du 'muntatu' urratsetik haratago egin", + "backup_delete_error": "Ezin izan da '{path}' ezabatu", + "backup_method_copy_finished": "Babeskopiak amaitu du", + "backup_hook_unknown": "Babeskopiaren '{hook}' kakoa ez da ezagutzen", + "backup_method_custom_finished": "'{method}' neurrira egindako babeskopiak amaitu du", + "backup_method_tar_finished": "TAR babeskopia artxiboa sortu da", + "backup_mount_archive_for_restore": "Lehengoratzeko fitxategoak prestatzen…", + "backup_nothings_done": "Ez dago gordetzeko ezer", + "backup_output_directory_required": "Babeskopia non gorde nahi duzun zehaztu behar duzu", + "backup_system_part_failed": "Ezin izan da sistemaren '{part}' atalaren babeskopia egin", + "apps_catalog_updating": "Aplikazioen katalogoa eguneratzen…", + "certmanager_cert_signing_failed": "Ezin izan da ziurtagiri berria sinatu", + "certmanager_cert_renew_success": "Let's Encrypt ziurtagiria berriztu da '{domain}' domeinurako", + "app_requirements_checking": "{app}(e)k behar dituen paketeak ikuskatzen…", + "certmanager_unable_to_parse_self_CA_name": "Ezin izan da norberak sinatutako ziurtagiriaren izena prozesatu (fitxategia: {file})", + "app_remove_after_failed_install": "Aplikazioa ezabatzen instalatzerakoan errorea dela-eta…", + "diagnosis_basesystem_ynh_single_version": "{package} bertsioa: {version} ({repo})", + "diagnosis_failed_for_category": "'{category}' ataleko diagnostikoak kale egin du: {error}", + "diagnosis_cache_still_valid": "(Cachea oraindik baliogarria da {category} (ar)en diagnosirako. Ez da berrabiaraziko!)", + "diagnosis_found_errors": "{category} atalari dago(z)kion {errors} arazoa(k) aurkitu d(ir)a!", + "diagnosis_found_warnings": "{category} atalari dagokion eta hobetu daite(z)keen {warnings} abisua(k) aurkitu d(ir)a.", + "diagnosis_ip_connected_ipv6": "Zerbitzaria IPv6 bidez dago internetera konektatuta!", + "diagnosis_everything_ok": "Itxura ona dauka {category} atalak!", + "diagnosis_ip_no_ipv4": "Zerbitzariak ez du dabilen IPv4rik.", + "diagnosis_ip_no_ipv6": "Zerbitzariak ez du dabilen IPv6rik.", + "diagnosis_ip_broken_dnsresolution": "Domeinu izenaren ebazpena hondatuta dagoela dirudi… Suebakiren bat ote dago DNS eskaerak oztopatzen?", + "diagnosis_diskusage_low": "{mountpoint} euskarriak ({device} gailuan) edukieraren {free} ({free_percent}%) bakarrik du erabilgarri ({total} orotara). Kontuz ibili.", + "diagnosis_dns_good_conf": "DNS ezarpenak zuzen konfiguratuta daude {domain} domeinurako ({category} atala)", + "diagnosis_diskusage_verylow": "{mountpoint} euskarriak ({device} gailuan) edukieraren {free} ({free_percent}%) bakarrik du erabilgarri ({total} orotara). Zertxobait hustu beharko zenuke!", + "diagnosis_description_basesystem": "Sistemaren oinarria", + "diagnosis_description_services": "Zerbitzuen egoeraren egiaztapena", + "diagnosis_http_could_not_diagnose": "Ezin izan da egiaztatu domeinuak IPv{ipversion} kanpotik eskuragarri daudenik.", + "diagnosis_http_ok": "Ezin da {domain} domeinua HTTP bidez bisitatu sare lokaletik kanpo.", + "diagnosis_http_unreachable": "Badirudi {domain} domeinua ez dagoela eskuragarri HTTP bidez sare lokaletik kanpo.", + "apps_catalog_failed_to_download": "Ezinezkoa izan da {apps_catalog} aplikazioen zerrenda eskuratzea: {error}", + "apps_catalog_init_success": "Abiarazi da aplikazioen katalogo sistema!", + "apps_catalog_obsolete_cache": "Aplikazioen katalogoaren cachea hutsik edo zaharkituta dago.", + "diagnosis_description_mail": "Posta elektronikoa", + "diagnosis_http_connection_error": "Arazoa konexioan: ezin izan da domeinu horretara konektatu, litekeena da eskuragaitza izatea.", + "diagnosis_description_web": "Weba", + "diagnosis_display_tip": "Aurkitu diren arazoak ikusteko joan Diagnosien atalera administrazio-webgunean, edo exekutatu 'yunohost diagnosis show --issues --human-readable' komandoak nahiago badituzu.", + "diagnosis_dns_point_to_doc": "Mesedez, irakurri dokumentazioa DNS erregistroekin laguntza behar baduzu.", + "diagnosis_mail_ehlo_unreachable": "SMTP posta zerbitzaria ez dago eskuragarri IPv{ipversion}ko sare lokaletik kanpo eta beraz, ez da posta elektronikoa jasotzeko gai.", + "diagnosis_mail_ehlo_bad_answer_details": "Litekeena da zure zerbitzaria ez den beste gailu batek erantzun izana.", + "diagnosis_mail_blacklist_listed_by": "Zure IP edo {item} domeinua {blacklist_name} zerrenda beltzean ageri da", + "diagnosis_mail_blacklist_website": "Zerrenda beltzean zergatik zauden ulertu eta konpondu ondoren, {blacklist_website} webgunean zure IP edo domeinua bertatik atera dezatela eska dezakezu", + "diagnosis_http_could_not_diagnose_details": "Errorea: {error}", + "diagnosis_http_hairpinning_issue": "Dirudienez zure sareak ez du hairpinninga gaituta.", + "diagnosis_http_partially_unreachable": "Badirudi {domain} domeinua ezin dela bisitatu HTTP bidez IPv{failed} sare lokaletik kanpo, bai ordea IPv{passed} erabiliz.", + "backup_archive_cant_retrieve_info_json": "Ezin izan da '{archive}' fitxategiko informazioa eskuratu… info.json ezin izan da eskuratu (edo ez da baliozko jsona).", + "diagnosis_domain_expiration_not_found": "Ezin izan da domeinu batzuen iraungitze data egiaztatu", + "diagnosis_domain_expiration_not_found_details": "Dirudienez {domain} domeinuari buruzko WHOIS informazioak ez du zehazten noiz iraungiko den.", + "certmanager_domain_not_diagnosed_yet": "Oraindik ez dago {domain} domeinurako diagnostikorik. Mesedez, berrabiarazi diagnostikoak 'DNS balioak' eta 'Web' ataletarako diagnostikoen gunean Let's Encrypt ziurtagirirako prest ote dagoen egiaztatzeko. (Edo zertan ari zaren baldin badakizu, erabili '--no-checks' egiaztatzea desgaitzeko.)", + "diagnosis_domain_expiration_warning": "Domeinu batzuk iraungitzear daude!", + "app_packaging_format_not_supported": "Aplikazio hau ezin da instalatu YunoHostek ez duelako paketea ezagutzen. Sistema eguneratzea hausnartu beharko zenuke ziur asko.", + "diagnosis_dns_try_dyndns_update_force": "Domeinu honen DNS konfigurazioa YunoHostek kudeatu beharko luke automatikoki. Gertatuko ez balitz, eguneratzera behartu zenezake yunohost dyndns update --force erabiliz.", + "app_manifest_install_ask_path": "Aukeratu aplikazio hau instalatzeko URLaren bidea (domeinuaren atzeko aldean)", + "app_manifest_install_ask_admin": "Aukeratu administrati bat aplikazio honetarako", + "app_manifest_install_ask_password": "Aukeratu administrazio-pasahitz bat aplikazio honetarako", + "ask_user_domain": "Erabiltzailearen posta elektroniko eta XMPP konturako erabiliko den domeinua", + "app_action_cannot_be_ran_because_required_services_down": "{services} zerbitzuak martxan egon beharko lirateke ekintza hau gauzatu ahal izateko. Saia zaitez zerbitzuok berrabiarazten (eta ikertu zergatik abiarazi ez diren).", + "apps_already_up_to_date": "Egunean daude dagoeneko aplikazio guztiak", + "app_full_domain_unavailable": "Aplikazio honek bere domeinu propioa behar du, baina beste aplikazio batzuk daude dagoeneko instalatuta '{domain}' domeinuan. Azpidomeinu bat erabil zenezake instalatu nahi duzun aplikaziorako.", + "app_install_script_failed": "Errore bat gertatu da aplikazioaren instalatzailearen aginduetan", + "diagnosis_basesystem_host": "Zerbitzariak Debian {debian_version} darabil", + "diagnosis_ignored_issues": "(kontuan hartu ez d(ir)en + {nb_ignored} arazoa(k))", + "diagnosis_ip_dnsresolution_working": "Domeinu izenaren ebazpena badabil!", + "diagnosis_failed": "Ezin izan da '{category}' ataleko diagnostikoa lortu: {error}", + "diagnosis_ip_weird_resolvconf": "DNS ebazpena badabilela dirudi, baina antza denez moldatutako /etc/resolv.conf fitxategia erabiltzen ari zara.", + "diagnosis_dns_bad_conf": "DNS balio batzuk falta dira edo ez dira zuzenak {domain} domeinurako ({category} atala)", + "diagnosis_diskusage_ok": "{mountpoint} euskarriak ({device} gailuan) edukieraren {free} ({free_percent}%) du erabilgarri oraindik ({total} orotara)!", + "apps_catalog_update_success": "Aplikazioen katalogoa eguneratu da!", + "certmanager_warning_subdomain_dns_record": "'{subdomain}' azpidomeinuak ez dauka '{domain}'(e)k duen IP bera. Ezaugarri batzuk ez dira erabilgarri egongo hau zuzendu arte eta ziurtagiri bat birsortu arte.", + "app_argument_choice_invalid": "Aukeratu ({choices}) aukeretako bat '{name}' argumenturako: '{value}' ez dago aukera horien artean", + "backup_create_size_estimation": "Fitxategiak {size} datu inguru izango ditu.", + "diagnosis_basesystem_ynh_main_version": "Zerbitzariak YunoHosten {main_version} ({repo}) darabil", + "backup_custom_backup_error": "Neurrira egindako babeskopiak ezin izan du 'babeskopia egin' urratsetik haratago egin", + "diagnosis_ip_broken_resolvconf": "Zure zerbitzarian domeinu izenaren ebazpena hondatuta dagoela dirudi, antza denez /etc/resolv.conf fitxategia ez dago 127.0.0.1ra adi.", + "diagnosis_ip_no_ipv6_tip": "Dabilen IPv6 izatea ez da derrigorrezkoa zerbitzariaren funtzionamendurako, baina egokiena da interneten osasunerako. IPv6 automatikoki konfiguratu beharko luke sistemak edo telefono-konpainiak. Bestela, eskuz konfiguratu beharko zenituzke hainbat gauza dokumentazioan azaltzen den bezala. Ezin baduzu edo IPv6 gaitzea zuretzat kontu teknikoegia baldin bada, ez duzu abisu hau zertan kontutan hartu.", + "diagnosis_http_nginx_conf_not_up_to_date_details": "Egoera konpontzeko, ikuskatu desberdintasunak yunohost tools regen-conf nginx --dry-run --with-diff komandoren bidez eta, proposatutako aldaketak onartzen badituzu, ezarri itzazu yunohost tools regen-conf nginx --force erabiliz.", + "diagnosis_domain_not_found_details": "{domain} domeinua ez da WHOISen datubasean existitzen edo iraungi da!", + "app_start_backup": "{app}(r)en babes-kopia egiteko fitxategiak hartzen…", + "app_change_url_no_script": "'{app_name}' aplikazioak ez du URLa moldatzerik onartzen momentuz. Agian eguneratu beharko zenuke.", + "app_location_unavailable": "URL hau ez dago erabilgarri edota dagoeneko instalatutako aplikazioren batekin talka egiten du:\n{apps}", + "app_not_upgraded": "'{failed_app}' aplikazioa ezin izan da eguneratu, eta horregatik ondorengo aplikazioen eguneraketak bertan behera utzi dira: {apps}", + "app_not_correctly_installed": "Ez dirudi {app} ondo instalatuta dagoenik", + "app_not_installed": "Ezinezkoa izan da {app} aurkitzea instalatutako aplikazioen zerrendan: {all_apps}", + "app_not_properly_removed": "Ezinezkoa izan da {app} guztiz ezabatzea", + "app_start_install": "{app} instalatzen…", + "app_start_restore": "{app} lehengoratzen…", + "app_unsupported_remote_type": "Aplikazioak darabilen urruneko motak ez du babesik", + "app_upgrade_several_apps": "Ondorengo aplikazioak eguneratuko dira: {apps}", + "backup_app_failed": "Ezinezkoa izan da {app}(r)en babeskopia egitea", + "backup_actually_backuping": "Bildutako fitxategiekin babeskopia sortzen…", + "backup_archive_name_exists": "Dagoeneko existitzen da izen bera duen babeskopia fitxategi bat.", + "backup_archive_name_unknown": "Ez da '{name}' izeneko babeskopia ezagutzen", + "backup_archive_open_failed": "Ezin izan da babeskopien fitxategia ireki", + "backup_archive_system_part_not_available": "'{part}' sistemaren atala ez dago erabilgarri babeskopia honetan", + "backup_archive_writing_error": "Ezin izan da '{source}' ('{dest}' fitxategiak eskatu dituenak) fitxategia '{archive}' konprimatutako babeskopian sartu", + "backup_ask_for_copying_if_needed": "Denbora batez {size}MB erabili nahi dituzu babeskopia gauzatu ahal izateko? (Horrela egiten da fitxategi batzuk ezin direlako modu eraginkorragoan prestatu.)", + "backup_cant_mount_uncompress_archive": "Ezin izan da deskonprimatutako fitxategia muntatu idazketa-babesa duelako", + "backup_created": "Egin da babeskopia", + "backup_copying_to_organize_the_archive": "{size}MB kopiatzen fitxategia antolatzeko", + "backup_couldnt_bind": "Ezin izan da {src} {dest}-ra lotu.", + "backup_output_directory_forbidden": "Aukeratu beste katalogo bat emaitza gordetzeko. Babeskopiak ezin dira sortu /bin, /boot, /dev, /etc, /lib, /root, /run, /sbin, /sys, /usr, /var or /home/yunohost.backup/archives azpi-katalogoetan", + "backup_output_directory_not_empty": "Aukeratu hutsik dagoen katalogo bat", + "backup_running_hooks": "Babeskopien kakoak exekutatzen…", + "backup_unable_to_organize_files": "Ezin izan da modu azkarra erabili fitxategiko artxiboak prestatzeko", + "backup_output_symlink_dir_broken": "'{path}' fitxategi-katalogoaren symlink-a ez dabil. Agian [ber]muntatzea ahaztu zaizu edo euskarria atakara konektatzea ahaztu duzu.", + "backup_with_no_backup_script_for_app": "'{app}' aplikazioak ez du babeskopia egiteko agindurik. Ez da kontutan hartuko.", + "backup_with_no_restore_script_for_app": "{app}(e)k ez du lehengoratzeko agindurik, ezingo duzu aplikazio hau automatikoki lehengoratu.", + "certmanager_attempt_to_renew_nonLE_cert": "'{domain}' domeinurako ziurtagiria ez da Let's Encryptek jaulkitakoa. Ezin da automatikoki berriztu!", + "certmanager_attempt_to_renew_valid_cert": "'{domain}' domeinurako ziurtagiria iraungitzear dago! (Zertan ari zaren baldin badakizu, --force erabil dezakezu)", + "certmanager_cannot_read_cert": "Arazoren bat egon da {domain} (fitxategia: {file}) domeinurako oraingo ziurtagiria irekitzen saiatzerakoan, arrazoia: {reason}", + "certmanager_cert_install_success": "Let's Encrypt ziurtagiria instalatu da '{domain}' domeinurako", + "certmanager_cert_install_success_selfsigned": "Norberak sinatutako ziurtagiria instalatu da '{domain}' domeinurako", + "certmanager_domain_cert_not_selfsigned": "{domain} domeinurako ziurtagiria ez da norberak sinatutakoa. Ziur al zaude ordezkatzeaz? (Erabili '--force' hori egiteko.)", + "certmanager_certificate_fetching_or_enabling_failed": "{domain} domeinurako ziurtagiri berriak kale egin du…", + "certmanager_domain_http_not_working": "Ez dirudi {domain} domeinua HTTP bidez ikusgai dagoenik. Mesedez, egiaztatu 'Web' kategoria diagnosien gunean informazio gehiagorako. (zertan ari zaren baldin badakizu, erabili '--no-checks' egiaztapen horiek desgaitzeko.)", + "certmanager_hit_rate_limit": "{domain} domeinu-multzurako ziurtagiri gehiegi jaulki dira dagoeneko. Mesedez, saia saitez geroago. Ikus https://letsencrypt.org/docs/rate-limits/ xehetasun gehiagorako", + "certmanager_no_cert_file": "Ezin izan da ziurtagiri fitxategia irakurri {domain} (fitxategia: {file}) domeinurako", + "certmanager_self_ca_conf_file_not_found": "Ezin izan da konfigurazio-fitxategia aurkitu norberak sinatutako ziurtagirirako (fitxategia: {file})", + "confirm_app_install_warning": "Adi: litekeena da aplikazio hau ibiltzea baina ez dago YunoHostera egina. Ezaugarri batzuk, SSO edo babeskopia/lehengoratzea esaterako, desgaituta egon daitezke. Instalatu hala ere? [{answers}] ", + "diagnosis_description_ports": "Ataken irisgarritasuna", + "backup_archive_corrupted": "Badirudi '{archive}' babeskopia fitxategia hondatuta dagoela: {error}", + "diagnosis_ip_local": "IP lokala: {local}", + "diagnosis_mail_blacklist_reason": "Zerrenda beltzean egotearen arrazoia zera da: {reason}", + "app_removed": "{app} desinstalatu da", + "backup_cleaning_failed": "Ezin izan da behin-behineko babeskopien karpeta hustu", + "certmanager_attempt_to_replace_valid_cert": "{domain} domeinurako egokia eta baliogarria den ziurtagiri bat ordezkatzen saiatzen ari zara! (Erabili --force mezu hau deuseztatu eta ziurtagiria ordezkatzeko)", + "diagnosis_backports_in_sources_list": "Dirudienez apt (pakete kudeatzailea) backports biltegia erabiltzeko konfiguratuta dago. Zertan ari zaren ez badakizu, ez zenuke backports biltegietako aplikaziorik instalatu beharko, ezegonkortasun eta gatazkak eragin ditzaketelako sistemarekin.", + "app_restore_failed": "Ezinezkoa izan da {app} lehengoratzea: {error}", + "diagnosis_apps_allgood": "Instalatutako aplikazioek oinarrizko pakete-jarraibideekin bat egiten dute", + "diagnosis_apps_bad_quality": "Aplikazio hau hondatuta dagoela dio YunoHosten aplikazioen katalogoak. Agian behin-behineko kontua da arduradunak arazoa konpondu bitartean. Momentuz, ezin da aplikazioa eguneratu.", + "diagnosis_apps_broken": "Aplikazio hau hondatuta dagoela ageri da YunoHosten aplikazioen katalogoan. Agian, behin-behineko kontua da arduradunak konpondu bitartean. Momentuz, ezin da aplikazioa eguneratu.", + "diagnosis_apps_deprecated_practices": "Instalatutako aplikazio honen bertsioak oraindik darabil zaharkitutako pakete-jarraibideak. Eguneratzea hausnartu beharko zenuke.", + "diagnosis_apps_issue": "Arazo bat dago {app} aplikazioarekin", + "diagnosis_apps_not_in_app_catalog": "Aplikazio hau ez da YunoHosten aplikazioen katalogokoa. Iraganean egon bazen eta ezabatu izan balitz, desinstalatzea litzateke onena, ez baitu eguneraketarik jasoko eta sistemaren integritate eta segurtasuna arriskuan jarri lezake.", + "diagnosis_apps_outdated_ynh_requirement": "Instalatutako aplikazio honen bertsioak yunohost >= 2.x baino ez du behar, eta horrek egungo pakete-jardunbideekin bat ez datorrela iradokitzen du. Eguneratzen saiatu beharko zinateke.", + "diagnosis_description_apps": "Aplikazioak" } From d846adb093c846d5e9b48a2c5b9cbc726a3e1796 Mon Sep 17 00:00:00 2001 From: ppr Date: Mon, 18 Oct 2021 18:11:11 +0000 Subject: [PATCH 055/619] Translated using Weblate (French) Currently translated at 100.0% (706 of 706 strings) Translation: YunoHost/core Translate-URL: https://translate.yunohost.org/projects/yunohost/core/fr/ --- locales/fr.json | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/locales/fr.json b/locales/fr.json index 123270bd6..cadc2e9dc 100644 --- a/locales/fr.json +++ b/locales/fr.json @@ -685,7 +685,7 @@ "domain_dns_registrar_managed_in_parent_domain": "Ce domaine est un sous-domaine de {parent_domain_link}. La configuration du registrar DNS doit être gérée dans le panneau de configuration de {parent_domain}.", "domain_dns_registrar_not_supported": "YunoHost n'a pas pu détecter automatiquement le bureau d'enregistrement gérant ce domaine. Vous devez configurer manuellement vos enregistrements DNS en suivant la documentation sur https://yunohost.org/dns.", "domain_dns_registrar_experimental": "Jusqu'à présent, l'interface avec l'API de **{registrar}** n'a pas été correctement testée et revue par la communauté YunoHost. L'assistance est **très expérimentale** - soyez prudent !", - "domain_dns_push_failed_to_authenticate": "Échec de l'authentification sur l'API du bureau d'enregistrement pour le domaine « {domain} ». Très probablement les informations d'identification sont incorrectes ? (Erreur : {error})", + "domain_dns_push_failed_to_authenticate": "Échec de l'authentification sur l'API du registrar gérant la réservation de votre nom de domaine internet pour '{domain}'. Il est très probable que les informations d'identification soient incorrectes ? (Erreur : {error})", "domain_dns_push_failed_to_list": "Échec de la liste des enregistrements actuels à l'aide de l'API du registraire : {error}", "domain_dns_push_already_up_to_date": "Dossiers déjà à jour.", "domain_dns_pushing": "Transmission des enregistrements DNS...", @@ -709,5 +709,6 @@ "diagnosis_http_special_use_tld": "Le domaine {domain} est basé sur un domaine de premier niveau (TLD) à usage spécial tel que .local ou .test et n'est donc pas censé être exposé en dehors du réseau local.", "domain_dns_conf_special_use_tld": "Ce domaine est basé sur un domaine de premier niveau (TLD) à usage spécial tel que .local ou .test et ne devrait donc pas avoir d'enregistrements DNS réels.", "other_available_options": "... et {n} autres options disponibles non affichées", - "domain_config_auth_consumer_key": "Consumer key" + "domain_config_auth_consumer_key": "Consumer key", + "domain_unknown": "Domaine '{domain}' inconnu" } From 3ca4cc4f7e5c2deccbb8ded35b5313243b114b56 Mon Sep 17 00:00:00 2001 From: yunohost-bot Date: Tue, 19 Oct 2021 12:38:33 +0000 Subject: [PATCH 056/619] [CI] Format code with Black --- src/yunohost/utils/config.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/yunohost/utils/config.py b/src/yunohost/utils/config.py index aaed1ffd5..2e0fa5b81 100644 --- a/src/yunohost/utils/config.py +++ b/src/yunohost/utils/config.py @@ -216,7 +216,9 @@ class ConfigPanel: self.entity = entity self.config_path = config_path if not config_path: - self.config_path = self.config_path_tpl.format(entity=entity, entity_type=self.entity_type) + self.config_path = self.config_path_tpl.format( + entity=entity, entity_type=self.entity_type + ) self.save_path = save_path if not save_path and self.save_path_tpl: self.save_path = self.save_path_tpl.format(entity=entity) From ebed74514066a6e8e8e86514c19e2c871d46c193 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Tue, 19 Oct 2021 15:32:04 +0200 Subject: [PATCH 057/619] Update changelog for 4.3.1.7 --- debian/changelog | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/debian/changelog b/debian/changelog index d359526d0..651f20a75 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,12 @@ +yunohost (4.3.1.7) testing; urgency=low + + - [fix] configpanel: Misc technical fixes ... (341059d0, 9c22329e) + - [i18n] Translations updated for Basque, French + + Thanks to all contributors <3 ! (ljf, ppr, punkrockgirl) + + -- Alexandre Aubin Tue, 19 Oct 2021 15:30:50 +0200 + yunohost (4.3.1.6) testing; urgency=low - [fix] configpanel: Various technical fixes (07c1ddce, eae826b2, ff69067d) From a61d02319895e42254006f169ed0e28c07ca53a1 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Tue, 19 Oct 2021 18:40:57 +0200 Subject: [PATCH 058/619] dyndns update: Fix for ipv6-only hosts --- src/yunohost/dyndns.py | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/yunohost/dyndns.py b/src/yunohost/dyndns.py index e33cf4f22..2ded9909e 100644 --- a/src/yunohost/dyndns.py +++ b/src/yunohost/dyndns.py @@ -257,13 +257,17 @@ def dyndns_update( def resolve_domain(domain, rdtype): - # FIXME make this work for IPv6-only hosts too.. ok, result = dig(dyn_host, "A") - dyn_host_ip = result[0] if ok == "ok" and len(result) else None - if not dyn_host_ip: - raise YunohostError("Failed to resolve %s" % dyn_host, raw_msg=True) + dyn_host_ipv4 = result[0] if ok == "ok" and len(result) else None + if not dyn_host_ipv4: + raise YunohostError("Failed to resolve IPv4 for %s ?" % dyn_host, raw_msg=True) + + ok, result = dig(dyn_host, "AAAA") + dyn_host_ipv6 = result[0] if ok == "ok" and len(result) else None + if not dyn_host_ipv6: + raise YunohostError("Failed to resolve IPv6 for %s ?" % dyn_host, raw_msg=True) - ok, result = dig(domain, rdtype, resolvers=[dyn_host_ip]) + ok, result = dig(domain, rdtype, resolvers=[dyn_host_ipv4, dyn_host_ipv6]) if ok == "ok": return result[0] if len(result) else None elif result[0] == "Timeout": From 57081f443317706e39298c781f69b0d0baade63f Mon Sep 17 00:00:00 2001 From: yunohost-bot Date: Tue, 19 Oct 2021 16:59:31 +0000 Subject: [PATCH 059/619] [CI] Format code with Black --- src/yunohost/dyndns.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/yunohost/dyndns.py b/src/yunohost/dyndns.py index 2ded9909e..cdc293421 100644 --- a/src/yunohost/dyndns.py +++ b/src/yunohost/dyndns.py @@ -260,12 +260,16 @@ def dyndns_update( ok, result = dig(dyn_host, "A") dyn_host_ipv4 = result[0] if ok == "ok" and len(result) else None if not dyn_host_ipv4: - raise YunohostError("Failed to resolve IPv4 for %s ?" % dyn_host, raw_msg=True) - + raise YunohostError( + "Failed to resolve IPv4 for %s ?" % dyn_host, raw_msg=True + ) + ok, result = dig(dyn_host, "AAAA") dyn_host_ipv6 = result[0] if ok == "ok" and len(result) else None if not dyn_host_ipv6: - raise YunohostError("Failed to resolve IPv6 for %s ?" % dyn_host, raw_msg=True) + raise YunohostError( + "Failed to resolve IPv6 for %s ?" % dyn_host, raw_msg=True + ) ok, result = dig(domain, rdtype, resolvers=[dyn_host_ipv4, dyn_host_ipv6]) if ok == "ok": From 2687121f6da14cb55d123605be3c4bdb7b34a030 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Wed, 20 Oct 2021 19:25:23 +0200 Subject: [PATCH 060/619] diagnosis: typo / don't run dnsrecords tests for special tlds --- data/hooks/diagnosis/12-dnsrecords.py | 1 + 1 file changed, 1 insertion(+) diff --git a/data/hooks/diagnosis/12-dnsrecords.py b/data/hooks/diagnosis/12-dnsrecords.py index 677a947a7..7e681484d 100644 --- a/data/hooks/diagnosis/12-dnsrecords.py +++ b/data/hooks/diagnosis/12-dnsrecords.py @@ -63,6 +63,7 @@ class DNSRecordsDiagnoser(Diagnoser): status="INFO", summary="diagnosis_dns_specialusedomain", ) + return base_dns_zone = _get_dns_zone_for_domain(domain) basename = domain.replace(base_dns_zone, "").rstrip(".") or "@" From 146fba7d481676850179e62ed36b7de1d5386838 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Wed, 20 Oct 2021 19:43:06 +0200 Subject: [PATCH 061/619] regenconf: yunohost hook was failing because grep may return exit code != 0 --- data/hooks/conf_regen/01-yunohost | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/data/hooks/conf_regen/01-yunohost b/data/hooks/conf_regen/01-yunohost index ad10fa863..1aba1f03c 100755 --- a/data/hooks/conf_regen/01-yunohost +++ b/data/hooks/conf_regen/01-yunohost @@ -61,9 +61,11 @@ do_init_regen() { # Change dpkg vendor # see https://wiki.debian.org/Derivatives/Guidelines#Vendor - readlink -f /etc/dpkg/origins/default | grep -q debian \ - && rm -f /etc/dpkg/origins/default \ - && ln -s /etc/dpkg/origins/yunohost /etc/dpkg/origins/default + if readlink -f /etc/dpkg/origins/default | grep -q debian; + then + rm -f /etc/dpkg/origins/default \ + ln -s /etc/dpkg/origins/yunohost /etc/dpkg/origins/default + fi } do_pre_regen() { @@ -238,9 +240,11 @@ do_post_regen() { # Change dpkg vendor # see https://wiki.debian.org/Derivatives/Guidelines#Vendor - readlink -f /etc/dpkg/origins/default | grep -q debian \ - && rm -f /etc/dpkg/origins/default \ - && ln -s /etc/dpkg/origins/yunohost /etc/dpkg/origins/default + if readlink -f /etc/dpkg/origins/default | grep -q debian; + then + rm -f /etc/dpkg/origins/default + ln -s /etc/dpkg/origins/yunohost /etc/dpkg/origins/default + fi } do_$1_regen ${@:2} From 86a9cb37ce96a0ef83e3eeac6a54970dff5d5401 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Wed, 20 Oct 2021 19:47:34 +0200 Subject: [PATCH 062/619] regenconf: gotta explicitly return *0* ... --- data/hooks/conf_regen/43-dnsmasq | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/hooks/conf_regen/43-dnsmasq b/data/hooks/conf_regen/43-dnsmasq index ee2ff1a1f..13c442158 100755 --- a/data/hooks/conf_regen/43-dnsmasq +++ b/data/hooks/conf_regen/43-dnsmasq @@ -69,7 +69,7 @@ do_post_regen() { short_hostname=$(hostname -s) grep -q "127.0.0.1.*$short_hostname" /etc/hosts || echo -e "\n127.0.0.1\t$short_hostname" >>/etc/hosts - [[ -n "$regen_conf_files" ]] || return + [[ -n "$regen_conf_files" ]] || return 0 # Remove / disable services likely to conflict with dnsmasq for SERVICE in systemd-resolved bind9; do From d82f14a4f91376c44059aa2d798470242ff1921b Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Wed, 20 Oct 2021 20:01:45 +0200 Subject: [PATCH 063/619] Typo T_T --- data/hooks/conf_regen/01-yunohost | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/hooks/conf_regen/01-yunohost b/data/hooks/conf_regen/01-yunohost index 1aba1f03c..1703dccd1 100755 --- a/data/hooks/conf_regen/01-yunohost +++ b/data/hooks/conf_regen/01-yunohost @@ -63,7 +63,7 @@ do_init_regen() { # see https://wiki.debian.org/Derivatives/Guidelines#Vendor if readlink -f /etc/dpkg/origins/default | grep -q debian; then - rm -f /etc/dpkg/origins/default \ + rm -f /etc/dpkg/origins/default ln -s /etc/dpkg/origins/yunohost /etc/dpkg/origins/default fi } From 93cc48ca688981f9ad428c9925cc82b2927f8618 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Wed, 20 Oct 2021 20:56:33 +0200 Subject: [PATCH 064/619] Drop customization of my.cnf, keep default conf --- data/hooks/conf_regen/34-mysql | 2 +- data/templates/mysql/my.cnf | 92 ---------------------------------- 2 files changed, 1 insertion(+), 93 deletions(-) delete mode 100644 data/templates/mysql/my.cnf diff --git a/data/hooks/conf_regen/34-mysql b/data/hooks/conf_regen/34-mysql index da66d5b1c..13730e0bb 100755 --- a/data/hooks/conf_regen/34-mysql +++ b/data/hooks/conf_regen/34-mysql @@ -8,7 +8,7 @@ do_pre_regen() { cd /usr/share/yunohost/templates/mysql - install -D -m 644 my.cnf "${pending_dir}/etc/mysql/my.cnf" + # Nothing to do } do_post_regen() { diff --git a/data/templates/mysql/my.cnf b/data/templates/mysql/my.cnf deleted file mode 100644 index 3da4377e1..000000000 --- a/data/templates/mysql/my.cnf +++ /dev/null @@ -1,92 +0,0 @@ -# Example MySQL config file for small systems. -# -# This is for a system with little memory (<= 64M) where MySQL is only used -# from time to time and it's important that the mysqld daemon -# doesn't use much resources. -# -# MySQL programs look for option files in a set of -# locations which depend on the deployment platform. -# You can copy this option file to one of those -# locations. For information about these locations, see: -# http://dev.mysql.com/doc/mysql/en/option-files.html -# -# In this file, you can use all long options that a program supports. -# If you want to know which options a program supports, run the program -# with the "--help" option. - -# The following options will be passed to all MySQL clients -[client] -#password = your_password -port = 3306 -socket = /var/run/mysqld/mysqld.sock - -# Here follows entries for some specific programs - -# The MySQL server -[mysqld] -port = 3306 -socket = /var/run/mysqld/mysqld.sock -skip-external-locking -key_buffer_size = 16K -max_allowed_packet = 16M -table_open_cache = 4 -sort_buffer_size = 4M -read_buffer_size = 256K -read_rnd_buffer_size = 256K -net_buffer_length = 2K -thread_stack = 128K - -# to avoid corruption on powerfailure -default-storage-engine=innodb - -# Don't listen on a TCP/IP port at all. This can be a security enhancement, -# if all processes that need to connect to mysqld run on the same host. -# All interaction with mysqld must be made via Unix sockets or named pipes. -# Note that using this option without enabling named pipes on Windows -# (using the "enable-named-pipe" option) will render mysqld useless! -# -#skip-networking -server-id = 1 - -# Uncomment the following if you want to log updates -#log-bin=mysql-bin - -# binary logging format - mixed recommended -#binlog_format=mixed - -# Causes updates to non-transactional engines using statement format to be -# written directly to binary log. Before using this option make sure that -# there are no dependencies between transactional and non-transactional -# tables such as in the statement INSERT INTO t_myisam SELECT * FROM -# t_innodb; otherwise, slaves may diverge from the master. -#binlog_direct_non_transactional_updates=TRUE - -# Uncomment the following if you are using InnoDB tables -#innodb_data_home_dir = /var/lib/mysql -#innodb_data_file_path = ibdata1:10M:autoextend -#innodb_log_group_home_dir = /var/lib/mysql -# You can set .._buffer_pool_size up to 50 - 80 % -# of RAM but beware of setting memory usage too high -#innodb_buffer_pool_size = 16M -#innodb_additional_mem_pool_size = 2M -# Set .._log_file_size to 25 % of buffer pool size -#innodb_log_file_size = 5M -#innodb_log_buffer_size = 8M -#innodb_flush_log_at_trx_commit = 1 -#innodb_lock_wait_timeout = 50 - -[mysqldump] -quick -max_allowed_packet = 16M - -[mysql] -no-auto-rehash -# Remove the next comment character if you are not familiar with SQL -#safe-updates - -[myisamchk] -key_buffer_size = 8M -sort_buffer_size = 8M - -[mysqlhotcopy] -interactive-timeout From 4dc53d5a8e49447d5368b699676c41eee9ac0e9e Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Wed, 20 Oct 2021 21:07:53 +0200 Subject: [PATCH 065/619] migrate_to_bullseye: get rid of custom my.cnf --- .../data_migrations/0021_migrate_to_bullseye.py | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/yunohost/data_migrations/0021_migrate_to_bullseye.py b/src/yunohost/data_migrations/0021_migrate_to_bullseye.py index 4b40fcbe0..db10777bf 100644 --- a/src/yunohost/data_migrations/0021_migrate_to_bullseye.py +++ b/src/yunohost/data_migrations/0021_migrate_to_bullseye.py @@ -5,11 +5,11 @@ from moulinette import m18n from yunohost.utils.error import YunohostError from moulinette.utils.log import getActionLogger from moulinette.utils.process import check_output, call_async_output -from moulinette.utils.filesystem import read_file +from moulinette.utils.filesystem import read_file, rm from yunohost.tools import Migration, tools_update, tools_upgrade from yunohost.app import unstable_apps -from yunohost.regenconf import manually_modified_files +from yunohost.regenconf import manually_modified_files, _force_clear_hashes from yunohost.utils.filesystem import free_space_in_directory from yunohost.utils.packages import ( get_ynh_package_version, @@ -67,6 +67,16 @@ class MyMigration(Migration): self.patch_yunohost_conflicts() + # + # Specific tweaking to get rid of custom my.cnf and use debian's default one + # (my.cnf is actually a symlink to mariadb.cnf) + # + + _force_clear_hashes(["/etc/mysql/my.cnf"]) + rm("/etc/mysql/mariadb.cnf", force=True) + rm("/etc/mysql/my.cnf", force=True) + self.apt_install("mariadb-common --reinstall -o Dpkg::Options::='--force-confmiss'") + # # Main upgrade # From 4ebcaf8d7e9467ccf319db0d2bd238a2dc48db6d Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Sun, 24 Oct 2021 15:59:48 +0200 Subject: [PATCH 066/619] [fix] helpers: composer not explaining why the hell it can't install shit --- data/helpers.d/php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/helpers.d/php b/data/helpers.d/php index 79c69b50c..42fed7707 100644 --- a/data/helpers.d/php +++ b/data/helpers.d/php @@ -496,7 +496,7 @@ ynh_composer_exec() { COMPOSER_HOME="$workdir/.composer" COMPOSER_MEMORY_LIMIT=-1 \ php${phpversion} "$workdir/composer.phar" $commands \ - -d "$workdir" --quiet --no-interaction + -d "$workdir" --no-interaction --no-ansi 2>&1 } # Install and initialize Composer in the given directory From 4e917b5e964b043dd9223eac9f014aebac0dbfd0 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Sun, 24 Oct 2021 16:09:34 +0200 Subject: [PATCH 067/619] [enh] logging: we don't care about 'update-rc.d: warning: start and stop actions are no longer supported; falling back to defaults' --- src/yunohost/hook.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/yunohost/hook.py b/src/yunohost/hook.py index 20757bf3c..98b624f12 100644 --- a/src/yunohost/hook.py +++ b/src/yunohost/hook.py @@ -359,6 +359,7 @@ def hook_exec( r"Created symlink /etc/systemd", r"dpkg: warning: while removing .* not empty so not removed", r"apt-key output should not be parsed", + r"update-rc.d: ", ] return all(not re.search(w, msg) for w in irrelevant_warnings) From 974ea71fc84bfc3b3f5e1fc64d3a97e2914449ff Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Sun, 24 Oct 2021 16:59:23 +0200 Subject: [PATCH 068/619] Simplify the whole ynh_install/remove_php story as no app is using them directly --- data/helpers.d/php | 24 +++++++++--------------- 1 file changed, 9 insertions(+), 15 deletions(-) diff --git a/data/helpers.d/php b/data/helpers.d/php index 42fed7707..b0e9fa59d 100644 --- a/data/helpers.d/php +++ b/data/helpers.d/php @@ -95,17 +95,8 @@ ynh_add_fpm_config() { ynh_remove_fpm_config fi - # If the requested PHP version is not the default version for YunoHost - if [ "$phpversion" != "$YNH_DEFAULT_PHP_VERSION" ]; then - # If the argument --package is used, add the packages to ynh_install_php to install them from sury - if [ -n "$package" ]; then - local additionnal_packages="--package=$package" - else - local additionnal_packages="" - fi - # Install this specific version of PHP. - ynh_install_php --phpversion="$phpversion" "$additionnal_packages" - elif [ -n "$package" ]; then + # Legacy args (packager should just list their php dependency as regular apt dependencies... + if [ -n "$package" ]; then # Install the additionnal packages from the default repository ynh_install_app_dependencies "$package" fi @@ -289,8 +280,8 @@ ynh_remove_fpm_config() { # If the PHP version used is not the default version for YunoHost if [ "$phpversion" != "$YNH_DEFAULT_PHP_VERSION" ]; then - # Remove this specific version of PHP - ynh_remove_php + # Remove app dependencies ... but ideally should happen via an explicit call from packager + ynh_remove_app_dependencies fi } @@ -298,6 +289,8 @@ ynh_remove_fpm_config() { # # [internal] # +# Legacy, to be remove on bullseye +# # usage: ynh_install_php --phpversion=phpversion [--package=packages] # | arg: -v, --phpversion= - Version of PHP to install. # | arg: -p, --package= - Additionnal PHP packages to install @@ -318,14 +311,15 @@ ynh_install_php() { fi ynh_install_app_dependencies "$package" - ynh_app_setting_set --app=$app --key=phpversion --value=$specific_php_version } # Remove the specific version of PHP used by the app. # # [internal] # -# usage: ynh_install_php +# Legacy, to be remove on bullseye +# +# usage: ynh_remove_php # # Requires YunoHost version 3.8.1 or higher. ynh_remove_php () { From fcd2ef9d2086fe12c95a2ca958cd086c98a1eff3 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Sun, 24 Oct 2021 18:16:21 +0200 Subject: [PATCH 069/619] [enh] helpers: allow to get/set/delete app settings without explicitly passing app id everytime... --- data/helpers.d/setting | 6 +++++ tests/test_helpers.d/ynhtest_settings.sh | 29 ++++++++++++++++++++++++ 2 files changed, 35 insertions(+) create mode 100644 tests/test_helpers.d/ynhtest_settings.sh diff --git a/data/helpers.d/setting b/data/helpers.d/setting index cd231c6ba..a2cf3a93d 100644 --- a/data/helpers.d/setting +++ b/data/helpers.d/setting @@ -8,6 +8,7 @@ # # Requires YunoHost version 2.2.4 or higher. ynh_app_setting_get() { + local _globalapp=${app-:} # Declare an array to define the options of this helper. local legacy_args=ak local -A args_array=([a]=app= [k]=key=) @@ -15,6 +16,7 @@ ynh_app_setting_get() { local key # Manage arguments with getopts ynh_handle_getopts_args "$@" + app="${app:-$_globalapp}" if [[ $key =~ (unprotected|protected|skipped)_ ]]; then yunohost app setting $app $key @@ -32,6 +34,7 @@ ynh_app_setting_get() { # # Requires YunoHost version 2.2.4 or higher. ynh_app_setting_set() { + local _globalapp=${app-:} # Declare an array to define the options of this helper. local legacy_args=akv local -A args_array=([a]=app= [k]=key= [v]=value=) @@ -40,6 +43,7 @@ ynh_app_setting_set() { local value # Manage arguments with getopts ynh_handle_getopts_args "$@" + app="${app:-$_globalapp}" if [[ $key =~ (unprotected|protected|skipped)_ ]]; then yunohost app setting $app $key -v $value @@ -56,6 +60,7 @@ ynh_app_setting_set() { # # Requires YunoHost version 2.2.4 or higher. ynh_app_setting_delete() { + local _globalapp=${app-:} # Declare an array to define the options of this helper. local legacy_args=ak local -A args_array=([a]=app= [k]=key=) @@ -63,6 +68,7 @@ ynh_app_setting_delete() { local key # Manage arguments with getopts ynh_handle_getopts_args "$@" + app="${app:-$_globalapp}" if [[ "$key" =~ (unprotected|skipped|protected)_ ]]; then yunohost app setting $app $key -d diff --git a/tests/test_helpers.d/ynhtest_settings.sh b/tests/test_helpers.d/ynhtest_settings.sh new file mode 100644 index 000000000..e916c146b --- /dev/null +++ b/tests/test_helpers.d/ynhtest_settings.sh @@ -0,0 +1,29 @@ +ynhtest_settings() { + + test -n "$app" + + mkdir -p "/etc/yunohost/apps/$app" + echo "label: $app" > "/etc/yunohost/apps/$app/settings.yml" + + test -z "$(ynh_app_setting_get --key="foo")" + test -z "$(ynh_app_setting_get --key="bar")" + test -z "$(ynh_app_setting_get --app="$app" --key="baz")" + + ynh_app_setting_set --key="foo" --value="foovalue" + ynh_app_setting_set --app="$app" --key="bar" --value="barvalue" + ynh_app_setting_set "$app" baz bazvalue + + test "$(ynh_app_setting_get --key="foo")" == "foovalue" + test "$(ynh_app_setting_get --key="bar")" == "barvalue" + test "$(ynh_app_setting_get --app="$app" --key="baz")" == "bazvalue" + + ynh_app_setting_delete --key="foo" + ynh_app_setting_delete --app="$app" --key="bar" + ynh_app_setting_delete "$app" baz + + test -z "$(ynh_app_setting_get --key="foo")" + test -z "$(ynh_app_setting_get --key="bar")" + test -z "$(ynh_app_setting_get --app="$app" --key="baz")" + + rm -rf "/etc/yunohost/apps/$app" +} From a8c6b5e6379727bd74c6dd9889f48de314de2e49 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Sun, 24 Oct 2021 18:17:02 +0200 Subject: [PATCH 070/619] [enh] helpers: add some tests for system user create that were lying in my uncommited files ? --- tests/test_helpers.d/ynhtest_user.sh | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 tests/test_helpers.d/ynhtest_user.sh diff --git a/tests/test_helpers.d/ynhtest_user.sh b/tests/test_helpers.d/ynhtest_user.sh new file mode 100644 index 000000000..46f2a0cd6 --- /dev/null +++ b/tests/test_helpers.d/ynhtest_user.sh @@ -0,0 +1,25 @@ + +ynhtest_system_user_create() { + username=$(head -c 12 /dev/urandom | md5sum | head -c 12) + + ! ynh_system_user_exists --username="$username" + + ynh_system_user_create --username="$username" + + ynh_system_user_exists --username="$username" + + ynh_system_user_delete --username="$username" + + ! ynh_system_user_exists --username="$username" +} + +ynhtest_system_user_with_group() { + username=$(head -c 12 /dev/urandom | md5sum | head -c 12) + + ynh_system_user_create --username="$username" --groups="ssl-cert,ssh.app" + + grep -q "^ssl-cert:.*$username" /etc/group + grep -q "^ssh.app:.*$username" /etc/group + + ynh_system_user_delete --username="$username" +} From c6dfe08973edd90ebc8c483d645b416172555e93 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Sun, 24 Oct 2021 22:16:07 +0200 Subject: [PATCH 071/619] Drop some dyndns yagni: we don't need to be able to specify a custom dyndns host... --- data/actionsmap/yunohost.yml | 6 -- src/yunohost/domain.py | 7 ++- src/yunohost/dyndns.py | 113 +++++++++++++---------------------- src/yunohost/tools.py | 44 ++++++-------- 4 files changed, 63 insertions(+), 107 deletions(-) diff --git a/data/actionsmap/yunohost.yml b/data/actionsmap/yunohost.yml index b845ded21..b88f5260a 100644 --- a/data/actionsmap/yunohost.yml +++ b/data/actionsmap/yunohost.yml @@ -1483,9 +1483,6 @@ dyndns: subscribe: action_help: Subscribe to a DynDNS service arguments: - --subscribe-host: - help: Dynette HTTP API to subscribe to - default: "dyndns.yunohost.org" -d: full: --domain help: Full domain to subscribe with @@ -1499,9 +1496,6 @@ dyndns: update: action_help: Update IP on DynDNS platform arguments: - --dyn-host: - help: Dynette DNS server to inform - default: "dyndns.yunohost.org" -d: full: --domain help: Full domain to update diff --git a/src/yunohost/domain.py b/src/yunohost/domain.py index 8eb14a36f..0bd84ea82 100644 --- a/src/yunohost/domain.py +++ b/src/yunohost/domain.py @@ -167,15 +167,16 @@ def domain_add(operation_logger, domain, dyndns=False): # DynDNS domain if dyndns: - from yunohost.dyndns import _dyndns_provides, _guess_current_dyndns_domain + from yunohost.utils.dns import is_yunohost_dyndns_domain + from yunohost.dyndns import _guess_current_dyndns_domain # Do not allow to subscribe to multiple dyndns domains... - if _guess_current_dyndns_domain("dyndns.yunohost.org") != (None, None): + if _guess_current_dyndns_domain() != (None, None): raise YunohostValidationError("domain_dyndns_already_subscribed") # Check that this domain can effectively be provided by # dyndns.yunohost.org. (i.e. is it a nohost.me / noho.st) - if not _dyndns_provides("dyndns.yunohost.org", domain): + if not is_yunohost_dyndns_domain(domain): raise YunohostValidationError("domain_dyndns_root_unknown") operation_logger.start() diff --git a/src/yunohost/dyndns.py b/src/yunohost/dyndns.py index cdc293421..1659ec6ea 100644 --- a/src/yunohost/dyndns.py +++ b/src/yunohost/dyndns.py @@ -39,7 +39,7 @@ from moulinette.utils.network import download_json from yunohost.utils.error import YunohostError, YunohostValidationError from yunohost.domain import _get_maindomain from yunohost.utils.network import get_public_ip -from yunohost.utils.dns import dig +from yunohost.utils.dns import dig, is_yunohost_dyndns_domain from yunohost.log import is_unit_operation from yunohost.regenconf import regen_conf @@ -53,66 +53,36 @@ RE_DYNDNS_PRIVATE_KEY_SHA512 = re.compile( r".*/K(?P[^\s\+]+)\.\+165.+\.private$" ) +DYNDNS_PROVIDER = "dyndns.yunohost.org" +DYNDNS_DNS_AUTH = ["ns0.yunohost.org", "ns1.yunohost.org"] -def _dyndns_provides(provider, domain): + +def _dyndns_available(domain): """ - Checks if a provider provide/manage a given domain. + Checks if a domain is available on dyndns.yunohost.org Keyword arguments: - provider -- The url of the provider, e.g. "dyndns.yunohost.org" - domain -- The full domain that you'd like.. e.g. "foo.nohost.me" - - Returns: - True if the provider provide/manages the domain. False otherwise. - """ - - logger.debug("Checking if %s is managed by %s ..." % (domain, provider)) - - try: - # Dyndomains will be a list of domains supported by the provider - # e.g. [ "nohost.me", "noho.st" ] - dyndomains = download_json("https://%s/domains" % provider, timeout=30) - except MoulinetteError as e: - logger.error(str(e)) - raise YunohostError( - "dyndns_could_not_check_provide", domain=domain, provider=provider - ) - - # Extract 'dyndomain' from 'domain', e.g. 'nohost.me' from 'foo.nohost.me' - dyndomain = ".".join(domain.split(".")[1:]) - - return dyndomain in dyndomains - - -def _dyndns_available(provider, domain): - """ - Checks if a domain is available from a given provider. - - Keyword arguments: - provider -- The url of the provider, e.g. "dyndns.yunohost.org" domain -- The full domain that you'd like.. e.g. "foo.nohost.me" Returns: True if the domain is available, False otherwise. """ - logger.debug("Checking if domain %s is available on %s ..." % (domain, provider)) + logger.debug(f"Checking if domain {domain} is available on {DYNDNS_PROVIDER} ...") try: - r = download_json( - "https://%s/test/%s" % (provider, domain), expected_status_code=None - ) + r = download_json(f"https://{DYNDNS_PROVIDER}/test/{domain}", expected_status_code=None) except MoulinetteError as e: logger.error(str(e)) raise YunohostError( - "dyndns_could_not_check_available", domain=domain, provider=provider + "dyndns_could_not_check_available", domain=domain, provider=DYNDNS_PROVIDER ) - return r == "Domain %s is available" % domain + return r == f"Domain {domain} is available" @is_unit_operation() def dyndns_subscribe( - operation_logger, subscribe_host="dyndns.yunohost.org", domain=None, key=None + operation_logger, domain=None, key=None ): """ Subscribe to a DynDNS service @@ -120,11 +90,9 @@ def dyndns_subscribe( Keyword argument: domain -- Full domain to subscribe with key -- Public DNS key - subscribe_host -- Dynette HTTP API to subscribe to - """ - if _guess_current_dyndns_domain(subscribe_host) != (None, None): + if _guess_current_dyndns_domain() != (None, None): raise YunohostValidationError("domain_dyndns_already_subscribed") if domain is None: @@ -132,13 +100,13 @@ def dyndns_subscribe( operation_logger.related_to.append(("domain", domain)) # Verify if domain is provided by subscribe_host - if not _dyndns_provides(subscribe_host, domain): + if not is_yunohost_dyndns_domain(domain): raise YunohostValidationError( - "dyndns_domain_not_provided", domain=domain, provider=subscribe_host + "dyndns_domain_not_provided", domain=domain, provider=DYNDNS_PROVIDER ) # Verify if domain is available - if not _dyndns_available(subscribe_host, domain): + if not _dyndns_available(domain): raise YunohostValidationError("dyndns_unavailable", domain=domain) operation_logger.start() @@ -167,9 +135,9 @@ def dyndns_subscribe( # Send subscription try: + b64encoded_key = base64.b64encode(key.encode()).decode() r = requests.post( - "https://%s/key/%s?key_algo=hmac-sha512" - % (subscribe_host, base64.b64encode(key.encode()).decode()), + f"https://{DYNDNS_PROVIDER}/key/{b64encoded_key}?key_algo=hmac-sha512", data={"subdomain": domain}, timeout=30, ) @@ -205,7 +173,6 @@ def dyndns_subscribe( @is_unit_operation() def dyndns_update( operation_logger, - dyn_host="dyndns.yunohost.org", domain=None, key=None, ipv4=None, @@ -218,7 +185,6 @@ def dyndns_update( Keyword argument: domain -- Full domain to update - dyn_host -- Dynette DNS server to inform key -- Public DNS key ipv4 -- IP address to send ipv6 -- IPv6 address to send @@ -229,7 +195,7 @@ def dyndns_update( # If domain is not given, try to guess it from keys available... if domain is None: - (domain, key) = _guess_current_dyndns_domain(dyn_host) + (domain, key) = _guess_current_dyndns_domain() if domain is None: raise YunohostValidationError("dyndns_no_domain_registered") @@ -251,33 +217,32 @@ def dyndns_update( logger.debug("Building zone update file ...") lines = [ - "server %s" % dyn_host, - "zone %s" % host, + f"server {DYNDNS_PROVIDER}", + f"zone {host}", ] + auth_resolvers = [] + + for dns_auth in DYNDNS_DNS_AUTH: + for type_ in ["A", "AAAA"]: + + ok, result = dig(dns_auth, type_) + if ok == "ok" and len(result) and result[0]: + auth_resolvers.append(result[0]) + + if not auth_resolvers: + raise YunohostError( + f"Failed to resolve IPv4/IPv6 for {DYNDNS_DNS_AUTH} ?", raw_msg=True + ) + def resolve_domain(domain, rdtype): - ok, result = dig(dyn_host, "A") - dyn_host_ipv4 = result[0] if ok == "ok" and len(result) else None - if not dyn_host_ipv4: - raise YunohostError( - "Failed to resolve IPv4 for %s ?" % dyn_host, raw_msg=True - ) - - ok, result = dig(dyn_host, "AAAA") - dyn_host_ipv6 = result[0] if ok == "ok" and len(result) else None - if not dyn_host_ipv6: - raise YunohostError( - "Failed to resolve IPv6 for %s ?" % dyn_host, raw_msg=True - ) - - ok, result = dig(domain, rdtype, resolvers=[dyn_host_ipv4, dyn_host_ipv6]) + ok, result = dig(domain, rdtype, resolvers=auth_resolvers) if ok == "ok": return result[0] if len(result) else None elif result[0] == "Timeout": logger.debug( - "Timed-out while trying to resolve %s record for %s using %s" - % (rdtype, domain, dyn_host) + f"Timed-out while trying to resolve {rdtype} record for {domain}" ) else: return None @@ -388,19 +353,21 @@ def dyndns_update( ) +# Legacy def dyndns_installcron(): logger.warning( "This command is deprecated. The dyndns cron job should automatically be added/removed by the regenconf depending if there's a private key in /etc/yunohost/dyndns. You can run the regenconf yourself with 'yunohost tools regen-conf yunohost'." ) +# Legacy def dyndns_removecron(): logger.warning( "This command is deprecated. The dyndns cron job should automatically be added/removed by the regenconf depending if there's a private key in /etc/yunohost/dyndns. You can run the regenconf yourself with 'yunohost tools regen-conf yunohost'." ) -def _guess_current_dyndns_domain(dyn_host): +def _guess_current_dyndns_domain(): """ This function tries to guess which domain should be updated by "dyndns_update()" because there's not proper management of the current @@ -423,7 +390,7 @@ def _guess_current_dyndns_domain(dyn_host): # current domain beause that's not the one we want to update..) # If there's only 1 such key found, then avoid doing the request # for nothing (that's very probably the one we want to find ...) - if len(paths) > 1 and _dyndns_available(dyn_host, _domain): + if len(paths) > 1 and _dyndns_available(_domain): continue else: return (_domain, path) diff --git a/src/yunohost/tools.py b/src/yunohost/tools.py index e89081abd..54d7ffc0e 100644 --- a/src/yunohost/tools.py +++ b/src/yunohost/tools.py @@ -45,7 +45,6 @@ from yunohost.app_catalog import ( _update_apps_catalog, ) from yunohost.domain import domain_add -from yunohost.dyndns import _dyndns_available, _dyndns_provides from yunohost.firewall import firewall_upnp from yunohost.service import service_start, service_enable from yunohost.regenconf import regen_conf @@ -205,12 +204,12 @@ def tools_postinstall( password -- YunoHost admin password """ + from yunohost.dyndns import _dyndns_available + from yunohost.utils.dns import is_yunohost_dyndns_domain from yunohost.utils.password import assert_password_is_strong_enough from yunohost.domain import domain_main_domain import psutil - dyndns_provider = "dyndns.yunohost.org" - # Do some checks at first if os.path.isfile("/etc/yunohost/installed"): raise YunohostValidationError("yunohost_already_installed") @@ -235,33 +234,28 @@ def tools_postinstall( if not force_password: assert_password_is_strong_enough("admin", password) - if not ignore_dyndns: - # Check if yunohost dyndns can handle the given domain - # (i.e. is it a .nohost.me ? a .noho.st ?) - try: - is_nohostme_or_nohost = _dyndns_provides(dyndns_provider, domain) - # If an exception is thrown, most likely we don't have internet - # connectivity or something. Assume that this domain isn't manageable - # and inform the user that we could not contact the dyndns host server. - except Exception: - logger.warning( - m18n.n("dyndns_provider_unreachable", provider=dyndns_provider) - ) - is_nohostme_or_nohost = False + # If this is a nohost.me/noho.st, actually check for availability + if not ignore_dyndns and is_yunohost_dyndns_domain(domain): + # (Except if the user explicitly said he/she doesn't care about dyndns) + if ignore_dyndns: + dyndns = False + # Check if the domain is available... + else: + try: + available = _dyndns_available(domain) + # If an exception is thrown, most likely we don't have internet + # connectivity or something. Assume that this domain isn't manageable + # and inform the user that we could not contact the dyndns host server. + except Exception: + logger.warning( + m18n.n("dyndns_provider_unreachable", provider="dyndns.yunohost.org") + ) - # If this is a nohost.me/noho.st, actually check for availability - if is_nohostme_or_nohost: - # (Except if the user explicitly said he/she doesn't care about dyndns) - if ignore_dyndns: - dyndns = False - # Check if the domain is available... - elif _dyndns_available(dyndns_provider, domain): + if available: dyndns = True # If not, abort the postinstall else: raise YunohostValidationError("dyndns_unavailable", domain=domain) - else: - dyndns = False else: dyndns = False From f7cea60a303e68ba69226107283860d2f5172ea2 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Sun, 24 Oct 2021 22:27:11 +0200 Subject: [PATCH 072/619] Moar dyndns yagni: we don't need to be able to specify ipv4/ipv6/keyfile during dyndns update --- data/actionsmap/yunohost.yml | 9 --------- src/yunohost/dyndns.py | 30 +++++++++--------------------- 2 files changed, 9 insertions(+), 30 deletions(-) diff --git a/data/actionsmap/yunohost.yml b/data/actionsmap/yunohost.yml index b88f5260a..16ea2c5d2 100644 --- a/data/actionsmap/yunohost.yml +++ b/data/actionsmap/yunohost.yml @@ -1501,12 +1501,6 @@ dyndns: help: Full domain to update extra: pattern: *pattern_domain - -k: - full: --key - help: Public DNS key - -i: - full: --ipv4 - help: IP address to send -f: full: --force help: Force the update (for debugging only) @@ -1515,9 +1509,6 @@ dyndns: full: --dry-run help: Only display the generated zone action: store_true - -6: - full: --ipv6 - help: IPv6 address to send ### dyndns_installcron() installcron: diff --git a/src/yunohost/dyndns.py b/src/yunohost/dyndns.py index 1659ec6ea..7027bebaa 100644 --- a/src/yunohost/dyndns.py +++ b/src/yunohost/dyndns.py @@ -174,9 +174,6 @@ def dyndns_subscribe( def dyndns_update( operation_logger, domain=None, - key=None, - ipv4=None, - ipv6=None, force=False, dry_run=False, ): @@ -185,15 +182,12 @@ def dyndns_update( Keyword argument: domain -- Full domain to update - key -- Public DNS key - ipv4 -- IP address to send - ipv6 -- IPv6 address to send - """ from yunohost.dns import _build_dns_conf # If domain is not given, try to guess it from keys available... + key = None if domain is None: (domain, key) = _guess_current_dyndns_domain() @@ -201,14 +195,13 @@ def dyndns_update( raise YunohostValidationError("dyndns_no_domain_registered") # If key is not given, pick the first file we find with the domain given - else: - if key is None: - keys = glob.glob("/etc/yunohost/dyndns/K{0}.+*.private".format(domain)) + elif key is None: + keys = glob.glob("/etc/yunohost/dyndns/K{0}.+*.private".format(domain)) - if not keys: - raise YunohostValidationError("dyndns_key_not_found") + if not keys: + raise YunohostValidationError("dyndns_key_not_found") - key = keys[0] + key = keys[0] # Extract 'host', e.g. 'nohost.me' from 'foo.nohost.me' host = domain.split(".")[1:] @@ -267,14 +260,8 @@ def dyndns_update( old_ipv6 = resolve_domain(domain, "AAAA") # Get current IPv4 and IPv6 - ipv4_ = get_public_ip() - ipv6_ = get_public_ip(6) - - if ipv4 is None: - ipv4 = ipv4_ - - if ipv6 is None: - ipv6 = ipv6_ + ipv4 = get_public_ip() + ipv6 = get_public_ip(6) logger.debug("Old IPv4/v6 are (%s, %s)" % (old_ipv4, old_ipv6)) logger.debug("Requested IPv4/v6 are (%s, %s)" % (ipv4, ipv6)) @@ -379,6 +366,7 @@ def _guess_current_dyndns_domain(): # Retrieve the first registered domain paths = list(glob.iglob("/etc/yunohost/dyndns/K*.private")) for path in paths: + # MD5 is legacy ugh match = RE_DYNDNS_PRIVATE_KEY_MD5.match(path) if not match: match = RE_DYNDNS_PRIVATE_KEY_SHA512.match(path) From e8e2cee030c871fa060b1cad5165c85c244215e5 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Sun, 24 Oct 2021 22:30:10 +0200 Subject: [PATCH 073/619] dyndns: During dyndns update, first make sure we have an ipv4 or ipv6 to avoid the remaining code miserably crashing --- src/yunohost/dyndns.py | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/yunohost/dyndns.py b/src/yunohost/dyndns.py index 7027bebaa..80099d811 100644 --- a/src/yunohost/dyndns.py +++ b/src/yunohost/dyndns.py @@ -203,6 +203,16 @@ def dyndns_update( key = keys[0] + # Get current IPv4 and IPv6 + ipv4 = get_public_ip() + ipv6 = get_public_ip(6) + + if ipv4 is None and ipv6 is None: + logger.debug( + "No ipv4 nor ipv6 ?! Sounds like the server is not connected to the internet, or the ip.yunohost.org infrastructure is down somehow" + ) + return + # Extract 'host', e.g. 'nohost.me' from 'foo.nohost.me' host = domain.split(".")[1:] host = ".".join(host) @@ -259,19 +269,9 @@ def dyndns_update( old_ipv4 = resolve_domain(domain, "A") old_ipv6 = resolve_domain(domain, "AAAA") - # Get current IPv4 and IPv6 - ipv4 = get_public_ip() - ipv6 = get_public_ip(6) - logger.debug("Old IPv4/v6 are (%s, %s)" % (old_ipv4, old_ipv6)) logger.debug("Requested IPv4/v6 are (%s, %s)" % (ipv4, ipv6)) - if ipv4 is None and ipv6 is None: - logger.debug( - "No ipv4 nor ipv6 ?! Sounds like the server is not connected to the internet, or the ip.yunohost.org infrastructure is down somehow" - ) - return - # no need to update if (not force and not dry_run) and (old_ipv4 == ipv4 and old_ipv6 == ipv6): logger.info("No updated needed.") From 4162557aacc7888ba138d02fcf3553e688b96d69 Mon Sep 17 00:00:00 2001 From: ljf Date: Tue, 26 Oct 2021 12:37:08 +0200 Subject: [PATCH 074/619] [fix] Mypy CI --- src/yunohost/utils/config.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/yunohost/utils/config.py b/src/yunohost/utils/config.py index 2e0fa5b81..5d1d1f9d2 100644 --- a/src/yunohost/utils/config.py +++ b/src/yunohost/utils/config.py @@ -191,7 +191,7 @@ def evaluate_simple_js_expression(expr, context={}): class ConfigPanel: entity_type = "config" - save_path_tpl = None + save_path_tpl: Union[str, None] = None config_path_tpl = "/usr/share/yunohost/other/config_{entity_type}.toml" save_mode = "full" @@ -705,7 +705,7 @@ class Question(object): # .value is the "proposed" value which we got from the user self.value = question.get("value") # Use to return several values in case answer is in mutipart - self.values = {} + self.values: Dict[str, Any] = {} # Empty value is parsed as empty string if self.default == "": @@ -1318,7 +1318,7 @@ ARGUMENTS_TYPE_PARSERS = { def ask_questions_and_parse_answers( raw_questions: Dict, prefilled_answers: Union[str, Mapping[str, Any]] = {}, - current_values: Union[str, Mapping[str, Any]] = {}, + current_values: Mapping[str, Any] = {}, hooks: Dict[str, Callable[[], None]] = {}, ) -> List[Question]: """Parse arguments store in either manifest.json or actions.json or from a From afbcc274439653538f69121484af6f84b69a342f Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Mon, 1 Nov 2021 17:06:56 +0100 Subject: [PATCH 075/619] Unused i18n string --- locales/en.json | 1 - 1 file changed, 1 deletion(-) diff --git a/locales/en.json b/locales/en.json index 2c9652b9c..81e75eb32 100644 --- a/locales/en.json +++ b/locales/en.json @@ -349,7 +349,6 @@ "dpkg_is_broken": "You cannot do this right now because dpkg/APT (the system package managers) seems to be in a broken state... You can try to solve this issue by connecting through SSH and running `sudo apt install --fix-broken` and/or `sudo dpkg --configure -a`.", "dpkg_lock_not_available": "This command can't be run right now because another program seems to be using the lock of dpkg (the system package manager)", "dyndns_could_not_check_available": "Could not check if {domain} is available on {provider}.", - "dyndns_could_not_check_provide": "Could not check if {provider} can provide {domain}.", "dyndns_domain_not_provided": "DynDNS provider {provider} cannot provide domain {domain}.", "dyndns_ip_update_failed": "Could not update IP address to DynDNS", "dyndns_ip_updated": "Updated your IP on DynDNS", From 93f1ab2b34bf98ac5ebafe000fe7c04ea45b206c Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Mon, 1 Nov 2021 18:19:23 +0100 Subject: [PATCH 076/619] Tweak debian control file to make php, mysql, metronome ~optional (but recommended) --- debian/control | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/debian/control b/debian/control index fe18b1de8..a1f84d579 100644 --- a/debian/control +++ b/debian/control @@ -16,8 +16,6 @@ Depends: ${python3:Depends}, ${misc:Depends} , python3-toml, python3-packaging, python3-publicsuffix, , python3-ldap, python3-zeroconf, python3-lexicon, , apt, apt-transport-https, apt-utils, dirmngr - , php7.3-common, php7.3-fpm, php7.3-ldap, php7.3-intl - , mariadb-server, php7.3-mysql , openssh-server, iptables, fail2ban, dnsutils, bind9utils , openssl, ca-certificates, netcat-openbsd, iproute2 , slapd, ldap-utils, sudo-ldap, libnss-ldapd, unscd, libpam-ldapd @@ -26,17 +24,19 @@ Depends: ${python3:Depends}, ${misc:Depends} , dovecot-core, dovecot-ldap, dovecot-lmtpd, dovecot-managesieved, dovecot-antispam , rspamd, opendkim-tools, postsrsd, procmail, mailutils , redis-server - , metronome (>=3.14.0) , acl , git, curl, wget, cron, unzip, jq, bc, at , lsb-release, haveged, fake-hwclock, equivs, lsof, whois Recommends: yunohost-admin , ntp, inetutils-ping | iputils-ping , bash-completion, rsyslog + , php7.3-common, php7.3-fpm, php7.3-ldap, php7.3-intl + , mariadb-server, php7.3-mysql , php7.3-gd, php7.3-curl, php-gettext , python3-pip , unattended-upgrades , libdbd-ldap-perl, libnet-dns-perl + , metronome (>=3.14.0) Suggests: htop, vim, rsync, acpi-support-base, udisks2 Conflicts: iptables-persistent , apache2 From 00bd7f16a5f4838e653b9f0c5045c56d89a9ed2c Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Mon, 1 Nov 2021 18:20:42 +0100 Subject: [PATCH 077/619] Tweak regenconf scripts for mysql, metronome, add one for postgresql --- data/helpers.d/postgresql | 31 +-------- data/hooks/conf_regen/12-metronome | 6 ++ data/hooks/conf_regen/34-mysql | 6 ++ data/hooks/conf_regen/35-postgresql | 66 ++++++++++++++++++++ data/hooks/conf_regen/{35-redis => 36-redis} | 0 5 files changed, 79 insertions(+), 30 deletions(-) create mode 100755 data/hooks/conf_regen/35-postgresql rename data/hooks/conf_regen/{35-redis => 36-redis} (100%) diff --git a/data/helpers.d/postgresql b/data/helpers.d/postgresql index 992474dd5..0e8d91936 100644 --- a/data/helpers.d/postgresql +++ b/data/helpers.d/postgresql @@ -292,34 +292,5 @@ ynh_psql_test_if_first_run() { # Make sure postgresql is indeed installed dpkg --list | grep -q "ii postgresql-$PSQL_VERSION" || ynh_die --message="postgresql-$PSQL_VERSION is not installed !?" - # Check for some weird issue where postgresql could be installed but etc folder would not exist ... - [ -e "/etc/postgresql/$PSQL_VERSION" ] || ynh_die --message="It looks like postgresql was not properly configured ? /etc/postgresql/$PSQL_VERSION is missing ... Could be due to a locale issue, c.f.https://serverfault.com/questions/426989/postgresql-etc-postgresql-doesnt-exist" - - # Make sure postgresql is started and enabled - # (N.B. : to check the active state, we check the cluster state because - # postgresql could be flagged as active even though the cluster is in - # failed state because of how the service is configured..) - systemctl is-active postgresql@$PSQL_VERSION-main -q || ynh_systemd_action --service_name=postgresql --action=restart - systemctl is-enabled postgresql -q || systemctl enable postgresql --quiet - - # If this is the very first time, we define the root password - # and configure a few things - if [ ! -f "$PSQL_ROOT_PWD_FILE" ]; then - local pg_hba=/etc/postgresql/$PSQL_VERSION/main/pg_hba.conf - - local psql_root_password="$(ynh_string_random)" - echo "$psql_root_password" >$PSQL_ROOT_PWD_FILE - sudo --login --user=postgres psql -c"ALTER user postgres WITH PASSWORD '$psql_root_password'" postgres - - # force all user to connect to local databases using hashed passwords - # https://www.postgresql.org/docs/current/static/auth-pg-hba-conf.html#EXAMPLE-PG-HBA.CONF - # Note: we can't use peer since YunoHost create users with nologin - # See: https://github.com/YunoHost/yunohost/blob/unstable/data/helpers.d/user - ynh_replace_string --match_string="local\(\s*\)all\(\s*\)all\(\s*\)peer" --replace_string="local\1all\2all\3md5" --target_file="$pg_hba" - - # Integrate postgresql service in yunohost - yunohost service add postgresql --log "/var/log/postgresql/" - - ynh_systemd_action --service_name=postgresql --action=reload - fi + yunohost tools regen-conf postgresql } diff --git a/data/hooks/conf_regen/12-metronome b/data/hooks/conf_regen/12-metronome index 5dfa7b5dc..c3c5ff828 100755 --- a/data/hooks/conf_regen/12-metronome +++ b/data/hooks/conf_regen/12-metronome @@ -2,6 +2,12 @@ set -e +if ! dpkg --list | grep -q 'ii *metronome ' +then + echo 'metronome is not installed, skipping' + exit 0 +fi + do_pre_regen() { pending_dir=$1 diff --git a/data/hooks/conf_regen/34-mysql b/data/hooks/conf_regen/34-mysql index 8b4d59288..c9115017d 100755 --- a/data/hooks/conf_regen/34-mysql +++ b/data/hooks/conf_regen/34-mysql @@ -3,6 +3,12 @@ set -e . /usr/share/yunohost/helpers +if ! dpkg --list | grep -q 'ii *mariadb-server ' +then + echo 'mysql/mariadb is not installed, skipping' + exit 0 +fi + do_pre_regen() { pending_dir=$1 diff --git a/data/hooks/conf_regen/35-postgresql b/data/hooks/conf_regen/35-postgresql new file mode 100755 index 000000000..0da0767cc --- /dev/null +++ b/data/hooks/conf_regen/35-postgresql @@ -0,0 +1,66 @@ +#!/bin/bash + +set -e +. /usr/share/yunohost/helpers + +if ! dpkg --list | grep -q "ii *postgresql-$PSQL_VERSION " +then + echo 'postgresql is not installed, skipping' + exit 0 +fi + +if [ ! -e "/etc/postgresql/$PSQL_VERSION" ] +then + ynh_die --message="It looks like postgresql was not properly configured ? /etc/postgresql/$PSQL_VERSION is missing ... Could be due to a locale issue, c.f.https://serverfault.com/questions/426989/postgresql-etc-postgresql-doesnt-exist" +fi + + +do_pre_regen() { + return 0 +} + +do_post_regen() { + regen_conf_files=$1 + + # Make sure postgresql is started and enabled + # (N.B. : to check the active state, we check the cluster state because + # postgresql could be flagged as active even though the cluster is in + # failed state because of how the service is configured..) + systemctl is-active postgresql@$PSQL_VERSION-main -q || ynh_systemd_action --service_name=postgresql --action=restart + systemctl is-enabled postgresql -q || systemctl enable postgresql --quiet + + # If this is the very first time, we define the root password + # and configure a few things + if [ ! -f "$PSQL_ROOT_PWD_FILE" ] || [ -z "$(cat $PSQL_ROOT_PWD_FILE)" ]; then + ynh_string_random >$PSQL_ROOT_PWD_FILE + fi + + sudo --login --user=postgres psql -c"ALTER user postgres WITH PASSWORD '$(cat $PSQL_ROOT_PWD_FILE)'" postgres + + # force all user to connect to local databases using hashed passwords + # https://www.postgresql.org/docs/current/static/auth-pg-hba-conf.html#EXAMPLE-PG-HBA.CONF + # Note: we can't use peer since YunoHost create users with nologin + # See: https://github.com/YunoHost/yunohost/blob/unstable/data/helpers.d/user + local pg_hba=/etc/postgresql/$PSQL_VERSION/main/pg_hba.conf + ynh_replace_string --match_string="local\(\s*\)all\(\s*\)all\(\s*\)peer" --replace_string="local\1all\2all\3md5" --target_file="$pg_hba" + + ynh_systemd_action --service_name=postgresql --action=reload +} + +FORCE=${2:-0} +DRY_RUN=${3:-0} + +case "$1" in + pre) + do_pre_regen $4 + ;; + post) + do_post_regen $4 + ;; + *) + echo "hook called with unknown argument \`$1'" >&2 + exit 1 + ;; +esac + +exit 0 diff --git a/data/hooks/conf_regen/35-redis b/data/hooks/conf_regen/36-redis similarity index 100% rename from data/hooks/conf_regen/35-redis rename to data/hooks/conf_regen/36-redis From 2282d0df61fa85e6f70fc57a425e3ba5cc0f2090 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Mon, 1 Nov 2021 18:35:36 +0100 Subject: [PATCH 078/619] Add sury by default in the core... --- data/helpers.d/apt | 33 --------------------------------- data/hooks/conf_regen/10-apt | 11 +++++++++++ 2 files changed, 11 insertions(+), 33 deletions(-) diff --git a/data/helpers.d/apt b/data/helpers.d/apt index cea850f6e..3d06608ac 100644 --- a/data/helpers.d/apt +++ b/data/helpers.d/apt @@ -262,8 +262,6 @@ ynh_install_app_dependencies() { || ynh_die --message="Inconsistent php versions in dependencies ... found : $specific_php_version" dependencies+=", php${specific_php_version}, php${specific_php_version}-fpm, php${specific_php_version}-common" - - ynh_add_sury fi @@ -285,23 +283,6 @@ ynh_install_app_dependencies() { dependencies="$current_dependencies, $dependencies" fi - # - # Epic ugly hack to fix the goddamn dependency nightmare of sury - # Sponsored by the "Djeezusse Fokin Kraiste Why Do Adminsys Has To Be So Fucking Complicated I Should Go Grow Potatoes Instead Of This Shit" collective - # https://github.com/YunoHost/issues/issues/1407 - # - # If we require to install php dependency - if grep --quiet 'php' <<< "$dependencies"; then - # And we have packages from sury installed (7.0.33-10+weirdshiftafter instead of 7.0.33-0 on debian) - if dpkg --list | grep "php7.0" | grep --quiet --invert-match "7.0.33-0+deb9"; then - # And sury ain't already in sources.lists - if ! grep --recursive --quiet "^ *deb.*sury" /etc/apt/sources.list*; then - # Re-add sury - ynh_add_sury - fi - fi - fi - cat >/tmp/${dep_app}-ynh-deps.control <>"${pending_dir}/etc/apt/preferences.d/ban_packages" + # Add sury + mkdir -p ${pending_dir}/etc/apt/sources.list.d/ + echo "deb https://packages.sury.org/php/ $(ynh_get_debian_release) main" > "${pending_dir}/etc/apt/sources.list.d/extra_php_version.list" + } do_post_regen() { regen_conf_files=$1 + # Add sury key + # We do this only at the post regen and if the key doesn't already exists, because we don't want the regenconf to fuck everything up if the regenconf runs while the network is down + if [[ ! -s /etc/apt/trusted.gpg.d/extra_php_version.gpg ]] + then + wget --timeout 900 --quiet "https://packages.sury.org/php/apt.gpg" --output-document=- | gpg --dearmor >"/etc/apt/trusted.gpg.d/extra_php_version.gpg" + fi + # Make sure php7.3 is the default version when using php in cli update-alternatives --set php /usr/bin/php7.3 } From 82f28efaafad73e0db72f1c7e8406f197d87af58 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Mon, 1 Nov 2021 18:44:12 +0100 Subject: [PATCH 079/619] Make php package always explicitly depend on the PHP version they're using, even if that's debian's default version --- data/helpers.d/apt | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) diff --git a/data/helpers.d/apt b/data/helpers.d/apt index 3d06608ac..194cae40f 100644 --- a/data/helpers.d/apt +++ b/data/helpers.d/apt @@ -252,9 +252,6 @@ ynh_install_app_dependencies() { # The (?<=php) syntax corresponds to lookbehind ;) local specific_php_version=$(echo $dependencies | grep -oP '(?<=php)[0-9.]+(?=-|\>)' | sort -u) - # Ignore case where the php version found is the one available in debian vanilla - [[ "$specific_php_version" != "$YNH_DEFAULT_PHP_VERSION" ]] || specific_php_version="" - if [[ -n "$specific_php_version" ]] then # Cover a small edge case where a packager could have specified "php7.4-pwet php5-gni" which is confusing @@ -301,17 +298,10 @@ EOF if [[ -n "$specific_php_version" ]] then - # Set the default php version back as the default version for php-cli. - update-alternatives --set php /usr/bin/php$YNH_DEFAULT_PHP_VERSION - - # Store phpversion into the config of this app ynh_app_setting_set --app=$app --key=phpversion --value=$specific_php_version - # Integrate new php-fpm service in yunohost - yunohost service add php${specific_php_version}-fpm --log "/var/log/php${phpversion}-fpm.log" - elif grep --quiet 'php' <<< "$dependencies"; then - # Store phpversion into the config of this app - ynh_app_setting_set --app=$app --key=phpversion --value=$YNH_DEFAULT_PHP_VERSION + # Set the default php version back as the default version for php-cli. + update-alternatives --set php /usr/bin/php$YNH_DEFAULT_PHP_VERSION fi } From 4ccd718183e5646378c17d407d275e1502fc58bb Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Mon, 1 Nov 2021 19:59:35 +0100 Subject: [PATCH 080/619] Improve handling of optional services/packages + dynamically handle the list of php-fpm versions --- data/templates/yunohost/services.yml | 15 ++++++++++---- src/yunohost/service.py | 29 +++++++++++++++------------- 2 files changed, 27 insertions(+), 17 deletions(-) diff --git a/data/templates/yunohost/services.yml b/data/templates/yunohost/services.yml index c781d54aa..967025d19 100644 --- a/data/templates/yunohost/services.yml +++ b/data/templates/yunohost/services.yml @@ -12,24 +12,31 @@ metronome: log: [/var/log/metronome/metronome.log,/var/log/metronome/metronome.err] needs_exposed_ports: [5222, 5269] category: xmpp + ignore_if_package_is_not_installed: metronome mysql: log: [/var/log/mysql.log,/var/log/mysql.err,/var/log/mysql/error.log] actual_systemd_service: mariadb category: database + ignore_if_package_is_not_installed: mariadb-server nginx: log: /var/log/nginx test_conf: nginx -t needs_exposed_ports: [80, 443] category: web -php7.3-fpm: - log: /var/log/php7.3-fpm.log - test_conf: php-fpm7.3 --test - category: web +# Yunohost will dynamically add installed php-fpm services (7.3, 7.4, 8.0, ...) in services.py +#php7.3-fpm: +# log: /var/log/php7.3-fpm.log +# test_conf: php-fpm7.3 --test +# category: web postfix: log: [/var/log/mail.log,/var/log/mail.err] actual_systemd_service: postfix@- needs_exposed_ports: [25, 587] category: email +postgresql: + actual_systemd_service: 'postgresql@11-main' + category: database + ignore_if_package_is_not_installed: postgresql-11 redis-server: log: /var/log/redis/redis-server.log category: database diff --git a/src/yunohost/service.py b/src/yunohost/service.py index f200d08c0..26d189d95 100644 --- a/src/yunohost/service.py +++ b/src/yunohost/service.py @@ -123,7 +123,7 @@ def service_add( # Try to get the description from systemd service _, systemd_info = _get_service_information_from_systemd(name) type_ = systemd_info.get("Type") if systemd_info is not None else "" - if type_ == "oneshot" and name != "postgresql": + if type_ == "oneshot": logger.warning( "/!\\ Packagers! Please provide a --test_status when adding oneshot-type services in Yunohost, such that it has a reliable way to check if the service is running or not." ) @@ -738,13 +738,20 @@ def _get_services(): if "log" not in services["ynh-vpnclient"]: services["ynh-vpnclient"]["log"] = ["/var/log/ynh-vpnclient.log"] - # Stupid hack for postgresql which ain't an official service ... Can't - # really inject that info otherwise. Real service we want to check for - # status and log is in fact postgresql@x.y-main (x.y being the version) - if "postgresql" in services: - if "description" in services["postgresql"]: - del services["postgresql"]["description"] - services["postgresql"]["actual_systemd_service"] = "postgresql@11-main" + services_with_package_condition = [name for name, infos in services.items() if infos.get("ignore_if_package_is_not_installed")] + for name in services_with_package_condition: + package = services[name]["ignore_if_package_is_not_installed"] + if os.system(f"dpkg --list | grep -q 'ii *{package}'") != 0: + del services[name] + + php_fpm_versions = check_output(r"dpkg --list | grep -P 'ii php\d.\d-fpm' | awk '{print $2}' | grep -o -P '\d.\d'") + php_fpm_versions = [v for v in php_fpm_versions.split('\n') if v.strip()] + for version in php_fpm_versions: + services[f"php{version}-fpm"] = { + "log": f"/var/log/php{version}-fpm.log", + "test_conf": f"php-fpm{version} --test", # ofc the service is phpx.y-fpm but the program is php-fpmx.y because why not ... + "category": "web" + } # Remove legacy /var/log/daemon.log and /var/log/syslog from log entries # because they are too general. Instead, now the journalctl log is @@ -864,11 +871,7 @@ def _get_journalctl_logs(service, number="all"): services = _get_services() systemd_service = services.get(service, {}).get("actual_systemd_service", service) try: - return check_output( - "journalctl --no-hostname --no-pager -u {0} -n{1}".format( - systemd_service, number - ) - ) + return check_output(f"journalctl --no-hostname --no-pager -u {systemd_service} -n{number}") except Exception: import traceback From b46a94a41dd6725653b2206b6d3e4ae80d2aa02c Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Mon, 1 Nov 2021 20:14:12 +0100 Subject: [PATCH 081/619] Automagically run ynh_psql_if_first_run / regenconf upon postgresl install --- data/helpers.d/apt | 9 +++++++++ data/helpers.d/postgresql | 2 ++ 2 files changed, 11 insertions(+) diff --git a/data/helpers.d/apt b/data/helpers.d/apt index 194cae40f..ecad3b14a 100644 --- a/data/helpers.d/apt +++ b/data/helpers.d/apt @@ -261,6 +261,7 @@ ynh_install_app_dependencies() { dependencies+=", php${specific_php_version}, php${specific_php_version}-fpm, php${specific_php_version}-common" fi + local psql_installed2="$(dpkg --list | grep -q "ii *postgresql-$PSQL_VERSION" && echo yes || echo no)" # The first time we run ynh_install_app_dependencies, we will replace the # entire control file (This is in particular meant to cover the case of @@ -303,6 +304,14 @@ EOF # Set the default php version back as the default version for php-cli. update-alternatives --set php /usr/bin/php$YNH_DEFAULT_PHP_VERSION fi + + # Trigger postgresql regenconf if we may have just installed postgresql + local psql_installed2="$(dpkg --list | grep -q "ii *postgresql-$PSQL_VERSION" && echo yes || echo no)" + if [[ "$psql_installed" != "$psql_installed2" ]] + then + yunohost tools regen-conf postgresql + fi + } # Add dependencies to install with ynh_install_app_dependencies diff --git a/data/helpers.d/postgresql b/data/helpers.d/postgresql index 0e8d91936..563d3e7be 100644 --- a/data/helpers.d/postgresql +++ b/data/helpers.d/postgresql @@ -281,6 +281,8 @@ ynh_psql_remove_db() { # Create a master password and set up global settings # +# [internal] +# # usage: ynh_psql_test_if_first_run # # It also make sure that postgresql is installed and running From 56f7cd87ecacc3b73d3994b1d13f9022133d9c06 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Mon, 1 Nov 2021 21:00:35 +0100 Subject: [PATCH 082/619] regenconf apt: ynh_get_debian_release undefined + reorder for clarity --- data/hooks/conf_regen/10-apt | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/data/hooks/conf_regen/10-apt b/data/hooks/conf_regen/10-apt index d67951823..06662375d 100755 --- a/data/hooks/conf_regen/10-apt +++ b/data/hooks/conf_regen/10-apt @@ -7,6 +7,11 @@ do_pre_regen() { mkdir --parents "${pending_dir}/etc/apt/preferences.d" + # Add sury + mkdir -p ${pending_dir}/etc/apt/sources.list.d/ + echo "deb https://packages.sury.org/php/ $(lsb_release --codename --short) main" > "${pending_dir}/etc/apt/sources.list.d/extra_php_version.list" + + # Ban some packages from sury packages_to_refuse_from_sury="php php-fpm php-mysql php-xml php-zip php-mbstring php-ldap php-gd php-curl php-bz2 php-json php-sqlite3 php-intl openssl libssl1.1 libssl-dev" for package in $packages_to_refuse_from_sury; do echo " @@ -15,6 +20,7 @@ Pin: origin \"packages.sury.org\" Pin-Priority: -1" >>"${pending_dir}/etc/apt/preferences.d/extra_php_version" done + # Ban some packages that users may inadvertendly try to install such as apache2 ... echo " # PLEASE READ THIS WARNING AND DON'T EDIT THIS FILE @@ -44,9 +50,6 @@ Pin: release * Pin-Priority: -1 " >>"${pending_dir}/etc/apt/preferences.d/ban_packages" - # Add sury - mkdir -p ${pending_dir}/etc/apt/sources.list.d/ - echo "deb https://packages.sury.org/php/ $(ynh_get_debian_release) main" > "${pending_dir}/etc/apt/sources.list.d/extra_php_version.list" } From 019d207c2f22616001dea719a0e4b0d18c647221 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Mon, 1 Nov 2021 21:09:29 +0100 Subject: [PATCH 083/619] helpers: Don't say the 'app was restored' when restore failed after failed upgrade --- data/helpers.d/backup | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/data/helpers.d/backup b/data/helpers.d/backup index 27ffa015c..98a61c16a 100644 --- a/data/helpers.d/backup +++ b/data/helpers.d/backup @@ -479,7 +479,12 @@ ynh_restore_upgradebackup() { yunohost app remove $app # Restore the backup yunohost backup restore $app_bck-pre-upgrade$backup_number --apps $app --force --debug - ynh_die --message="The app was restored to the way it was before the failed upgrade." + if [[ -d /etc/yunohost/apps/$app ]] + then + ynh_die --message="The app was restored to the way it was before the failed upgrade." + elif + ynh_die --message="Uhoh ... Yunohost failed to restore the app to the way it was before the failed upgrade :|" + fi fi else ynh_print_warn --message="\$NO_BACKUP_UPGRADE is set, that means there's no backup to restore. You have to fix this upgrade by yourself !" From a97b282d97dd01b6fa784eba729edb4d9142cbdb Mon Sep 17 00:00:00 2001 From: yunohost-bot Date: Mon, 1 Nov 2021 20:34:04 +0000 Subject: [PATCH 084/619] [CI] Format code with Black --- src/yunohost/dyndns.py | 8 ++++---- src/yunohost/tools.py | 4 +++- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/yunohost/dyndns.py b/src/yunohost/dyndns.py index 80099d811..4f4dc1d1f 100644 --- a/src/yunohost/dyndns.py +++ b/src/yunohost/dyndns.py @@ -70,7 +70,9 @@ def _dyndns_available(domain): logger.debug(f"Checking if domain {domain} is available on {DYNDNS_PROVIDER} ...") try: - r = download_json(f"https://{DYNDNS_PROVIDER}/test/{domain}", expected_status_code=None) + r = download_json( + f"https://{DYNDNS_PROVIDER}/test/{domain}", expected_status_code=None + ) except MoulinetteError as e: logger.error(str(e)) raise YunohostError( @@ -81,9 +83,7 @@ def _dyndns_available(domain): @is_unit_operation() -def dyndns_subscribe( - operation_logger, domain=None, key=None -): +def dyndns_subscribe(operation_logger, domain=None, key=None): """ Subscribe to a DynDNS service diff --git a/src/yunohost/tools.py b/src/yunohost/tools.py index 54d7ffc0e..fb9839814 100644 --- a/src/yunohost/tools.py +++ b/src/yunohost/tools.py @@ -248,7 +248,9 @@ def tools_postinstall( # and inform the user that we could not contact the dyndns host server. except Exception: logger.warning( - m18n.n("dyndns_provider_unreachable", provider="dyndns.yunohost.org") + m18n.n( + "dyndns_provider_unreachable", provider="dyndns.yunohost.org" + ) ) if available: From 69ca64d333302e0ec61fddae16de8639efa7b827 Mon Sep 17 00:00:00 2001 From: punkrockgirl Date: Wed, 20 Oct 2021 16:00:17 +0000 Subject: [PATCH 085/619] Translated using Weblate (Basque) Currently translated at 66.1% (467 of 706 strings) Translation: YunoHost/core Translate-URL: https://translate.yunohost.org/projects/yunohost/core/eu/ --- locales/eu.json | 239 +++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 236 insertions(+), 3 deletions(-) diff --git a/locales/eu.json b/locales/eu.json index 99735e9ce..4dc280e43 100644 --- a/locales/eu.json +++ b/locales/eu.json @@ -35,7 +35,7 @@ "backup_no_uncompress_archive_dir": "Ez dago horrelako deskonprimatutako fitxategi katalogorik", "danger": "Arriskua:", "diagnosis_dns_discrepancy": "Ez dirudi ondorengo DNS balioak bat datozenik proposatutako konfigurazioarekin:
Mota: {type}
Izena: {name}
Oraingo balioa: {current}
Proposatutako balioa: {value}", - "diagnosis_dns_specialusedomain": "{domain} domeinua top-level domain (TLD) erabilera berezikoa da .local edo .test bezala eta horregatik ez du DNS erregistrorik erabiltzen.", + "diagnosis_dns_specialusedomain": "{domain} domeinua top-level domain (TLD) erabilera berezikoa da .local edo .test bezala eta horregatik ez du DNS erregistrorik erabiltzeko beharrik.", "diagnosis_http_bad_status_code": "Badirudi zerbitzaria ez den beste gailu batek erantzun diola eskaerari (agian routerrak).
1. Honen arrazoi ohikoena 80 (eta 443) ataka zerbitzarira ondo birbidaltzen ez dela da.
2. Konfigurazio konplexua badarabilzu, egiaztatu suebakiak edo reverse-proxyk oztopatzen ez dutela.", "diagnosis_http_timeout": "Denbora agortu da sare lokaletik kanpo zure zerbitzarira konexioa gauzatzeko ahaleginean. Eskuragarri ez dagoela dirudi.
1. 80 (eta 443) ataka zerbitzarira modu egokian birbidaltzen ez direla da ohiko arrazoia.
2. Badaezpada egiaztatu nginx martxan dagoela.
3. Konfigurazio konplexuetan, egiaztatu suebakiak edo reverse-proxyk konexioa oztopatzen ez dutela.", "app_sources_fetch_failed": "Ezin izan dira fitxategiak eskuratu, zuzena al da URLa?", @@ -143,7 +143,7 @@ "apps_catalog_init_success": "Abiarazi da aplikazioen katalogo sistema!", "apps_catalog_obsolete_cache": "Aplikazioen katalogoaren cachea hutsik edo zaharkituta dago.", "diagnosis_description_mail": "Posta elektronikoa", - "diagnosis_http_connection_error": "Arazoa konexioan: ezin izan da domeinu horretara konektatu, litekeena da eskuragaitza izatea.", + "diagnosis_http_connection_error": "Arazoa konexioan: ezin izan da domeinu horretara konektatu, litekeena da eskuragarri ez egotea.", "diagnosis_description_web": "Weba", "diagnosis_display_tip": "Aurkitu diren arazoak ikusteko joan Diagnosien atalera administrazio-webgunean, edo exekutatu 'yunohost diagnosis show --issues --human-readable' komandoak nahiago badituzu.", "diagnosis_dns_point_to_doc": "Mesedez, irakurri dokumentazioa DNS erregistroekin laguntza behar baduzu.", @@ -244,5 +244,238 @@ "diagnosis_apps_issue": "Arazo bat dago {app} aplikazioarekin", "diagnosis_apps_not_in_app_catalog": "Aplikazio hau ez da YunoHosten aplikazioen katalogokoa. Iraganean egon bazen eta ezabatu izan balitz, desinstalatzea litzateke onena, ez baitu eguneraketarik jasoko eta sistemaren integritate eta segurtasuna arriskuan jarri lezake.", "diagnosis_apps_outdated_ynh_requirement": "Instalatutako aplikazio honen bertsioak yunohost >= 2.x baino ez du behar, eta horrek egungo pakete-jardunbideekin bat ez datorrela iradokitzen du. Eguneratzen saiatu beharko zinateke.", - "diagnosis_description_apps": "Aplikazioak" + "diagnosis_description_apps": "Aplikazioak", + "domain_dns_conf_special_use_tld": "Domeinu hau top-level domain (TLD) erabilera bereziko motakoa da .local edo .test bezala eta ez du DNS ezarpenik behar.", + "log_permission_create": "Sortu '{}' baimena", + "log_user_delete": "Ezabatu '{}' erabiltzailea", + "log_app_install": "'{}' aplikazioa instalatu", + "done": "Egina", + "group_user_already_in_group": "{user} erabiltzailea {group} taldean dago dagoeneko", + "firewall_reloaded": "Suebakia birkargatu da", + "domain_unknown": "'{domain}' domeinua ezezaguna da", + "global_settings_cant_serialize_settings": "Ezin izan da konfikurazio-datuak serializatu, zergatia: {reason}", + "global_settings_setting_security_nginx_redirect_to_https": "Birbidali HTTP eskaerak HTTPSra (EZ ITZALI hau ez badakizu zertan ari zaren!)", + "group_deleted": "'{group}' taldea ezabatu da", + "invalid_password": "Pasahitza ez da zuzena", + "log_domain_main_domain": "Lehenetsi '{}' domeinua", + "log_user_group_update": "Aldatu '{}' taldea", + "dyndns_could_not_check_available": "Ezin izan da egiaztatu {domain} eskuragarri dagoenik {provider}(e)n.", + "diagnosis_rootfstotalspace_critical": "Sistemaren root memoriak {space} baino ez ditu erabilgarri, eta hori kezkagarria da! Litekeena da oso laster memoriarik gabe geratzea! Root partizioak gutxienez 16GB erabilgarri izatea da gomendioa.", + "disk_space_not_sufficient_install": "Ez dago aplikazio hau instalatzeko nahikoa espaziorik", + "domain_dns_conf_is_just_a_recommendation": "Komando honek *gomendatutako* konfigurazioa erakusten du. Ez du DNS konfigurazioa zugatik ezartzen. Zure ardura da DNS gunea zure erregistro-enpresaren gomendioen arabera ezartzea.", + "dyndns_ip_update_failed": "Ezin izan da IP helbidea DynDNSan eguneratu", + "dyndns_ip_updated": "IP helbidea DynDNS-n eguneratu da", + "dyndns_key_not_found": "Ez da domeinurako DNS gakorik aurkitu", + "dyndns_unavailable": "'{domain}' domeinua ez dago eskuragarri.", + "log_app_makedefault": "Lehenetsi '{}' aplikazioa", + "log_does_exists": "Ez dago '{log}' izena duen eragiketa-erregistrorik, erabili 'yunohost log list' eragiketa-erregistro guztiak ikusteko", + "log_user_group_delete": "Ezabatu '{}' taldea", + "log_user_import": "Inportatu erabiltzaileak", + "dyndns_key_generating": "DNS gakoa sortzen… litekeena da honek denbora behar izatea.", + "diagnosis_mail_fcrdns_ok": "Alderantzizko DNSa zuzen konfiguratuta dago!", + "diagnosis_mail_queue_unavailable_details": "Errorea: {error}", + "dyndns_provider_unreachable": "Ezin izan da DynDNS {provider} enpresarekin konexioa gauzatu: agian zure YunoHost zerbitzaria ez dago internetera konektatuta edo dynette zerbitzaria ez dago martxan.", + "dyndns_registered": "DynDNS domeinua erregistratu da", + "dyndns_registration_failed": "Ezin izan da DynDNS domeinua erregistratu: {error}", + "extracting": "Ateratzen…", + "diagnosis_ports_unreachable": "{port}. ataka ez dago eskuragarri kanpotik.", + "diagnosis_regenconf_manually_modified_details": "Ez dago arazorik zertan ari zaren baldin badakizu! YunoHostek fitxategi hau automatikoki eguneratzeari utziko dio… Baina kontutan izan YunoHosten eguneraketek aldaketa garrantzitsuak izan ditzaketela. Nahi izatekotan, desberdintasunak aztertu ditzakezu yunohost tools regen-conf {category} --dry-run --with-diff komandoa exekutatuz, eta gomendatutako konfiguraziora bueltatu yunohost tools regen-conf {category} --force erabiliz", + "experimental_feature": "Adi: Funtzio hau esperimentala eta ezegonkorra da, ez zenuke erabili beharko ez badakizu zertan ari zaren.", + "global_settings_cant_write_settings": "Ezin izan da konfigurazio fitxategia gorde, zergatia: {reason}", + "dyndns_domain_not_provided": "{provider} DynDNS enpresak ezin du {domain} domeinua eskaini.", + "firewall_reload_failed": "Ezin izan da suebakia birkargatu", + "global_settings_setting_security_password_admin_strength": "Administrazio-pasahitzaren segurtasuna", + "hook_name_unknown": "'{name}' \"hook\" izen ezezaguna", + "domain_deletion_failed": "Ezin izan da {domain} ezabatu: {error}", + "global_settings_setting_security_nginx_compatibility": "Bateragarritasun eta segurtasun arteko gatazka NGINX web zerbitzarirako. Zifraketari eragiten dio (eta segurtasunari lotutako beste kontu batzuei)", + "log_regen_conf": "Berregin '{}' sistemaren konfigurazioa", + "dpkg_lock_not_available": "Ezin da komando hau une honetan exekutatu beste aplikazio bat dpkg (sistemaren paketeen kudeatzailea) blokeatuta duelako, erabiltzen ari baita", + "group_created": "'{group}' taldea sortu da", + "global_settings_setting_security_password_user_strength": "Erabiltzaile-pasahitzaren segurtasuna", + "global_settings_setting_security_experimental_enabled": "Gaitu segurtasun funtzio esperimentlak (ez ezazu egin ez badakizu zertan ari zaren!)", + "good_practices_about_admin_password": "Administrazio-pasahitz berria ezartzear zaude. Pasahitzak zortzi karaktere izan beharko lituzke gutxienez, baina gomendagarria da pasahitz luzeagoa erabiltzea (esaldi bat, esaterako) edota karaktere desberdinak erabiltzea (larriak, txikiak, zenbakiak eta karaktere bereziak).", + "log_help_to_get_failed_log": "Ezin izan da '{desc}' eragiketa exekutatu. Mesedez, laguntza nahi baduzu partekatu eragiketa honen erregistro osoa 'yunohost log share {name}' komandoa erabiliz", + "global_settings_setting_security_webadmin_allowlist_enabled": "Baimendu IP zehatz batzuk bakarrik administrazio-webgunean.", + "group_unknown": "'{group}' taldea ezezaguna da", + "group_updated": "'{group}' taldea eguneratu da", + "group_update_failed": "Ezin izan da '{group}' taldea eguneratu: {error}", + "diagnosis_rootfstotalspace_warning": "Sistemaren root partizioak {space} baino ez ditu. Agian ez da arazorik egongo, baina kontuz ibili edo memoriarik gabe gera zaitezke laster… Root partizioak gutxienez 16GB erabilgarri izatea da gomendioa.", + "iptables_unavailable": "Ezin dituzu iptaulak hemen aldatu. Edukiontzi bat erabiltzen ari zara edo kernelak ez du aukera hau onartzen", + "log_permission_delete": "Ezabatu '{}' baimena", + "group_already_exist": "{group} taldea existitzen da dagoeneko", + "group_user_not_in_group": "{user} erabiltzailea ez dago {group} taldean", + "diagnosis_mail_fcrdns_nok_alternatives_6": "Operadore batzuek ez dute alderantzizko DNSa konfiguratzen uzten (edo funtzioa ez dabil…). IPv4rako alderantzizko DNSa zuzen konfiguratuta badago, IPv6 desgaitzen saia zaitezke posta elektronikoa bidaltzeko, yunohost settings set smtp.allow_ipv6 -v off exekutatuz. Adi: honek esan nahi du ez zarela gai izango IPv6 bakarrik darabilten zerbitzari apurren posta elektronikoa jasotzeko edo beraiei bidaltzeko.", + "diagnosis_sshd_config_inconsistent": "Dirudienez SSH ataka eskuz aldatu da /etc/ssh/sshd_config fitxategian. YunoHost 4.2tik aurrera 'security.ssh.port' izeneko ezarpen orokor bat dago konfigurazioa eskuz aldatzea ekiditeko.", + "diagnosis_sshd_config_inconsistent_details": "Mesedez, exekutatu yunohost settings set security.ssh.port -v YOUR_SSH_PORT SSH ataka zehazteko, egiaztatu yunohost tools regen-conf ssh --dry-run --with-diff erabiliz eta yunohost tools regen-conf ssh --force exekutatu gomendatutako konfiguraziora bueltatu nahi baduzu.", + "domain_dns_push_failed_to_authenticate": "Ezin izan da '{domain}' domeinurako erregistro-enpresan saioa hasi APIa erabiliz. Zuzenak al dira egiaztagiriak? (Errorea: {error})", + "domain_dns_pushing": "DNS ezarpenak bidaltzen…", + "diagnosis_sshd_config_insecure": "Badirudi SSH konfigurazioa eskuz aldatu dela eta ez da segurua ez duelako baldintzarik jartzen 'AllowGroups' edo AllowUsers' fitxategien sarbidea oztopatzeko.", + "disk_space_not_sufficient_update": "Ez dago aplikazio hau eguneratzeko nahikoa espaziorik", + "domain_cannot_add_xmpp_upload": "Ezin dira 'xmpp-upload.' hasiera duten domeinuak gehitu. Izen mota hau YunoHosten zati den XMPP igoeretarako erabiltzen da.", + "domain_cannot_remove_main_add_new_one": "Ezin duzu '{domain}' ezabatu domeinu nagusi eta bakarra delako. Beste domeinu bat gehitu 'yunohost domain add ' exekutatuz, gero erabili 'yunohost domain main-domain -n ' domeinu nagusi bilakatzeko, eta azkenik ezabatu {domain}' domeinua 'yunohost domain remove {domain}' komandoarekin.", + "domain_dns_push_record_failed": "Ezin izan da {type}/{name} ezarpenak {action}: {error}", + "domain_dns_push_success": "DNS ezarpenak eguneratu dira!", + "domain_dns_push_failed": "DNS ezarpenen eguneratzeak huts egin du.", + "domain_dns_push_partial_failure": "DNS ezarpenak hala-nola eguneratu dira: abisu/errore batzuk egon dira.", + "global_settings_setting_smtp_relay_host": "YunoHosten ordez posta elektronikoa bidaltzeko SMTP relay helbidea. Erabilgarri izan daiteke egoera hauetan: operadore edo VPS enpresak 25. ataka blokeatzen badute, DUHLn zure etxeko IPa ageri bada, ezin baduzu alderantzizko DNSa ezarri edo zerbitzari hau ez badago zuzenean internetera konektatuta baina posta elektronikoa bidali nahi baduzu.", + "group_deletion_failed": "Ezin izan da '{group}' taldea ezabatu: {error}", + "invalid_number_min": "{min} baino handiagoa izan behar da", + "invalid_number_max": "{max} baino txikiagoa izan behar da", + "diagnosis_services_bad_status": "{service} zerbitzua {status} dago :(", + "diagnosis_ports_needed_by": "{category} funtzioetarako ezinbestekoa da ataka hau eskuragarri egotea (zerbitzua {service})", + "diagnosis_package_installed_from_sury": "Sistemaren pakete batzuen lehenagoko bertsioa beharko litzateke", + "global_settings_setting_smtp_relay_password": "SMTP relay helbideko pasahitza", + "global_settings_setting_smtp_relay_port": "SMTP relay ataka", + "domain_deleted": "Domeinua ezabatu da", + "domain_dyndns_root_unknown": "Ez da ezagutzen DynDNSaren root domeinua", + "domain_exists": "Dagoeneko existitzen da domeinu hau", + "domain_registrar_is_not_configured": "Oraindik ez da {domain} domeinurako erregistro-enpresa ezarri.", + "domain_dns_push_not_applicable": "Ezin da {domain} domeinurako DNS konfigurazio automatiko funtzioa erabili. DNS erregistroak eskuz ezarri beharko zenituzke gidaorriei erreparatuz: https://yunohost.org/dns_config.", + "domain_dns_push_managed_in_parent_domain": "DNS ezarpenak automatikoki konfiguratzeko funtzioa {parent_domain} domeinu nagusian kudeatzen da.", + "domain_dns_registrar_managed_in_parent_domain": "Domeinu hau {parent_domain_link} (r)en azpidomeinua da. DNS ezarpenak {parent_domain}(r)en konfigurazio atalean kudeatu beharko lirateke.", + "domain_dns_registrar_yunohost": "Hau nohost.me / nohost.st / ynh.fr domeinu bat da eta, beraz, DNS ezarpenak automatikoki kudeatzen ditu YunoHostek, bestelako ezer konfiguratu beharrik gabe. (ikus 'yunohost dyndns update' komandoa)", + "domain_dns_registrar_not_supported": "YunoHostek ezin izan du automatikoki erregistro-enpresa antzeman domeinu honetarako. Eskuz konfiguratu beharko zenituzke DNS ezarpenak gidalerroei erreparatuz: https://yunohost.org/dns.", + "domain_dns_registrar_experimental": "Momentuz, YunoHosten kideek ez dute **{registrar}** erregistro-enpresaren APIa nahi beste probatu eta aztertu. Funtzioa **oso esperimentala** da - kontuz!", + "domain_config_mail_in": "Jasotako mezuak", + "domain_config_auth_token": "Token egiaztagiria", + "domain_config_auth_key": "Egiaztapen gakoa", + "domain_config_auth_secret": "Egiaztagiriaren \"secret\"a", + "domain_config_api_protocol": "API protokoloa", + "domain_config_auth_entrypoint": "APIaren sarrera", + "domain_config_auth_application_key": "Aplikazioaren gakoa", + "domain_config_auth_application_secret": "Aplikazioaren gako sekretua", + "domain_config_auth_consumer_key": "Erabiltzailearen gakoa", + "global_settings_setting_smtp_allow_ipv6": "Baimendu IPv6 posta elektronikoa jaso eta bidaltzeko", + "group_cannot_be_deleted": "{group} taldea ezin da eskuz ezabatu.", + "log_domain_config_set": "Aldatu '{}' domeinuko konfigurazioa", + "log_domain_dns_push": "Bidali '{}' domeinuaren DNS ezarpenak", + "log_tools_migrations_migrate_forward": "Exekutatu migrazioak", + "log_tools_postinstall": "Abiarazi YunoHost zerbitzariaren instalazio ondorengo prozesua", + "diagnosis_mail_fcrdns_nok_alternatives_4": "Operadore batzuek ez dute alderantzizko DNSa konfiguratzen uzten (edo funtzioa ez dabil…). Hau dela-eta arazoak badituzu, irtenbide batzuk eduki ditzakezu:
- Operadora batzuek relay posta zerbitzari bat eskaini dezakete, baina kasu horretan zure posta elektronikoa zelatatu dezakete.
- Pribatutasuna bermatzeko *IP publiko bat duen* VPN bat erabiltzea izan daiteke irtenbidea. Ikus https://yunohost.org/#/vpn_advantage
- Edo operadore desberdin batera aldatu", + "domain_dns_registrar_supported": "YunoHostek automatikoki antzeman du domeinu hau **{registrar}** erregistro-enpresak kudeatzen duela. Nahi baduzu YunoHostek automatikoki konfiguratu ditzake DNS ezarpenak, API egiaztagiri aproposak zehazten badituzu. API egiaztagiriak non lortzeko dokumentazioa orri honetan duzu: https://yunohost.org/registar_api_{registrar}. (Baduzu DNS erregistroak eskuz konfiguratzeko aukera ere, gidalerro hauetan ageri den bezala: https://yunohost.org/dns)", + "domain_dns_push_failed_to_list": "Ezin izan da APIa erabiliz oraingo erregistroak antzematea: {error}", + "domain_dns_push_already_up_to_date": "Ezarpenak egunean daude, ez dago zereginik.", + "domain_config_features_disclaimer": "Oraingoz, posta elektronikoa edo XMPP funtzioak gaitu/desgaitzeak, DNS ezarpenei soilik eragiten die, ez sistemaren konfigurazioari!", + "domain_config_mail_out": "Bidalitako mezuak", + "domain_config_xmpp": "Bat-bateko mezularitza (XMPP)", + "global_settings_bad_choice_for_enum": "{setting} ezarpenerako aukera okerra. '{choice}' ezarri da baina hauek dira aukerak: {available_choices}", + "global_settings_setting_security_postfix_compatibility": "Bateragarritasun eta segurtasun arteko gatazka Postfix zerbitzarirako. Zifraketari eragiten dio (eta segurtasunari lotutako beste kontu batzuei)", + "global_settings_setting_security_ssh_compatibility": "Bateragarritasun eta segurtasun arteko gatazka SSH zerbitzarirako. Zifraketari eragiten dio (eta segurtasunari lotutako beste kontu batzuei)", + "good_practices_about_user_password": "Erabiltzaile-pasahitz berria ezartzear zaude. Pasahitzak zortzi karaktere izan beharko lituzke gutxienez, baina gomendagarria da pasahitz luzeagoa erabiltzea (esaldi bat, esaterako) edota karaktere desberdinak erabiltzea (larriak, txikiak, zenbakiak eta karaktere bereziak).", + "group_cannot_edit_all_users": "'all_users' taldea ezin da eskuz aldatu. YunoHosten izena emanda dauden erabiltzaile guztiak barne dituen talde berezia da", + "invalid_number": "Zenbaki bat izan behar da", + "ldap_attribute_already_exists": "'{attribute}' LDAP funtzioa existitzen da dagoeneko eta '{value}' balioa dauka", + "log_app_change_url": "'{}' aplikazioaren URLa aldatu", + "log_app_config_set": "Ezarri '{}' aplikazioako konfigurazioa", + "downloading": "Deskargatzen…", + "dyndns_could_not_check_provide": "Ezin izan da egiaztatu {provider}(e)k {domain} eskaini dezakenik.", + "log_available_on_yunopaste": "Erregistroa {url} estekan ikus daiteke", + "log_dyndns_update": "Eguneratu YunoHosten '{}' domeinuarekin lotutako IP helbidea", + "log_letsencrypt_cert_install": "Instalatu Let's Encrypt ziurtagiria '{}' domeinurako", + "log_selfsigned_cert_install": "Instalatu '{}' domeinurako norberak sinatutako ziurtagiria", + "diagnosis_mail_ehlo_wrong": "Zurea ez den SMTP posta zerbitzari batek erantzun du IPv{ipversion}an. Litekeena da zure zerbitzariak posta elektronikorik jaso ezin izatea.", + "log_tools_upgrade": "Eguneratu sistemaren paketeak", + "log_tools_reboot": "Berrabiarazi zerbitzaria", + "diagnosis_mail_queue_unavailable": "Ezin da kontsultatu zenbat posta elektroniko dauden ilaran", + "log_user_create": "Gehitu '{}' erabiltzailea", + "group_cannot_edit_visitors": "'bisitariak' taldea ezin da eskuz aldatu. Saiorik hasi gabeko bisitariak barne hartzen dituen talde berezia da", + "diagnosis_ram_verylow": "Sistemak RAM memoriaren {available} ({available_percent}%) dauka bakarrik! ({total}(e)tik)", + "diagnosis_ram_low": "Sistemak {available} soilik du erabilgarri, ({available_percent}%), RAM memoriaren (out of {total}). Kontuz ibili", + "diagnosis_ram_ok": "Sistemak oraindik dauka RAM memoriaren {available} ({available_percent}%) erabilgarri, {total} orotara.", + "diagnosis_swap_none": "Sistemak ez du swap-ik. Gutxienez {recommended} gehitzen saiatu beharko zinateke, sistema memoriarik gabe gera ez dadin.", + "diagnosis_swap_ok": "Sistemak {total} swap dauka!", + "diagnosis_regenconf_allgood": "Konfigurazio fitxategi guztiak bat datoz gomendatutako ezarpenekin!", + "diagnosis_regenconf_manually_modified": "Dirudienez {file} konfigurazio fitxategia eskuz aldatu da.", + "diagnosis_security_vulnerable_to_meltdown": "Badirudi Meltdown izeneko segurtasun arazo larriak eragin diezazukela", + "diagnosis_ports_could_not_diagnose": "Ezin izan da egiaztatu atakak IPv{ipversion} erabiliz kanpotik eskuragarri daudenik.", + "diagnosis_ports_ok": "{port}. ataka eskuragarri dago kanpotik.", + "diagnosis_unknown_categories": "Honako kategoriak ez dira ezagutzen: {categories}", + "diagnosis_services_running": "{service} zerbitzua martxan dago!", + "log_app_action_run": "'{}' aplikazioaren eragiketa exekutatu", + "diagnosis_never_ran_yet": "Badirudi zerbitzari hau duela gutxi konfiguratu dela eta oraindik ez dago erakusteko diagnostikorik. Diagnostiko osoa abiarazi beharko zenuke, administrazio-webgunetik edo 'yunohost diagnosis run' komandoa exekutatuz.", + "diagnosis_mail_outgoing_port_25_blocked": "SMTP posta zerbitzariak ezin ditu posta elektronikoak bidali 25. ataka itxita dagoelako IPv{ipversion}n.", + "diagnosis_mail_outgoing_port_25_blocked_details": "Lehenik eta behin operadorearen routerreko aukeretan saiatu beharko zinateke 25. ataka desblokeatzen. (Hosting enpresaren arabera, beraiekin harremanetan jartzea beharrezkoa izango da).", + "diagnosis_mail_ehlo_wrong_details": "Kanpo-diagnostikatzaileak IPv{ipversion}an jaso duen EHLOa eta zure zerbitzariaren domeinukoa ez datoz bat.
Jasotako EHLOa: {wrong_ehlo}
Esperotakoa: {right_ehlo}
Arazo honen zergati ohikoena 25. ataka zuzen konfiguratuta ez egotea da. Edo agian suebaki edo reverse-proxya oztopo izan daiteke.", + "diagnosis_mail_fcrdns_different_from_ehlo_domain": "Alderantzizko DNSa ez dago zuzen konfiguratuta IPv{ipversion}an. Litekeena da posta elektroniko batzuk hartzaileak jaso ezin izatea edo spam modura etiketatuak izatea.", + "diagnosis_mail_fcrdns_different_from_ehlo_domain_details": "Oraingo alderantzizko DNSa: {rdns_domain}
Esperotako balioa: {ehlo_domain}", + "diagnosis_mail_queue_too_big": "Mezu gehiegi posta elektronikoaren ilaran: ({nb_pending} mezu)", + "diagnosis_ports_could_not_diagnose_details": "Errorea: {error}", + "diagnosis_swap_tip": "Mesedez, kontutan hartu zerbitzari honen swap memoria SD edo SSD euskarri batean gordetzen dela, euskarri horien bizi-iraupena izugarri laburtu dezakeela.", + "invalid_regex": "\"Regexa\" ez da baliogarria: '{regex}'", + "group_creation_failed": "Ezin izan da '{group}' taldea sortu: {error}", + "log_user_permission_reset": "Berrezarri '{}' baimena", + "group_cannot_edit_primary_group": "'{group}' taldea ezin da eskuz aldatu. Erabiltzaile zehatz bakar bat duen talde nagusia da.", + "diagnosis_swap_notsomuch": "Sistemak {total} swap baino ez du. Gutxienez {recommended} gehitzen saiatu beharko zinateke sistema memoriarik gabe gera ez dadin.", + "diagnosis_security_vulnerable_to_meltdown_details": "Arazoa konpontzeko, sistema eguneratu eta berrabiarazi beharko zenuke linux-en kernel berriagoa erabiltzeko (edo zerbitzariaren arduradunarekin jarri harremanetan. Ikus https://meltdownattack.com/ informazio gehiagorako.", + "diagnosis_services_conf_broken": "{service} zerbitzuko konfigurazioa hondatuta dago!", + "diagnosis_services_bad_status_tip": "Zerbitzua berrabiarazten saia zaitezke eta nahikoa ez bada, aztertu zerbitzuaren erregistroa administrariaren webgunean. (komandoak nahiago badituzu yunohost service restart {service} eta yunohost service log {service} hurrenez hurren).", + "diagnosis_mail_ehlo_unreachable_details": "Ezin izan da zure zerbitzariko 25. atakari konektatu IPv{ipversion} erabiliz. Badirudi ez dagoela eskuragarri.
1. Arazo honen zergati ohikoena 25. ataka egoki birbidalita ez egotea da.
2. Egiaztatu postfix zerbitzua martxan dagoela.
3. Konfigurazio konplexuagoetan: egiaztatu suebaki edo reverse-proxyak konexioa oztopatzen ez dutela.", + "group_already_exist_on_system_but_removing_it": "{group} taldea existitzen da sistemaren taldeetan, baina YunoHostek ezabatuko du…", + "diagnosis_mail_fcrdns_nok_details": "Lehenik eta behin zure routerraren konfigurazio gunean edo hostingaren enprearen aukeretan alderantzizko DNSa konfiguratzen saiatu beharko zinateke {ehlo_domain} erabiliz. (Hosting enpresaren arabera, ezinbestekoa da beraiekin harremanetan jartzea).", + "diagnosis_mail_outgoing_port_25_ok": "SMTP posta zerbitzaria posta elektronikoa bidaltzeko gai da (25. atakaren irteera ez dago blokeatuta).", + "diagnosis_ports_partially_unreachable": "{port}. ataka ez dago eskuragarri kanpotik Pv{failed} erabiliz.", + "diagnosis_ports_forwarding_tip": "Arazoa konpontzeko, litekeena da operadorearen routerrean ataken birbidalketa konfiguratu behar izatea, https://yunohost.org/isp_box_config-n agertzen den bezala", + "domain_creation_failed": "Ezin izan da {domain} domeinua sortu: {error}", + "domains_available": "Erabilgarri dauden domeinuak:", + "global_settings_setting_pop3_enabled": "Gaitu POP3 protokoloa posta zerbitzarirako", + "global_settings_setting_security_ssh_port": "SSH ataka", + "global_settings_unknown_type": "Gertaera ezezaguna, {setting} ezarpenak {unknown_type} mota duela dirudi baina mota hori ez da sistemarekin bateragarria.", + "group_already_exist_on_system": "{group} taldea existitzen da sistemaren taldeetan dagoeneko", + "diagnosis_processes_killed_by_oom_reaper": "Memoria agortu eta sistemak prozesu batzuk amaituarazi behar izan ditu. Honek esan. nahi du sistemak ez duela memoria nahikoa edo prozesuren batek memoria gehiegi behar duela. Amaituarazi d(ir)en prozesua(k):\n{kills_summary}", + "hook_exec_not_terminated": "Aginduak ez du behar bezala amaitu: {path}", + "log_corrupted_md_file": "Erregistroei lotutako YAML metadatu fitxategia hondatuta dago: '{md_file}\nErrorea: {error}'", + "log_letsencrypt_cert_renew": "Berriztu '{}' Let's Encrypt ziurtagiria", + "log_remove_on_failed_restore": "Ezabatu '{}' babeskopia baten lehengoratzeak huts egin eta gero", + "diagnosis_package_installed_from_sury_details": "Sury izena duen kanpoko biltegi batetik instalatu dira pakete batzuk, nahi gabe. YunoHosten taldeak hobekuntzak egin ditu pakete hauek kudeatzeko, baina litekeena da PHP7.3 aplikazioak Stretch sistema eragilean instalatu zituzten kasu batzuetan arazoak sortzea. Egoera hau konpontzeko, honako komando hau exekutatu beharko zenuke: {cmd_to_fix}", + "log_help_to_get_log": "'{desc}' eragiketaren erregistroa ikusteko, exekutatu 'yunohost log show {name}'", + "dpkg_is_broken": "Ezin duzu une honetan agin dpkg/APT (sistemaren pakateen kudeatzaileak) hondatutako itxura dutelako… Arazoa konpontzeko SSH bidez konektatzen saia zaitezke eta ondoren exekutatu 'sudo apt install --fix-broken' edota 'sudo dpkg --configure -a'.", + "domain_cannot_remove_main": "Ezin duzu '{domain}' ezabatu domeinu nagusia delako. Beste domeinu bat ezarri beharko duzu nagusi bezala 'yunohost domain main-domain -n ' erabiliz; honako hauek dituzu aukeran: {other_domains}", + "domain_created": "Sortu da domeinua", + "domain_dyndns_already_subscribed": "Dagoeneko izena eman duzu DunDNS domeinu batean", + "domain_hostname_failed": "Ezin izan da hostname berria ezarri. Honek arazoak ekar litzake etorkizunean (litekeena da ondo egotea).", + "domain_uninstall_app_first": "Honako aplikazio hauek domeinuan instalatuta daude:\n{apps}\n\nMesedez, desinstalatu 'yunohost app remove the_app_id' ezekutatuz edo alda itzazu beste domeinu batera 'yunohost app change-url the_app_id' erabiliz domeinua ezabatu baino lehen", + "file_does_not_exist": "{path} fitxategia ez da existitzen.", + "firewall_rules_cmd_failed": "Suebakiko arau batzuen exekuzioak huts egin du. Informazio gehiago erregistroetan.", + "log_app_remove": "Ezabatu '{}' aplikazioa", + "global_settings_cant_open_settings": "Ezin izan da konfigurazio fitxategia ireki, zergatia: {reason}", + "global_settings_reset_success": "Lehengo ezarpenak {path}-n gorde dira", + "global_settings_unknown_setting_from_settings_file": "Gako ezezaguna ezarpenetan: '{setting_key}', baztertu eta gorde ezazu hemen: /etc/yunohost/settings-unknown.json", + "domain_remove_confirm_apps_removal": "Domeinu hau ezabatzean aplikazio hauek desinstalatuko dira:\n{apps}\n\nZiur al zaude? [{answers}]", + "global_settings_setting_service_ssh_allow_deprecated_dsa_hostkey": "Baimendu DSA gakoa (zaharkitua) SSH zerbitzuaren konfiguraziorako", + "hook_list_by_invalid": "Aukera hau ezin da erabili \"hook\"ak zerrendatzeko", + "installation_complete": "Instalazioa amaitu da", + "hook_exec_failed": "Ezin izan da agindua exekutatu: {path}", + "hook_json_return_error": "Ezin izan da {path} aginduaren erantzuna irakurri. Errorea: {msg}. Jatorrizko edukia: {raw_content}", + "ip6tables_unavailable": "Ezin dituzu ip6taulak hemen aldatu. Edukiontzi bat erabiltzen ari zara edo kernelak ez du aukera hau onartzen", + "log_link_to_log": "Eragiketa honen erregistro osoa: '{desc}'", + "log_operation_unit_unclosed_properly": "Eragiketa ez da modu egokian itxi", + "log_backup_restore_app": "Lehengoratu '{}' babeskopia fitxategi bat erabiliz", + "log_remove_on_failed_install": "Ezabatu '{}' instalazioak huts egin ondoren", + "log_domain_add": "Gehitu '{}' domeinua sistemaren konfiguraziora", + "log_dyndns_subscribe": "Eman izena YunoHosten '{}' azpidomeinuan", + "diagnosis_no_cache": "Oraindik ez dago '{category}' kategoriarako diagnostikoaren cacherik", + "diagnosis_mail_queue_ok": "Posta elektronikoaren ilaran zain dauden mezuak: {nb_pending}", + "global_settings_setting_smtp_relay_user": "SMTP relay erabiltzailea", + "domain_cert_gen_failed": "Ezinezkoa izan da ziurtagiria sortzea", + "field_invalid": "'{}' ez da baliogarria", + "diagnosis_mail_outgoing_port_25_blocked_relay_vpn": "Operadore batzuei bost axola zaie internetaren neutraltasuna (Net Neutrality) eta ez dute 25. ataka desblokeatzen uzten.
- Operadora batzuek relay posta zerbitzari bat eskaini dezakete, baina kasu horretan zure posta elektronikoa zelatatu dezakete.
- Pribatutasuna bermatzeko *IP publiko bat duen* VPN bat erabiltzea izan daiteke irtenbidea. Ikus https://yunohost.org/#/vpn_advantage
- Edo operadore desberdin batera aldatu", + "ldap_server_down": "Ezin izan da LDAP zerbitzarira konektatu", + "ldap_server_is_down_restart_it": "LDAP zerbitzaria ez dago martxan, saia zaitez berrabiarazten…", + "log_app_upgrade": "'{}' aplikazioa eguneratu", + "log_tools_shutdown": "Itzali zerbitzaria", + "log_user_permission_update": "Eguneratu '{}' baimenerako sarbideak", + "log_user_update": "Eguneratu '{}' erabiltzailearen informazioa", + "dyndns_no_domain_registered": "Ez dago DynDNSrekin izena emandako domeinurik", + "global_settings_bad_type_for_setting": "{setting} ezarpenerako mota okerra. {received_type} ezarri da, {expected_type} espero zen", + "diagnosis_mail_fcrdns_dns_missing": "Ez da alderantzizko DNSrik ezarri IPv{ipversion}rako. Litekeena da posta elektroniko batzuk hartzaileak jaso ezin izatea edo spam modura etiketatuak izatea.", + "log_backup_create": "Sortu babeskopia fitxategia", + "global_settings_setting_backup_compress_tar_archives": "Babeskopia berriak sortzean, konprimitu fitxategiak (.tar.gz) konprimitu gabeko fitxategien (.tar) ordez. Aukera hau gaitzean babeskopiek espazio gutxiago beharko dute, baina hasierako prozesua luzeagoa izango da eta CPUari lan handiagoa eragingo dio.", + "global_settings_setting_security_webadmin_allowlist": "Administrazio-webgunea bisita ditzaketen IP helbideak. Koma bidez bereiziak.", + "global_settings_key_doesnt_exists": "'{settings_key}' gakoa ez da existitzen konfigurazio orokorrean, erabilgarri dauden gakoak ikus ditzakezu 'yunohost settings list' exekutatuz", + "global_settings_setting_ssowat_panel_overlay_enabled": "Gaitu SSOwat paneleko \"overlay\"a", + "log_backup_restore_system": "Lehengoratu sistema babeskopia fitxategi batetik", + "log_domain_remove": "Ezabatu '{}' domeinua sistemaren konfiguraziotik", + "log_link_to_failed_log": "Ezin izan da '{desc}' eragiketa exekutatu. Mesedez, laguntza nahi izanez gero, elkarbanatu erakigeta honen erregistro osoa hemen sakatuz", + "log_permission_url": "Eguneratu '{}' baimenari lotutako URLa", + "log_user_group_create": "Sortu '{}' taldea" } From 1285bd50ab66cc2b27109b4073234caa3160de0a Mon Sep 17 00:00:00 2001 From: ppr Date: Wed, 20 Oct 2021 19:19:24 +0000 Subject: [PATCH 086/619] Translated using Weblate (French) Currently translated at 100.0% (706 of 706 strings) Translation: YunoHost/core Translate-URL: https://translate.yunohost.org/projects/yunohost/core/fr/ --- locales/fr.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/locales/fr.json b/locales/fr.json index cadc2e9dc..5b2ea6225 100644 --- a/locales/fr.json +++ b/locales/fr.json @@ -685,7 +685,7 @@ "domain_dns_registrar_managed_in_parent_domain": "Ce domaine est un sous-domaine de {parent_domain_link}. La configuration du registrar DNS doit être gérée dans le panneau de configuration de {parent_domain}.", "domain_dns_registrar_not_supported": "YunoHost n'a pas pu détecter automatiquement le bureau d'enregistrement gérant ce domaine. Vous devez configurer manuellement vos enregistrements DNS en suivant la documentation sur https://yunohost.org/dns.", "domain_dns_registrar_experimental": "Jusqu'à présent, l'interface avec l'API de **{registrar}** n'a pas été correctement testée et revue par la communauté YunoHost. L'assistance est **très expérimentale** - soyez prudent !", - "domain_dns_push_failed_to_authenticate": "Échec de l'authentification sur l'API du registrar gérant la réservation de votre nom de domaine internet pour '{domain}'. Il est très probable que les informations d'identification soient incorrectes ? (Erreur : {error})", + "domain_dns_push_failed_to_authenticate": "Échec de l'authentification sur l'API du registrar qui gère votre nom de domaine internet pour '{domain}'. Il est très probable que les informations d'identification soient incorrectes ? (Erreur : {error})", "domain_dns_push_failed_to_list": "Échec de la liste des enregistrements actuels à l'aide de l'API du registraire : {error}", "domain_dns_push_already_up_to_date": "Dossiers déjà à jour.", "domain_dns_pushing": "Transmission des enregistrements DNS...", From 6e3e3a847b3be538a97985a75f01948747ca55e8 Mon Sep 17 00:00:00 2001 From: punkrockgirl Date: Wed, 20 Oct 2021 21:56:34 +0000 Subject: [PATCH 087/619] Translated using Weblate (Basque) Currently translated at 96.8% (684 of 706 strings) Translation: YunoHost/core Translate-URL: https://translate.yunohost.org/projects/yunohost/core/eu/ --- locales/eu.json | 229 +++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 228 insertions(+), 1 deletion(-) diff --git a/locales/eu.json b/locales/eu.json index 4dc280e43..b4bd97f6c 100644 --- a/locales/eu.json +++ b/locales/eu.json @@ -477,5 +477,232 @@ "log_domain_remove": "Ezabatu '{}' domeinua sistemaren konfiguraziotik", "log_link_to_failed_log": "Ezin izan da '{desc}' eragiketa exekutatu. Mesedez, laguntza nahi izanez gero, elkarbanatu erakigeta honen erregistro osoa hemen sakatuz", "log_permission_url": "Eguneratu '{}' baimenari lotutako URLa", - "log_user_group_create": "Sortu '{}' taldea" + "log_user_group_create": "Sortu '{}' taldea", + "permission_creation_failed": "Ezin izan da '{permission}' baimena sortu: {error}", + "permission_not_found": "Ez da '{permission}' baimena aurkitu", + "pattern_lastname": "Abizen horrek ez du balio", + "permission_deleted": "'{permission}' baimena ezabatu da", + "service_disabled": "'{service}' zerbitzua ez da etorkizunean zerbitzaria abiaraztearekin batera exekutatuko.", + "tools_upgrade_regular_packages_failed": "Ezin izan dira paketeak eguneratu: {packages_list}", + "tools_upgrade_special_packages_completed": "YunoHosten paketeak eguneratu dira.\nSakatu [Enter] komando-lerrora bueltatzeko", + "unexpected_error": "Ezusteko zerbaitek huts egin du: {error}", + "updating_apt_cache": "Sistemaren paketeen eguneraketak eskuratzen…", + "mail_forward_remove_failed": "Ezin izan da '{mail}' posta elektronikoko birbidalketa ezabatu", + "migration_description_0020_ssh_sftp_permissions": "Gehitu SSH eta SFTP baimenen funtzioak", + "migration_ldap_migration_failed_trying_to_rollback": "Ezin izan da migratu… sistema lehengoratzen saiatzen.", + "migrations_exclusive_options": "'--auto', '--skip', and '--force-rerun' aukerek batak bestea baztertzen du.", + "migrations_running_forward": "{id} migrazioa exekutatzen…", + "regenconf_dry_pending_applying": "'{category}' atalari dagokion konfigurazioa egiaztatzen…", + "regenconf_file_backed_up": "'{conf} konfigurazio fitxategia '{backup}' babeskopian kopiatu da", + "regenconf_file_manually_modified": "'{conf}' konfigurazio fitxategia eskuz moldatu da eta ez da eguneratuko", + "regenconf_file_updated": "'{conf}' konfigurazio fitxategia eguneratu da", + "regenconf_updated": "'{category}' atalerako ezarpenak eguneratu dira", + "service_started": "'{service}' zerbitzua abiarazi da", + "show_tile_cant_be_enabled_for_regex": "Ezin duzu 'show_tile' gaitu une honetan, '{permission}' baimenerako URLa regez delako", + "unknown_main_domain_path": "{app} aplikaziorako domeinu edo bide ezezaguna. Domeinua eta bidea zehaztu behar dituzu baimena emateko URLa ahalbidetzeko.", + "user_import_partial_failed": "Erabiltzaileak inportatzeko eragiketak erdizka huts egin du", + "user_import_success": "Erabiltzaileak arazorik gabe inportatu dira", + "yunohost_already_installed": "YunoHost instalatuta dago dagoeneko", + "migration_0015_not_stretch": "Debianen oraingo bertsioa ez da Stretch!", + "migrations_success_forward": "{id} migrazioak amaitu du", + "migrations_to_be_ran_manually": "{id} migrazioa eskuz abiarazi behar da. Mesedez, joan Erramintak → Migrazioak atalera administratzeko webgunean edo bestela exekutatu 'yunohost tools migrations run'.", + "permission_currently_allowed_for_all_users": "Baimen hau erabiltzaile guztiei esleitzen zaie eta baita beste talde batzuei ere. Litekeena da 'all users' baimena edo eslaituta duten taldeei baimena kendu nahi izatea.", + "permission_require_account": "'{permission}' baimenak zentzua du zerbitzarian kontua duten erabiltzaileentzat eta beraz ezin da gaitu bisitarientzat.", + "postinstall_low_rootfsspace": "root direktorioak 10 GB edo espazio gutxiago dauka, kezkatzekoa dena! Litekeena da espaziorik gabe geratzea aurki! Gomendagarria da root direktorioan gutxienez 16 GB libre izatea. Abisu honen ondoren YunoHost instalatzen jarraitu nahi baduzu, berrabiarazi agindua '--force-diskspace' gehituz", + "this_action_broke_dpkg": "Eragiketa honek dpkg/APT (sistemaren pakete kudeatzaileak) apurtu ditu… Arazoa konpontzeko SSH bidez konektatu eta 'sudo apt install --fix-broken' edota 'sudo dpkg --configure -a' exekutatu dezakezu.", + "tools_upgrade_special_packages_explanation": "Eguneraketa bereziak atzeko planoan jarraituko du. Mesedez, ez abiarazi bestelako eragiketarik datozen ~10 minutuetan (zure hardwarearen abiaduraren arabera). Honen ondoren litekeena da saioa berriro hasi behar izatea. Eguneraketaren erregistroa Erramintak → Erregistroak (administrazio-webgunean) edo 'yunohost log list' komandoa erabiliz egongo da ikusgai.", + "user_import_bad_line": "{line} lerro okerra: {details}", + "restore_complete": "Lehengoratzea amaitu da", + "restore_extracting": "Behar diren fitxategiak ateratzen…", + "tools_upgrade_cant_unhold_critical_packages": "Ezin izan dira pakete kritikoak alde batera utzi…", + "tools_upgrade_regular_packages": "Orain pakete \"arruntak\" (YunoHostekin zerikusia ez dutenak) eguneratzen…", + "tools_upgrade_special_packages": "Orain pakete \"bereziak\" (YunoHostekin zerikusia dutenak) eguneratzen…", + "regenconf_would_be_updated": "'{category}' atalerako konfigurazioa eguneratu izango litzatekeen", + "migration_description_0018_xtable_to_nftable": "Migratu internet trafiko arau zaharrak nftaula sistema berrira", + "migrations_dependencies_not_satisfied": "Exekutatu honako migrazioak: '{dependencies_id}', {id} migratu baino lehen.", + "permission_created": "'{permission}' baimena sortu da", + "regenconf_now_managed_by_yunohost": "'{conf}' konfigurazio fitxategia YunoHostek kudeatzen du orain ({category} atala).", + "service_enabled": "'{service}' zerbitzua ez da automatikoki exekutatuko sistema abiaraztean.", + "service_removed": "'{service}' zerbitzua ezabatu da", + "service_restart_failed": "Ezin izan da '{service}' zerbitzua berrabiarazi\n\nZerbitzuen azken erregistroak: {logs}", + "service_restarted": "'{service}' zerbitzua berrabiarazi da", + "service_start_failed": "Ezin izan da '{service}' zerbitzua abiarazi\n\nZerbitzuen azken erregistroak: {logs}", + "ssowat_conf_updated": "SSOwat ezarpenak eguneratu dira", + "tools_upgrade_at_least_one": "Mesedez, zehaztu '--apps' edo '--system'", + "tools_upgrade_cant_both": "Ezin dira sistema eta aplikazioak une berean eguneratu", + "update_apt_cache_failed": "Ezin da APT Debian-en pakete kudeatzailearen cachea eguneratu. Hemen dituzu sources.list fitxategiaren lerroak, arazoa identifikatzeko baliagarria izan dezakezuna:\n{sourceslist}", + "update_apt_cache_warning": "Zerbaitek huts egin du APT Debian-en pakete kudeatzailearen cachea eguneratzean. Hemen dituzu sources.list fitxategiaren lerroak, arazoa identifikatzeko baliagarria izan dezakezuna:\n{sourceslist}", + "user_created": "Erabiltzailea sortu da", + "user_deletion_failed": "Ezin izan da '{user}' ezabatu: {error}", + "permission_updated": "'{permission}' baimena aldatu da", + "ssowat_conf_generated": "SSOwat ezarpenak berregin dira", + "system_upgraded": "Sistema eguneratu da", + "upnp_port_open_failed": "Ezin izan da UPnP bidez ataka zabaldu", + "user_creation_failed": "Ezin izan da '{user}' erabiltzailea sortu: {error}", + "user_deleted": "Erabiltzailea ezabatu da", + "main_domain_changed": "Domeinu nagusia aldatu da", + "migrations_already_ran": "Honako migrazio hauek amaitu dute dagoeneko: {ids}", + "yunohost_installing": "YunoHost instalatzen…", + "migrations_failed_to_load_migration": "Ezin izan da {id} migrazioa kargatu: {error}", + "migrations_must_provide_explicit_targets": "'--skip' edo '--force-rerun' aukerak erabiltzean jomuga zehatzak zehaztu behar dituzu", + "migrations_pending_cant_rerun": "Migrazio hauek exekutatzeke daude eta, beraz, ezin dira berriro abiarazi: {ids}", + "regenconf_file_kept_back": "'{conf}' konfigurazio fitxategia regen-conf-ek ({category} atala) ezabatzekoa zen baina mantendu egin da.", + "regenconf_file_removed": "'{conf}' konfigurazio fitxategia ezabatu da", + "tools_upgrade_cant_hold_critical_packages": "Ezin izan dira pakete kritikoak mantendu…", + "migrations_cant_reach_migration_file": "Ezin izan da '%s' migrazioen fitxategia eskuratu", + "permission_already_allowed": "'{group} taldeak badauka dagoeneko '{permission}' baimena", + "permission_cant_add_to_all_users": "{permission} baimena ezin da erabiltzaile guztiei ezarri.", + "mailbox_disabled": "Posta elektronikoa desgaituta dago {user} erabiltzailearentzat", + "operation_interrupted": "Eragiketa eskuz geldiarazi da?", + "permission_already_exist": "'{permission}' baimena existitzen da dagoeneko", + "regenconf_pending_applying": "'{category}' atalerako konfigurazioa ezartzen…", + "user_import_nothing_to_do": "Ez dago erabiltzaileak inportatu beharrik", + "mailbox_used_space_dovecot_down": "Dovecot mailbox zerbitzua martxan egon behar da postak erabilitako espazioa ezagutzeko", + "migration_0015_cleaning_up": "Beharrezkoak ez diren cache eta paketeak kentzen…", + "migration_0015_modified_files": "Mesedez, kontutan hartu ondorengo fitxategiak eskuz aldatu direla eta sistema eguneratzean euren gainean idatziko dela: {manually_modified_files}", + "migration_0015_not_enough_free_space": "/var/ direktorioan oso espazio gutxi geratzen da! Gutxienez GB bat izan behar da migrazioa abiarazteko.", + "migration_0015_weak_certs": "Sinadura-algoritmo ahulak darabiltzaten ziurtagiriak aurkitu dira eta eguneratu behar dira nginx-en hurrengo bertsioarekin bateragarriak izateko: {certs}", + "migration_description_0017_postgresql_9p6_to_11": "Migratu datubaseak PostgreSQL 9.6-tik 11-ra", + "other_available_options": "… eta erakusten ez diren beste {n} aukera daude", + "permission_cannot_remove_main": "Ezin da baimen nagusi bat kendu", + "service_not_reloading_because_conf_broken": "Ez da '{name}' zerbitzua birkargatu/berrabiarazi konfigurazioa hondatuta dagoelako: {errors}", + "service_reloaded": "'{service}' zerbitzua birkargatu da", + "service_reloaded_or_restarted": "'{service}' zerbitzua birkargatu edo berrabiarazi da", + "user_import_bad_file": "CSV fitxategiak ez du formatu egokia eta ekidingo da balizko datuen galera saihesteko", + "user_import_failed": "Erabiltzaileak inportatzeko eragiketak huts egin du", + "user_import_missing_columns": "Ondorengo zutabeak falta dira: {columns}", + "service_disable_failed": "Ezin izan da '{service}' zerbitzua geldiarazi zerbitzaria abiaraztean.\n\nZerbitzuen erregistro berriak: {logs}", + "migrations_skip_migration": "{id} migrazioa saihesten…", + "packages_upgrade_failed": "Ezin izan dira pakete guztiak eguneratu", + "upnp_disabled": "UPnP itzalita dago", + "main_domain_change_failed": "Ezin izan da domeinu nagusia aldatu", + "regenconf_failed": "Ezin izan da ondorengo atal(ar)en konfigurazioa berregin: {categories}", + "migration_0015_start": "Buster-erako migrazioa abiarazten", + "migration_0015_patching_sources_list": "sources.lists petatxatzen…", + "migration_0015_yunohost_upgrade": "YunoHosten muinaren eguneraketa abiarazten…", + "migration_0017_postgresql_96_not_installed": "Ez da PostgreSQL instalatu. Ez dago egitekorik.", + "pattern_email_forward": "Helbide elektroniko baliagarri bat izan behar da, '+' karakterea onartzen da (adibidez izena+urtea@domeinua.eus)", + "migrating_legacy_permission_settings": "Zaharkitutako baimenen ezarpenak migratzen…", + "migration_0019_add_new_attributes_in_ldap": "Gehitu LDAP datubasean baimenetarako atributu berriak", + "regenconf_file_manually_removed": "'{conf}' konfigurazio fitxategia eskuz ezabatu da eta ez da berriro sortuko", + "regenconf_up_to_date": "Konfigurazioa egunean dago dagoeneko '{category}' atalerako", + "service_regen_conf_is_deprecated": "'yunohost service regen-conf' zaharkitua dago! Mesedez, erabili 'yunohost tools regen-conf' haren ordez.", + "migrations_no_such_migration": "Ez dago '{id}' izeneko migraziorik", + "migrations_not_pending_cant_skip": "Migrazio hauek ez daude exekutatzeke eta beraz, ezin dira saihestu: {ids}", + "regex_with_only_domain": "Ezin duzu regex domeinuetarako erabili, bideetarako bakarrik", + "port_already_closed": "{port}. ataka itxita dago dagoeneko {ip_version} konexioetarako", + "regenconf_file_copy_failed": "Ezin izan da '{new}' konfigurazio fitxategi berria '{conf}'-(e)n kopiatu", + "regenconf_file_remove_failed": "Ezin izan da '{conf}' konfigurazio fitxategia ezabatu", + "server_shutdown_confirm": "Zerbitzaria berehala itzaliko da, ziur al zaude? [{answers}]", + "restore_already_installed_app": "'{app}' IDa duen aplikazioa dagoeneko instalatuta dago", + "service_description_postfix": "Posta elektronikoa bidali eta jasotzeko erabiltzen da", + "service_enable_failed": "Ezin izan da '{service}' zerbitzua sistema abiaraztearekin batera exekutatzea lortu.\n\nZerbitzuen erregistro berriak: {logs}", + "system_username_exists": "Erabiltzaile izena existitzen da dagoeneko sistemaren erabiltzaileen zerrendan", + "user_already_exists": "'{user}' erabiltzailea existitzen da dagoeneko", + "migration_0018_failed_to_migrate_iptables_rules": "Zaharkitutako iptaulak nftauletara eguneratzeak huts egin du: {error}", + "mail_domain_unknown": "Ezin da posta elektroniko hori erabili '{domain}' domeinurako. Mesedez, erabili zerbitzari honek kudeatzen duen domeinu bat.", + "migrations_list_conflict_pending_done": "Ezin dituzu '--previous' eta '--done' aldi berean erabili.", + "migrations_loading_migration": "{id} migrazioa kargatzen…", + "migrations_no_migrations_to_run": "Ez dago exekutatzeko migraziorik", + "password_listed": "Pasahitz hau munduan erabilienetarikoa da. Mesedez, aukeratu beste bat.", + "password_too_simple_2": "Pasahitzak zortzi karaktere izan behar ditu gutxienez eta zenbakiren bat, karaktere larriren bat eta txikiren bat izan behar ditu", + "pattern_firstname": "Izen horrek ez du balio", + "pattern_password": "Gutxienez hiru karaktere izan behar ditu", + "restore_failed": "Ezin izan da sistema lehengoratu", + "restore_removing_tmp_dir_failed": "Ezin izan da behin-behineko direktorio zaharra ezabatu", + "restore_running_app_script": "'{app}' aplikazioa lehengoratzen…", + "root_password_replaced_by_admin_password": "Administrazio pasahitzak root pasahitza ordezkatu du.", + "service_description_fail2ban": "Internetetik datozen bortxaz egindako saiakerak eta bestelako erasoak ekiditen ditu", + "service_description_ssh": "Zerbitzarira sare lokaletik kanpo konektatzea ahalbidetzen du (SSH protokoloa)", + "service_description_yunohost-firewall": "Zerbitzuen konexiorako atakak ireki eta ixteko kudeatzailea", + "service_remove_failed": "Ezin izan da '{service}' zerbitzua ezabatu", + "service_reload_failed": "Ezin izan da '{service}' zerbitzua birkargatu\n\nZerbitzuen azken erregistroak: {logs}", + "service_reload_or_restart_failed": "Ezin izan da '{service}' zerbitzua birkargatu edo berrabiarazi\n\nZerbitzuen azken erregistroak: {logs}", + "service_stopped": "'{service}' zerbitzua geldiarazi da", + "unbackup_app": "{app} aplikazioa ez da gordeko", + "unrestore_app": "{app} ez da lehengoratuko", + "upgrade_complete": "Eguneraketa amaitu da", + "upgrading_packages": "Paketeak eguneratzen…", + "upnp_dev_not_found": "Ez da UPnP gailurik aurkitu", + "user_update_failed": "Ezin izan da {user} erabiltzailea eguneratu: {error}", + "user_updated": "Erabiltzailearen informazioa aldatu da", + "yunohost_configured": "YunoHost konfiguratuta dago", + "migration_0015_system_not_fully_up_to_date": "Sistema ez dago guztiz eguneratuta. Mesedez, exekutatu eguneraketa orokorra Buster-erako migrazioa abiarazi baino lehen.", + "migration_description_0015_migrate_to_buster": "Eguneratu sistema Debian Buster eta YunoHost 4.x-ra", + "service_description_yunomdns": "Sare lokalean zerbitzarira 'yunohost.local' erabiliz konektatzea ahalbidetzen du", + "mail_alias_remove_failed": "Ezin izan da '{mail}' posta elektroniko ezizena ezabatu", + "mail_unavailable": "Helbide elektroniko hau lehenengo erabiltzailearentzat gorde da eta hari ezarri zaio automatikoki", + "migration_description_0016_php70_to_php73_pools": "Migratu php7.0-fpm 'pool' fitxategiak php7.3-ra", + "migration_description_0019_extend_permissions_features": "Hedatu aplikazioen baimenen kudeaketa sistema", + "migration_0015_main_upgrade": "Eguneraketa orokorra abiarazten…", + "migration_ldap_backup_before_migration": "Sortu LDAP datubase eta aplikazioen ezarpenen babeskopia migrazioa abiarazi baino lehen.", + "migration_ldap_can_not_backup_before_migration": "Sistemaren babeskopiak ez du amaitu migrazioak huts egin baino lehen. Errorea: {error}", + "migration_0015_problematic_apps_warning": "Mesedez, kontutan izan arazoak sor ditzaketen aplikazioak aurkitu direla. Badirudi ez zirela YunoHosten aplikazioen katalogotik instalatu, edo 'ez dabiltza' etiketa dute. Beraz, ezin da bermatu eguneratu eta gero funtzionatuko dutenik: {problematic_apps}", + "migration_0017_not_enough_space": "Espazio gehiago behar da {path}-n migrazioa exekutatzeko.", + "migration_0017_postgresql_11_not_installed": "PostgreSQL 9.6 instalatuta egon arren postgresql 11 ez‽ Zerbait arraroa gertatu da zure sisteman :(…", + "migration_0018_failed_to_reset_legacy_rules": "Ezin izan dira zaharkitutako iptaulak berrezarri: {error}", + "migrations_migration_has_failed": "{id} migrazioak ez du amaitu, geldiarazten. Errorea: {exception}", + "migrations_need_to_accept_disclaimer": "{id} migrazioa abiarazteko, ondorengo baldintzak onartu behar dituzu:\n---\n{disclaimer}\n---\nMigrazioa onartzen baduzu, mesedez berrabiarazi prozesua komandoan '--accept-disclaimer' aukera gehituz.", + "not_enough_disk_space": "Ez dago nahikoa espazio librerik '{path}'-n", + "password_too_simple_3": "Pasahitzak zortzi karaktere izan behar ditu gutxienez eta zenbakiren bat, karaktere larriren bat, txikiren bat eta bereziren bat izan behar ditu", + "pattern_backup_archive_name": "Fitxategiaren izenak 30 karaktere izan ditzake gehienez, alfanumerikoak eta ._- baino ez", + "pattern_domain": "Domeinu izen baliagarri bat izan behar da (adibidez nire-domeinua.eus)", + "pattern_mailbox_quota": "Tamainak b/k/M/G/T zehaztu behar du edo 0 mugarik ezarri nahi ez bada", + "pattern_password_app": "Barka, baina pasahitzek ezin dituzte ondorengo karaktereak izan: {forbidden_chars}", + "pattern_port_or_range": "Ataka zenbaki (0-65535) edo errenkada (100:200) baliagarri bat izan behar da", + "permission_already_disallowed": "'{group}' taldeak desgaituta dauka dagoeneko '{permission} baimena", + "permission_already_up_to_date": "Baimena ez da eguneratu egindako eskaria egungo egoerarekin bat datorrelako.", + "migration_0015_still_on_stretch_after_main_upgrade": "Zerbaitek huts egin du eguneraketa orokorrean, badirudi sistemak oraindik darabilela Debian Stretch", + "migration_update_LDAP_schema": "LDAP eskema eguneratzen…", + "permission_protected": "'{permission}' baimena babestuta dago. Ezin duzu bisitarien taldea baimen honetara gehitu / baimen honetatik kendu.", + "permission_update_failed": "Ezin izan da '{permission}' baimena aldatu: {error}", + "port_already_opened": "{port}. ataka dagoeneko irekita dago {ip_version} konexioetarako", + "user_home_creation_failed": "Ezin izan da erabiltzailearentzat '{home}' direktorioa sortu", + "user_unknown": "Erabiltzaile ezezaguna: {user}", + "yunohost_postinstall_end_tip": "Instalazio ondorengo prozesua amaitu da! Sistemaren konfigurazioa bukatzeko:\n- gehitu erabiltzaile bat administrazio-webguneko 'Erabiltzaileak' atalean (edo 'yunohost user create ' komandoa erabiliz);\n- erabili 'Diagnostikoa' atala ohiko arazoei aurre hartzeko. Administrazio-webgunean abiarazi edo 'yunohost diagnosis run' exekutatu;\n- irakurri 'Finalizing your setup' eta 'Getting to know YunoHost' atalak. Dokumentazioan aurki ditzakezu: https://yunohost.org/admindoc.", + "yunohost_not_installed": "YunoHost ez da zuzen instalatu. Mesedez, exekutatu 'yunohost tools postinstall'", + "migration_0019_slapd_config_will_be_overwritten": "Badirudi eskuz moldatu duzula slapd konfigurazioa. Migrazio garrantzitsu honetarako, YunoHostek slapd ezarpenak eguneratu behar ditu. Oraingo fitxategiak {conf_backup_folder}-n kopiatuko dira.", + "unlimit": "Mugarik ez", + "restore_already_installed_apps": "Ondorengo aplikazioak ezin dira lehengoratu dagoeneko instalatuta daudelako: {apps}", + "migration_0015_general_warning": "Mesedez, uler ezazu migrazio hau eragiketa zaila dela. YunoHosten kideek ahalik eta hoberen egin dute prozesua egiaztatzeko, baina hala ere sistemaren atalak edo aplikazioak honda litezke.\n\nHorregatik gomendagarria da:\n- Informazio edo aplikazio garrantzitsuen babeskopia egitea. Informazio gehiagorako: https://yunohost.org/backup;\n- Pazientzia izatea migrazioa abiarazterakoan: zure internet konexioaren eta hardwarearen arabera litekeena da ordu batzuk behar izatea eguneraketa amaitu arte.", + "migration_0015_specific_upgrade": "Aparte eguneratu behar diren sistemaren paketeen eguneraketa abiarazten…", + "password_too_simple_4": "Pasahitzak 12 karaktere izan behar ditu gutxienez eta zenbakiren bat, karaktere larriren bat, txikiren bat eta bereziren bat izan behar ditu", + "pattern_email": "Helbide elektroniko baliagarri bat izan behar da, '+' karaktererik gabe (adibidez izena@domeinua.eus)", + "pattern_username": "Txikiz idatzitako karaktere alfanumerikoak eta azpiko marra soilik eduki ditzake", + "permission_deletion_failed": "Ezin izan da '{permission}' baimena ezabatu: {error}", + "migration_ldap_rollback_success": "Sistema lehengoratu da.", + "regenconf_need_to_explicitly_specify_ssh": "SSH ezarpenak eskuz aldatu dira, baina aldaketak erabiltzeko '--force' zehaztu behar duzu 'ssh' atalean.", + "regex_incompatible_with_tile": "/!\\ Pakete-arduradunak! {permission}' baimenak show_tile aukera 'true' bezala dauka eta horregatik ezin duzu regex URLa URL nagusi bezala ezarri", + "root_password_desynchronized": "Administrariaren pasahitza aldatu da baina YunoHostek ezin izan du aldaketa root pasahitzera zabaldu!", + "server_shutdown": "Zerbitzaria itzaliko da", + "service_stop_failed": "Ezin izan da '{service}' zerbitzua geldiarazi\n\nZerbitzuen azken erregistroak: {logs}", + "service_unknown": "'{service}' zerbitzu ezezaguna", + "show_tile_cant_be_enabled_for_url_not_defined": "Ezin duzu 'show_tile' gaitu une honetan, '{permission}' baimenerako URL bat zehaztu behar duzulako", + "upnp_enabled": "UPnP piztuta dago", + "restore_nothings_done": "Ez da ezer lehengoratu", + "restore_backup_too_old": "Babeskopia fitxategi hau ezin da lehengoratu YunoHosten bertsio zaharregi batetik datorrelako.", + "restore_hook_unavailable": "'{part}'-(e)rako lehengoratze agindua ez dago erabilgarri ez sisteman ezta fitxategian ere", + "restore_cleaning_failed": "Ezin izan dira lehengoratu ondoren behin-behineko fitxategiak ezabatu", + "restore_confirm_yunohost_installed": "Ziur al zaude dagoeneko instalatuta dagoen sistema lehengoratzeaz? [{answers}]", + "restore_may_be_not_enough_disk_space": "Badirudi zure sistemak ez duela nahikoa espazio (erabilgarri: {free_space} B, beharrezkoa {needed_space} B, segurtasuneko tartea: {margin} B)", + "restore_not_enough_disk_space": "Ez dago nahikoa espazio (erabilgarri: {free_space} B, beharrezkoa {needed_space} B, segurtasuneko tartea: {margin} B)", + "restore_running_hooks": "Lehengoratzeko \"hook\"ak exekutatzen…", + "restore_system_part_failed": "Ezin izan da sistemaren '{part}' atala lehengoratu", + "server_reboot": "Zerbitzaria berrabiaraziko da", + "server_reboot_confirm": "Zerbitzaria berehala berrabiaraziko da, ziur al zaude? [{answers}]", + "service_add_failed": "Ezin izan da '{service}' zerbitzua gehitu", + "service_added": "'{service}' zerbitzua gehitu da", + "service_already_started": "'{service}' zerbitzua matxan dago dagoeneko", + "service_already_stopped": "'{service}' zerbitzua geldiarazi da dagoeneko", + "service_cmd_exec_failed": "Ezin izan da '{command}' komandoa exekutatu", + "service_description_dnsmasq": "DNSa \"domain name resolution\" kudeatzen du", + "service_description_dovecot": "Posta elektronikoko programei mezuak jasotzea ahalbidetzen die (IMAP eta POP3 bidez)", + "service_description_metronome": "Bat-bateko XMPP mezularitza kontuak kudeatzen ditu", + "service_description_mysql": "Aplikazioen datuak gordetzen ditu (SQL datubasea)", + "service_description_nginx": "Zerbitzariak ostatazen dituen webguneak ikusgai egiten ditu", + "service_description_php7.3-fpm": "PHP aplikazioak exekutatzen ditu NGINXi esker", + "service_description_redis-server": "Datuak bizkor atzitzeko, zereginak lerratzeko eta programen arteko komunikaziorako datubase berezi bat", + "service_description_rspamd": "Spama bahetzeko eta posta elektronikoarekin zerikusia duten bestelako ezaugarrietarako", + "service_description_slapd": "Erabiltzaileak, domeinuak eta hauei lotutako informazioa gordetzen du", + "service_description_yunohost-api": "YunoHosten web interfazearen eta sistemaren arteko hartuemana kudeatzen du" } From ee11e42b7b3c9dcddb0718e2bfdde1432d2cd3a1 Mon Sep 17 00:00:00 2001 From: punkrockgirl Date: Wed, 20 Oct 2021 23:57:14 +0000 Subject: [PATCH 088/619] Translated using Weblate (Basque) Currently translated at 100.0% (706 of 706 strings) Translation: YunoHost/core Translate-URL: https://translate.yunohost.org/projects/yunohost/core/eu/ --- locales/eu.json | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/locales/eu.json b/locales/eu.json index b4bd97f6c..6f62ebf53 100644 --- a/locales/eu.json +++ b/locales/eu.json @@ -1,5 +1,5 @@ { - "password_too_simple_1": "Pasahitzak gutxienez 8 karaktere izan behar ditu", + "password_too_simple_1": "Pasahitzak gutxienez zortzi karaktere izan behar ditu", "action_invalid": "'{action}' ekintza baliogabea", "aborting": "Bertan behera uzten.", "admin_password_changed": "Administrazio-pasahitza aldatu da", @@ -253,7 +253,7 @@ "group_user_already_in_group": "{user} erabiltzailea {group} taldean dago dagoeneko", "firewall_reloaded": "Suebakia birkargatu da", "domain_unknown": "'{domain}' domeinua ezezaguna da", - "global_settings_cant_serialize_settings": "Ezin izan da konfikurazio-datuak serializatu, zergatia: {reason}", + "global_settings_cant_serialize_settings": "Ezin izan dira konfikurazio-datuak serializatu, zergatia: {reason}", "global_settings_setting_security_nginx_redirect_to_https": "Birbidali HTTP eskaerak HTTPSra (EZ ITZALI hau ez badakizu zertan ari zaren!)", "group_deleted": "'{group}' taldea ezabatu da", "invalid_password": "Pasahitza ez da zuzena", @@ -307,9 +307,9 @@ "diagnosis_mail_fcrdns_nok_alternatives_6": "Operadore batzuek ez dute alderantzizko DNSa konfiguratzen uzten (edo funtzioa ez dabil…). IPv4rako alderantzizko DNSa zuzen konfiguratuta badago, IPv6 desgaitzen saia zaitezke posta elektronikoa bidaltzeko, yunohost settings set smtp.allow_ipv6 -v off exekutatuz. Adi: honek esan nahi du ez zarela gai izango IPv6 bakarrik darabilten zerbitzari apurren posta elektronikoa jasotzeko edo beraiei bidaltzeko.", "diagnosis_sshd_config_inconsistent": "Dirudienez SSH ataka eskuz aldatu da /etc/ssh/sshd_config fitxategian. YunoHost 4.2tik aurrera 'security.ssh.port' izeneko ezarpen orokor bat dago konfigurazioa eskuz aldatzea ekiditeko.", "diagnosis_sshd_config_inconsistent_details": "Mesedez, exekutatu yunohost settings set security.ssh.port -v YOUR_SSH_PORT SSH ataka zehazteko, egiaztatu yunohost tools regen-conf ssh --dry-run --with-diff erabiliz eta yunohost tools regen-conf ssh --force exekutatu gomendatutako konfiguraziora bueltatu nahi baduzu.", - "domain_dns_push_failed_to_authenticate": "Ezin izan da '{domain}' domeinurako erregistro-enpresan saioa hasi APIa erabiliz. Zuzenak al dira egiaztagiriak? (Errorea: {error})", + "domain_dns_push_failed_to_authenticate": "Ezin izan da '{domain}' domeinurako APIa erabiliz erregistro-enpresan saioa hastea. Zuzenak al dira datuak? (Errorea: {error})", "domain_dns_pushing": "DNS ezarpenak bidaltzen…", - "diagnosis_sshd_config_insecure": "Badirudi SSH konfigurazioa eskuz aldatu dela eta ez da segurua ez duelako baldintzarik jartzen 'AllowGroups' edo AllowUsers' fitxategien sarbidea oztopatzeko.", + "diagnosis_sshd_config_insecure": "Badirudi SSH konfigurazioa eskuz aldatu dela eta ez da segurua ez duelako 'AllowGroups' edo 'AllowUsers' baldintzarik jartzen fitxategien atzitzea oztopatzeko.", "disk_space_not_sufficient_update": "Ez dago aplikazio hau eguneratzeko nahikoa espaziorik", "domain_cannot_add_xmpp_upload": "Ezin dira 'xmpp-upload.' hasiera duten domeinuak gehitu. Izen mota hau YunoHosten zati den XMPP igoeretarako erabiltzen da.", "domain_cannot_remove_main_add_new_one": "Ezin duzu '{domain}' ezabatu domeinu nagusi eta bakarra delako. Beste domeinu bat gehitu 'yunohost domain add ' exekutatuz, gero erabili 'yunohost domain main-domain -n ' domeinu nagusi bilakatzeko, eta azkenik ezabatu {domain}' domeinua 'yunohost domain remove {domain}' komandoarekin.", @@ -323,7 +323,7 @@ "invalid_number_max": "{max} baino txikiagoa izan behar da", "diagnosis_services_bad_status": "{service} zerbitzua {status} dago :(", "diagnosis_ports_needed_by": "{category} funtzioetarako ezinbestekoa da ataka hau eskuragarri egotea (zerbitzua {service})", - "diagnosis_package_installed_from_sury": "Sistemaren pakete batzuen lehenagoko bertsioa beharko litzateke", + "diagnosis_package_installed_from_sury": "Sistemaren pakete batzuen lehenagoko bertsioak beharko lirateke", "global_settings_setting_smtp_relay_password": "SMTP relay helbideko pasahitza", "global_settings_setting_smtp_relay_port": "SMTP relay ataka", "domain_deleted": "Domeinua ezabatu da", @@ -379,8 +379,8 @@ "diagnosis_mail_queue_unavailable": "Ezin da kontsultatu zenbat posta elektroniko dauden ilaran", "log_user_create": "Gehitu '{}' erabiltzailea", "group_cannot_edit_visitors": "'bisitariak' taldea ezin da eskuz aldatu. Saiorik hasi gabeko bisitariak barne hartzen dituen talde berezia da", - "diagnosis_ram_verylow": "Sistemak RAM memoriaren {available} ({available_percent}%) dauka bakarrik! ({total}(e)tik)", - "diagnosis_ram_low": "Sistemak {available} soilik du erabilgarri, ({available_percent}%), RAM memoriaren (out of {total}). Kontuz ibili", + "diagnosis_ram_verylow": "Sistemak RAM memoriaren {available} ({available_percent}%) dauka bakarrik! ({total} orotara)", + "diagnosis_ram_low": "Sistemak {available} soilik du erabilgarri, RAM memoriaren ({available_percent}%) ({total} orotara). Kontuz ibili.", "diagnosis_ram_ok": "Sistemak oraindik dauka RAM memoriaren {available} ({available_percent}%) erabilgarri, {total} orotara.", "diagnosis_swap_none": "Sistemak ez du swap-ik. Gutxienez {recommended} gehitzen saiatu beharko zinateke, sistema memoriarik gabe gera ez dadin.", "diagnosis_swap_ok": "Sistemak {total} swap dauka!", @@ -488,7 +488,7 @@ "unexpected_error": "Ezusteko zerbaitek huts egin du: {error}", "updating_apt_cache": "Sistemaren paketeen eguneraketak eskuratzen…", "mail_forward_remove_failed": "Ezin izan da '{mail}' posta elektronikoko birbidalketa ezabatu", - "migration_description_0020_ssh_sftp_permissions": "Gehitu SSH eta SFTP baimenen funtzioak", + "migration_description_0020_ssh_sftp_permissions": "Gehitu SSH eta SFTP baimenak", "migration_ldap_migration_failed_trying_to_rollback": "Ezin izan da migratu… sistema lehengoratzen saiatzen.", "migrations_exclusive_options": "'--auto', '--skip', and '--force-rerun' aukerek batak bestea baztertzen du.", "migrations_running_forward": "{id} migrazioa exekutatzen…", @@ -514,7 +514,7 @@ "user_import_bad_line": "{line} lerro okerra: {details}", "restore_complete": "Lehengoratzea amaitu da", "restore_extracting": "Behar diren fitxategiak ateratzen…", - "tools_upgrade_cant_unhold_critical_packages": "Ezin izan dira pakete kritikoak alde batera utzi…", + "tools_upgrade_cant_unhold_critical_packages": "Ezin izan dira pakete kritikoak deuseztatu…", "tools_upgrade_regular_packages": "Orain pakete \"arruntak\" (YunoHostekin zerikusia ez dutenak) eguneratzen…", "tools_upgrade_special_packages": "Orain pakete \"bereziak\" (YunoHostekin zerikusia dutenak) eguneratzen…", "regenconf_would_be_updated": "'{category}' atalerako konfigurazioa eguneratu izango litzatekeen", @@ -695,7 +695,7 @@ "service_already_started": "'{service}' zerbitzua matxan dago dagoeneko", "service_already_stopped": "'{service}' zerbitzua geldiarazi da dagoeneko", "service_cmd_exec_failed": "Ezin izan da '{command}' komandoa exekutatu", - "service_description_dnsmasq": "DNSa \"domain name resolution\" kudeatzen du", + "service_description_dnsmasq": "Domeinuen izenen ebazpena (DNSa) kudeatzen du", "service_description_dovecot": "Posta elektronikoko programei mezuak jasotzea ahalbidetzen die (IMAP eta POP3 bidez)", "service_description_metronome": "Bat-bateko XMPP mezularitza kontuak kudeatzen ditu", "service_description_mysql": "Aplikazioen datuak gordetzen ditu (SQL datubasea)", From 5a213dae20157b607ec19f0ac0614a6d883c54b3 Mon Sep 17 00:00:00 2001 From: Page Asgardius Date: Sat, 23 Oct 2021 15:19:59 +0000 Subject: [PATCH 089/619] Translated using Weblate (Spanish) Currently translated at 78.0% (551 of 706 strings) Translation: YunoHost/core Translate-URL: https://translate.yunohost.org/projects/yunohost/core/es/ --- locales/es.json | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/locales/es.json b/locales/es.json index 688db4546..dec90b42b 100644 --- a/locales/es.json +++ b/locales/es.json @@ -4,7 +4,7 @@ "admin_password_change_failed": "No se pudo cambiar la contraseña", "admin_password_changed": "La contraseña de administración fue cambiada", "app_already_installed": "{app} ya está instalada", - "app_argument_choice_invalid": "Use una de estas opciones «{choices}» para el argumento «{name}»", + "app_argument_choice_invalid": "Elija un valor válido para el argumento '{name}': '{value}' no se encuentra entre las opciones disponibles ({choices})", "app_argument_invalid": "Elija un valor válido para el argumento «{name}»: {error}", "app_argument_required": "Se requiere el argumento '{name} 7'", "app_extraction_failed": "No se pudieron extraer los archivos de instalación", @@ -14,7 +14,7 @@ "app_not_correctly_installed": "La aplicación {app} 8 parece estar incorrectamente instalada", "app_not_installed": "No se pudo encontrar «{app}» en la lista de aplicaciones instaladas: {all_apps}", "app_not_properly_removed": "La {app} 0 no ha sido desinstalada correctamente", - "app_removed": "Eliminado {app}", + "app_removed": "{app} Desinstalado", "app_requirements_checking": "Comprobando los paquetes necesarios para {app}…", "app_requirements_unmeet": "No se cumplen los requisitos para {app}, el paquete {pkgname} ({version}) debe ser {spec}", "app_sources_fetch_failed": "No se pudieron obtener los archivos con el código fuente, ¿es el URL correcto?", @@ -520,7 +520,7 @@ "app_manifest_install_ask_is_public": "¿Debería exponerse esta aplicación a visitantes anónimos?", "app_manifest_install_ask_admin": "Elija un usuario administrativo para esta aplicación", "app_manifest_install_ask_password": "Elija una contraseña de administración para esta aplicación", - "app_manifest_install_ask_path": "Seleccione el path donde esta aplicación debería ser instalada", + "app_manifest_install_ask_path": "Seleccione la ruta de URL (después del dominio) donde esta aplicación debería ser instalada", "app_manifest_install_ask_domain": "Seleccione el dominio donde esta app debería ser instalada", "app_label_deprecated": "Este comando está depreciado! Favor usar el nuevo comando 'yunohost user permission update' para administrar la etiqueta de app.", "app_argument_password_no_default": "Error al interpretar argumento de contraseña'{name}': El argumento de contraseña no puede tener un valor por defecto por razón de seguridad", @@ -580,5 +580,11 @@ "diagnosis_backports_in_sources_list": "Parece que apt (el gestor de paquetes) está configurado para usar el repositorio backports. A menos que realmente sepas lo que estás haciendo, desaconsejamos absolutamente instalar paquetes desde backports, ya que pueden provocar comportamientos intestables o conflictos en el sistema.", "diagnosis_basesystem_hardware_model": "El modelo de servidor es {model}", "additional_urls_already_removed": "La URL adicional «{url}» ya se ha eliminado para el permiso «{permission}»", - "additional_urls_already_added": "La URL adicional «{url}» ya se ha añadido para el permiso «{permission}»" -} \ No newline at end of file + "additional_urls_already_added": "La URL adicional «{url}» ya se ha añadido para el permiso «{permission}»", + "config_apply_failed": "Falló la aplicación de la nueva configuración: {error}", + "app_restore_script_failed": "Ha ocurrido un error dentro del script de restauración de aplicaciones", + "app_config_unable_to_apply": "No se pudieron aplicar los valores del panel configuración.", + "app_config_unable_to_read": "No se pudieron leer los valores del panel configuración.", + "backup_create_size_estimation": "El archivo contendrá aproximadamente {size} de datos.", + "config_cant_set_value_on_section": "No puede establecer un único valor en una sección de configuración completa." +} From 5326f6d7a75f801bc690a63d2a5233d1b6a9061d Mon Sep 17 00:00:00 2001 From: punkrockgirl Date: Fri, 29 Oct 2021 23:22:14 +0000 Subject: [PATCH 090/619] Translated using Weblate (Basque) Currently translated at 100.0% (706 of 706 strings) Translation: YunoHost/core Translate-URL: https://translate.yunohost.org/projects/yunohost/core/eu/ --- locales/eu.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/locales/eu.json b/locales/eu.json index 6f62ebf53..82063058a 100644 --- a/locales/eu.json +++ b/locales/eu.json @@ -1,6 +1,6 @@ { "password_too_simple_1": "Pasahitzak gutxienez zortzi karaktere izan behar ditu", - "action_invalid": "'{action}' ekintza baliogabea", + "action_invalid": "'{action}' eragiketa baliogabea", "aborting": "Bertan behera uzten.", "admin_password_changed": "Administrazio-pasahitza aldatu da", "admin_password_change_failed": "Ezinezkoa izan da pasahitza aldatzea", @@ -44,7 +44,7 @@ "diagnosis_ip_not_connected_at_all": "Badirudi zerbitzaria ez dagoela internetera konektatuta!?", "app_already_up_to_date": "{app} aplikazioa egunean da dagoeneko", "app_change_url_success": "{app} aplikazioaren URLa {domain}{path} da orain", - "admin_password_too_long": "Mesedez aukeratu 127 karaktere baino laburragoa den pasahitz bat", + "admin_password_too_long": "Mesedez, aukeratu 127 karaktere baino laburragoa den pasahitz bat", "app_action_broke_system": "Ekintza honek {services} zerbitzu garrantzitsuak hondatu dituela dirudi", "diagnosis_basesystem_hardware_model": "Zerbitzariaren modeloa {model} da", "already_up_to_date": "Ez dago egiteko ezer. Guztia dago egunean.", From 3a5765a5e464c9d6b49c08238bbc7f9a27a50b40 Mon Sep 17 00:00:00 2001 From: punkrockgirl Date: Sat, 30 Oct 2021 13:29:09 +0000 Subject: [PATCH 091/619] Translated using Weblate (Basque) Currently translated at 100.0% (706 of 706 strings) Translation: YunoHost/core Translate-URL: https://translate.yunohost.org/projects/yunohost/core/eu/ --- locales/eu.json | 408 ++++++++++++++++++++++++------------------------ 1 file changed, 204 insertions(+), 204 deletions(-) diff --git a/locales/eu.json b/locales/eu.json index 82063058a..bbe78029a 100644 --- a/locales/eu.json +++ b/locales/eu.json @@ -1,6 +1,6 @@ { "password_too_simple_1": "Pasahitzak gutxienez zortzi karaktere izan behar ditu", - "action_invalid": "'{action}' eragiketa baliogabea", + "action_invalid": "'{action}' eragiketa baliogabea da", "aborting": "Bertan behera uzten.", "admin_password_changed": "Administrazio-pasahitza aldatu da", "admin_password_change_failed": "Ezinezkoa izan da pasahitza aldatzea", @@ -8,44 +8,44 @@ "additional_urls_already_removed": "'{url}' URL gehigarriari '{permission}' baimena kendu zaio dagoeneko", "admin_password": "Administrazio-pasahitza", "diagnosis_ip_global": "IP orokorra: {global}", - "app_argument_password_no_default": "Errorea egon da '{name}' pasahitzaren argumentua ikuskatzean: pasahitzaren argumentuak ezin du balio hori izan segurtasun urria duela-eta", + "app_argument_password_no_default": "Errorea egon da '{name}' pasahitzaren argumentua ikuskatzean: pasahitzak ezin du balio hori izan segurtasuna dela-eta", "app_extraction_failed": "Ezinezkoa izan da instalazio fitxategiak ateratzea", "app_requirements_unmeet": "{app}(e)k behar dituen baldintzak ez dira betetzen, {pkgname} ({version}) paketea {spec} izan behar da", "backup_deleted": "Babeskopia ezabatuta", - "app_argument_required": "'{name}' argumentua beharrezkoa da", - "certmanager_acme_not_configured_for_domain": "Ezin da ACME azterketa {domain} domeinurako burutu une honetan nginx konfigurazioak ez duelako beharrezko kodea… Baieztatu nginx-en konfigurazioa egunean dagoela 'yunohost tools regen-conf nginx --dry-run --with-diff' komandoa exekutatuz.", + "app_argument_required": "'{name}' argumentua ezinbestekoa da", + "certmanager_acme_not_configured_for_domain": "Ezinezkoa da ACME azterketa {domain} domeinurako burutzea une honetan nginx ezarpenek ez dutelako beharrezko kodea… Egiaztatu nginx ezarpenak egunean daudela 'yunohost tools regen-conf nginx --dry-run --with-diff' komandoa exekutatuz.", "certmanager_domain_dns_ip_differs_from_public_ip": "'{domain}' domeinurako DNS balioak ez datoz bat zerbitzariaren IParekin. Mesedez, egiaztatu 'DNS balioak' (oinarrizkoa) kategoria diagnostikoen atalean. A balioak duela gutxi aldatu badituzu, itxaron hedatu daitezen (badaude DNSen hedapena ikusteko erramintak interneten). (Zertan ari zeren baldin badakizu, erabili '--no-checks' egiaztapen horiek desgaitzeko.)", - "confirm_app_install_thirdparty": "KONTUZ! Aplikazio hau ez da YunoHosten aplikazioen katalogokoa. Kanpoko aplikazioek sistemaren integritate eta segurtasuna arriskuan jarri dezakete. Ziur asko EZ zenuke instalatu beharko zertan ari zaren ez badakizu. Aplikazio hau ez badabil edo sistema hondatzen badu EZ DA LAGUNTZARIK EMANGO… aurrera jarraitu nahi duzu hala ere? Aukeratu '{answers}'", + "confirm_app_install_thirdparty": "KONTUZ! Aplikazio hau ez da YunoHosten aplikazioen katalogokoa. Kanpoko aplikazioek sistemaren integritate eta segurtasuna arriskuan jarri dezakete. Ziur asko EZ zenuke instalatu beharko zertan ari zaren ez badakizu. Aplikazio hau ez badabil edo sistema kaltetzen badu EZ DA LAGUNTZARIK EMANGO… aurrera jarraitu nahi duzu hala ere? Aukeratu '{answers}'", "app_start_remove": "{app} ezabatzen…", - "diagnosis_http_hairpinning_issue_details": "Litekeena da erantzulea zure kable-modem / routerra izatea. Honen eraginez, saretik kanpo daudenek zerbitzaria arazorik gabe erabili ahal izango dute, baina sarean bertan daudenek (ziur asko zure kasua) ezingo dute kanpoko IPa edo domeinu izena erabili zerbitzarira konektatzeko. Egoera hobetu edo guztiz konpontzeko, irakurri dokumentazioa. [Itzultzailearen oharra: SBC merke batean Pi-Hole instalatu eta bertako Local DNS > DNS records baliatu arazo hau ekiditeko]", + "diagnosis_http_hairpinning_issue_details": "Litekeena da erantzulea zure kable-modem / routerra izatea. Honen eraginez, saretik kanpo daudenek zerbitzaria arazorik gabe erabili ahal izango dute, baina sare lokalean bertan daudenek (ziur asko zure kasua) ezingo dute kanpoko IPa edo domeinu izena erabili zerbitzarira konektatzeko. Egoera hobetu edo guztiz konpontzeko, irakurri dokumentazioa", "diagnosis_http_special_use_tld": "{domain} domeinua top-level domain (TLD) motakoa da .local edo .test bezala eta ez du sare lokaletik kanpo eskuragarri zertan egon.", - "diagnosis_ip_weird_resolvconf_details": "/etc/resolv.conf fitxategia symlink bat izan beharko litzateke /etc/resolvconf/run/resolv.conf fitxategira 127.0.0.1ra adi dagoena (dnsmasq). DNS ebazleak eskuz konfiguratu nahi badituzu, mesedez aldatu /etc/resolv.dnsmasq.conf fitxategia.", + "diagnosis_ip_weird_resolvconf_details": "/etc/resolv.conf fitxategia symlink bat izan beharko litzateke 127.0.0.1ra adi dagoen /etc/resolvconf/run/resolv.conf fitxategira (dnsmasq). DNS ebazleak eskuz konfiguratu nahi badituzu, mesedez aldatu /etc/resolv.dnsmasq.conf fitxategia.", "diagnosis_ip_connected_ipv4": "Zerbitzaria IPv4 bidez dago internetera konektatuta!", "diagnosis_basesystem_ynh_inconsistent_versions": "YunoHost paketeen bertsioak ez datoz bat… ziur asko noizbait eguneraketa batek kale egin edo erabat amaitu ez zuelako.", "diagnosis_high_number_auth_failures": "Azken aldian kale egin duten saio-hasiera saiakera ugari egon dira. Egiaztatu fail2ban martxan dabilela eta egoki konfiguratuta dagoela, edo erabili beste ataka bat SSHrako dokumentazioan azaldu bezala.", - "diagnosis_mail_ehlo_could_not_diagnose": "Ezin izan da egiaztatu postfix posta zerbitzaria IPv{ipversion}az kanpo eskuragarri dagoenik.", + "diagnosis_mail_ehlo_could_not_diagnose": "Ezinezkoa izan da postfix posta zerbitzaria IPv{ipversion}az kanpo eskuragarri dagoen egiaztatzea.", "app_id_invalid": "Aplikazio ID okerra", - "app_install_files_invalid": "Fitxategi hauek ezin dira instalatu", + "app_install_files_invalid": "Ezin dira fitxategi hauek instalatu", "diagnosis_description_ip": "Internet konexioa", "diagnosis_description_dnsrecords": "DNS erregistroak", - "app_label_deprecated": "Komando hau zaharkitua dago! Mesedez erabili 'yunohost user permission update' komando berria aplikazioaren etiketa kudeatzeko.", - "confirm_app_install_danger": "KONTUZ! Aplikazio hau esperimentala da (edo ez dabil)! Ez zenuke instalatu beharko zertan ari zaren ez badakizu. Aplikazio hau ez badabil edo sistema hondatzen badu, EZ DA LAGUNTZARIK EMANGO… aurrera jarraitu nahi al duzu hala ere? Aukeratu '{answers}'", + "app_label_deprecated": "Komando hau zaharkitua dago! Mesedez, erabili 'yunohost user permission update' komando berria aplikazioaren etiketa kudeatzeko.", + "confirm_app_install_danger": "KONTUZ! Aplikazio hau esperimentala da (edo ez dabil)! Ez zenuke instalatu beharko zertan ari zaren ez badakizu. Aplikazio hau ez badabil edo sistema kaltetzen badu, EZ DA LAGUNTZARIK EMANGO… aurrera jarraitu nahi al duzu hala ere? Aukeratu '{answers}'", "diagnosis_description_systemresources": "Sistemaren baliabideak", - "backup_csv_addition_failed": "Ezin izan dira fitxategiak CSV fitxategira kopiatu", + "backup_csv_addition_failed": "Ezinezkoa izan da fitxategiak CSV fitxategira kopiatzea", "backup_no_uncompress_archive_dir": "Ez dago horrelako deskonprimatutako fitxategi katalogorik", "danger": "Arriskua:", "diagnosis_dns_discrepancy": "Ez dirudi ondorengo DNS balioak bat datozenik proposatutako konfigurazioarekin:
Mota: {type}
Izena: {name}
Oraingo balioa: {current}
Proposatutako balioa: {value}", "diagnosis_dns_specialusedomain": "{domain} domeinua top-level domain (TLD) erabilera berezikoa da .local edo .test bezala eta horregatik ez du DNS erregistrorik erabiltzeko beharrik.", - "diagnosis_http_bad_status_code": "Badirudi zerbitzaria ez den beste gailu batek erantzun diola eskaerari (agian routerrak).
1. Honen arrazoi ohikoena 80 (eta 443) ataka zerbitzarira ondo birbidaltzen ez dela da.
2. Konfigurazio konplexua badarabilzu, egiaztatu suebakiak edo reverse-proxyk oztopatzen ez dutela.", - "diagnosis_http_timeout": "Denbora agortu da sare lokaletik kanpo zure zerbitzarira konexioa gauzatzeko ahaleginean. Eskuragarri ez dagoela dirudi.
1. 80 (eta 443) ataka zerbitzarira modu egokian birbidaltzen ez direla da ohiko arrazoia.
2. Badaezpada egiaztatu nginx martxan dagoela.
3. Konfigurazio konplexuetan, egiaztatu suebakiak edo reverse-proxyk konexioa oztopatzen ez dutela.", - "app_sources_fetch_failed": "Ezin izan dira fitxategiak eskuratu, zuzena al da URLa?", - "app_make_default_location_already_used": "Ezinezkoa izan da '{app}' domeinuko aplikazio nagusi ezartzea, '{other_app}'(e)k dagoeneko '{domain}' erabiltzen duelako", - "app_already_installed_cant_change_url": "Aplikazio hau instalatuta dago dagoeneko. URLa ezin da aldatu aukera honekin. Markatu `app changeurl` markatzeko moduan badago.", + "diagnosis_http_bad_status_code": "Badirudi zerbitzari hau ez den beste gailu batek erantzun diola eskaerari (agian routerrak).
1. Honen arrazoi ohikoena 80 (eta 443) ataka zerbitzarira ondo birbidaltzen ez dela da.
2. Konfigurazio konplexua badarabilzu, egiaztatu suebakiak edo reverse-proxyk oztopatzen ez dutela.", + "diagnosis_http_timeout": "Denbora agortu da sare lokaletik kanpo zure zerbitzarira konektatzeko ahaleginean. Eskuragarri ez dagoela dirudi.
1. 80 (eta 443) ataka zerbitzarira modu egokian birzuzentzen ez direla da ohiko zergatia.
2. Badaezpada egiaztatu nginx martxan dagoela.
3. Konfigurazio konplexuetan, egiaztatu suebakiak edo reverse-proxyk konexioa oztopatzen ez dutela.", + "app_sources_fetch_failed": "Ezinezkoa izan da fitxategiak eskuratzea, zuzena al da URLa?", + "app_make_default_location_already_used": "Ezinezkoa izan da '{app}' '{domain}' domeinuan lehenestea, '{other_app}'(e)k dagoeneko '{domain}' erabiltzen duelako", + "app_already_installed_cant_change_url": "Aplikazio hau instalatuta dago dagoeneko. URLa ezin da aldatu aukera honekin. Markatu 'app changeurl' markatzeko moduan badago.", "diagnosis_ip_not_connected_at_all": "Badirudi zerbitzaria ez dagoela internetera konektatuta!?", - "app_already_up_to_date": "{app} aplikazioa egunean da dagoeneko", + "app_already_up_to_date": "{app} egunean da dagoeneko", "app_change_url_success": "{app} aplikazioaren URLa {domain}{path} da orain", "admin_password_too_long": "Mesedez, aukeratu 127 karaktere baino laburragoa den pasahitz bat", - "app_action_broke_system": "Ekintza honek {services} zerbitzu garrantzitsuak hondatu dituela dirudi", + "app_action_broke_system": "Eragiketa honek {services} zerbitzu garrantzitsua(k) hondatu d(it)uela dirudi", "diagnosis_basesystem_hardware_model": "Zerbitzariaren modeloa {model} da", "already_up_to_date": "Ez dago egiteko ezer. Guztia dago egunean.", "backup_permission": "{app}(r)entzat babeskopia baimena", @@ -53,35 +53,35 @@ "config_validate_email": "Benetazko posta elektronikoa izan behar da", "config_validate_time": "OO:MM formatua duen ordu bat izan behar da", "config_validate_url": "Benetazko URL bat izan behar da", - "config_version_not_supported": "Ezin da konfigurazio-panelaren '{version}' bertsioa erabili.", + "config_version_not_supported": "Ezinezkoa da konfigurazio-panelaren '{version}' bertsioa erabiltzea.", "app_restore_script_failed": "Errorea gertatu da aplikazioa lehengoratzeko aginduan", - "app_upgrade_some_app_failed": "Ezin izan dira aplikazio batzuk eguneratu", + "app_upgrade_some_app_failed": "Ezinezkoa izan da aplikazio batzuk eguneratzea", "app_install_failed": "Ezinezkoa izan da {app} instalatzea: {error}", "diagnosis_basesystem_kernel": "Zerbitzariak Linuxen {kernel_version} kernela darabil", - "app_argument_invalid": "Aukeratu balio onargarri bat {name}' argumenturako: {error}", + "app_argument_invalid": "Aukeratu balio egoki bat '{name}' argumenturako: {error}", "app_already_installed": "{app} instalatuta dago dagoeneko", "app_config_unable_to_apply": "Ezinezkoa izan da konfigurazio aukerak ezartzea.", "app_config_unable_to_read": "Ezinezkoa izan da konfigurazio aukerak irakurtzea.", "config_apply_failed": "Ezin izan da konfigurazio berria ezarri: {error}", - "config_cant_set_value_on_section": "Ezin da balio bakar bat ezarri konfigurazio atal oso batean.", + "config_cant_set_value_on_section": "Ezinezkoa da balio bakar bat ezartzea konfigurazio atal oso batean.", "config_no_panel": "Ez da konfigurazio-panelik aurkitu.", "diagnosis_found_errors_and_warnings": "{category} atalari dago(z)kion {errors} arazoa(k) (eta {warnings} abisua(k)) aurkitu d(ir)a!", "diagnosis_description_regenconf": "Sistemaren ezarpenak", "app_upgrade_script_failed": "Errore bat gertatu da aplikazioaren eguneratze aginduan", "diagnosis_basesystem_hardware": "Zerbitzariaren arkitektura {virt} {arch} da", - "diagnosis_mail_ehlo_ok": "SMTP posta zerbitzaria eskuragarri dago kanpoko saretik eta beraz, posta elektronikoa jasotzeko gai da!", + "diagnosis_mail_ehlo_ok": "SMTP posta zerbitzaria eskuragarri dago kanpoko saretik eta, beraz, posta elektronikoa jasotzeko gai da!", "app_unknown": "Aplikazio ezezaguna", "diagnosis_mail_ehlo_bad_answer": "SMTP ez den zerbitzu batek erantzun du IPv{ipversion}ko 25. atakan", "diagnosis_mail_ehlo_could_not_diagnose_details": "Errorea: {error}", - "diagnosis_mail_blacklist_ok": "Zerbitzari honek darabiltzan IPak eta domeinuak ez dirudi inolako zerrenda beltzetan daudenik", + "diagnosis_mail_blacklist_ok": "Ez dirudi zerbitzari honek darabiltzan IPak eta domeinuak inolako zerrenda beltzean daudenik", "diagnosis_domain_expiration_error": "Domeinu batzuk IRAUNGITZEAR daude!", "diagnosis_domain_expiration_success": "Domeinuak erregistratuta daude eta ez dira oraingoz iraungiko.", - "app_manifest_install_ask_is_public": "Saiorik hasi gabeko bisitarientzat ikusgai egon beharko litzateke aplikazio hau?", + "app_manifest_install_ask_is_public": "Saiorik hasi gabeko bisitarientzat ikusgai egon beharko luke aplikazioak?", "diagnosis_domain_expires_in": "{domain} {days} egun barru iraungiko da.", - "app_manifest_install_ask_domain": "Aukeratu zein domeinutan instalatu nahi duzun aplikazio hau", + "app_manifest_install_ask_domain": "Aukeratu zein domeinutan instalatu nahi duzun aplikazioa", "custom_app_url_required": "URL bat zehaztu behar duzu {app} eguneratzeko", "app_change_url_identical_domains": "Domeinu zahar eta berriaren bidea bera dira: ('{domain}{path}'), ez dago ezer egitekorik.", - "app_upgrade_failed": "Ezinezkoa {app} eguneratzea: {error}", + "app_upgrade_failed": "Ezinezkoa izan da {app} eguneratzea: {error}", "app_upgrade_app_name": "Orain {app} eguneratzen…", "app_upgraded": "{app} eguneratu da", "ask_firstname": "Izena", @@ -90,9 +90,9 @@ "config_forbidden_keyword": "'{keyword}' etiketa sistemak bakarrik erabil dezake; ezin da ID hau daukan baliorik sortu edo erabili.", "config_unknown_filter_key": "'{filter_key}' filtroaren kakoa ez da zuzena.", "config_validate_color": "RGB hamaseitar kolore bat izan behar da", - "diagnosis_cant_run_because_of_dep": "Ezin da diagnosia abiarazi {category} atalerako {dep}(r)i lotutako arazo garrantzitsuek dirauen artean.", + "diagnosis_cant_run_because_of_dep": "Ezinezkoa da diagnosia abiaraztea {category} atalerako {dep}(r)i lotutako arazo garrantzitsuek dirauen artean.", "diagnosis_dns_missing_record": "Proposatutako DNS konfigurazioaren arabera, ondorengo informazioa gehitu beharko zenuke DNS erregistroan:
Mota: {type}
Izena: {name}
Balioa: {value}", - "diagnosis_http_nginx_conf_not_up_to_date": "Domeinu honen nginx konfigurazioa eskuz moldatu dela dirudi eta YunoHostek ezin du egiaztatu HTTP bidez eskuragarri dagoen.", + "diagnosis_http_nginx_conf_not_up_to_date": "Domeinu honen nginx ezarpenak eskuz moldatu direla dirudi eta YunoHostek ezin du egiaztatu HTTP bidez eskuragarri dagoenik.", "ask_new_admin_password": "Administrazio-pasahitz berria", "ask_new_domain": "Domeinu berria", "ask_new_path": "Bide berria", @@ -103,23 +103,23 @@ "backup_archive_app_not_found": "Ezin izan da {app} aurkitu babeskopia fitxategian", "backup_applying_method_tar": "Babeskopiaren TAR fitxategia sortzen…", "backup_archive_broken_link": "Ezin izan da babeskopiaren fitxategia eskuratu ({path}ra esteka okerra)", - "backup_creation_failed": "Ezin izan da babeskopiaren fitxategia sortu", - "backup_csv_creation_failed": "Ezin izan da lehengoratzeko beharrezkoak diren CSV fitxategiak sortu", + "backup_creation_failed": "Ezinezkoa izan da babeskopiaren fitxategia sortzea", + "backup_csv_creation_failed": "Ezinezkoa izan da lehengoratzeko beharrezkoak diren CSV fitxategiak sortzea", "backup_custom_mount_error": "Neurrira egindako babeskopiak ezin izan du 'muntatu' urratsetik haratago egin", - "backup_delete_error": "Ezin izan da '{path}' ezabatu", + "backup_delete_error": "Ezinezkoa izan da '{path}' ezabatzea", "backup_method_copy_finished": "Babeskopiak amaitu du", - "backup_hook_unknown": "Babeskopiaren '{hook}' kakoa ez da ezagutzen", + "backup_hook_unknown": "Babeskopiaren '{hook}' kakoa ezezaguna da", "backup_method_custom_finished": "'{method}' neurrira egindako babeskopiak amaitu du", "backup_method_tar_finished": "TAR babeskopia artxiboa sortu da", - "backup_mount_archive_for_restore": "Lehengoratzeko fitxategoak prestatzen…", + "backup_mount_archive_for_restore": "Lehengoratzeko fitxategiak prestatzen…", "backup_nothings_done": "Ez dago gordetzeko ezer", "backup_output_directory_required": "Babeskopia non gorde nahi duzun zehaztu behar duzu", - "backup_system_part_failed": "Ezin izan da sistemaren '{part}' atalaren babeskopia egin", + "backup_system_part_failed": "Ezinezkoa izan da sistemaren '{part}' atalaren babeskopia egitea", "apps_catalog_updating": "Aplikazioen katalogoa eguneratzen…", - "certmanager_cert_signing_failed": "Ezin izan da ziurtagiri berria sinatu", + "certmanager_cert_signing_failed": "Ezinezkoa izan da ziurtagiri berria sinatzea", "certmanager_cert_renew_success": "Let's Encrypt ziurtagiria berriztu da '{domain}' domeinurako", "app_requirements_checking": "{app}(e)k behar dituen paketeak ikuskatzen…", - "certmanager_unable_to_parse_self_CA_name": "Ezin izan da norberak sinatutako ziurtagiriaren izena prozesatu (fitxategia: {file})", + "certmanager_unable_to_parse_self_CA_name": "Ezinezkoa izan da norberak sinatutako ziurtagiriaren izena prozesatzea (fitxategia: {file})", "app_remove_after_failed_install": "Aplikazioa ezabatzen instalatzerakoan errorea dela-eta…", "diagnosis_basesystem_ynh_single_version": "{package} bertsioa: {version} ({repo})", "diagnosis_failed_for_category": "'{category}' ataleko diagnostikoak kale egin du: {error}", @@ -127,17 +127,17 @@ "diagnosis_found_errors": "{category} atalari dago(z)kion {errors} arazoa(k) aurkitu d(ir)a!", "diagnosis_found_warnings": "{category} atalari dagokion eta hobetu daite(z)keen {warnings} abisua(k) aurkitu d(ir)a.", "diagnosis_ip_connected_ipv6": "Zerbitzaria IPv6 bidez dago internetera konektatuta!", - "diagnosis_everything_ok": "Itxura ona dauka {category} atalak!", + "diagnosis_everything_ok": "Badirudi guztia zuzen dagoela {category} atalean!", "diagnosis_ip_no_ipv4": "Zerbitzariak ez du dabilen IPv4rik.", "diagnosis_ip_no_ipv6": "Zerbitzariak ez du dabilen IPv6rik.", - "diagnosis_ip_broken_dnsresolution": "Domeinu izenaren ebazpena hondatuta dagoela dirudi… Suebakiren bat ote dago DNS eskaerak oztopatzen?", - "diagnosis_diskusage_low": "{mountpoint} euskarriak ({device} gailuan) edukieraren {free} ({free_percent}%) bakarrik du erabilgarri ({total} orotara). Kontuz ibili.", + "diagnosis_ip_broken_dnsresolution": "Domeinu izenaren ebazpena kaltetuta dagoela dirudi… Suebakiren bat ote dago DNS eskaerak oztopatzen?", + "diagnosis_diskusage_low": "{mountpoint} fitxategi-sistemak ({device} euskarrian) edukieraren {free} ({free_percent}%) bakarrik du erabilgarri ({total} orotara). Kontuz ibili.", "diagnosis_dns_good_conf": "DNS ezarpenak zuzen konfiguratuta daude {domain} domeinurako ({category} atala)", - "diagnosis_diskusage_verylow": "{mountpoint} euskarriak ({device} gailuan) edukieraren {free} ({free_percent}%) bakarrik du erabilgarri ({total} orotara). Zertxobait hustu beharko zenuke!", + "diagnosis_diskusage_verylow": "{mountpoint} fitxategi-sistemak ({device} euskarrian) edukieraren {free} ({free_percent}%) bakarrik du erabilgarri ({total} orotara). Zertxobait hustu beharko zenuke!", "diagnosis_description_basesystem": "Sistemaren oinarria", "diagnosis_description_services": "Zerbitzuen egoeraren egiaztapena", - "diagnosis_http_could_not_diagnose": "Ezin izan da egiaztatu domeinuak IPv{ipversion} kanpotik eskuragarri daudenik.", - "diagnosis_http_ok": "Ezin da {domain} domeinua HTTP bidez bisitatu sare lokaletik kanpo.", + "diagnosis_http_could_not_diagnose": "Ezinezkoa izan da domeinuak IPv{ipversion} kanpotik eskuragarri dauden egiaztatzea.", + "diagnosis_http_ok": "{domain} domeinua HTTP bidez bisitatu daiteke sare lokaletik kanpo.", "diagnosis_http_unreachable": "Badirudi {domain} domeinua ez dagoela eskuragarri HTTP bidez sare lokaletik kanpo.", "apps_catalog_failed_to_download": "Ezinezkoa izan da {apps_catalog} aplikazioen zerrenda eskuratzea: {error}", "apps_catalog_init_success": "Abiarazi da aplikazioen katalogo sistema!", @@ -147,47 +147,47 @@ "diagnosis_description_web": "Weba", "diagnosis_display_tip": "Aurkitu diren arazoak ikusteko joan Diagnosien atalera administrazio-webgunean, edo exekutatu 'yunohost diagnosis show --issues --human-readable' komandoak nahiago badituzu.", "diagnosis_dns_point_to_doc": "Mesedez, irakurri dokumentazioa DNS erregistroekin laguntza behar baduzu.", - "diagnosis_mail_ehlo_unreachable": "SMTP posta zerbitzaria ez dago eskuragarri IPv{ipversion}ko sare lokaletik kanpo eta beraz, ez da posta elektronikoa jasotzeko gai.", + "diagnosis_mail_ehlo_unreachable": "SMTP posta zerbitzaria ez dago eskuragarri IPv{ipversion}ko sare lokaletik kanpo eta, beraz, ez da posta elektronikoa jasotzeko gai.", "diagnosis_mail_ehlo_bad_answer_details": "Litekeena da zure zerbitzaria ez den beste gailu batek erantzun izana.", - "diagnosis_mail_blacklist_listed_by": "Zure IP edo {item} domeinua {blacklist_name} zerrenda beltzean ageri da", + "diagnosis_mail_blacklist_listed_by": "Zure {item} IPa edo domeinua {blacklist_name} zerrenda beltzean ageri da", "diagnosis_mail_blacklist_website": "Zerrenda beltzean zergatik zauden ulertu eta konpondu ondoren, {blacklist_website} webgunean zure IP edo domeinua bertatik atera dezatela eska dezakezu", "diagnosis_http_could_not_diagnose_details": "Errorea: {error}", "diagnosis_http_hairpinning_issue": "Dirudienez zure sareak ez du hairpinninga gaituta.", "diagnosis_http_partially_unreachable": "Badirudi {domain} domeinua ezin dela bisitatu HTTP bidez IPv{failed} sare lokaletik kanpo, bai ordea IPv{passed} erabiliz.", - "backup_archive_cant_retrieve_info_json": "Ezin izan da '{archive}' fitxategiko informazioa eskuratu… info.json ezin izan da eskuratu (edo ez da baliozko jsona).", - "diagnosis_domain_expiration_not_found": "Ezin izan da domeinu batzuen iraungitze data egiaztatu", - "diagnosis_domain_expiration_not_found_details": "Dirudienez {domain} domeinuari buruzko WHOIS informazioak ez du zehazten noiz iraungiko den.", + "backup_archive_cant_retrieve_info_json": "Ezinezkoa izan da '{archive}' fitxategiko informazioa eskuratzea… info.json ezin izan da eskuratu (edo ez da baliozko jsona).", + "diagnosis_domain_expiration_not_found": "Ezinezkoa izan da domeinu batzuen iraungitze data egiaztatzea", + "diagnosis_domain_expiration_not_found_details": "Badirudi {domain} domeinuari buruzko WHOIS informazioak ez duela zehazten noiz iraungiko den.", "certmanager_domain_not_diagnosed_yet": "Oraindik ez dago {domain} domeinurako diagnostikorik. Mesedez, berrabiarazi diagnostikoak 'DNS balioak' eta 'Web' ataletarako diagnostikoen gunean Let's Encrypt ziurtagirirako prest ote dagoen egiaztatzeko. (Edo zertan ari zaren baldin badakizu, erabili '--no-checks' egiaztatzea desgaitzeko.)", "diagnosis_domain_expiration_warning": "Domeinu batzuk iraungitzear daude!", "app_packaging_format_not_supported": "Aplikazio hau ezin da instalatu YunoHostek ez duelako paketea ezagutzen. Sistema eguneratzea hausnartu beharko zenuke ziur asko.", "diagnosis_dns_try_dyndns_update_force": "Domeinu honen DNS konfigurazioa YunoHostek kudeatu beharko luke automatikoki. Gertatuko ez balitz, eguneratzera behartu zenezake yunohost dyndns update --force erabiliz.", "app_manifest_install_ask_path": "Aukeratu aplikazio hau instalatzeko URLaren bidea (domeinuaren atzeko aldean)", - "app_manifest_install_ask_admin": "Aukeratu administrati bat aplikazio honetarako", + "app_manifest_install_ask_admin": "Aukeratu administrari bat aplikazio honetarako", "app_manifest_install_ask_password": "Aukeratu administrazio-pasahitz bat aplikazio honetarako", "ask_user_domain": "Erabiltzailearen posta elektroniko eta XMPP konturako erabiliko den domeinua", - "app_action_cannot_be_ran_because_required_services_down": "{services} zerbitzuak martxan egon beharko lirateke ekintza hau gauzatu ahal izateko. Saia zaitez zerbitzuok berrabiarazten (eta ikertu zergatik abiarazi ez diren).", + "app_action_cannot_be_ran_because_required_services_down": "{services} zerbitzuak martxan egon beharko lirateke eragiketa hau exekutatu ahal izateko. Saia zaitez zerbitzuok berrabiarazten (eta ikertu zergatik ez diren abiarazi).", "apps_already_up_to_date": "Egunean daude dagoeneko aplikazio guztiak", "app_full_domain_unavailable": "Aplikazio honek bere domeinu propioa behar du, baina beste aplikazio batzuk daude dagoeneko instalatuta '{domain}' domeinuan. Azpidomeinu bat erabil zenezake instalatu nahi duzun aplikaziorako.", "app_install_script_failed": "Errore bat gertatu da aplikazioaren instalatzailearen aginduetan", "diagnosis_basesystem_host": "Zerbitzariak Debian {debian_version} darabil", - "diagnosis_ignored_issues": "(kontuan hartu ez d(ir)en + {nb_ignored} arazoa(k))", + "diagnosis_ignored_issues": "(kontutan hartu ez d(ir)en + {nb_ignored} arazo)", "diagnosis_ip_dnsresolution_working": "Domeinu izenaren ebazpena badabil!", - "diagnosis_failed": "Ezin izan da '{category}' ataleko diagnostikoa lortu: {error}", + "diagnosis_failed": "Ezinezkoa izan da '{category}' ataleko diagnostikoa lortzea: {error}", "diagnosis_ip_weird_resolvconf": "DNS ebazpena badabilela dirudi, baina antza denez moldatutako /etc/resolv.conf fitxategia erabiltzen ari zara.", "diagnosis_dns_bad_conf": "DNS balio batzuk falta dira edo ez dira zuzenak {domain} domeinurako ({category} atala)", - "diagnosis_diskusage_ok": "{mountpoint} euskarriak ({device} gailuan) edukieraren {free} ({free_percent}%) du erabilgarri oraindik ({total} orotara)!", + "diagnosis_diskusage_ok": "{mountpoint} fitxategi-sistemak ({device} euskarrian) edukieraren {free} ({free_percent}%) du erabilgarri oraindik ({total} orotara)!", "apps_catalog_update_success": "Aplikazioen katalogoa eguneratu da!", "certmanager_warning_subdomain_dns_record": "'{subdomain}' azpidomeinuak ez dauka '{domain}'(e)k duen IP bera. Ezaugarri batzuk ez dira erabilgarri egongo hau zuzendu arte eta ziurtagiri bat birsortu arte.", - "app_argument_choice_invalid": "Aukeratu ({choices}) aukeretako bat '{name}' argumenturako: '{value}' ez dago aukera horien artean", + "app_argument_choice_invalid": "Hautatu ({choices}) aukeretako bat '{name}' argumenturako: '{value}' ez dago aukera horien artean", "backup_create_size_estimation": "Fitxategiak {size} datu inguru izango ditu.", "diagnosis_basesystem_ynh_main_version": "Zerbitzariak YunoHosten {main_version} ({repo}) darabil", "backup_custom_backup_error": "Neurrira egindako babeskopiak ezin izan du 'babeskopia egin' urratsetik haratago egin", - "diagnosis_ip_broken_resolvconf": "Zure zerbitzarian domeinu izenaren ebazpena hondatuta dagoela dirudi, antza denez /etc/resolv.conf fitxategia ez dago 127.0.0.1ra adi.", + "diagnosis_ip_broken_resolvconf": "Zure zerbitzarian domeinu izenaren ebazpena kaltetuta dagoela dirudi, antza denez /etc/resolv.conf fitxategia ez dago 127.0.0.1ra adi.", "diagnosis_ip_no_ipv6_tip": "Dabilen IPv6 izatea ez da derrigorrezkoa zerbitzariaren funtzionamendurako, baina egokiena da interneten osasunerako. IPv6 automatikoki konfiguratu beharko luke sistemak edo telefono-konpainiak. Bestela, eskuz konfiguratu beharko zenituzke hainbat gauza dokumentazioan azaltzen den bezala. Ezin baduzu edo IPv6 gaitzea zuretzat kontu teknikoegia baldin bada, ez duzu abisu hau zertan kontutan hartu.", "diagnosis_http_nginx_conf_not_up_to_date_details": "Egoera konpontzeko, ikuskatu desberdintasunak yunohost tools regen-conf nginx --dry-run --with-diff komandoren bidez eta, proposatutako aldaketak onartzen badituzu, ezarri itzazu yunohost tools regen-conf nginx --force erabiliz.", "diagnosis_domain_not_found_details": "{domain} domeinua ez da WHOISen datubasean existitzen edo iraungi da!", - "app_start_backup": "{app}(r)en babes-kopia egiteko fitxategiak hartzen…", - "app_change_url_no_script": "'{app_name}' aplikazioak ez du URLa moldatzerik onartzen momentuz. Agian eguneratu beharko zenuke.", + "app_start_backup": "{app}(r)en babeskopia egiteko fitxategiak eskuratzen…", + "app_change_url_no_script": "'{app_name}' aplikazioak oraingoz ez du URLa moldatzerik onartzen. Agian eguneratu beharko zenuke.", "app_location_unavailable": "URL hau ez dago erabilgarri edota dagoeneko instalatutako aplikazioren batekin talka egiten du:\n{apps}", "app_not_upgraded": "'{failed_app}' aplikazioa ezin izan da eguneratu, eta horregatik ondorengo aplikazioen eguneraketak bertan behera utzi dira: {apps}", "app_not_correctly_installed": "Ez dirudi {app} ondo instalatuta dagoenik", @@ -195,54 +195,54 @@ "app_not_properly_removed": "Ezinezkoa izan da {app} guztiz ezabatzea", "app_start_install": "{app} instalatzen…", "app_start_restore": "{app} lehengoratzen…", - "app_unsupported_remote_type": "Aplikazioak darabilen urruneko motak ez du babesik", + "app_unsupported_remote_type": "Aplikazioak darabilen urruneko motak ez du babesik (Unsupported remote type)", "app_upgrade_several_apps": "Ondorengo aplikazioak eguneratuko dira: {apps}", "backup_app_failed": "Ezinezkoa izan da {app}(r)en babeskopia egitea", "backup_actually_backuping": "Bildutako fitxategiekin babeskopia sortzen…", "backup_archive_name_exists": "Dagoeneko existitzen da izen bera duen babeskopia fitxategi bat.", "backup_archive_name_unknown": "Ez da '{name}' izeneko babeskopia ezagutzen", - "backup_archive_open_failed": "Ezin izan da babeskopien fitxategia ireki", + "backup_archive_open_failed": "Ezinezkoa izan da babeskopien fitxategia irekitzea", "backup_archive_system_part_not_available": "'{part}' sistemaren atala ez dago erabilgarri babeskopia honetan", - "backup_archive_writing_error": "Ezin izan da '{source}' ('{dest}' fitxategiak eskatu dituenak) fitxategia '{archive}' konprimatutako babeskopian sartu", - "backup_ask_for_copying_if_needed": "Denbora batez {size}MB erabili nahi dituzu babeskopia gauzatu ahal izateko? (Horrela egiten da fitxategi batzuk ezin direlako modu eraginkorragoan prestatu.)", - "backup_cant_mount_uncompress_archive": "Ezin izan da deskonprimatutako fitxategia muntatu idazketa-babesa duelako", - "backup_created": "Egin da babeskopia", + "backup_archive_writing_error": "Ezinezkoa izan da '{source}' ('{dest}' fitxategiak eskatu dituenak) fitxategia '{archive}' konprimatutako babeskopian sartzea", + "backup_ask_for_copying_if_needed": "Behin-behinean {size}MB erabili nahi dituzu babeskopia gauzatu ahal izateko? (Horrela egiten da fitxategi batzuk ezin direlako modu eraginkorragoan prestatu.)", + "backup_cant_mount_uncompress_archive": "Ezinezkoa izan da deskonprimatutako fitxategia muntatzea idazketa-babesa duelako", + "backup_created": "Babeskopia sortu da", "backup_copying_to_organize_the_archive": "{size}MB kopiatzen fitxategia antolatzeko", "backup_couldnt_bind": "Ezin izan da {src} {dest}-ra lotu.", - "backup_output_directory_forbidden": "Aukeratu beste katalogo bat emaitza gordetzeko. Babeskopiak ezin dira sortu /bin, /boot, /dev, /etc, /lib, /root, /run, /sbin, /sys, /usr, /var or /home/yunohost.backup/archives azpi-katalogoetan", + "backup_output_directory_forbidden": "Aukeratu beste katalogo bat emaitza gordetzeko. Babeskopiak ezin dira sortu /bin, /boot, /dev, /etc, /lib, /root, /run, /sbin, /sys, /usr, /var edo /home/yunohost.backup/archives azpi-katalogoetan", "backup_output_directory_not_empty": "Aukeratu hutsik dagoen katalogo bat", "backup_running_hooks": "Babeskopien kakoak exekutatzen…", - "backup_unable_to_organize_files": "Ezin izan da modu azkarra erabili fitxategiko artxiboak prestatzeko", + "backup_unable_to_organize_files": "Ezinezkoa izan da modu azkarra erabiltzea fitxategiko artxiboak prestatzeko", "backup_output_symlink_dir_broken": "'{path}' fitxategi-katalogoaren symlink-a ez dabil. Agian [ber]muntatzea ahaztu zaizu edo euskarria atakara konektatzea ahaztu duzu.", "backup_with_no_backup_script_for_app": "'{app}' aplikazioak ez du babeskopia egiteko agindurik. Ez da kontutan hartuko.", "backup_with_no_restore_script_for_app": "{app}(e)k ez du lehengoratzeko agindurik, ezingo duzu aplikazio hau automatikoki lehengoratu.", "certmanager_attempt_to_renew_nonLE_cert": "'{domain}' domeinurako ziurtagiria ez da Let's Encryptek jaulkitakoa. Ezin da automatikoki berriztu!", "certmanager_attempt_to_renew_valid_cert": "'{domain}' domeinurako ziurtagiria iraungitzear dago! (Zertan ari zaren baldin badakizu, --force erabil dezakezu)", - "certmanager_cannot_read_cert": "Arazoren bat egon da {domain} (fitxategia: {file}) domeinurako oraingo ziurtagiria irekitzen saiatzerakoan, arrazoia: {reason}", + "certmanager_cannot_read_cert": "Arazoren bat egon da {domain} (fitxategia: {file}) domeinurako oraingo ziurtagiria irekitzen saiatzerakoan, zergatia: {reason}", "certmanager_cert_install_success": "Let's Encrypt ziurtagiria instalatu da '{domain}' domeinurako", "certmanager_cert_install_success_selfsigned": "Norberak sinatutako ziurtagiria instalatu da '{domain}' domeinurako", - "certmanager_domain_cert_not_selfsigned": "{domain} domeinurako ziurtagiria ez da norberak sinatutakoa. Ziur al zaude ordezkatzeaz? (Erabili '--force' hori egiteko.)", + "certmanager_domain_cert_not_selfsigned": "{domain} domeinurako ziurtagiria ez da norberak sinatutakoa. Ziur al zaude ordezkatu nahi duzula? (Erabili '--force' hori egiteko.)", "certmanager_certificate_fetching_or_enabling_failed": "{domain} domeinurako ziurtagiri berriak kale egin du…", - "certmanager_domain_http_not_working": "Ez dirudi {domain} domeinua HTTP bidez ikusgai dagoenik. Mesedez, egiaztatu 'Web' kategoria diagnosien gunean informazio gehiagorako. (zertan ari zaren baldin badakizu, erabili '--no-checks' egiaztapen horiek desgaitzeko.)", - "certmanager_hit_rate_limit": "{domain} domeinu-multzurako ziurtagiri gehiegi jaulki dira dagoeneko. Mesedez, saia saitez geroago. Ikus https://letsencrypt.org/docs/rate-limits/ xehetasun gehiagorako", - "certmanager_no_cert_file": "Ezin izan da ziurtagiri fitxategia irakurri {domain} (fitxategia: {file}) domeinurako", - "certmanager_self_ca_conf_file_not_found": "Ezin izan da konfigurazio-fitxategia aurkitu norberak sinatutako ziurtagirirako (fitxategia: {file})", + "certmanager_domain_http_not_working": "Ez dirudi {domain} domeinua HTTP bidez ikusgai dagoenik. Mesedez, egiaztatu 'Weba' atala diagnosien gunean informazio gehiagorako. (Zertan ari zaren baldin badakizu, erabili '--no-checks' egiaztapen horiek desgaitzeko.)", + "certmanager_hit_rate_limit": "{domain} domeinu-multzorako ziurtagiri gehiegi jaulki dira dagoeneko. Mesedez, saia saitez geroago. Ikus https://letsencrypt.org/docs/rate-limits/ xehetasun gehiagorako", + "certmanager_no_cert_file": "Ezinezkoa izan da {domain} domeinurako ziurtagiri fitxategia irakurrtzea (fitxategia: {file})", + "certmanager_self_ca_conf_file_not_found": "Ezinezkoa izan da konfigurazio-fitxategia aurkitzea norberak sinatutako ziurtagirirako (fitxategia: {file})", "confirm_app_install_warning": "Adi: litekeena da aplikazio hau ibiltzea baina ez dago YunoHostera egina. Ezaugarri batzuk, SSO edo babeskopia/lehengoratzea esaterako, desgaituta egon daitezke. Instalatu hala ere? [{answers}] ", "diagnosis_description_ports": "Ataken irisgarritasuna", - "backup_archive_corrupted": "Badirudi '{archive}' babeskopia fitxategia hondatuta dagoela: {error}", + "backup_archive_corrupted": "Badirudi '{archive}' babeskopia fitxategia kaltetuta dagoela: {error}", "diagnosis_ip_local": "IP lokala: {local}", - "diagnosis_mail_blacklist_reason": "Zerrenda beltzean egotearen arrazoia zera da: {reason}", + "diagnosis_mail_blacklist_reason": "Zerrenda beltzean egotearen zergatia zera da: {reason}", "app_removed": "{app} desinstalatu da", - "backup_cleaning_failed": "Ezin izan da behin-behineko babeskopien karpeta hustu", + "backup_cleaning_failed": "Ezinezkoa izan da behin-behineko babeskopien karpeta hustea", "certmanager_attempt_to_replace_valid_cert": "{domain} domeinurako egokia eta baliogarria den ziurtagiri bat ordezkatzen saiatzen ari zara! (Erabili --force mezu hau deuseztatu eta ziurtagiria ordezkatzeko)", "diagnosis_backports_in_sources_list": "Dirudienez apt (pakete kudeatzailea) backports biltegia erabiltzeko konfiguratuta dago. Zertan ari zaren ez badakizu, ez zenuke backports biltegietako aplikaziorik instalatu beharko, ezegonkortasun eta gatazkak eragin ditzaketelako sistemarekin.", "app_restore_failed": "Ezinezkoa izan da {app} lehengoratzea: {error}", "diagnosis_apps_allgood": "Instalatutako aplikazioek oinarrizko pakete-jarraibideekin bat egiten dute", "diagnosis_apps_bad_quality": "Aplikazio hau hondatuta dagoela dio YunoHosten aplikazioen katalogoak. Agian behin-behineko kontua da arduradunak arazoa konpondu bitartean. Momentuz, ezin da aplikazioa eguneratu.", - "diagnosis_apps_broken": "Aplikazio hau hondatuta dagoela ageri da YunoHosten aplikazioen katalogoan. Agian, behin-behineko kontua da arduradunak konpondu bitartean. Momentuz, ezin da aplikazioa eguneratu.", - "diagnosis_apps_deprecated_practices": "Instalatutako aplikazio honen bertsioak oraindik darabil zaharkitutako pakete-jarraibideak. Eguneratzea hausnartu beharko zenuke.", + "diagnosis_apps_broken": "Aplikazio hau YunoHosten aplikazioen katalogoan hondatuta dagoela ageri da. Agian behin-behineko kontua da arduradunak konpondu bitartean. Momentuz, ezin da aplikazioa eguneratu.", + "diagnosis_apps_deprecated_practices": "Instalatutako aplikazio honen bertsioak oraindik darabiltza zaharkitutako pakete-jarraibideak. Eguneratzea hausnartu beharko zenuke.", "diagnosis_apps_issue": "Arazo bat dago {app} aplikazioarekin", - "diagnosis_apps_not_in_app_catalog": "Aplikazio hau ez da YunoHosten aplikazioen katalogokoa. Iraganean egon bazen eta ezabatu izan balitz, desinstalatzea litzateke onena, ez baitu eguneraketarik jasoko eta sistemaren integritate eta segurtasuna arriskuan jarri lezake.", + "diagnosis_apps_not_in_app_catalog": "Aplikazio hau ez da YunoHosten aplikazioen katalogokoa. Iraganean egon bazen eta ezabatu izan balitz, desinstalatzea litzateke onena, ez baitu eguneraketarik jasoko eta sistemaren integritate eta segurtasuna arriskuan jarri lezakeelako.", "diagnosis_apps_outdated_ynh_requirement": "Instalatutako aplikazio honen bertsioak yunohost >= 2.x baino ez du behar, eta horrek egungo pakete-jardunbideekin bat ez datorrela iradokitzen du. Eguneratzen saiatu beharko zinateke.", "diagnosis_description_apps": "Aplikazioak", "domain_dns_conf_special_use_tld": "Domeinu hau top-level domain (TLD) erabilera bereziko motakoa da .local edo .test bezala eta ez du DNS ezarpenik behar.", @@ -253,76 +253,76 @@ "group_user_already_in_group": "{user} erabiltzailea {group} taldean dago dagoeneko", "firewall_reloaded": "Suebakia birkargatu da", "domain_unknown": "'{domain}' domeinua ezezaguna da", - "global_settings_cant_serialize_settings": "Ezin izan dira konfikurazio-datuak serializatu, zergatia: {reason}", - "global_settings_setting_security_nginx_redirect_to_https": "Birbidali HTTP eskaerak HTTPSra (EZ ITZALI hau ez badakizu zertan ari zaren!)", + "global_settings_cant_serialize_settings": "Ezinezkoa izan da konfikurazio-datuak serializatzea, zergatia: {reason}", + "global_settings_setting_security_nginx_redirect_to_https": "Birbideratu HTTP eskaerak HTTPSra (EZ ITZALI hau ez badakizu zertan ari zaren!)", "group_deleted": "'{group}' taldea ezabatu da", "invalid_password": "Pasahitza ez da zuzena", "log_domain_main_domain": "Lehenetsi '{}' domeinua", - "log_user_group_update": "Aldatu '{}' taldea", - "dyndns_could_not_check_available": "Ezin izan da egiaztatu {domain} eskuragarri dagoenik {provider}(e)n.", - "diagnosis_rootfstotalspace_critical": "Sistemaren root memoriak {space} baino ez ditu erabilgarri, eta hori kezkagarria da! Litekeena da oso laster memoriarik gabe geratzea! Root partizioak gutxienez 16GB erabilgarri izatea da gomendioa.", + "log_user_group_update": "Moldatu '{}' taldea", + "dyndns_could_not_check_available": "Ezinezkoa izan da {domain} {provider}(e)n eskuragarri dagoen egiaztatzea.", + "diagnosis_rootfstotalspace_critical": "'root' fitxategi-sistemak {space} baino ez ditu erabilgarri, eta hori kezkagarria da! Litekeena da oso laster memoriarik gabe geratzea! 'root' fitxategi-sistemak gutxienez 16GB erabilgarri izatea da gomendioa.", "disk_space_not_sufficient_install": "Ez dago aplikazio hau instalatzeko nahikoa espaziorik", - "domain_dns_conf_is_just_a_recommendation": "Komando honek *gomendatutako* konfigurazioa erakusten du. Ez du DNS konfigurazioa zugatik ezartzen. Zure ardura da DNS gunea zure erregistro-enpresaren gomendioen arabera ezartzea.", + "domain_dns_conf_is_just_a_recommendation": "Komando honek *iradokitako* konfigurazioa erakusten du. Ez du DNS konfigurazioa zugatik ezartzen. Zure ardura da DNS gunea zure erregistro-enpresaren gomendioen arabera ezartzea.", "dyndns_ip_update_failed": "Ezin izan da IP helbidea DynDNSan eguneratu", "dyndns_ip_updated": "IP helbidea DynDNS-n eguneratu da", "dyndns_key_not_found": "Ez da domeinurako DNS gakorik aurkitu", "dyndns_unavailable": "'{domain}' domeinua ez dago eskuragarri.", "log_app_makedefault": "Lehenetsi '{}' aplikazioa", - "log_does_exists": "Ez dago '{log}' izena duen eragiketa-erregistrorik, erabili 'yunohost log list' eragiketa-erregistro guztiak ikusteko", + "log_does_exists": "Ez dago '{log}' izena duen eragiketa-erregistrorik; erabili 'yunohost log list' eragiketa-erregistro guztiak ikusteko", "log_user_group_delete": "Ezabatu '{}' taldea", "log_user_import": "Inportatu erabiltzaileak", "dyndns_key_generating": "DNS gakoa sortzen… litekeena da honek denbora behar izatea.", "diagnosis_mail_fcrdns_ok": "Alderantzizko DNSa zuzen konfiguratuta dago!", "diagnosis_mail_queue_unavailable_details": "Errorea: {error}", - "dyndns_provider_unreachable": "Ezin izan da DynDNS {provider} enpresarekin konexioa gauzatu: agian zure YunoHost zerbitzaria ez dago internetera konektatuta edo dynette zerbitzaria ez dago martxan.", + "dyndns_provider_unreachable": "Ezinezkoa izan da DynDNS {provider} enpresarekin konektatzea: agian zure YunoHost zerbitzaria ez dago internetera konektatuta edo dynette zerbitzaria ez dago martxan.", "dyndns_registered": "DynDNS domeinua erregistratu da", - "dyndns_registration_failed": "Ezin izan da DynDNS domeinua erregistratu: {error}", + "dyndns_registration_failed": "Ezinezkoa izan da DynDNS domeinua erregistratzea: {error}", "extracting": "Ateratzen…", "diagnosis_ports_unreachable": "{port}. ataka ez dago eskuragarri kanpotik.", "diagnosis_regenconf_manually_modified_details": "Ez dago arazorik zertan ari zaren baldin badakizu! YunoHostek fitxategi hau automatikoki eguneratzeari utziko dio… Baina kontutan izan YunoHosten eguneraketek aldaketa garrantzitsuak izan ditzaketela. Nahi izatekotan, desberdintasunak aztertu ditzakezu yunohost tools regen-conf {category} --dry-run --with-diff komandoa exekutatuz, eta gomendatutako konfiguraziora bueltatu yunohost tools regen-conf {category} --force erabiliz", "experimental_feature": "Adi: Funtzio hau esperimentala eta ezegonkorra da, ez zenuke erabili beharko ez badakizu zertan ari zaren.", - "global_settings_cant_write_settings": "Ezin izan da konfigurazio fitxategia gorde, zergatia: {reason}", + "global_settings_cant_write_settings": "Ezinezkoa izan da konfigurazio fitxategia gordetzea, zergatia: {reason}", "dyndns_domain_not_provided": "{provider} DynDNS enpresak ezin du {domain} domeinua eskaini.", - "firewall_reload_failed": "Ezin izan da suebakia birkargatu", + "firewall_reload_failed": "Ezinezkoa izan da suebakia birkargatzea", "global_settings_setting_security_password_admin_strength": "Administrazio-pasahitzaren segurtasuna", - "hook_name_unknown": "'{name}' \"hook\" izen ezezaguna", - "domain_deletion_failed": "Ezin izan da {domain} ezabatu: {error}", + "hook_name_unknown": "'{name}' 'hook' izen ezezaguna", + "domain_deletion_failed": "Ezinezkoa izan da {domain} ezabatzea: {error}", "global_settings_setting_security_nginx_compatibility": "Bateragarritasun eta segurtasun arteko gatazka NGINX web zerbitzarirako. Zifraketari eragiten dio (eta segurtasunari lotutako beste kontu batzuei)", "log_regen_conf": "Berregin '{}' sistemaren konfigurazioa", - "dpkg_lock_not_available": "Ezin da komando hau une honetan exekutatu beste aplikazio bat dpkg (sistemaren paketeen kudeatzailea) blokeatuta duelako, erabiltzen ari baita", + "dpkg_lock_not_available": "Ezin da komando hau une honetan exekutatu beste aplikazio batek dpkg (sistemaren paketeen kudeatzailea) blokeatuta duelako, erabiltzen ari baita", "group_created": "'{group}' taldea sortu da", "global_settings_setting_security_password_user_strength": "Erabiltzaile-pasahitzaren segurtasuna", - "global_settings_setting_security_experimental_enabled": "Gaitu segurtasun funtzio esperimentlak (ez ezazu egin ez badakizu zertan ari zaren!)", - "good_practices_about_admin_password": "Administrazio-pasahitz berria ezartzear zaude. Pasahitzak zortzi karaktere izan beharko lituzke gutxienez, baina gomendagarria da pasahitz luzeagoa erabiltzea (esaldi bat, esaterako) edota karaktere desberdinak erabiltzea (larriak, txikiak, zenbakiak eta karaktere bereziak).", + "global_settings_setting_security_experimental_enabled": "Gaitu segurtasun funtzio esperimentalak (ez ezazu egin ez badakizu zertan ari zaren!)", + "good_practices_about_admin_password": "Administrazio-pasahitz berria ezartzear zaude. Pasahitzak zortzi karaktere izan beharko lituzke gutxienez, baina gomendagarria da pasahitz luzeagoa erabiltzea (esaldi bat, esaterako) edota karaktere desberdinak erabiltzea (hizki larriak, txikiak, zenbakiak eta karaktere bereziak).", "log_help_to_get_failed_log": "Ezin izan da '{desc}' eragiketa exekutatu. Mesedez, laguntza nahi baduzu partekatu eragiketa honen erregistro osoa 'yunohost log share {name}' komandoa erabiliz", "global_settings_setting_security_webadmin_allowlist_enabled": "Baimendu IP zehatz batzuk bakarrik administrazio-webgunean.", "group_unknown": "'{group}' taldea ezezaguna da", "group_updated": "'{group}' taldea eguneratu da", - "group_update_failed": "Ezin izan da '{group}' taldea eguneratu: {error}", - "diagnosis_rootfstotalspace_warning": "Sistemaren root partizioak {space} baino ez ditu. Agian ez da arazorik egongo, baina kontuz ibili edo memoriarik gabe gera zaitezke laster… Root partizioak gutxienez 16GB erabilgarri izatea da gomendioa.", - "iptables_unavailable": "Ezin dituzu iptaulak hemen aldatu. Edukiontzi bat erabiltzen ari zara edo kernelak ez du aukera hau onartzen", + "group_update_failed": "Ezinezkoa izan da '{group}' taldea eguneratzea: {error}", + "diagnosis_rootfstotalspace_warning": "'root' fitxategi-sistemak {space} baino ez ditu. Agian ez da arazorik egongo, baina kontuz ibili edo memoriarik gabe gera zaitezke laster… 'root' fitxategi-sistemak gutxienez 16GB erabilgarri izatea da gomendioa.", + "iptables_unavailable": "Ezin dituzu iptaulak hemen moldatu; edukiontzi bat erabiltzen ari zara edo kernelak ez du aukera hau onartzen", "log_permission_delete": "Ezabatu '{}' baimena", "group_already_exist": "{group} taldea existitzen da dagoeneko", "group_user_not_in_group": "{user} erabiltzailea ez dago {group} taldean", "diagnosis_mail_fcrdns_nok_alternatives_6": "Operadore batzuek ez dute alderantzizko DNSa konfiguratzen uzten (edo funtzioa ez dabil…). IPv4rako alderantzizko DNSa zuzen konfiguratuta badago, IPv6 desgaitzen saia zaitezke posta elektronikoa bidaltzeko, yunohost settings set smtp.allow_ipv6 -v off exekutatuz. Adi: honek esan nahi du ez zarela gai izango IPv6 bakarrik darabilten zerbitzari apurren posta elektronikoa jasotzeko edo beraiei bidaltzeko.", "diagnosis_sshd_config_inconsistent": "Dirudienez SSH ataka eskuz aldatu da /etc/ssh/sshd_config fitxategian. YunoHost 4.2tik aurrera 'security.ssh.port' izeneko ezarpen orokor bat dago konfigurazioa eskuz aldatzea ekiditeko.", "diagnosis_sshd_config_inconsistent_details": "Mesedez, exekutatu yunohost settings set security.ssh.port -v YOUR_SSH_PORT SSH ataka zehazteko, egiaztatu yunohost tools regen-conf ssh --dry-run --with-diff erabiliz eta yunohost tools regen-conf ssh --force exekutatu gomendatutako konfiguraziora bueltatu nahi baduzu.", - "domain_dns_push_failed_to_authenticate": "Ezin izan da '{domain}' domeinurako APIa erabiliz erregistro-enpresan saioa hastea. Zuzenak al dira datuak? (Errorea: {error})", + "domain_dns_push_failed_to_authenticate": "Ezinezkoa izan da '{domain}' domeinurako APIa erabiliz erregistro-enpresan saioa hastea. Zuzenak al dira datuak? (Errorea: {error})", "domain_dns_pushing": "DNS ezarpenak bidaltzen…", "diagnosis_sshd_config_insecure": "Badirudi SSH konfigurazioa eskuz aldatu dela eta ez da segurua ez duelako 'AllowGroups' edo 'AllowUsers' baldintzarik jartzen fitxategien atzitzea oztopatzeko.", "disk_space_not_sufficient_update": "Ez dago aplikazio hau eguneratzeko nahikoa espaziorik", "domain_cannot_add_xmpp_upload": "Ezin dira 'xmpp-upload.' hasiera duten domeinuak gehitu. Izen mota hau YunoHosten zati den XMPP igoeretarako erabiltzen da.", "domain_cannot_remove_main_add_new_one": "Ezin duzu '{domain}' ezabatu domeinu nagusi eta bakarra delako. Beste domeinu bat gehitu 'yunohost domain add ' exekutatuz, gero erabili 'yunohost domain main-domain -n ' domeinu nagusi bilakatzeko, eta azkenik ezabatu {domain}' domeinua 'yunohost domain remove {domain}' komandoarekin.", - "domain_dns_push_record_failed": "Ezin izan da {type}/{name} ezarpenak {action}: {error}", + "domain_dns_push_record_failed": "Ezinezkoa izan da {type}/{name} ezarpenak {action}: {error}", "domain_dns_push_success": "DNS ezarpenak eguneratu dira!", - "domain_dns_push_failed": "DNS ezarpenen eguneratzeak huts egin du.", - "domain_dns_push_partial_failure": "DNS ezarpenak hala-nola eguneratu dira: abisu/errore batzuk egon dira.", - "global_settings_setting_smtp_relay_host": "YunoHosten ordez posta elektronikoa bidaltzeko SMTP relay helbidea. Erabilgarri izan daiteke egoera hauetan: operadore edo VPS enpresak 25. ataka blokeatzen badute, DUHLn zure etxeko IPa ageri bada, ezin baduzu alderantzizko DNSa ezarri edo zerbitzari hau ez badago zuzenean internetera konektatuta baina posta elektronikoa bidali nahi baduzu.", - "group_deletion_failed": "Ezin izan da '{group}' taldea ezabatu: {error}", + "domain_dns_push_failed": "DNS ezarpenen eguneratzeak kale egin du.", + "domain_dns_push_partial_failure": "DNS ezarpenak hala-nola eguneratu dira: jakinarazpen/errore batzuk egon dira.", + "global_settings_setting_smtp_relay_host": "YunoHosten ordez posta elektronikoa bidaltzeko SMTP relay helbidea. Erabilgarri izan daiteke egoera hauetan: operadore edo VPS enpresak 25. ataka blokeatzen badu, DUHLen zure etxeko IPa ageri bada, ezin baduzu alderantzizko DNSa ezarri edo zerbitzari hau ez badago zuzenean internetera konektatuta baina posta elektronikoa bidali nahi baduzu.", + "group_deletion_failed": "Ezinezkoa izan da '{group}' taldea ezabatzea: {error}", "invalid_number_min": "{min} baino handiagoa izan behar da", "invalid_number_max": "{max} baino txikiagoa izan behar da", "diagnosis_services_bad_status": "{service} zerbitzua {status} dago :(", - "diagnosis_ports_needed_by": "{category} funtzioetarako ezinbestekoa da ataka hau eskuragarri egotea (zerbitzua {service})", + "diagnosis_ports_needed_by": "{category} funtzioetarako ezinbestekoa da ataka hau eskuragarri egotea ({service} zerbitzua)", "diagnosis_package_installed_from_sury": "Sistemaren pakete batzuen lehenagoko bertsioak beharko lirateke", "global_settings_setting_smtp_relay_password": "SMTP relay helbideko pasahitza", "global_settings_setting_smtp_relay_port": "SMTP relay ataka", @@ -332,14 +332,14 @@ "domain_registrar_is_not_configured": "Oraindik ez da {domain} domeinurako erregistro-enpresa ezarri.", "domain_dns_push_not_applicable": "Ezin da {domain} domeinurako DNS konfigurazio automatiko funtzioa erabili. DNS erregistroak eskuz ezarri beharko zenituzke gidaorriei erreparatuz: https://yunohost.org/dns_config.", "domain_dns_push_managed_in_parent_domain": "DNS ezarpenak automatikoki konfiguratzeko funtzioa {parent_domain} domeinu nagusian kudeatzen da.", - "domain_dns_registrar_managed_in_parent_domain": "Domeinu hau {parent_domain_link} (r)en azpidomeinua da. DNS ezarpenak {parent_domain}(r)en konfigurazio atalean kudeatu beharko lirateke.", + "domain_dns_registrar_managed_in_parent_domain": "Domeinu hau {parent_domain_link} (r)en azpidomeinua da. DNS ezarpenak {parent_domain}(r)en konfigurazio atalean kudeatu behar dira.", "domain_dns_registrar_yunohost": "Hau nohost.me / nohost.st / ynh.fr domeinu bat da eta, beraz, DNS ezarpenak automatikoki kudeatzen ditu YunoHostek, bestelako ezer konfiguratu beharrik gabe. (ikus 'yunohost dyndns update' komandoa)", - "domain_dns_registrar_not_supported": "YunoHostek ezin izan du automatikoki erregistro-enpresa antzeman domeinu honetarako. Eskuz konfiguratu beharko zenituzke DNS ezarpenak gidalerroei erreparatuz: https://yunohost.org/dns.", - "domain_dns_registrar_experimental": "Momentuz, YunoHosten kideek ez dute **{registrar}** erregistro-enpresaren APIa nahi beste probatu eta aztertu. Funtzioa **oso esperimentala** da - kontuz!", + "domain_dns_registrar_not_supported": "YunoHostek ezin izan du domeinu honen erregistro-enpresa automatikoki antzeman. Eskuz konfiguratu beharko dituzu DNS ezarpenak gidalerroei erreparatuz: https://yunohost.org/dns.", + "domain_dns_registrar_experimental": "Oraingoz, YunoHosten kideek ez dute **{registrar}** erregistro-enpresaren APIa nahi beste probatu eta aztertu. Funtzioa **oso esperimentala** da — kontuz!", "domain_config_mail_in": "Jasotako mezuak", - "domain_config_auth_token": "Token egiaztagiria", - "domain_config_auth_key": "Egiaztapen gakoa", - "domain_config_auth_secret": "Egiaztagiriaren \"secret\"a", + "domain_config_auth_token": "Token autentifikazioa", + "domain_config_auth_key": "Autentifikazio gakoa", + "domain_config_auth_secret": "Autentifikazioaren \"secret\"a", "domain_config_api_protocol": "API protokoloa", "domain_config_auth_entrypoint": "APIaren sarrera", "domain_config_auth_application_key": "Aplikazioaren gakoa", @@ -347,39 +347,39 @@ "domain_config_auth_consumer_key": "Erabiltzailearen gakoa", "global_settings_setting_smtp_allow_ipv6": "Baimendu IPv6 posta elektronikoa jaso eta bidaltzeko", "group_cannot_be_deleted": "{group} taldea ezin da eskuz ezabatu.", - "log_domain_config_set": "Aldatu '{}' domeinuko konfigurazioa", + "log_domain_config_set": "Aldatu '{}' domeinuko ezarpenak", "log_domain_dns_push": "Bidali '{}' domeinuaren DNS ezarpenak", "log_tools_migrations_migrate_forward": "Exekutatu migrazioak", "log_tools_postinstall": "Abiarazi YunoHost zerbitzariaren instalazio ondorengo prozesua", - "diagnosis_mail_fcrdns_nok_alternatives_4": "Operadore batzuek ez dute alderantzizko DNSa konfiguratzen uzten (edo funtzioa ez dabil…). Hau dela-eta arazoak badituzu, irtenbide batzuk eduki ditzakezu:
- Operadora batzuek relay posta zerbitzari bat eskaini dezakete, baina kasu horretan zure posta elektronikoa zelatatu dezakete.
- Pribatutasuna bermatzeko *IP publiko bat duen* VPN bat erabiltzea izan daiteke irtenbidea. Ikus https://yunohost.org/#/vpn_advantage
- Edo operadore desberdin batera aldatu", - "domain_dns_registrar_supported": "YunoHostek automatikoki antzeman du domeinu hau **{registrar}** erregistro-enpresak kudeatzen duela. Nahi baduzu YunoHostek automatikoki konfiguratu ditzake DNS ezarpenak, API egiaztagiri aproposak zehazten badituzu. API egiaztagiriak non lortzeko dokumentazioa orri honetan duzu: https://yunohost.org/registar_api_{registrar}. (Baduzu DNS erregistroak eskuz konfiguratzeko aukera ere, gidalerro hauetan ageri den bezala: https://yunohost.org/dns)", - "domain_dns_push_failed_to_list": "Ezin izan da APIa erabiliz oraingo erregistroak antzematea: {error}", + "diagnosis_mail_fcrdns_nok_alternatives_4": "Operadore batzuek ez dute alderantzizko DNSa konfiguratzen uzten (edo funtzioa ez dabil…). Hau dela-eta arazoak badituzu, irtenbide batzuk eduki ditzakezu:
- Operadore batzuek relay posta zerbitzari bat eskaini dezakete, baina kasu horretan zure posta elektronikoa zelatatu dezakete.
- Pribatutasuna bermatzeko *IP publiko bat duen* VPN bat erabiltzea izan daiteke irtenbidea. Ikus https://yunohost.org/#/vpn_advantage
- Edo operadore desberdin batera aldatu", + "domain_dns_registrar_supported": "YunoHostek automatikoki antzeman du domeinu hau **{registrar}** erregistro-enpresak kudeatzen duela. Nahi baduzu YunoHostek automatikoki konfiguratu ditzake DNS ezarpenak, API egiaztagiri zuzenak zehazten badituzu. API egiaztagiriak non lortzeko dokumentazioa orri honetan duzu: https://yunohost.org/registar_api_{registrar}. (Baduzu DNS erregistroak eskuz konfiguratzeko aukera ere, gidalerro hauetan ageri den bezala: https://yunohost.org/dns)", + "domain_dns_push_failed_to_list": "Ezinezkoa izan da APIa erabiliz oraingo erregistroak antzematea: {error}", "domain_dns_push_already_up_to_date": "Ezarpenak egunean daude, ez dago zereginik.", - "domain_config_features_disclaimer": "Oraingoz, posta elektronikoa edo XMPP funtzioak gaitu/desgaitzeak, DNS ezarpenei soilik eragiten die, ez sistemaren konfigurazioari!", + "domain_config_features_disclaimer": "Oraingoz, posta elektronikoa edo XMPP funtzioak gaitu/desgaitzeak DNS ezarpenei soilik eragiten die, ez sistemaren konfigurazioari!", "domain_config_mail_out": "Bidalitako mezuak", "domain_config_xmpp": "Bat-bateko mezularitza (XMPP)", "global_settings_bad_choice_for_enum": "{setting} ezarpenerako aukera okerra. '{choice}' ezarri da baina hauek dira aukerak: {available_choices}", "global_settings_setting_security_postfix_compatibility": "Bateragarritasun eta segurtasun arteko gatazka Postfix zerbitzarirako. Zifraketari eragiten dio (eta segurtasunari lotutako beste kontu batzuei)", "global_settings_setting_security_ssh_compatibility": "Bateragarritasun eta segurtasun arteko gatazka SSH zerbitzarirako. Zifraketari eragiten dio (eta segurtasunari lotutako beste kontu batzuei)", - "good_practices_about_user_password": "Erabiltzaile-pasahitz berria ezartzear zaude. Pasahitzak zortzi karaktere izan beharko lituzke gutxienez, baina gomendagarria da pasahitz luzeagoa erabiltzea (esaldi bat, esaterako) edota karaktere desberdinak erabiltzea (larriak, txikiak, zenbakiak eta karaktere bereziak).", - "group_cannot_edit_all_users": "'all_users' taldea ezin da eskuz aldatu. YunoHosten izena emanda dauden erabiltzaile guztiak barne dituen talde berezia da", + "good_practices_about_user_password": "Erabiltzaile-pasahitz berria ezartzear zaude. Pasahitzak zortzi karaktere izan beharko lituzke gutxienez, baina gomendagarria da pasahitz luzeagoa erabiltzea (esaldi bat, esaterako) edota karaktere desberdinak erabiltzea (hizki larriak, txikiak, zenbakiak eta karaktere bereziak).", + "group_cannot_edit_all_users": "'all_users' taldea ezin da eskuz moldatu. YunoHosten izena emanda dauden erabiltzaile guztiak barne dituen talde berezia da", "invalid_number": "Zenbaki bat izan behar da", "ldap_attribute_already_exists": "'{attribute}' LDAP funtzioa existitzen da dagoeneko eta '{value}' balioa dauka", "log_app_change_url": "'{}' aplikazioaren URLa aldatu", - "log_app_config_set": "Ezarri '{}' aplikazioako konfigurazioa", + "log_app_config_set": "Ezarri '{}' aplikazioko konfigurazioa", "downloading": "Deskargatzen…", - "dyndns_could_not_check_provide": "Ezin izan da egiaztatu {provider}(e)k {domain} eskaini dezakenik.", + "dyndns_could_not_check_provide": "Ezinezkoa izan da {provider}(e)k {domain} eskaini dezakeen egiaztatzea.", "log_available_on_yunopaste": "Erregistroa {url} estekan ikus daiteke", - "log_dyndns_update": "Eguneratu YunoHosten '{}' domeinuarekin lotutako IP helbidea", + "log_dyndns_update": "Eguneratu YunoHosten '{}' domeinuari lotutako IP helbidea", "log_letsencrypt_cert_install": "Instalatu Let's Encrypt ziurtagiria '{}' domeinurako", "log_selfsigned_cert_install": "Instalatu '{}' domeinurako norberak sinatutako ziurtagiria", "diagnosis_mail_ehlo_wrong": "Zurea ez den SMTP posta zerbitzari batek erantzun du IPv{ipversion}an. Litekeena da zure zerbitzariak posta elektronikorik jaso ezin izatea.", "log_tools_upgrade": "Eguneratu sistemaren paketeak", "log_tools_reboot": "Berrabiarazi zerbitzaria", - "diagnosis_mail_queue_unavailable": "Ezin da kontsultatu zenbat posta elektroniko dauden ilaran", + "diagnosis_mail_queue_unavailable": "Ezinezkoa da ilaran zenbat posta elektroniko dauden kontsultatzea", "log_user_create": "Gehitu '{}' erabiltzailea", - "group_cannot_edit_visitors": "'bisitariak' taldea ezin da eskuz aldatu. Saiorik hasi gabeko bisitariak barne hartzen dituen talde berezia da", - "diagnosis_ram_verylow": "Sistemak RAM memoriaren {available} ({available_percent}%) dauka bakarrik! ({total} orotara)", + "group_cannot_edit_visitors": "'bisitariak' taldea ezin da eskuz moldatu. Saiorik hasi gabeko bisitariak barne hartzen dituen talde berezia da", + "diagnosis_ram_verylow": "Sistemak RAM memoriaren {available} ({available_percent}%) dauka bakarrik erabilgarri! ({total} orotara)", "diagnosis_ram_low": "Sistemak {available} soilik du erabilgarri, RAM memoriaren ({available_percent}%) ({total} orotara). Kontuz ibili.", "diagnosis_ram_ok": "Sistemak oraindik dauka RAM memoriaren {available} ({available_percent}%) erabilgarri, {total} orotara.", "diagnosis_swap_none": "Sistemak ez du swap-ik. Gutxienez {recommended} gehitzen saiatu beharko zinateke, sistema memoriarik gabe gera ez dadin.", @@ -387,9 +387,9 @@ "diagnosis_regenconf_allgood": "Konfigurazio fitxategi guztiak bat datoz gomendatutako ezarpenekin!", "diagnosis_regenconf_manually_modified": "Dirudienez {file} konfigurazio fitxategia eskuz aldatu da.", "diagnosis_security_vulnerable_to_meltdown": "Badirudi Meltdown izeneko segurtasun arazo larriak eragin diezazukela", - "diagnosis_ports_could_not_diagnose": "Ezin izan da egiaztatu atakak IPv{ipversion} erabiliz kanpotik eskuragarri daudenik.", + "diagnosis_ports_could_not_diagnose": "Ezinezkoa izan da atakak IPv{ipversion} erabiliz kanpotik eskuragarri dauden egiaztatzea.", "diagnosis_ports_ok": "{port}. ataka eskuragarri dago kanpotik.", - "diagnosis_unknown_categories": "Honako kategoriak ez dira ezagutzen: {categories}", + "diagnosis_unknown_categories": "Honako atalak ez dira ezagutzen: {categories}", "diagnosis_services_running": "{service} zerbitzua martxan dago!", "log_app_action_run": "'{}' aplikazioaren eragiketa exekutatu", "diagnosis_never_ran_yet": "Badirudi zerbitzari hau duela gutxi konfiguratu dela eta oraindik ez dago erakusteko diagnostikorik. Diagnostiko osoa abiarazi beharko zenuke, administrazio-webgunetik edo 'yunohost diagnosis run' komandoa exekutatuz.", @@ -400,65 +400,65 @@ "diagnosis_mail_fcrdns_different_from_ehlo_domain_details": "Oraingo alderantzizko DNSa: {rdns_domain}
Esperotako balioa: {ehlo_domain}", "diagnosis_mail_queue_too_big": "Mezu gehiegi posta elektronikoaren ilaran: ({nb_pending} mezu)", "diagnosis_ports_could_not_diagnose_details": "Errorea: {error}", - "diagnosis_swap_tip": "Mesedez, kontutan hartu zerbitzari honen swap memoria SD edo SSD euskarri batean gordetzen dela, euskarri horien bizi-iraupena izugarri laburtu dezakeela.", - "invalid_regex": "\"Regexa\" ez da baliogarria: '{regex}'", - "group_creation_failed": "Ezin izan da '{group}' taldea sortu: {error}", + "diagnosis_swap_tip": "Mesedez, kontutan hartu zerbitzari honen swap memoria SD edo SSD euskarri batean gordetzen bada, euskarri horren bizi-iraupena izugarri laburtu dezakeela.", + "invalid_regex": "'Regexa' ez da zuzena: '{regex}'", + "group_creation_failed": "Ezinezkoa izan da '{group}' taldea sortzea: {error}", "log_user_permission_reset": "Berrezarri '{}' baimena", - "group_cannot_edit_primary_group": "'{group}' taldea ezin da eskuz aldatu. Erabiltzaile zehatz bakar bat duen talde nagusia da.", + "group_cannot_edit_primary_group": "'{group}' taldea ezin da eskuz moldatu. Erabiltzaile zehatz bakar bat duen talde nagusia da.", "diagnosis_swap_notsomuch": "Sistemak {total} swap baino ez du. Gutxienez {recommended} gehitzen saiatu beharko zinateke sistema memoriarik gabe gera ez dadin.", - "diagnosis_security_vulnerable_to_meltdown_details": "Arazoa konpontzeko, sistema eguneratu eta berrabiarazi beharko zenuke linux-en kernel berriagoa erabiltzeko (edo zerbitzariaren arduradunarekin jarri harremanetan. Ikus https://meltdownattack.com/ informazio gehiagorako.", + "diagnosis_security_vulnerable_to_meltdown_details": "Arazoa konpontzeko, sistema eguneratu eta berrabiarazi beharko zenuke linux-en kernel berriagoa erabiltzeko (edo zerbitzariaren arduradunarekin jarri harremanetan). Ikus https://meltdownattack.com/ argibide gehiagorako.", "diagnosis_services_conf_broken": "{service} zerbitzuko konfigurazioa hondatuta dago!", "diagnosis_services_bad_status_tip": "Zerbitzua berrabiarazten saia zaitezke eta nahikoa ez bada, aztertu zerbitzuaren erregistroa administrariaren webgunean. (komandoak nahiago badituzu yunohost service restart {service} eta yunohost service log {service} hurrenez hurren).", - "diagnosis_mail_ehlo_unreachable_details": "Ezin izan da zure zerbitzariko 25. atakari konektatu IPv{ipversion} erabiliz. Badirudi ez dagoela eskuragarri.
1. Arazo honen zergati ohikoena 25. ataka egoki birbidalita ez egotea da.
2. Egiaztatu postfix zerbitzua martxan dagoela.
3. Konfigurazio konplexuagoetan: egiaztatu suebaki edo reverse-proxyak konexioa oztopatzen ez dutela.", + "diagnosis_mail_ehlo_unreachable_details": "Ezinezkoa izan da zure zerbitzariko 25. atakari konektatzea IPv{ipversion} erabiliz. Badirudi ez dagoela eskuragarri.
1. Arazo honen zergati ohikoena 25. ataka egoki birbideratuta ez egotea da.
2. Egiaztatu postfix zerbitzua martxan dagoela.
3. Konfigurazio konplexuagoetan: egiaztatu suebaki edo reverse-proxyak konexioa oztopatzen ez dutela.", "group_already_exist_on_system_but_removing_it": "{group} taldea existitzen da sistemaren taldeetan, baina YunoHostek ezabatuko du…", "diagnosis_mail_fcrdns_nok_details": "Lehenik eta behin zure routerraren konfigurazio gunean edo hostingaren enprearen aukeretan alderantzizko DNSa konfiguratzen saiatu beharko zinateke {ehlo_domain} erabiliz. (Hosting enpresaren arabera, ezinbestekoa da beraiekin harremanetan jartzea).", "diagnosis_mail_outgoing_port_25_ok": "SMTP posta zerbitzaria posta elektronikoa bidaltzeko gai da (25. atakaren irteera ez dago blokeatuta).", "diagnosis_ports_partially_unreachable": "{port}. ataka ez dago eskuragarri kanpotik Pv{failed} erabiliz.", - "diagnosis_ports_forwarding_tip": "Arazoa konpontzeko, litekeena da operadorearen routerrean ataken birbidalketa konfiguratu behar izatea, https://yunohost.org/isp_box_config-n agertzen den bezala", - "domain_creation_failed": "Ezin izan da {domain} domeinua sortu: {error}", + "diagnosis_ports_forwarding_tip": "Arazoa konpontzeko, litekeena da operadorearen routerrean ataken birbideraketa konfiguratu behar izatea, https://yunohost.org/isp_box_config-n agertzen den bezala", + "domain_creation_failed": "Ezinezkoa izan da {domain} domeinua sortzea: {error}", "domains_available": "Erabilgarri dauden domeinuak:", "global_settings_setting_pop3_enabled": "Gaitu POP3 protokoloa posta zerbitzarirako", "global_settings_setting_security_ssh_port": "SSH ataka", "global_settings_unknown_type": "Gertaera ezezaguna, {setting} ezarpenak {unknown_type} mota duela dirudi baina mota hori ez da sistemarekin bateragarria.", - "group_already_exist_on_system": "{group} taldea existitzen da sistemaren taldeetan dagoeneko", - "diagnosis_processes_killed_by_oom_reaper": "Memoria agortu eta sistemak prozesu batzuk amaituarazi behar izan ditu. Honek esan. nahi du sistemak ez duela memoria nahikoa edo prozesuren batek memoria gehiegi behar duela. Amaituarazi d(ir)en prozesua(k):\n{kills_summary}", + "group_already_exist_on_system": "{group} taldea existitzen da dagoeneko sistemaren taldeetan", + "diagnosis_processes_killed_by_oom_reaper": "Memoria agortu eta sistemak prozesu batzuk amaituarazi behar izan ditu. Honek esan nahi du sistemak ez duela memoria nahikoa edo prozesuren batek memoria gehiegi behar duela. Amaituarazi d(ir)en prozesua(k):\n{kills_summary}", "hook_exec_not_terminated": "Aginduak ez du behar bezala amaitu: {path}", - "log_corrupted_md_file": "Erregistroei lotutako YAML metadatu fitxategia hondatuta dago: '{md_file}\nErrorea: {error}'", + "log_corrupted_md_file": "Erregistroei lotutako YAML metadatu fitxategia kaltetuta dago: '{md_file}\nErrorea: {error}'", "log_letsencrypt_cert_renew": "Berriztu '{}' Let's Encrypt ziurtagiria", "log_remove_on_failed_restore": "Ezabatu '{}' babeskopia baten lehengoratzeak huts egin eta gero", "diagnosis_package_installed_from_sury_details": "Sury izena duen kanpoko biltegi batetik instalatu dira pakete batzuk, nahi gabe. YunoHosten taldeak hobekuntzak egin ditu pakete hauek kudeatzeko, baina litekeena da PHP7.3 aplikazioak Stretch sistema eragilean instalatu zituzten kasu batzuetan arazoak sortzea. Egoera hau konpontzeko, honako komando hau exekutatu beharko zenuke: {cmd_to_fix}", "log_help_to_get_log": "'{desc}' eragiketaren erregistroa ikusteko, exekutatu 'yunohost log show {name}'", - "dpkg_is_broken": "Ezin duzu une honetan agin dpkg/APT (sistemaren pakateen kudeatzaileak) hondatutako itxura dutelako… Arazoa konpontzeko SSH bidez konektatzen saia zaitezke eta ondoren exekutatu 'sudo apt install --fix-broken' edota 'sudo dpkg --configure -a'.", + "dpkg_is_broken": "Ezin duzu une honetan egin dpkg/APT (sistemaren pakateen kudeatzaileak) hondatutako itxura dutelako… Arazoa konpontzeko SSH bidez konektatzen saia zaitezke eta ondoren exekutatu 'sudo apt install --fix-broken' edota 'sudo dpkg --configure -a'.", "domain_cannot_remove_main": "Ezin duzu '{domain}' ezabatu domeinu nagusia delako. Beste domeinu bat ezarri beharko duzu nagusi bezala 'yunohost domain main-domain -n ' erabiliz; honako hauek dituzu aukeran: {other_domains}", "domain_created": "Sortu da domeinua", - "domain_dyndns_already_subscribed": "Dagoeneko izena eman duzu DunDNS domeinu batean", - "domain_hostname_failed": "Ezin izan da hostname berria ezarri. Honek arazoak ekar litzake etorkizunean (litekeena da ondo egotea).", + "domain_dyndns_already_subscribed": "Dagoeneko izena eman duzu DynDNS domeinu batean", + "domain_hostname_failed": "Ezinezkoa izan da hostname berria ezartzea. Honek arazoak ekar litzake etorkizunean (litekeena da ondo egotea).", "domain_uninstall_app_first": "Honako aplikazio hauek domeinuan instalatuta daude:\n{apps}\n\nMesedez, desinstalatu 'yunohost app remove the_app_id' ezekutatuz edo alda itzazu beste domeinu batera 'yunohost app change-url the_app_id' erabiliz domeinua ezabatu baino lehen", "file_does_not_exist": "{path} fitxategia ez da existitzen.", "firewall_rules_cmd_failed": "Suebakiko arau batzuen exekuzioak huts egin du. Informazio gehiago erregistroetan.", "log_app_remove": "Ezabatu '{}' aplikazioa", - "global_settings_cant_open_settings": "Ezin izan da konfigurazio fitxategia ireki, zergatia: {reason}", + "global_settings_cant_open_settings": "Ezinezkoa izan da konfigurazio fitxategia irekitzea, zergatia: {reason}", "global_settings_reset_success": "Lehengo ezarpenak {path}-n gorde dira", "global_settings_unknown_setting_from_settings_file": "Gako ezezaguna ezarpenetan: '{setting_key}', baztertu eta gorde ezazu hemen: /etc/yunohost/settings-unknown.json", "domain_remove_confirm_apps_removal": "Domeinu hau ezabatzean aplikazio hauek desinstalatuko dira:\n{apps}\n\nZiur al zaude? [{answers}]", "global_settings_setting_service_ssh_allow_deprecated_dsa_hostkey": "Baimendu DSA gakoa (zaharkitua) SSH zerbitzuaren konfiguraziorako", - "hook_list_by_invalid": "Aukera hau ezin da erabili \"hook\"ak zerrendatzeko", + "hook_list_by_invalid": "Aukera hau ezin da 'hook'ak zerrendatzeko erabili", "installation_complete": "Instalazioa amaitu da", - "hook_exec_failed": "Ezin izan da agindua exekutatu: {path}", + "hook_exec_failed": "Ezinezkoa izan da agindua exekutatzea: {path}", "hook_json_return_error": "Ezin izan da {path} aginduaren erantzuna irakurri. Errorea: {msg}. Jatorrizko edukia: {raw_content}", - "ip6tables_unavailable": "Ezin dituzu ip6taulak hemen aldatu. Edukiontzi bat erabiltzen ari zara edo kernelak ez du aukera hau onartzen", + "ip6tables_unavailable": "Ezin dituzu ip6taulak hemen moldatu; edukiontzi bat erabiltzen ari zara edo kernelak ez du aukera hau onartzen", "log_link_to_log": "Eragiketa honen erregistro osoa: '{desc}'", "log_operation_unit_unclosed_properly": "Eragiketa ez da modu egokian itxi", "log_backup_restore_app": "Lehengoratu '{}' babeskopia fitxategi bat erabiliz", "log_remove_on_failed_install": "Ezabatu '{}' instalazioak huts egin ondoren", "log_domain_add": "Gehitu '{}' domeinua sistemaren konfiguraziora", "log_dyndns_subscribe": "Eman izena YunoHosten '{}' azpidomeinuan", - "diagnosis_no_cache": "Oraindik ez dago '{category}' kategoriarako diagnostikoaren cacherik", + "diagnosis_no_cache": "Oraindik ez dago '{category}' atalerako diagnostikoaren cacherik", "diagnosis_mail_queue_ok": "Posta elektronikoaren ilaran zain dauden mezuak: {nb_pending}", "global_settings_setting_smtp_relay_user": "SMTP relay erabiltzailea", "domain_cert_gen_failed": "Ezinezkoa izan da ziurtagiria sortzea", "field_invalid": "'{}' ez da baliogarria", - "diagnosis_mail_outgoing_port_25_blocked_relay_vpn": "Operadore batzuei bost axola zaie internetaren neutraltasuna (Net Neutrality) eta ez dute 25. ataka desblokeatzen uzten.
- Operadora batzuek relay posta zerbitzari bat eskaini dezakete, baina kasu horretan zure posta elektronikoa zelatatu dezakete.
- Pribatutasuna bermatzeko *IP publiko bat duen* VPN bat erabiltzea izan daiteke irtenbidea. Ikus https://yunohost.org/#/vpn_advantage
- Edo operadore desberdin batera aldatu", + "diagnosis_mail_outgoing_port_25_blocked_relay_vpn": "Operadore batzuei bost axola zaie internetaren neutraltasuna (Net Neutrality) eta ez dute 25. ataka desblokeatzen uzten.
- Operadore batzuek relay posta zerbitzari bat eskaini dezakete, baina kasu horretan zure posta elektronikoa zelatatu dezakete.
- Pribatutasuna bermatzeko *IP publiko bat duen* VPN bat erabiltzea izan daiteke irtenbidea. Ikus https://yunohost.org/#/vpn_advantage
- Edo operadore desberdin batera aldatu", "ldap_server_down": "Ezin izan da LDAP zerbitzarira konektatu", "ldap_server_is_down_restart_it": "LDAP zerbitzaria ez dago martxan, saia zaitez berrabiarazten…", "log_app_upgrade": "'{}' aplikazioa eguneratu", @@ -470,15 +470,15 @@ "diagnosis_mail_fcrdns_dns_missing": "Ez da alderantzizko DNSrik ezarri IPv{ipversion}rako. Litekeena da posta elektroniko batzuk hartzaileak jaso ezin izatea edo spam modura etiketatuak izatea.", "log_backup_create": "Sortu babeskopia fitxategia", "global_settings_setting_backup_compress_tar_archives": "Babeskopia berriak sortzean, konprimitu fitxategiak (.tar.gz) konprimitu gabeko fitxategien (.tar) ordez. Aukera hau gaitzean babeskopiek espazio gutxiago beharko dute, baina hasierako prozesua luzeagoa izango da eta CPUari lan handiagoa eragingo dio.", - "global_settings_setting_security_webadmin_allowlist": "Administrazio-webgunea bisita ditzaketen IP helbideak. Koma bidez bereiziak.", - "global_settings_key_doesnt_exists": "'{settings_key}' gakoa ez da existitzen konfigurazio orokorrean, erabilgarri dauden gakoak ikus ditzakezu 'yunohost settings list' exekutatuz", + "global_settings_setting_security_webadmin_allowlist": "Administrazio-webgunea bisita ditzaketen IP helbideak, koma bidez bereiziak.", + "global_settings_key_doesnt_exists": "'{settings_key}' gakoa ez da existitzen konfigurazio orokorrean; erabilgarri dauden gakoak ikus ditzakezu 'yunohost settings list' exekutatuz", "global_settings_setting_ssowat_panel_overlay_enabled": "Gaitu SSOwat paneleko \"overlay\"a", "log_backup_restore_system": "Lehengoratu sistema babeskopia fitxategi batetik", - "log_domain_remove": "Ezabatu '{}' domeinua sistemaren konfiguraziotik", - "log_link_to_failed_log": "Ezin izan da '{desc}' eragiketa exekutatu. Mesedez, laguntza nahi izanez gero, elkarbanatu erakigeta honen erregistro osoa hemen sakatuz", + "log_domain_remove": "Ezabatu '{}' domeinua sistemaren ezarpenetatik", + "log_link_to_failed_log": "Ezinezkoa izan da '{desc}' eragiketa exekutatzea. Mesedez, laguntza nahi izanez gero, partekatu erakigeta honen erregistro osoa hemen sakatuz", "log_permission_url": "Eguneratu '{}' baimenari lotutako URLa", "log_user_group_create": "Sortu '{}' taldea", - "permission_creation_failed": "Ezin izan da '{permission}' baimena sortu: {error}", + "permission_creation_failed": "Ezinezkoa izan da '{permission}' baimena sortzea: {error}", "permission_not_found": "Ez da '{permission}' baimena aurkitu", "pattern_lastname": "Abizen horrek ez du balio", "permission_deleted": "'{permission}' baimena ezabatu da", @@ -487,10 +487,10 @@ "tools_upgrade_special_packages_completed": "YunoHosten paketeak eguneratu dira.\nSakatu [Enter] komando-lerrora bueltatzeko", "unexpected_error": "Ezusteko zerbaitek huts egin du: {error}", "updating_apt_cache": "Sistemaren paketeen eguneraketak eskuratzen…", - "mail_forward_remove_failed": "Ezin izan da '{mail}' posta elektronikoko birbidalketa ezabatu", + "mail_forward_remove_failed": "Ezinezkoa izan da '{mail}' posta elektronikoko birbidalketa ezabatzea", "migration_description_0020_ssh_sftp_permissions": "Gehitu SSH eta SFTP baimenak", - "migration_ldap_migration_failed_trying_to_rollback": "Ezin izan da migratu… sistema lehengoratzen saiatzen.", - "migrations_exclusive_options": "'--auto', '--skip', and '--force-rerun' aukerek batak bestea baztertzen du.", + "migration_ldap_migration_failed_trying_to_rollback": "Ezinezkoa izan da migratzea… sistema lehengoratzen saiatzen.", + "migrations_exclusive_options": "'--auto', '--skip', eta '--force-rerun' aukerek batak bestea baztertzen du.", "migrations_running_forward": "{id} migrazioa exekutatzen…", "regenconf_dry_pending_applying": "'{category}' atalari dagokion konfigurazioa egiaztatzen…", "regenconf_file_backed_up": "'{conf} konfigurazio fitxategia '{backup}' babeskopian kopiatu da", @@ -498,18 +498,18 @@ "regenconf_file_updated": "'{conf}' konfigurazio fitxategia eguneratu da", "regenconf_updated": "'{category}' atalerako ezarpenak eguneratu dira", "service_started": "'{service}' zerbitzua abiarazi da", - "show_tile_cant_be_enabled_for_regex": "Ezin duzu 'show_tile' gaitu une honetan, '{permission}' baimenerako URLa regez delako", + "show_tile_cant_be_enabled_for_regex": "Ezin duzu 'show_tile' gaitu une honetan, '{permission}' baimenerako URLa regex delako", "unknown_main_domain_path": "{app} aplikaziorako domeinu edo bide ezezaguna. Domeinua eta bidea zehaztu behar dituzu baimena emateko URLa ahalbidetzeko.", "user_import_partial_failed": "Erabiltzaileak inportatzeko eragiketak erdizka huts egin du", "user_import_success": "Erabiltzaileak arazorik gabe inportatu dira", "yunohost_already_installed": "YunoHost instalatuta dago dagoeneko", "migration_0015_not_stretch": "Debianen oraingo bertsioa ez da Stretch!", "migrations_success_forward": "{id} migrazioak amaitu du", - "migrations_to_be_ran_manually": "{id} migrazioa eskuz abiarazi behar da. Mesedez, joan Erramintak → Migrazioak atalera administratzeko webgunean edo bestela exekutatu 'yunohost tools migrations run'.", - "permission_currently_allowed_for_all_users": "Baimen hau erabiltzaile guztiei esleitzen zaie eta baita beste talde batzuei ere. Litekeena da 'all users' baimena edo eslaituta duten taldeei baimena kendu nahi izatea.", - "permission_require_account": "'{permission}' baimenak zentzua du zerbitzarian kontua duten erabiltzaileentzat eta beraz ezin da gaitu bisitarientzat.", - "postinstall_low_rootfsspace": "root direktorioak 10 GB edo espazio gutxiago dauka, kezkatzekoa dena! Litekeena da espaziorik gabe geratzea aurki! Gomendagarria da root direktorioan gutxienez 16 GB libre izatea. Abisu honen ondoren YunoHost instalatzen jarraitu nahi baduzu, berrabiarazi agindua '--force-diskspace' gehituz", - "this_action_broke_dpkg": "Eragiketa honek dpkg/APT (sistemaren pakete kudeatzaileak) apurtu ditu… Arazoa konpontzeko SSH bidez konektatu eta 'sudo apt install --fix-broken' edota 'sudo dpkg --configure -a' exekutatu dezakezu.", + "migrations_to_be_ran_manually": "{id} migrazioa eskuz abiarazi behar da. Mesedez, joan Erramintak → Migrazioak atalera administrazio-webgunean edo bestela exekutatu 'yunohost tools migrations run'.", + "permission_currently_allowed_for_all_users": "Baimen hau erabiltzaile guztiei esleitzen zaio eta baita beste talde batzuei ere. Litekeena da 'all users' baimena edo esleituta duten taldeei baimena kendu nahi izatea.", + "permission_require_account": "'{permission}' baimena zerbitzarian kontua duten erabiltzaileentzat da eta, beraz, ezin da gaitu bisitarientzat.", + "postinstall_low_rootfsspace": "'root' fitxategi-sistemak 10 GB edo espazio gutxiago dauka, kezkatzekoa dena! Litekeena da espaziorik gabe geratzea aurki! Gomendagarria da 'root' fitxategi-sistemak gutxienez 16 GB libre izatea. Jakinarazpen honen ondoren YunoHost instalatzen jarraitu nahi baduzu, berrabiarazi agindua '--force-diskspace' gehituz", + "this_action_broke_dpkg": "Eragiketa honek dpkg/APT (sistemaren pakete kudeatzaileak) kaltetu ditu… Arazoa konpontzeko SSH bidez konektatu eta 'sudo apt install --fix-broken' edota 'sudo dpkg --configure -a' exekutatu dezakezu.", "tools_upgrade_special_packages_explanation": "Eguneraketa bereziak atzeko planoan jarraituko du. Mesedez, ez abiarazi bestelako eragiketarik datozen ~10 minutuetan (zure hardwarearen abiaduraren arabera). Honen ondoren litekeena da saioa berriro hasi behar izatea. Eguneraketaren erregistroa Erramintak → Erregistroak (administrazio-webgunean) edo 'yunohost log list' komandoa erabiliz egongo da ikusgai.", "user_import_bad_line": "{line} lerro okerra: {details}", "restore_complete": "Lehengoratzea amaitu da", @@ -534,7 +534,7 @@ "update_apt_cache_warning": "Zerbaitek huts egin du APT Debian-en pakete kudeatzailearen cachea eguneratzean. Hemen dituzu sources.list fitxategiaren lerroak, arazoa identifikatzeko baliagarria izan dezakezuna:\n{sourceslist}", "user_created": "Erabiltzailea sortu da", "user_deletion_failed": "Ezin izan da '{user}' ezabatu: {error}", - "permission_updated": "'{permission}' baimena aldatu da", + "permission_updated": "'{permission}' baimena moldatu da", "ssowat_conf_generated": "SSOwat ezarpenak berregin dira", "system_upgraded": "Sistema eguneratu da", "upnp_port_open_failed": "Ezin izan da UPnP bidez ataka zabaldu", @@ -543,13 +543,13 @@ "main_domain_changed": "Domeinu nagusia aldatu da", "migrations_already_ran": "Honako migrazio hauek amaitu dute dagoeneko: {ids}", "yunohost_installing": "YunoHost instalatzen…", - "migrations_failed_to_load_migration": "Ezin izan da {id} migrazioa kargatu: {error}", + "migrations_failed_to_load_migration": "Ezinezkoa izan da {id} migrazioa kargatzea: {error}", "migrations_must_provide_explicit_targets": "'--skip' edo '--force-rerun' aukerak erabiltzean jomuga zehatzak zehaztu behar dituzu", "migrations_pending_cant_rerun": "Migrazio hauek exekutatzeke daude eta, beraz, ezin dira berriro abiarazi: {ids}", "regenconf_file_kept_back": "'{conf}' konfigurazio fitxategia regen-conf-ek ({category} atala) ezabatzekoa zen baina mantendu egin da.", "regenconf_file_removed": "'{conf}' konfigurazio fitxategia ezabatu da", "tools_upgrade_cant_hold_critical_packages": "Ezin izan dira pakete kritikoak mantendu…", - "migrations_cant_reach_migration_file": "Ezin izan da '%s' migrazioen fitxategia eskuratu", + "migrations_cant_reach_migration_file": "Ezinezkoa izan da '%s' migrazioen fitxategia eskuratzea", "permission_already_allowed": "'{group} taldeak badauka dagoeneko '{permission}' baimena", "permission_cant_add_to_all_users": "{permission} baimena ezin da erabiltzaile guztiei ezarri.", "mailbox_disabled": "Posta elektronikoa desgaituta dago {user} erabiltzailearentzat", @@ -560,66 +560,66 @@ "mailbox_used_space_dovecot_down": "Dovecot mailbox zerbitzua martxan egon behar da postak erabilitako espazioa ezagutzeko", "migration_0015_cleaning_up": "Beharrezkoak ez diren cache eta paketeak kentzen…", "migration_0015_modified_files": "Mesedez, kontutan hartu ondorengo fitxategiak eskuz aldatu direla eta sistema eguneratzean euren gainean idatziko dela: {manually_modified_files}", - "migration_0015_not_enough_free_space": "/var/ direktorioan oso espazio gutxi geratzen da! Gutxienez GB bat izan behar da migrazioa abiarazteko.", + "migration_0015_not_enough_free_space": "/var/ fitxategi-sisteman oso espazio gutxi geratzen da! Gutxienez GB bat izan behar da migrazioa abiarazteko.", "migration_0015_weak_certs": "Sinadura-algoritmo ahulak darabiltzaten ziurtagiriak aurkitu dira eta eguneratu behar dira nginx-en hurrengo bertsioarekin bateragarriak izateko: {certs}", "migration_description_0017_postgresql_9p6_to_11": "Migratu datubaseak PostgreSQL 9.6-tik 11-ra", "other_available_options": "… eta erakusten ez diren beste {n} aukera daude", "permission_cannot_remove_main": "Ezin da baimen nagusi bat kendu", - "service_not_reloading_because_conf_broken": "Ez da '{name}' zerbitzua birkargatu/berrabiarazi konfigurazioa hondatuta dagoelako: {errors}", + "service_not_reloading_because_conf_broken": "Ez da '{name}' zerbitzua birkargatu/berrabiarazi konfigurazioa kaltetuta dagoelako: {errors}", "service_reloaded": "'{service}' zerbitzua birkargatu da", "service_reloaded_or_restarted": "'{service}' zerbitzua birkargatu edo berrabiarazi da", "user_import_bad_file": "CSV fitxategiak ez du formatu egokia eta ekidingo da balizko datuen galera saihesteko", "user_import_failed": "Erabiltzaileak inportatzeko eragiketak huts egin du", "user_import_missing_columns": "Ondorengo zutabeak falta dira: {columns}", - "service_disable_failed": "Ezin izan da '{service}' zerbitzua geldiarazi zerbitzaria abiaraztean.\n\nZerbitzuen erregistro berriak: {logs}", + "service_disable_failed": "Ezin izan da '{service}' zerbitzua geldiarazi zerbitzaria abiaraztean.\n\nZerbitzuen erregistro berrienak: {logs}", "migrations_skip_migration": "{id} migrazioa saihesten…", - "packages_upgrade_failed": "Ezin izan dira pakete guztiak eguneratu", + "packages_upgrade_failed": "Ezinezkoa izan da pakete guztiak eguneratzea", "upnp_disabled": "UPnP itzalita dago", - "main_domain_change_failed": "Ezin izan da domeinu nagusia aldatu", - "regenconf_failed": "Ezin izan da ondorengo atal(ar)en konfigurazioa berregin: {categories}", + "main_domain_change_failed": "Ezinezkoa izan da domeinu nagusia aldatzea", + "regenconf_failed": "Ezinezkoa izan da ondorengo atal(ar)en konfigurazioa berregitea: {categories}", "migration_0015_start": "Buster-erako migrazioa abiarazten", "migration_0015_patching_sources_list": "sources.lists petatxatzen…", "migration_0015_yunohost_upgrade": "YunoHosten muinaren eguneraketa abiarazten…", "migration_0017_postgresql_96_not_installed": "Ez da PostgreSQL instalatu. Ez dago egitekorik.", - "pattern_email_forward": "Helbide elektroniko baliagarri bat izan behar da, '+' karakterea onartzen da (adibidez izena+urtea@domeinua.eus)", + "pattern_email_forward": "Helbide elektroniko baliagarri bat izan behar da, '+' karakterea onartzen da (adibidez: izena+urtea@domeinua.eus)", "migrating_legacy_permission_settings": "Zaharkitutako baimenen ezarpenak migratzen…", "migration_0019_add_new_attributes_in_ldap": "Gehitu LDAP datubasean baimenetarako atributu berriak", "regenconf_file_manually_removed": "'{conf}' konfigurazio fitxategia eskuz ezabatu da eta ez da berriro sortuko", "regenconf_up_to_date": "Konfigurazioa egunean dago dagoeneko '{category}' atalerako", "service_regen_conf_is_deprecated": "'yunohost service regen-conf' zaharkitua dago! Mesedez, erabili 'yunohost tools regen-conf' haren ordez.", "migrations_no_such_migration": "Ez dago '{id}' izeneko migraziorik", - "migrations_not_pending_cant_skip": "Migrazio hauek ez daude exekutatzeke eta beraz, ezin dira saihestu: {ids}", - "regex_with_only_domain": "Ezin duzu regex domeinuetarako erabili, bideetarako bakarrik", + "migrations_not_pending_cant_skip": "Migrazio hauek ez daude exekutatzeke eta, beraz, ezin dira saihestu: {ids}", + "regex_with_only_domain": "Ezin duzu regex domeinuetarako erabili; bideetarako bakarrik", "port_already_closed": "{port}. ataka itxita dago dagoeneko {ip_version} konexioetarako", - "regenconf_file_copy_failed": "Ezin izan da '{new}' konfigurazio fitxategi berria '{conf}'-(e)n kopiatu", - "regenconf_file_remove_failed": "Ezin izan da '{conf}' konfigurazio fitxategia ezabatu", + "regenconf_file_copy_failed": "Ezinezkoa izan da '{new}' konfigurazio fitxategi berria '{conf}'-(e)n kopiatzea", + "regenconf_file_remove_failed": "Ezinezkoa izan da '{conf}' konfigurazio fitxategia ezabatzea", "server_shutdown_confirm": "Zerbitzaria berehala itzaliko da, ziur al zaude? [{answers}]", "restore_already_installed_app": "'{app}' IDa duen aplikazioa dagoeneko instalatuta dago", "service_description_postfix": "Posta elektronikoa bidali eta jasotzeko erabiltzen da", - "service_enable_failed": "Ezin izan da '{service}' zerbitzua sistema abiaraztearekin batera exekutatzea lortu.\n\nZerbitzuen erregistro berriak: {logs}", + "service_enable_failed": "Ezin izan da '{service}' zerbitzua sistema abiaraztearekin batera exekutatzea lortu.\n\nZerbitzuen erregistro berrienak: {logs}", "system_username_exists": "Erabiltzaile izena existitzen da dagoeneko sistemaren erabiltzaileen zerrendan", "user_already_exists": "'{user}' erabiltzailea existitzen da dagoeneko", "migration_0018_failed_to_migrate_iptables_rules": "Zaharkitutako iptaulak nftauletara eguneratzeak huts egin du: {error}", - "mail_domain_unknown": "Ezin da posta elektroniko hori erabili '{domain}' domeinurako. Mesedez, erabili zerbitzari honek kudeatzen duen domeinu bat.", + "mail_domain_unknown": "Ezinezkoa da posta elektroniko hori '{domain}' domeinurako erabiltzea. Mesedez, erabili zerbitzari honek kudeatzen duen domeinu bat.", "migrations_list_conflict_pending_done": "Ezin dituzu '--previous' eta '--done' aldi berean erabili.", "migrations_loading_migration": "{id} migrazioa kargatzen…", "migrations_no_migrations_to_run": "Ez dago exekutatzeko migraziorik", - "password_listed": "Pasahitz hau munduan erabilienetarikoa da. Mesedez, aukeratu beste bat.", - "password_too_simple_2": "Pasahitzak zortzi karaktere izan behar ditu gutxienez eta zenbakiren bat, karaktere larriren bat eta txikiren bat izan behar ditu", + "password_listed": "Pasahitz hau munduan erabilienetarikoa da. Mesedez, aukeratu bereziagoa den beste bat.", + "password_too_simple_2": "Pasahitzak zortzi karaktere izan behar ditu gutxienez eta zenbakiren bat, hizki larriren bat eta txikiren bat izan behar ditu", "pattern_firstname": "Izen horrek ez du balio", "pattern_password": "Gutxienez hiru karaktere izan behar ditu", "restore_failed": "Ezin izan da sistema lehengoratu", - "restore_removing_tmp_dir_failed": "Ezin izan da behin-behineko direktorio zaharra ezabatu", + "restore_removing_tmp_dir_failed": "Ezinezkoa izan da behin-behineko direktorio zaharra ezabatzea", "restore_running_app_script": "'{app}' aplikazioa lehengoratzen…", - "root_password_replaced_by_admin_password": "Administrazio pasahitzak root pasahitza ordezkatu du.", + "root_password_replaced_by_admin_password": "Administrazio-pasahitzak root pasahitza ordezkatu du.", "service_description_fail2ban": "Internetetik datozen bortxaz egindako saiakerak eta bestelako erasoak ekiditen ditu", "service_description_ssh": "Zerbitzarira sare lokaletik kanpo konektatzea ahalbidetzen du (SSH protokoloa)", - "service_description_yunohost-firewall": "Zerbitzuen konexiorako atakak ireki eta ixteko kudeatzailea", + "service_description_yunohost-firewall": "Zerbitzuen konexiorako atakak ireki eta ixteko kudeatzailea da", "service_remove_failed": "Ezin izan da '{service}' zerbitzua ezabatu", - "service_reload_failed": "Ezin izan da '{service}' zerbitzua birkargatu\n\nZerbitzuen azken erregistroak: {logs}", - "service_reload_or_restart_failed": "Ezin izan da '{service}' zerbitzua birkargatu edo berrabiarazi\n\nZerbitzuen azken erregistroak: {logs}", + "service_reload_failed": "Ezin izan da '{service}' zerbitzua birkargatu\n\nZerbitzuen erregistro berrienak: {logs}", + "service_reload_or_restart_failed": "Ezin izan da '{service}' zerbitzua birkargatu edo berrabiarazi\n\nZerbitzuen erregistro berrienak: {logs}", "service_stopped": "'{service}' zerbitzua geldiarazi da", - "unbackup_app": "{app} aplikazioa ez da gordeko", + "unbackup_app": "{app} ez da gordeko", "unrestore_app": "{app} ez da lehengoratuko", "upgrade_complete": "Eguneraketa amaitu da", "upgrading_packages": "Paketeak eguneratzen…", @@ -630,7 +630,7 @@ "migration_0015_system_not_fully_up_to_date": "Sistema ez dago guztiz eguneratuta. Mesedez, exekutatu eguneraketa orokorra Buster-erako migrazioa abiarazi baino lehen.", "migration_description_0015_migrate_to_buster": "Eguneratu sistema Debian Buster eta YunoHost 4.x-ra", "service_description_yunomdns": "Sare lokalean zerbitzarira 'yunohost.local' erabiliz konektatzea ahalbidetzen du", - "mail_alias_remove_failed": "Ezin izan da '{mail}' posta elektroniko ezizena ezabatu", + "mail_alias_remove_failed": "Ezin izan da '{mail}' e-mail ezizena ezabatu", "mail_unavailable": "Helbide elektroniko hau lehenengo erabiltzailearentzat gorde da eta hari ezarri zaio automatikoki", "migration_description_0016_php70_to_php73_pools": "Migratu php7.0-fpm 'pool' fitxategiak php7.3-ra", "migration_description_0019_extend_permissions_features": "Hedatu aplikazioen baimenen kudeaketa sistema", @@ -640,22 +640,22 @@ "migration_0015_problematic_apps_warning": "Mesedez, kontutan izan arazoak sor ditzaketen aplikazioak aurkitu direla. Badirudi ez zirela YunoHosten aplikazioen katalogotik instalatu, edo 'ez dabiltza' etiketa dute. Beraz, ezin da bermatu eguneratu eta gero funtzionatuko dutenik: {problematic_apps}", "migration_0017_not_enough_space": "Espazio gehiago behar da {path}-n migrazioa exekutatzeko.", "migration_0017_postgresql_11_not_installed": "PostgreSQL 9.6 instalatuta egon arren postgresql 11 ez‽ Zerbait arraroa gertatu da zure sisteman :(…", - "migration_0018_failed_to_reset_legacy_rules": "Ezin izan dira zaharkitutako iptaulak berrezarri: {error}", + "migration_0018_failed_to_reset_legacy_rules": "Ezinezkoa izan da zaharkitutako iptaulak berrezartzea: {error}", "migrations_migration_has_failed": "{id} migrazioak ez du amaitu, geldiarazten. Errorea: {exception}", "migrations_need_to_accept_disclaimer": "{id} migrazioa abiarazteko, ondorengo baldintzak onartu behar dituzu:\n---\n{disclaimer}\n---\nMigrazioa onartzen baduzu, mesedez berrabiarazi prozesua komandoan '--accept-disclaimer' aukera gehituz.", "not_enough_disk_space": "Ez dago nahikoa espazio librerik '{path}'-n", - "password_too_simple_3": "Pasahitzak zortzi karaktere izan behar ditu gutxienez eta zenbakiren bat, karaktere larriren bat, txikiren bat eta bereziren bat izan behar ditu", + "password_too_simple_3": "Pasahitzak zortzi karaktere izan behar ditu gutxienez eta zenbakiren bat, hizki larriren bat, txikiren bat eta karaktere bereziren bat izan behar ditu", "pattern_backup_archive_name": "Fitxategiaren izenak 30 karaktere izan ditzake gehienez, alfanumerikoak eta ._- baino ez", - "pattern_domain": "Domeinu izen baliagarri bat izan behar da (adibidez nire-domeinua.eus)", + "pattern_domain": "Domeinu izen baliagarri bat izan behar da (adibidez: nire-domeinua.eus)", "pattern_mailbox_quota": "Tamainak b/k/M/G/T zehaztu behar du edo 0 mugarik ezarri nahi ez bada", "pattern_password_app": "Barka, baina pasahitzek ezin dituzte ondorengo karaktereak izan: {forbidden_chars}", "pattern_port_or_range": "Ataka zenbaki (0-65535) edo errenkada (100:200) baliagarri bat izan behar da", "permission_already_disallowed": "'{group}' taldeak desgaituta dauka dagoeneko '{permission} baimena", "permission_already_up_to_date": "Baimena ez da eguneratu egindako eskaria egungo egoerarekin bat datorrelako.", - "migration_0015_still_on_stretch_after_main_upgrade": "Zerbaitek huts egin du eguneraketa orokorrean, badirudi sistemak oraindik darabilela Debian Stretch", + "migration_0015_still_on_stretch_after_main_upgrade": "Zerbaitek huts egin du eguneraketa orokorrean; badirudi sistemak oraindik darabilela Debian Stretch", "migration_update_LDAP_schema": "LDAP eskema eguneratzen…", "permission_protected": "'{permission}' baimena babestuta dago. Ezin duzu bisitarien taldea baimen honetara gehitu / baimen honetatik kendu.", - "permission_update_failed": "Ezin izan da '{permission}' baimena aldatu: {error}", + "permission_update_failed": "Ezinezkoa izan da '{permission}' baimena aldatzea: {error}", "port_already_opened": "{port}. ataka dagoeneko irekita dago {ip_version} konexioetarako", "user_home_creation_failed": "Ezin izan da erabiltzailearentzat '{home}' direktorioa sortu", "user_unknown": "Erabiltzaile ezezaguna: {user}", @@ -664,16 +664,16 @@ "migration_0019_slapd_config_will_be_overwritten": "Badirudi eskuz moldatu duzula slapd konfigurazioa. Migrazio garrantzitsu honetarako, YunoHostek slapd ezarpenak eguneratu behar ditu. Oraingo fitxategiak {conf_backup_folder}-n kopiatuko dira.", "unlimit": "Mugarik ez", "restore_already_installed_apps": "Ondorengo aplikazioak ezin dira lehengoratu dagoeneko instalatuta daudelako: {apps}", - "migration_0015_general_warning": "Mesedez, uler ezazu migrazio hau eragiketa zaila dela. YunoHosten kideek ahalik eta hoberen egin dute prozesua egiaztatzeko, baina hala ere sistemaren atalak edo aplikazioak honda litezke.\n\nHorregatik gomendagarria da:\n- Informazio edo aplikazio garrantzitsuen babeskopia egitea. Informazio gehiagorako: https://yunohost.org/backup;\n- Pazientzia izatea migrazioa abiarazterakoan: zure internet konexioaren eta hardwarearen arabera litekeena da ordu batzuk behar izatea eguneraketa amaitu arte.", + "migration_0015_general_warning": "Mesedez, uler ezazu migrazio hau eragiketa zaila dela. YunoHosten kideek ahalik eta hoberen egin dute prozesua egiaztatzeko, baina hala ere sistemaren atalak edo aplikazioak kaltetu litezke.\n\nHorregatik gomendagarria da:\n- Informazio edo aplikazio garrantzitsuen babeskopia egitea. Argibide gehiagorako: https://yunohost.org/backup;\n- Pazientzia izatea migrazioa abiarazterakoan: zure internet konexioaren eta hardwarearen arabera litekeena da ordu batzuk behar izatea eguneraketa amaitu arte.", "migration_0015_specific_upgrade": "Aparte eguneratu behar diren sistemaren paketeen eguneraketa abiarazten…", - "password_too_simple_4": "Pasahitzak 12 karaktere izan behar ditu gutxienez eta zenbakiren bat, karaktere larriren bat, txikiren bat eta bereziren bat izan behar ditu", - "pattern_email": "Helbide elektroniko baliagarri bat izan behar da, '+' karaktererik gabe (adibidez izena@domeinua.eus)", + "password_too_simple_4": "Pasahitzak 12 karaktere izan behar ditu gutxienez eta zenbakiren bat, hizki larriren bat, txikiren bat eta karaktere bereziren bat izan behar ditu", + "pattern_email": "Helbide elektroniko baliagarri bat izan behar da, '+' karaktererik gabe (adibidez: izena@domeinua.eus)", "pattern_username": "Txikiz idatzitako karaktere alfanumerikoak eta azpiko marra soilik eduki ditzake", - "permission_deletion_failed": "Ezin izan da '{permission}' baimena ezabatu: {error}", + "permission_deletion_failed": "Ezinezkoa izan da '{permission}' baimena ezabatzea: {error}", "migration_ldap_rollback_success": "Sistema lehengoratu da.", "regenconf_need_to_explicitly_specify_ssh": "SSH ezarpenak eskuz aldatu dira, baina aldaketak erabiltzeko '--force' zehaztu behar duzu 'ssh' atalean.", - "regex_incompatible_with_tile": "/!\\ Pakete-arduradunak! {permission}' baimenak show_tile aukera 'true' bezala dauka eta horregatik ezin duzu regex URLa URL nagusi bezala ezarri", - "root_password_desynchronized": "Administrariaren pasahitza aldatu da baina YunoHostek ezin izan du aldaketa root pasahitzera zabaldu!", + "regex_incompatible_with_tile": "/!\\ Pakete-arduradunak! {permission}' baimenak show_tile aukera 'true' bezala dauka eta horregatik ezin duzue regex URLa URL nagusi bezala ezarri", + "root_password_desynchronized": "Administrariaren pasahitza aldatu da baina YunoHostek ezin izan du aldaketa root pasahitzera hedatu!", "server_shutdown": "Zerbitzaria itzaliko da", "service_stop_failed": "Ezin izan da '{service}' zerbitzua geldiarazi\n\nZerbitzuen azken erregistroak: {logs}", "service_unknown": "'{service}' zerbitzu ezezaguna", @@ -682,27 +682,27 @@ "restore_nothings_done": "Ez da ezer lehengoratu", "restore_backup_too_old": "Babeskopia fitxategi hau ezin da lehengoratu YunoHosten bertsio zaharregi batetik datorrelako.", "restore_hook_unavailable": "'{part}'-(e)rako lehengoratze agindua ez dago erabilgarri ez sisteman ezta fitxategian ere", - "restore_cleaning_failed": "Ezin izan dira lehengoratu ondoren behin-behineko fitxategiak ezabatu", - "restore_confirm_yunohost_installed": "Ziur al zaude dagoeneko instalatuta dagoen sistema lehengoratzeaz? [{answers}]", + "restore_cleaning_failed": "Ezin izan dira lehengoratzeko behin-behineko fitxategiak ezabatu", + "restore_confirm_yunohost_installed": "Ziur al zaude dagoeneko instalatuta dagoen sistema lehengoratu nahi duzula? [{answers}]", "restore_may_be_not_enough_disk_space": "Badirudi zure sistemak ez duela nahikoa espazio (erabilgarri: {free_space} B, beharrezkoa {needed_space} B, segurtasuneko tartea: {margin} B)", "restore_not_enough_disk_space": "Ez dago nahikoa espazio (erabilgarri: {free_space} B, beharrezkoa {needed_space} B, segurtasuneko tartea: {margin} B)", - "restore_running_hooks": "Lehengoratzeko \"hook\"ak exekutatzen…", - "restore_system_part_failed": "Ezin izan da sistemaren '{part}' atala lehengoratu", + "restore_running_hooks": "Lehengoratzeko 'hook'ak exekutatzen…", + "restore_system_part_failed": "Ezinezkoa izan da sistemaren '{part}' atala lehengoratzea", "server_reboot": "Zerbitzaria berrabiaraziko da", "server_reboot_confirm": "Zerbitzaria berehala berrabiaraziko da, ziur al zaude? [{answers}]", - "service_add_failed": "Ezin izan da '{service}' zerbitzua gehitu", + "service_add_failed": "Ezinezkoa izan da '{service}' zerbitzua gehitzea", "service_added": "'{service}' zerbitzua gehitu da", "service_already_started": "'{service}' zerbitzua matxan dago dagoeneko", "service_already_stopped": "'{service}' zerbitzua geldiarazi da dagoeneko", "service_cmd_exec_failed": "Ezin izan da '{command}' komandoa exekutatu", "service_description_dnsmasq": "Domeinuen izenen ebazpena (DNSa) kudeatzen du", - "service_description_dovecot": "Posta elektronikoko programei mezuak jasotzea ahalbidetzen die (IMAP eta POP3 bidez)", + "service_description_dovecot": "Posta elektronikorako programei mezuak jasotzea ahalbidetzen die (IMAP eta POP3 bidez)", "service_description_metronome": "Bat-bateko XMPP mezularitza kontuak kudeatzen ditu", "service_description_mysql": "Aplikazioen datuak gordetzen ditu (SQL datubasea)", "service_description_nginx": "Zerbitzariak ostatazen dituen webguneak ikusgai egiten ditu", "service_description_php7.3-fpm": "PHP aplikazioak exekutatzen ditu NGINXi esker", - "service_description_redis-server": "Datuak bizkor atzitzeko, zereginak lerratzeko eta programen arteko komunikaziorako datubase berezi bat", - "service_description_rspamd": "Spama bahetzeko eta posta elektronikoarekin zerikusia duten bestelako ezaugarrietarako", + "service_description_redis-server": "Datuak bizkor atzitzeko, zereginak lerratzeko eta programen arteko komunikaziorako datubase berezi bat da", + "service_description_rspamd": "Spama bahetu eta posta elektronikoarekin zerikusia duten bestelako futzioen ardura dauka", "service_description_slapd": "Erabiltzaileak, domeinuak eta hauei lotutako informazioa gordetzen du", - "service_description_yunohost-api": "YunoHosten web interfazearen eta sistemaren arteko hartuemana kudeatzen du" + "service_description_yunohost-api": "YunoHosten web-interfazearen eta sistemaren arteko hartuemana kudeatzen du" } From edc5295d51585732249dcee862fe7ddd67d4194f Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Tue, 2 Nov 2021 01:29:07 +0100 Subject: [PATCH 092/619] Add some debug to _collect_app_files exception ... --- src/yunohost/backup.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/yunohost/backup.py b/src/yunohost/backup.py index cce66597a..058813502 100644 --- a/src/yunohost/backup.py +++ b/src/yunohost/backup.py @@ -734,7 +734,8 @@ class BackupManager: this_app_permissions = {name: infos for name, infos in permissions.items()} write_to_yaml("%s/permissions.yml" % settings_dir, this_app_permissions) - except Exception: + except Exception as e: + logger.debug(e) abs_tmp_app_dir = os.path.join(self.work_dir, "apps/", app) shutil.rmtree(abs_tmp_app_dir, ignore_errors=True) logger.error(m18n.n("backup_app_failed", app=app)) From 85eb43a73045c1108e9bdba8caece8fdb2d0837f Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Tue, 2 Nov 2021 01:38:11 +0100 Subject: [PATCH 093/619] apps: Add YNH_ARCH to app script env for easier debugging and arch check in script --- src/yunohost/app.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/yunohost/app.py b/src/yunohost/app.py index a7a188452..649110267 100644 --- a/src/yunohost/app.py +++ b/src/yunohost/app.py @@ -2390,6 +2390,7 @@ def _make_environment_for_app_script( "YNH_APP_INSTANCE_NAME": app, "YNH_APP_INSTANCE_NUMBER": str(app_instance_nb), "YNH_APP_MANIFEST_VERSION": manifest.get("version", "?"), + "YNH_ARCH": check_output("dpkg --print-architecture"), } if workdir: From 844346320b0d3b0684dcb975a610720c0206bd4a Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Tue, 2 Nov 2021 01:38:33 +0100 Subject: [PATCH 094/619] Typo :| --- data/helpers.d/backup | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/helpers.d/backup b/data/helpers.d/backup index 98a61c16a..53efcc917 100644 --- a/data/helpers.d/backup +++ b/data/helpers.d/backup @@ -482,7 +482,7 @@ ynh_restore_upgradebackup() { if [[ -d /etc/yunohost/apps/$app ]] then ynh_die --message="The app was restored to the way it was before the failed upgrade." - elif + else ynh_die --message="Uhoh ... Yunohost failed to restore the app to the way it was before the failed upgrade :|" fi fi From b953ae9dd4f8886a9dcec93946cdfa10cee3de80 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Tue, 2 Nov 2021 01:43:31 +0100 Subject: [PATCH 095/619] Typo + used existing ynh_package_is_installed helper --- data/helpers.d/apt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/data/helpers.d/apt b/data/helpers.d/apt index ecad3b14a..d35328f6a 100644 --- a/data/helpers.d/apt +++ b/data/helpers.d/apt @@ -261,7 +261,7 @@ ynh_install_app_dependencies() { dependencies+=", php${specific_php_version}, php${specific_php_version}-fpm, php${specific_php_version}-common" fi - local psql_installed2="$(dpkg --list | grep -q "ii *postgresql-$PSQL_VERSION" && echo yes || echo no)" + local psql_installed="$(ynh_package_is_installed "postgresql-$PSQL_VERSION" && echo yes || echo no)" # The first time we run ynh_install_app_dependencies, we will replace the # entire control file (This is in particular meant to cover the case of @@ -306,7 +306,7 @@ EOF fi # Trigger postgresql regenconf if we may have just installed postgresql - local psql_installed2="$(dpkg --list | grep -q "ii *postgresql-$PSQL_VERSION" && echo yes || echo no)" + local psql_installed2="$(ynh_package_is_installed "postgresql-$PSQL_VERSION" && echo yes || echo no)" if [[ "$psql_installed" != "$psql_installed2" ]] then yunohost tools regen-conf postgresql From c571516c68a883069d13518b264ea582e2c546b7 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Tue, 2 Nov 2021 01:44:48 +0100 Subject: [PATCH 096/619] i18n strings --- locales/en.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/locales/en.json b/locales/en.json index 81e75eb32..8590c5c62 100644 --- a/locales/en.json +++ b/locales/en.json @@ -624,8 +624,8 @@ "service_description_fail2ban": "Protects against brute-force and other kinds of attacks from the Internet", "service_description_metronome": "Manage XMPP instant messaging accounts", "service_description_mysql": "Stores app data (SQL database)", + "service_description_postgresql": "Stores app data (SQL database)", "service_description_nginx": "Serves or provides access to all the websites hosted on your server", - "service_description_php7.3-fpm": "Runs apps written in PHP with NGINX", "service_description_postfix": "Used to send and receive e-mails", "service_description_redis-server": "A specialized database used for rapid data access, task queue, and communication between programs", "service_description_rspamd": "Filters spam, and other e-mail related features", From ba489bfc27445d9ed7e1dc65ad9405fccf161267 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Tue, 2 Nov 2021 02:02:29 +0100 Subject: [PATCH 097/619] helpers: We don't care about the apt_dependencies setting ... it's not used and the info is already stored in the $app-ynh-deps virtual package --- data/helpers.d/apt | 2 -- 1 file changed, 2 deletions(-) diff --git a/data/helpers.d/apt b/data/helpers.d/apt index cea850f6e..2e56e3788 100644 --- a/data/helpers.d/apt +++ b/data/helpers.d/apt @@ -316,8 +316,6 @@ EOF || ynh_die --message="Unable to install dependencies" # Install the fake package and its dependencies rm /tmp/${dep_app}-ynh-deps.control - ynh_app_setting_set --app=$app --key=apt_dependencies --value="$dependencies" - if [[ -n "$specific_php_version" ]] then # Set the default php version back as the default version for php-cli. From 3eb69224aa8c29f290c68cca77116b03ae81b8cc Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Tue, 2 Nov 2021 02:03:53 +0100 Subject: [PATCH 098/619] ci: Add test for apt helpers --- tests/test_helpers.d/ynhtest_apt.sh | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 tests/test_helpers.d/ynhtest_apt.sh diff --git a/tests/test_helpers.d/ynhtest_apt.sh b/tests/test_helpers.d/ynhtest_apt.sh new file mode 100644 index 000000000..074bc2e60 --- /dev/null +++ b/tests/test_helpers.d/ynhtest_apt.sh @@ -0,0 +1,22 @@ +ynhtest_apt_install_apt_deps_regular() { + + dpkg --list | grep -q "ii *$app-ynh-deps" && apt remove $app-ynh-deps --assume-yes || true + dpkg --list | grep -q 'ii *nyancat' && apt remove nyancat --assume-yes || true + dpkg --list | grep -q 'ii *sl' && apt remove sl --assume-yes || true + + ! ynh_package_is_installed "$app-ynh-deps" + ! ynh_package_is_installed "nyancat" + ! ynh_package_is_installed "sl" + + ynh_install_app_dependencies "nyancat sl" + + ynh_package_is_installed "$app-ynh-deps" + ynh_package_is_installed "nyancat" + ynh_package_is_installed "sl" + + ynh_remove_app_dependencies + + ! ynh_package_is_installed "$app-ynh-deps" + ! ynh_package_is_installed "nyancat" + ! ynh_package_is_installed "sl" +} From 99e46b3a61d73795267198bf99088dd8d00bcbc8 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Tue, 2 Nov 2021 02:50:32 +0100 Subject: [PATCH 099/619] ynh_local_curl: temporarily auto-add visitors if needed --- data/helpers.d/utils | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/data/helpers.d/utils b/data/helpers.d/utils index 453a1ab94..8b7179289 100644 --- a/data/helpers.d/utils +++ b/data/helpers.d/utils @@ -290,8 +290,18 @@ ynh_local_curl() { chown root $cookiefile chmod 700 $cookiefile + # Temporarily enable visitors if needed... + local visitors_enabled=$(ynh_permission_has_user "main" "visitors" && echo yes || echo no) + if [[ $visitors_enabled == "no" ]]; then + ynh_permission_update --permission "main" --add "visitors" + fi + # Curl the URL curl --silent --show-error --insecure --location --header "Host: $domain" --resolve $domain:443:127.0.0.1 $POST_data "$full_page_url" --cookie-jar $cookiefile --cookie $cookiefile + + if [[ $visitors_enabled == "no" ]]; then + ynh_permission_update --permission "main" --remove "visitors" + fi } # Create a dedicated config file from a template From abaa60d7742f9b851266e4789a16c3f574c71000 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Tue, 2 Nov 2021 03:24:30 +0100 Subject: [PATCH 100/619] ynh_install_n / ux: remove useless info message / redundant because scripts already include a script_progression ... --- data/helpers.d/nodejs | 1 - 1 file changed, 1 deletion(-) diff --git a/data/helpers.d/nodejs b/data/helpers.d/nodejs index 6c23c0c99..69e9ce445 100644 --- a/data/helpers.d/nodejs +++ b/data/helpers.d/nodejs @@ -14,7 +14,6 @@ export N_PREFIX="$n_install_dir" # # Requires YunoHost version 2.7.12 or higher. ynh_install_n() { - ynh_print_info --message="Installation of N - Node.js version management" # Build an app.src for n echo "SOURCE_URL=https://github.com/tj/n/archive/v${n_version}.tar.gz SOURCE_SUM=d4da7ea91f680de0c9b5876e097e2a793e8234fcd0f7ca87a0599b925be087a3" >"$YNH_APP_BASEDIR/conf/n.src" From 0489b717290016c511e86939964492c435e68495 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Wed, 3 Nov 2021 18:42:02 +0100 Subject: [PATCH 101/619] Update changelog for 4.3.1.8 --- debian/changelog | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/debian/changelog b/debian/changelog index 651f20a75..a7d6c2445 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,18 @@ +yunohost (4.3.1.8) testing; urgency=low + + - [enh] dyndns: Drop some YAGNI + improve IPv6-only support + resilience w.r.t. ns0 / ns1 being down (a61d0231, [#1367](https://github.com/YunoHost/yunohost/pull/1367)) + - [fix] helpers: improve composer debug when it can't install dependencies (4ebcaf8d) + - [enh] helpers: allow to get/set/delete app settings without explicitly passing app id everytime... (fcd2ef9d) + - [fix] helpers: Don't say the 'app was restored' when restore failed after failed upgrade (019d207c) + - [enh] helpers: temporarily auto-add visitors during ynh_local_curl if needed ([#1370](https://github.com/YunoHost/yunohost/pull/1370)) + - [enh] apps: Add YNH_ARCH to app script env for easier debugging and arch check in script (85eb43a7) + - [mod] misc fixes/enh (2687121f, 146fba7d, 86a9cb37, 4e917b5e, 974ea71f, edc5295d, ba489bfc) + - [i18n] Translations updated for Basque, French, Spanish + + Thanks to all contributors <3 ! (ljf, Page Asgardius, ppr, punkrockgirl) + + -- Alexandre Aubin Wed, 03 Nov 2021 18:35:18 +0100 + yunohost (4.3.1.7) testing; urgency=low - [fix] configpanel: Misc technical fixes ... (341059d0, 9c22329e) From dc55a2d99e6b7f0d083c6781c0acb4941dbc1bb0 Mon Sep 17 00:00:00 2001 From: punkrockgirl Date: Thu, 4 Nov 2021 16:57:53 +0000 Subject: [PATCH 102/619] Translated using Weblate (Basque) Currently translated at 100.0% (705 of 705 strings) Translation: YunoHost/core Translate-URL: https://translate.yunohost.org/projects/yunohost/core/eu/ --- locales/eu.json | 48 ++++++++++++++++++++++++------------------------ 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/locales/eu.json b/locales/eu.json index bbe78029a..f8469c37e 100644 --- a/locales/eu.json +++ b/locales/eu.json @@ -65,7 +65,7 @@ "config_apply_failed": "Ezin izan da konfigurazio berria ezarri: {error}", "config_cant_set_value_on_section": "Ezinezkoa da balio bakar bat ezartzea konfigurazio atal oso batean.", "config_no_panel": "Ez da konfigurazio-panelik aurkitu.", - "diagnosis_found_errors_and_warnings": "{category} atalari dago(z)kion {errors} arazoa(k) (eta {warnings} abisua(k)) aurkitu d(ir)a!", + "diagnosis_found_errors_and_warnings": "{category} atalari dago(z)kion {errors} arazo (eta {warnings} abisu) aurkitu d(ir)a!", "diagnosis_description_regenconf": "Sistemaren ezarpenak", "app_upgrade_script_failed": "Errore bat gertatu da aplikazioaren eguneratze aginduan", "diagnosis_basesystem_hardware": "Zerbitzariaren arkitektura {virt} {arch} da", @@ -124,16 +124,16 @@ "diagnosis_basesystem_ynh_single_version": "{package} bertsioa: {version} ({repo})", "diagnosis_failed_for_category": "'{category}' ataleko diagnostikoak kale egin du: {error}", "diagnosis_cache_still_valid": "(Cachea oraindik baliogarria da {category} (ar)en diagnosirako. Ez da berrabiaraziko!)", - "diagnosis_found_errors": "{category} atalari dago(z)kion {errors} arazoa(k) aurkitu d(ir)a!", - "diagnosis_found_warnings": "{category} atalari dagokion eta hobetu daite(z)keen {warnings} abisua(k) aurkitu d(ir)a.", + "diagnosis_found_errors": "{category} atalari dago(z)kion {errors} arazo aurkitu d(ir)a!", + "diagnosis_found_warnings": "{category} atalari dagokion eta hobetu daite(z)keen {warnings} abisu aurkitu d(ir)a.", "diagnosis_ip_connected_ipv6": "Zerbitzaria IPv6 bidez dago internetera konektatuta!", "diagnosis_everything_ok": "Badirudi guztia zuzen dagoela {category} atalean!", "diagnosis_ip_no_ipv4": "Zerbitzariak ez du dabilen IPv4rik.", "diagnosis_ip_no_ipv6": "Zerbitzariak ez du dabilen IPv6rik.", "diagnosis_ip_broken_dnsresolution": "Domeinu izenaren ebazpena kaltetuta dagoela dirudi… Suebakiren bat ote dago DNS eskaerak oztopatzen?", - "diagnosis_diskusage_low": "{mountpoint} fitxategi-sistemak ({device} euskarrian) edukieraren {free} ({free_percent}%) bakarrik du erabilgarri ({total} orotara). Kontuz ibili.", + "diagnosis_diskusage_low": "{mountpoint} fitxategi-sistemak ({device} euskarrian) edukieraren {free} ({free_percent}%) bakarrik ditu erabilgarri ({total} orotara). Kontuz ibili.", "diagnosis_dns_good_conf": "DNS ezarpenak zuzen konfiguratuta daude {domain} domeinurako ({category} atala)", - "diagnosis_diskusage_verylow": "{mountpoint} fitxategi-sistemak ({device} euskarrian) edukieraren {free} ({free_percent}%) bakarrik du erabilgarri ({total} orotara). Zertxobait hustu beharko zenuke!", + "diagnosis_diskusage_verylow": "{mountpoint} fitxategi-sistemak ({device} euskarrian) edukieraren {free} ({free_percent}%) bakarrik ditu erabilgarri ({total} orotara). Zertxobait hustu beharko zenuke!", "diagnosis_description_basesystem": "Sistemaren oinarria", "diagnosis_description_services": "Zerbitzuen egoeraren egiaztapena", "diagnosis_http_could_not_diagnose": "Ezinezkoa izan da domeinuak IPv{ipversion} kanpotik eskuragarri dauden egiaztatzea.", @@ -170,12 +170,12 @@ "app_full_domain_unavailable": "Aplikazio honek bere domeinu propioa behar du, baina beste aplikazio batzuk daude dagoeneko instalatuta '{domain}' domeinuan. Azpidomeinu bat erabil zenezake instalatu nahi duzun aplikaziorako.", "app_install_script_failed": "Errore bat gertatu da aplikazioaren instalatzailearen aginduetan", "diagnosis_basesystem_host": "Zerbitzariak Debian {debian_version} darabil", - "diagnosis_ignored_issues": "(kontutan hartu ez d(ir)en + {nb_ignored} arazo)", + "diagnosis_ignored_issues": "(kontuan hartu ez d(ir)en + {nb_ignored} arazo)", "diagnosis_ip_dnsresolution_working": "Domeinu izenaren ebazpena badabil!", "diagnosis_failed": "Ezinezkoa izan da '{category}' ataleko diagnostikoa lortzea: {error}", "diagnosis_ip_weird_resolvconf": "DNS ebazpena badabilela dirudi, baina antza denez moldatutako /etc/resolv.conf fitxategia erabiltzen ari zara.", "diagnosis_dns_bad_conf": "DNS balio batzuk falta dira edo ez dira zuzenak {domain} domeinurako ({category} atala)", - "diagnosis_diskusage_ok": "{mountpoint} fitxategi-sistemak ({device} euskarrian) edukieraren {free} ({free_percent}%) du erabilgarri oraindik ({total} orotara)!", + "diagnosis_diskusage_ok": "{mountpoint} fitxategi-sistemak ({device} euskarrian) edukieraren {free} ({free_percent}%) ditu erabilgarri oraindik ({total} orotara)!", "apps_catalog_update_success": "Aplikazioen katalogoa eguneratu da!", "certmanager_warning_subdomain_dns_record": "'{subdomain}' azpidomeinuak ez dauka '{domain}'(e)k duen IP bera. Ezaugarri batzuk ez dira erabilgarri egongo hau zuzendu arte eta ziurtagiri bat birsortu arte.", "app_argument_choice_invalid": "Hautatu ({choices}) aukeretako bat '{name}' argumenturako: '{value}' ez dago aukera horien artean", @@ -183,7 +183,7 @@ "diagnosis_basesystem_ynh_main_version": "Zerbitzariak YunoHosten {main_version} ({repo}) darabil", "backup_custom_backup_error": "Neurrira egindako babeskopiak ezin izan du 'babeskopia egin' urratsetik haratago egin", "diagnosis_ip_broken_resolvconf": "Zure zerbitzarian domeinu izenaren ebazpena kaltetuta dagoela dirudi, antza denez /etc/resolv.conf fitxategia ez dago 127.0.0.1ra adi.", - "diagnosis_ip_no_ipv6_tip": "Dabilen IPv6 izatea ez da derrigorrezkoa zerbitzariaren funtzionamendurako, baina egokiena da interneten osasunerako. IPv6 automatikoki konfiguratu beharko luke sistemak edo telefono-konpainiak. Bestela, eskuz konfiguratu beharko zenituzke hainbat gauza dokumentazioan azaltzen den bezala. Ezin baduzu edo IPv6 gaitzea zuretzat kontu teknikoegia baldin bada, ez duzu abisu hau zertan kontutan hartu.", + "diagnosis_ip_no_ipv6_tip": "Dabilen IPv6 izatea ez da derrigorrezkoa zerbitzariaren funtzionamendurako, baina egokiena da interneten osasunerako. IPv6 automatikoki konfiguratu beharko luke sistemak edo operadoreak. Bestela, eskuz konfiguratu beharko zenituzke hainbat gauza dokumentazioan azaltzen den bezala. Ezin baduzu edo IPv6 gaitzea zuretzat kontu teknikoegia baldin bada, ez duzu abisu hau zertan kontuan hartu.", "diagnosis_http_nginx_conf_not_up_to_date_details": "Egoera konpontzeko, ikuskatu desberdintasunak yunohost tools regen-conf nginx --dry-run --with-diff komandoren bidez eta, proposatutako aldaketak onartzen badituzu, ezarri itzazu yunohost tools regen-conf nginx --force erabiliz.", "diagnosis_domain_not_found_details": "{domain} domeinua ez da WHOISen datubasean existitzen edo iraungi da!", "app_start_backup": "{app}(r)en babeskopia egiteko fitxategiak eskuratzen…", @@ -214,7 +214,7 @@ "backup_running_hooks": "Babeskopien kakoak exekutatzen…", "backup_unable_to_organize_files": "Ezinezkoa izan da modu azkarra erabiltzea fitxategiko artxiboak prestatzeko", "backup_output_symlink_dir_broken": "'{path}' fitxategi-katalogoaren symlink-a ez dabil. Agian [ber]muntatzea ahaztu zaizu edo euskarria atakara konektatzea ahaztu duzu.", - "backup_with_no_backup_script_for_app": "'{app}' aplikazioak ez du babeskopia egiteko agindurik. Ez da kontutan hartuko.", + "backup_with_no_backup_script_for_app": "'{app}' aplikazioak ez du babeskopia egiteko agindurik. Ez da kontuan hartuko.", "backup_with_no_restore_script_for_app": "{app}(e)k ez du lehengoratzeko agindurik, ezingo duzu aplikazio hau automatikoki lehengoratu.", "certmanager_attempt_to_renew_nonLE_cert": "'{domain}' domeinurako ziurtagiria ez da Let's Encryptek jaulkitakoa. Ezin da automatikoki berriztu!", "certmanager_attempt_to_renew_valid_cert": "'{domain}' domeinurako ziurtagiria iraungitzear dago! (Zertan ari zaren baldin badakizu, --force erabil dezakezu)", @@ -279,7 +279,7 @@ "dyndns_registration_failed": "Ezinezkoa izan da DynDNS domeinua erregistratzea: {error}", "extracting": "Ateratzen…", "diagnosis_ports_unreachable": "{port}. ataka ez dago eskuragarri kanpotik.", - "diagnosis_regenconf_manually_modified_details": "Ez dago arazorik zertan ari zaren baldin badakizu! YunoHostek fitxategi hau automatikoki eguneratzeari utziko dio… Baina kontutan izan YunoHosten eguneraketek aldaketa garrantzitsuak izan ditzaketela. Nahi izatekotan, desberdintasunak aztertu ditzakezu yunohost tools regen-conf {category} --dry-run --with-diff komandoa exekutatuz, eta gomendatutako konfiguraziora bueltatu yunohost tools regen-conf {category} --force erabiliz", + "diagnosis_regenconf_manually_modified_details": "Ez dago arazorik zertan ari zaren baldin badakizu! YunoHostek fitxategi hau automatikoki eguneratzeari utziko dio… Baina kontuan izan YunoHosten eguneraketek aldaketa garrantzitsuak izan ditzaketela. Nahi izatekotan, desberdintasunak aztertu ditzakezu yunohost tools regen-conf {category} --dry-run --with-diff komandoa exekutatuz, eta gomendatutako konfiguraziora bueltatu yunohost tools regen-conf {category} --force erabiliz", "experimental_feature": "Adi: Funtzio hau esperimentala eta ezegonkorra da, ez zenuke erabili beharko ez badakizu zertan ari zaren.", "global_settings_cant_write_settings": "Ezinezkoa izan da konfigurazio fitxategia gordetzea, zergatia: {reason}", "dyndns_domain_not_provided": "{provider} DynDNS enpresak ezin du {domain} domeinua eskaini.", @@ -351,7 +351,7 @@ "log_domain_dns_push": "Bidali '{}' domeinuaren DNS ezarpenak", "log_tools_migrations_migrate_forward": "Exekutatu migrazioak", "log_tools_postinstall": "Abiarazi YunoHost zerbitzariaren instalazio ondorengo prozesua", - "diagnosis_mail_fcrdns_nok_alternatives_4": "Operadore batzuek ez dute alderantzizko DNSa konfiguratzen uzten (edo funtzioa ez dabil…). Hau dela-eta arazoak badituzu, irtenbide batzuk eduki ditzakezu:
- Operadore batzuek relay posta zerbitzari bat eskaini dezakete, baina kasu horretan zure posta elektronikoa zelatatu dezakete.
- Pribatutasuna bermatzeko *IP publiko bat duen* VPN bat erabiltzea izan daiteke irtenbidea. Ikus https://yunohost.org/#/vpn_advantage
- Edo operadore desberdin batera aldatu", + "diagnosis_mail_fcrdns_nok_alternatives_4": "Operadore batzuek ez dute alderantzizko DNSa konfiguratzen uzten (edo funtzioa ez dabil…). Hau dela-eta arazoak badituzu, irtenbide batzuk eduki ditzakezu:
- Operadore batzuek relay posta zerbitzari bat eskaini dezakete, baina kasu horretan zure posta elektronikoa zelatatu dezakete.
- Pribatutasuna bermatzeko *IP publikoa* duen VPN bat erabiltzea izan daiteke irtenbidea. Ikus https://yunohost.org/#/vpn_advantage
- Edo operadore desberdin batera aldatu", "domain_dns_registrar_supported": "YunoHostek automatikoki antzeman du domeinu hau **{registrar}** erregistro-enpresak kudeatzen duela. Nahi baduzu YunoHostek automatikoki konfiguratu ditzake DNS ezarpenak, API egiaztagiri zuzenak zehazten badituzu. API egiaztagiriak non lortzeko dokumentazioa orri honetan duzu: https://yunohost.org/registar_api_{registrar}. (Baduzu DNS erregistroak eskuz konfiguratzeko aukera ere, gidalerro hauetan ageri den bezala: https://yunohost.org/dns)", "domain_dns_push_failed_to_list": "Ezinezkoa izan da APIa erabiliz oraingo erregistroak antzematea: {error}", "domain_dns_push_already_up_to_date": "Ezarpenak egunean daude, ez dago zereginik.", @@ -380,11 +380,11 @@ "log_user_create": "Gehitu '{}' erabiltzailea", "group_cannot_edit_visitors": "'bisitariak' taldea ezin da eskuz moldatu. Saiorik hasi gabeko bisitariak barne hartzen dituen talde berezia da", "diagnosis_ram_verylow": "Sistemak RAM memoriaren {available} ({available_percent}%) dauka bakarrik erabilgarri! ({total} orotara)", - "diagnosis_ram_low": "Sistemak {available} soilik du erabilgarri, RAM memoriaren ({available_percent}%) ({total} orotara). Kontuz ibili.", - "diagnosis_ram_ok": "Sistemak oraindik dauka RAM memoriaren {available} ({available_percent}%) erabilgarri, {total} orotara.", - "diagnosis_swap_none": "Sistemak ez du swap-ik. Gutxienez {recommended} gehitzen saiatu beharko zinateke, sistema memoriarik gabe gera ez dadin.", - "diagnosis_swap_ok": "Sistemak {total} swap dauka!", - "diagnosis_regenconf_allgood": "Konfigurazio fitxategi guztiak bat datoz gomendatutako ezarpenekin!", + "diagnosis_ram_low": "RAM memoriaren {available} ditu erabilgarri sistemak; memoria guztiaren {total} %{available_percent}a. Adi ibili.", + "diagnosis_ram_ok": "RAM memoriaren {available} ditu oraindik erabilgarri sistemak; memoria guztiaren {total} %{available_percent}a.", + "diagnosis_swap_none": "Sistemak ez du swap-ik. Gutxienez {recommended} izaten saiatu beharko zinateke, sistema memoriarik gabe gera ez dadin.", + "diagnosis_swap_ok": "Sistemak {total} swap dauzka!", + "diagnosis_regenconf_allgood": "Konfigurazio-fitxategi guztiak bat datoz gomendatutako ezarpenekin!", "diagnosis_regenconf_manually_modified": "Dirudienez {file} konfigurazio fitxategia eskuz aldatu da.", "diagnosis_security_vulnerable_to_meltdown": "Badirudi Meltdown izeneko segurtasun arazo larriak eragin diezazukela", "diagnosis_ports_could_not_diagnose": "Ezinezkoa izan da atakak IPv{ipversion} erabiliz kanpotik eskuragarri dauden egiaztatzea.", @@ -400,18 +400,18 @@ "diagnosis_mail_fcrdns_different_from_ehlo_domain_details": "Oraingo alderantzizko DNSa: {rdns_domain}
Esperotako balioa: {ehlo_domain}", "diagnosis_mail_queue_too_big": "Mezu gehiegi posta elektronikoaren ilaran: ({nb_pending} mezu)", "diagnosis_ports_could_not_diagnose_details": "Errorea: {error}", - "diagnosis_swap_tip": "Mesedez, kontutan hartu zerbitzari honen swap memoria SD edo SSD euskarri batean gordetzen bada, euskarri horren bizi-iraupena izugarri laburtu dezakeela.", + "diagnosis_swap_tip": "Mesedez, kontuan hartu zerbitzari honen swap memoria SD edo SSD euskarri batean gordetzeak euskarri horren bizi-iraupena izugarri laburtu dezakeela.", "invalid_regex": "'Regexa' ez da zuzena: '{regex}'", "group_creation_failed": "Ezinezkoa izan da '{group}' taldea sortzea: {error}", "log_user_permission_reset": "Berrezarri '{}' baimena", "group_cannot_edit_primary_group": "'{group}' taldea ezin da eskuz moldatu. Erabiltzaile zehatz bakar bat duen talde nagusia da.", - "diagnosis_swap_notsomuch": "Sistemak {total} swap baino ez du. Gutxienez {recommended} gehitzen saiatu beharko zinateke sistema memoriarik gabe gera ez dadin.", + "diagnosis_swap_notsomuch": "Sistemak {total} swap baino ez ditu. Gutxienez {recommended} izaten saiatu beharko zinateke sistema memoriarik gabe gera ez dadin.", "diagnosis_security_vulnerable_to_meltdown_details": "Arazoa konpontzeko, sistema eguneratu eta berrabiarazi beharko zenuke linux-en kernel berriagoa erabiltzeko (edo zerbitzariaren arduradunarekin jarri harremanetan). Ikus https://meltdownattack.com/ argibide gehiagorako.", "diagnosis_services_conf_broken": "{service} zerbitzuko konfigurazioa hondatuta dago!", "diagnosis_services_bad_status_tip": "Zerbitzua berrabiarazten saia zaitezke eta nahikoa ez bada, aztertu zerbitzuaren erregistroa administrariaren webgunean. (komandoak nahiago badituzu yunohost service restart {service} eta yunohost service log {service} hurrenez hurren).", "diagnosis_mail_ehlo_unreachable_details": "Ezinezkoa izan da zure zerbitzariko 25. atakari konektatzea IPv{ipversion} erabiliz. Badirudi ez dagoela eskuragarri.
1. Arazo honen zergati ohikoena 25. ataka egoki birbideratuta ez egotea da.
2. Egiaztatu postfix zerbitzua martxan dagoela.
3. Konfigurazio konplexuagoetan: egiaztatu suebaki edo reverse-proxyak konexioa oztopatzen ez dutela.", "group_already_exist_on_system_but_removing_it": "{group} taldea existitzen da sistemaren taldeetan, baina YunoHostek ezabatuko du…", - "diagnosis_mail_fcrdns_nok_details": "Lehenik eta behin zure routerraren konfigurazio gunean edo hostingaren enprearen aukeretan alderantzizko DNSa konfiguratzen saiatu beharko zinateke {ehlo_domain} erabiliz. (Hosting enpresaren arabera, ezinbestekoa da beraiekin harremanetan jartzea).", + "diagnosis_mail_fcrdns_nok_details": "Lehenik eta behin zure routerraren konfigurazio gunean edo hostingaren enpresaren aukeretan alderantzizko DNSa konfiguratzen saiatu beharko zinateke {ehlo_domain} erabiliz. (Hosting enpresaren arabera, ezinbestekoa da beraiekin harremanetan jartzea).", "diagnosis_mail_outgoing_port_25_ok": "SMTP posta zerbitzaria posta elektronikoa bidaltzeko gai da (25. atakaren irteera ez dago blokeatuta).", "diagnosis_ports_partially_unreachable": "{port}. ataka ez dago eskuragarri kanpotik Pv{failed} erabiliz.", "diagnosis_ports_forwarding_tip": "Arazoa konpontzeko, litekeena da operadorearen routerrean ataken birbideraketa konfiguratu behar izatea, https://yunohost.org/isp_box_config-n agertzen den bezala", @@ -458,7 +458,7 @@ "global_settings_setting_smtp_relay_user": "SMTP relay erabiltzailea", "domain_cert_gen_failed": "Ezinezkoa izan da ziurtagiria sortzea", "field_invalid": "'{}' ez da baliogarria", - "diagnosis_mail_outgoing_port_25_blocked_relay_vpn": "Operadore batzuei bost axola zaie internetaren neutraltasuna (Net Neutrality) eta ez dute 25. ataka desblokeatzen uzten.
- Operadore batzuek relay posta zerbitzari bat eskaini dezakete, baina kasu horretan zure posta elektronikoa zelatatu dezakete.
- Pribatutasuna bermatzeko *IP publiko bat duen* VPN bat erabiltzea izan daiteke irtenbidea. Ikus https://yunohost.org/#/vpn_advantage
- Edo operadore desberdin batera aldatu", + "diagnosis_mail_outgoing_port_25_blocked_relay_vpn": "Operadore batzuei bost axola zaie internetaren neutraltasuna (Net Neutrality) eta ez dute 25. ataka desblokeatzen uzten.
- Operadore batzuek relay posta zerbitzari bat eskaini dezakete, baina kasu horretan zure posta elektronikoa zelatatu dezakete.
- Pribatutasuna bermatzeko *IP publikoa* duen VPN bat erabiltzea izan daiteke irtenbidea. Ikus https://yunohost.org/#/vpn_advantage
- Edo operadore desberdin batera aldatu", "ldap_server_down": "Ezin izan da LDAP zerbitzarira konektatu", "ldap_server_is_down_restart_it": "LDAP zerbitzaria ez dago martxan, saia zaitez berrabiarazten…", "log_app_upgrade": "'{}' aplikazioa eguneratu", @@ -506,7 +506,7 @@ "migration_0015_not_stretch": "Debianen oraingo bertsioa ez da Stretch!", "migrations_success_forward": "{id} migrazioak amaitu du", "migrations_to_be_ran_manually": "{id} migrazioa eskuz abiarazi behar da. Mesedez, joan Erramintak → Migrazioak atalera administrazio-webgunean edo bestela exekutatu 'yunohost tools migrations run'.", - "permission_currently_allowed_for_all_users": "Baimen hau erabiltzaile guztiei esleitzen zaio eta baita beste talde batzuei ere. Litekeena da 'all users' baimena edo esleituta duten taldeei baimena kendu nahi izatea.", + "permission_currently_allowed_for_all_users": "Baimen hau erabiltzaile guztiei esleitzen zaie eta baita beste talde batzuei ere. Litekeena da 'all users' baimena edo esleituta duten taldeei baimena kendu nahi izatea.", "permission_require_account": "'{permission}' baimena zerbitzarian kontua duten erabiltzaileentzat da eta, beraz, ezin da gaitu bisitarientzat.", "postinstall_low_rootfsspace": "'root' fitxategi-sistemak 10 GB edo espazio gutxiago dauka, kezkatzekoa dena! Litekeena da espaziorik gabe geratzea aurki! Gomendagarria da 'root' fitxategi-sistemak gutxienez 16 GB libre izatea. Jakinarazpen honen ondoren YunoHost instalatzen jarraitu nahi baduzu, berrabiarazi agindua '--force-diskspace' gehituz", "this_action_broke_dpkg": "Eragiketa honek dpkg/APT (sistemaren pakete kudeatzaileak) kaltetu ditu… Arazoa konpontzeko SSH bidez konektatu eta 'sudo apt install --fix-broken' edota 'sudo dpkg --configure -a' exekutatu dezakezu.", @@ -559,7 +559,7 @@ "user_import_nothing_to_do": "Ez dago erabiltzaileak inportatu beharrik", "mailbox_used_space_dovecot_down": "Dovecot mailbox zerbitzua martxan egon behar da postak erabilitako espazioa ezagutzeko", "migration_0015_cleaning_up": "Beharrezkoak ez diren cache eta paketeak kentzen…", - "migration_0015_modified_files": "Mesedez, kontutan hartu ondorengo fitxategiak eskuz aldatu direla eta sistema eguneratzean euren gainean idatziko dela: {manually_modified_files}", + "migration_0015_modified_files": "Mesedez, kontuan hartu ondorengo fitxategiak eskuz aldatu direla eta sistema eguneratzean euren gainean idatziko dela: {manually_modified_files}", "migration_0015_not_enough_free_space": "/var/ fitxategi-sisteman oso espazio gutxi geratzen da! Gutxienez GB bat izan behar da migrazioa abiarazteko.", "migration_0015_weak_certs": "Sinadura-algoritmo ahulak darabiltzaten ziurtagiriak aurkitu dira eta eguneratu behar dira nginx-en hurrengo bertsioarekin bateragarriak izateko: {certs}", "migration_description_0017_postgresql_9p6_to_11": "Migratu datubaseak PostgreSQL 9.6-tik 11-ra", @@ -637,7 +637,7 @@ "migration_0015_main_upgrade": "Eguneraketa orokorra abiarazten…", "migration_ldap_backup_before_migration": "Sortu LDAP datubase eta aplikazioen ezarpenen babeskopia migrazioa abiarazi baino lehen.", "migration_ldap_can_not_backup_before_migration": "Sistemaren babeskopiak ez du amaitu migrazioak huts egin baino lehen. Errorea: {error}", - "migration_0015_problematic_apps_warning": "Mesedez, kontutan izan arazoak sor ditzaketen aplikazioak aurkitu direla. Badirudi ez zirela YunoHosten aplikazioen katalogotik instalatu, edo 'ez dabiltza' etiketa dute. Beraz, ezin da bermatu eguneratu eta gero funtzionatuko dutenik: {problematic_apps}", + "migration_0015_problematic_apps_warning": "Mesedez, kontuan izan arazoak sor ditzaketen aplikazioak aurkitu direla. Badirudi ez zirela YunoHosten aplikazioen katalogotik instalatu, edo 'ez dabiltza' etiketa dute. Beraz, ezin da bermatu eguneratu eta gero funtzionatuko dutenik: {problematic_apps}", "migration_0017_not_enough_space": "Espazio gehiago behar da {path}-n migrazioa exekutatzeko.", "migration_0017_postgresql_11_not_installed": "PostgreSQL 9.6 instalatuta egon arren postgresql 11 ez‽ Zerbait arraroa gertatu da zure sisteman :(…", "migration_0018_failed_to_reset_legacy_rules": "Ezinezkoa izan da zaharkitutako iptaulak berrezartzea: {error}", @@ -704,5 +704,5 @@ "service_description_redis-server": "Datuak bizkor atzitzeko, zereginak lerratzeko eta programen arteko komunikaziorako datubase berezi bat da", "service_description_rspamd": "Spama bahetu eta posta elektronikoarekin zerikusia duten bestelako futzioen ardura dauka", "service_description_slapd": "Erabiltzaileak, domeinuak eta hauei lotutako informazioa gordetzen du", - "service_description_yunohost-api": "YunoHosten web-interfazearen eta sistemaren arteko hartuemana kudeatzen du" + "service_description_yunohost-api": "YunoHosten web-atariaren eta sistemaren arteko hartuemana kudeatzen du" } From 2d89e15671bf9312d411dfc153d551f7878714d8 Mon Sep 17 00:00:00 2001 From: punkrockgirl Date: Thu, 4 Nov 2021 17:37:09 +0000 Subject: [PATCH 103/619] Translated using Weblate (Basque) Currently translated at 100.0% (705 of 705 strings) Translation: YunoHost/core Translate-URL: https://translate.yunohost.org/projects/yunohost/core/eu/ --- locales/eu.json | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/locales/eu.json b/locales/eu.json index f8469c37e..b5f98dec5 100644 --- a/locales/eu.json +++ b/locales/eu.json @@ -36,7 +36,7 @@ "danger": "Arriskua:", "diagnosis_dns_discrepancy": "Ez dirudi ondorengo DNS balioak bat datozenik proposatutako konfigurazioarekin:
Mota: {type}
Izena: {name}
Oraingo balioa: {current}
Proposatutako balioa: {value}", "diagnosis_dns_specialusedomain": "{domain} domeinua top-level domain (TLD) erabilera berezikoa da .local edo .test bezala eta horregatik ez du DNS erregistrorik erabiltzeko beharrik.", - "diagnosis_http_bad_status_code": "Badirudi zerbitzari hau ez den beste gailu batek erantzun diola eskaerari (agian routerrak).
1. Honen arrazoi ohikoena 80 (eta 443) ataka zerbitzarira ondo birbidaltzen ez dela da.
2. Konfigurazio konplexua badarabilzu, egiaztatu suebakiak edo reverse-proxyk oztopatzen ez dutela.", + "diagnosis_http_bad_status_code": "Zerbitzari hau ez den beste gailu batek erantzun omen dio eskaerari (agian routerrak).
1. Honen arrazoi ohikoena 80 (eta 443) ataka zerbitzarira ondo birbidaltzen ez dela da.
2. Konfigurazio konplexua badarabilzu, egiaztatu suebakiak edo reverse-proxyk oztopatzen ez dutela.", "diagnosis_http_timeout": "Denbora agortu da sare lokaletik kanpo zure zerbitzarira konektatzeko ahaleginean. Eskuragarri ez dagoela dirudi.
1. 80 (eta 443) ataka zerbitzarira modu egokian birzuzentzen ez direla da ohiko zergatia.
2. Badaezpada egiaztatu nginx martxan dagoela.
3. Konfigurazio konplexuetan, egiaztatu suebakiak edo reverse-proxyk konexioa oztopatzen ez dutela.", "app_sources_fetch_failed": "Ezinezkoa izan da fitxategiak eskuratzea, zuzena al da URLa?", "app_make_default_location_already_used": "Ezinezkoa izan da '{app}' '{domain}' domeinuan lehenestea, '{other_app}'(e)k dagoeneko '{domain}' erabiltzen duelako", @@ -149,7 +149,7 @@ "diagnosis_dns_point_to_doc": "Mesedez, irakurri dokumentazioa DNS erregistroekin laguntza behar baduzu.", "diagnosis_mail_ehlo_unreachable": "SMTP posta zerbitzaria ez dago eskuragarri IPv{ipversion}ko sare lokaletik kanpo eta, beraz, ez da posta elektronikoa jasotzeko gai.", "diagnosis_mail_ehlo_bad_answer_details": "Litekeena da zure zerbitzaria ez den beste gailu batek erantzun izana.", - "diagnosis_mail_blacklist_listed_by": "Zure {item} IPa edo domeinua {blacklist_name} zerrenda beltzean ageri da", + "diagnosis_mail_blacklist_listed_by": "Zure domeinua edo {item} IPa {blacklist_name} zerrenda beltzean ageri da", "diagnosis_mail_blacklist_website": "Zerrenda beltzean zergatik zauden ulertu eta konpondu ondoren, {blacklist_website} webgunean zure IP edo domeinua bertatik atera dezatela eska dezakezu", "diagnosis_http_could_not_diagnose_details": "Errorea: {error}", "diagnosis_http_hairpinning_issue": "Dirudienez zure sareak ez du hairpinninga gaituta.", @@ -238,8 +238,8 @@ "diagnosis_backports_in_sources_list": "Dirudienez apt (pakete kudeatzailea) backports biltegia erabiltzeko konfiguratuta dago. Zertan ari zaren ez badakizu, ez zenuke backports biltegietako aplikaziorik instalatu beharko, ezegonkortasun eta gatazkak eragin ditzaketelako sistemarekin.", "app_restore_failed": "Ezinezkoa izan da {app} lehengoratzea: {error}", "diagnosis_apps_allgood": "Instalatutako aplikazioek oinarrizko pakete-jarraibideekin bat egiten dute", - "diagnosis_apps_bad_quality": "Aplikazio hau hondatuta dagoela dio YunoHosten aplikazioen katalogoak. Agian behin-behineko kontua da arduradunak arazoa konpondu bitartean. Momentuz, ezin da aplikazioa eguneratu.", - "diagnosis_apps_broken": "Aplikazio hau YunoHosten aplikazioen katalogoan hondatuta dagoela ageri da. Agian behin-behineko kontua da arduradunak konpondu bitartean. Momentuz, ezin da aplikazioa eguneratu.", + "diagnosis_apps_bad_quality": "Aplikazio hau hondatuta dagoela dio YunoHosten aplikazioen katalogoak. Agian behin-behineko kontua da arduradunak arazoa konpondu bitartean. Oraingoz, ezin da aplikazioa eguneratu.", + "diagnosis_apps_broken": "Aplikazio hau YunoHosten aplikazioen katalogoan hondatuta dagoela ageri da. Agian behin-behineko kontua da arduradunak konpondu bitartean. Oraingoz, ezin da aplikazioa eguneratu.", "diagnosis_apps_deprecated_practices": "Instalatutako aplikazio honen bertsioak oraindik darabiltza zaharkitutako pakete-jarraibideak. Eguneratzea hausnartu beharko zenuke.", "diagnosis_apps_issue": "Arazo bat dago {app} aplikazioarekin", "diagnosis_apps_not_in_app_catalog": "Aplikazio hau ez da YunoHosten aplikazioen katalogokoa. Iraganean egon bazen eta ezabatu izan balitz, desinstalatzea litzateke onena, ez baitu eguneraketarik jasoko eta sistemaren integritate eta segurtasuna arriskuan jarri lezakeelako.", @@ -316,7 +316,7 @@ "domain_dns_push_record_failed": "Ezinezkoa izan da {type}/{name} ezarpenak {action}: {error}", "domain_dns_push_success": "DNS ezarpenak eguneratu dira!", "domain_dns_push_failed": "DNS ezarpenen eguneratzeak kale egin du.", - "domain_dns_push_partial_failure": "DNS ezarpenak hala-nola eguneratu dira: jakinarazpen/errore batzuk egon dira.", + "domain_dns_push_partial_failure": "DNS ezarpenak erdipurdi eguneratu dira: jakinarazpen/errore batzuk egon dira.", "global_settings_setting_smtp_relay_host": "YunoHosten ordez posta elektronikoa bidaltzeko SMTP relay helbidea. Erabilgarri izan daiteke egoera hauetan: operadore edo VPS enpresak 25. ataka blokeatzen badu, DUHLen zure etxeko IPa ageri bada, ezin baduzu alderantzizko DNSa ezarri edo zerbitzari hau ez badago zuzenean internetera konektatuta baina posta elektronikoa bidali nahi baduzu.", "group_deletion_failed": "Ezinezkoa izan da '{group}' taldea ezabatzea: {error}", "invalid_number_min": "{min} baino handiagoa izan behar da", @@ -379,9 +379,9 @@ "diagnosis_mail_queue_unavailable": "Ezinezkoa da ilaran zenbat posta elektroniko dauden kontsultatzea", "log_user_create": "Gehitu '{}' erabiltzailea", "group_cannot_edit_visitors": "'bisitariak' taldea ezin da eskuz moldatu. Saiorik hasi gabeko bisitariak barne hartzen dituen talde berezia da", - "diagnosis_ram_verylow": "Sistemak RAM memoriaren {available} ({available_percent}%) dauka bakarrik erabilgarri! ({total} orotara)", - "diagnosis_ram_low": "RAM memoriaren {available} ditu erabilgarri sistemak; memoria guztiaren {total} %{available_percent}a. Adi ibili.", - "diagnosis_ram_ok": "RAM memoriaren {available} ditu oraindik erabilgarri sistemak; memoria guztiaren {total} %{available_percent}a.", + "diagnosis_ram_verylow": "RAM memoriaren {available} baino ez ditu erabilgarri sistemak; memoria guztiaren ({total}) %{available_percent}a bakarrik!", + "diagnosis_ram_low": "RAM memoriaren {available} ditu erabilgarri sistemak; memoria guztiaren ({total}) %{available_percent}a. Adi ibili.", + "diagnosis_ram_ok": "RAM memoriaren {available} ditu oraindik erabilgarri sistemak; memoria guztiaren ({total}) %{available_percent}a.", "diagnosis_swap_none": "Sistemak ez du swap-ik. Gutxienez {recommended} izaten saiatu beharko zinateke, sistema memoriarik gabe gera ez dadin.", "diagnosis_swap_ok": "Sistemak {total} swap dauzka!", "diagnosis_regenconf_allgood": "Konfigurazio-fitxategi guztiak bat datoz gomendatutako ezarpenekin!", @@ -396,7 +396,7 @@ "diagnosis_mail_outgoing_port_25_blocked": "SMTP posta zerbitzariak ezin ditu posta elektronikoak bidali 25. ataka itxita dagoelako IPv{ipversion}n.", "diagnosis_mail_outgoing_port_25_blocked_details": "Lehenik eta behin operadorearen routerreko aukeretan saiatu beharko zinateke 25. ataka desblokeatzen. (Hosting enpresaren arabera, beraiekin harremanetan jartzea beharrezkoa izango da).", "diagnosis_mail_ehlo_wrong_details": "Kanpo-diagnostikatzaileak IPv{ipversion}an jaso duen EHLOa eta zure zerbitzariaren domeinukoa ez datoz bat.
Jasotako EHLOa: {wrong_ehlo}
Esperotakoa: {right_ehlo}
Arazo honen zergati ohikoena 25. ataka zuzen konfiguratuta ez egotea da. Edo agian suebaki edo reverse-proxya oztopo izan daiteke.", - "diagnosis_mail_fcrdns_different_from_ehlo_domain": "Alderantzizko DNSa ez dago zuzen konfiguratuta IPv{ipversion}an. Litekeena da posta elektroniko batzuk hartzaileak jaso ezin izatea edo spam modura etiketatuak izatea.", + "diagnosis_mail_fcrdns_different_from_ehlo_domain": "Alderantzizko DNSa ez dago zuzen konfiguratuta IPv{ipversion}an. Litekeena da hartzaileak posta elektroniko batzuk jaso ezin izatea edo mezuok spam modura etiketatuak izatea.", "diagnosis_mail_fcrdns_different_from_ehlo_domain_details": "Oraingo alderantzizko DNSa: {rdns_domain}
Esperotako balioa: {ehlo_domain}", "diagnosis_mail_queue_too_big": "Mezu gehiegi posta elektronikoaren ilaran: ({nb_pending} mezu)", "diagnosis_ports_could_not_diagnose_details": "Errorea: {error}", @@ -467,7 +467,7 @@ "log_user_update": "Eguneratu '{}' erabiltzailearen informazioa", "dyndns_no_domain_registered": "Ez dago DynDNSrekin izena emandako domeinurik", "global_settings_bad_type_for_setting": "{setting} ezarpenerako mota okerra. {received_type} ezarri da, {expected_type} espero zen", - "diagnosis_mail_fcrdns_dns_missing": "Ez da alderantzizko DNSrik ezarri IPv{ipversion}rako. Litekeena da posta elektroniko batzuk hartzaileak jaso ezin izatea edo spam modura etiketatuak izatea.", + "diagnosis_mail_fcrdns_dns_missing": "Ez da alderantzizko DNSrik ezarri IPv{ipversion}rako. Litekeena da hartzaileak posta elektroniko batzuk jaso ezin izatea edo mezuok spam modura etiketatuak izatea.", "log_backup_create": "Sortu babeskopia fitxategia", "global_settings_setting_backup_compress_tar_archives": "Babeskopia berriak sortzean, konprimitu fitxategiak (.tar.gz) konprimitu gabeko fitxategien (.tar) ordez. Aukera hau gaitzean babeskopiek espazio gutxiago beharko dute, baina hasierako prozesua luzeagoa izango da eta CPUari lan handiagoa eragingo dio.", "global_settings_setting_security_webadmin_allowlist": "Administrazio-webgunea bisita ditzaketen IP helbideak, koma bidez bereiziak.", From 6ec12e92a6889ea30bd5e97c053710a3936bebe8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Quent=C3=AD?= Date: Thu, 4 Nov 2021 20:13:54 +0000 Subject: [PATCH 104/619] Translated using Weblate (Occitan) Currently translated at 50.0% (353 of 705 strings) Translation: YunoHost/core Translate-URL: https://translate.yunohost.org/projects/yunohost/core/oc/ --- locales/oc.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/locales/oc.json b/locales/oc.json index a2a5bfe31..a794f5e04 100644 --- a/locales/oc.json +++ b/locales/oc.json @@ -78,8 +78,8 @@ "upnp_enabled": "UPnP es activat", "upnp_port_open_failed": "Impossible de dobrir los pòrts amb UPnP", "yunohost_already_installed": "YunoHost es ja installat", - "yunohost_configured": "YunoHost es estat configurat", - "yunohost_installing": "Installacion de YunoHost…", + "yunohost_configured": "YunoHost es ara configurat", + "yunohost_installing": "Installacion de YunoHost...", "backup_csv_creation_failed": "Creacion impossibla del fichièr CSV necessari a las operacions futuras de restauracion", "backup_output_symlink_dir_broken": "Vòstre repertòri d’archiu « {path} » es un ligam simbolic copat. Saique oblidèretz de re/montar o de connectar supòrt.", "backup_with_no_backup_script_for_app": "L’aplicacion {app} a pas cap de script de salvagarda. I fasèm pas cas.", @@ -144,7 +144,7 @@ "restore_already_installed_app": "Una aplicacion es ja installada amb l’id « {app} »", "app_restore_failed": "Impossible de restaurar l’aplicacion « {app} »: {error}", "backup_ask_for_copying_if_needed": "Volètz far una salvagarda en utilizant {size} Mo temporàriament ? (Aqueste biais de far es emplegat perque unes fichièrs an pas pogut èsser preparats amb un metòde mai eficaç.)", - "yunohost_not_installed": "YunoHost es pas installat o corrèctament installat. Mercés d’executar « yunohost tools postinstall »", + "yunohost_not_installed": "YunoHost es pas corrèctament installat. Mercés d’executar « yunohost tools postinstall »", "backup_output_directory_forbidden": "Causissètz un repertòri de destinacion deferent. Las salvagardas pòdon pas se realizar dins los repertòris bin, /boot, /dev, /etc, /lib, /root, /run, /sbin, /sys, /usr, /var ou /home/yunohost.backup/archives", "certmanager_attempt_to_replace_valid_cert": "Sètz a remplaçar un certificat corrècte e valid pel domeni {domain} ! (Utilizatz --force per cortcircuitar)", "certmanager_cert_renew_success": "Renovèlament capitat d’un certificat Let’s Encrypt pel domeni « {domain} »", @@ -513,4 +513,4 @@ "diagnosis_domain_expiration_not_found": "Impossible de verificar la data d’expiracion d’unes domenis", "backup_create_size_estimation": "L’archiu contendrà apr’aquí {size} de donadas.", "app_restore_script_failed": "Una error s’es producha a l’interior del script de restauracion de l’aplicacion" -} \ No newline at end of file +} From 875677a8632375647654194068ace6153e91c6fa Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Fri, 5 Nov 2021 02:33:48 +0100 Subject: [PATCH 105/619] Update changelog for 4.3.2 --- debian/changelog | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/debian/changelog b/debian/changelog index a7d6c2445..88d29d377 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,12 @@ +yunohost (4.3.2) stable; urgency=low + + - Release as stable + - [i18n] Translations updated for Basque, Occitan + + Thanks to all contributors <3 ! (punkrockgirl, Quentí) + + -- Alexandre Aubin Fri, 05 Nov 2021 02:32:56 +0100 + yunohost (4.3.1.8) testing; urgency=low - [enh] dyndns: Drop some YAGNI + improve IPv6-only support + resilience w.r.t. ns0 / ns1 being down (a61d0231, [#1367](https://github.com/YunoHost/yunohost/pull/1367)) From 09d5f6ea0029c73a49175dcb9675d522248d24fd Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Fri, 5 Nov 2021 12:07:16 +0100 Subject: [PATCH 106/619] Update nodejs --- data/helpers.d/nodejs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/data/helpers.d/nodejs b/data/helpers.d/nodejs index 69e9ce445..e7e61b0c6 100644 --- a/data/helpers.d/nodejs +++ b/data/helpers.d/nodejs @@ -1,6 +1,6 @@ #!/bin/bash -n_version=7.5.0 +n_version=8.0.0 n_install_dir="/opt/node_n" node_version_path="$n_install_dir/n/versions/node" # N_PREFIX is the directory of n, it needs to be loaded as a environment variable. @@ -16,7 +16,7 @@ export N_PREFIX="$n_install_dir" ynh_install_n() { # Build an app.src for n echo "SOURCE_URL=https://github.com/tj/n/archive/v${n_version}.tar.gz -SOURCE_SUM=d4da7ea91f680de0c9b5876e097e2a793e8234fcd0f7ca87a0599b925be087a3" >"$YNH_APP_BASEDIR/conf/n.src" +SOURCE_SUM=9e8879dc4f1c4c0fe4e08a108ed6c23046419b6865fe922ca5176ff7998ae6ff" >"$YNH_APP_BASEDIR/conf/n.src" # Download and extract n ynh_setup_source --dest_dir="$n_install_dir/git" --source_id=n # Install n From 3da2df6e292cd3efd2d708b512fd55cf7b42b8c0 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Fri, 5 Nov 2021 16:34:33 +0100 Subject: [PATCH 107/619] mdns: Add possibility to manually add .local aliases via /etc/yunohost/mdns.aliases (meant for internetcube) --- data/hooks/conf_regen/37-mdns | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/data/hooks/conf_regen/37-mdns b/data/hooks/conf_regen/37-mdns index 52213c297..f45356db9 100755 --- a/data/hooks/conf_regen/37-mdns +++ b/data/hooks/conf_regen/37-mdns @@ -11,6 +11,10 @@ _generate_config() { [[ "$domain" =~ ^[^.]+\.local$ ]] || continue echo " - $domain" done + for localalias in $(cat /etc/yunohost/mdns.aliases | grep -v "^ *$") + do + echo " - $localalias.local" + done } do_init_regen() { From 69b8603f148aee400660ec19398780826f99db20 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Fri, 5 Nov 2021 16:41:33 +0100 Subject: [PATCH 108/619] mdns: Aaaaand we don't want to crash if mdns.aliases doesnt exists obviously --- data/hooks/conf_regen/37-mdns | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/data/hooks/conf_regen/37-mdns b/data/hooks/conf_regen/37-mdns index f45356db9..faa581efa 100755 --- a/data/hooks/conf_regen/37-mdns +++ b/data/hooks/conf_regen/37-mdns @@ -11,10 +11,13 @@ _generate_config() { [[ "$domain" =~ ^[^.]+\.local$ ]] || continue echo " - $domain" done - for localalias in $(cat /etc/yunohost/mdns.aliases | grep -v "^ *$") - do - echo " - $localalias.local" - done + if [[ -e /etc/yunohot/mdns.aliases ]] + then + for localalias in $(cat /etc/yunohost/mdns.aliases | grep -v "^ *$") + do + echo " - $localalias.local" + done + fi } do_init_regen() { From 6558b23dd6fb2402edf9578b7c8419c8aef41ca8 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Sat, 6 Nov 2021 15:54:34 +0100 Subject: [PATCH 109/619] Fix conflict with redis-server --- debian/control | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/debian/control b/debian/control index fe18b1de8..f99fe25a9 100644 --- a/debian/control +++ b/debian/control @@ -45,7 +45,7 @@ Conflicts: iptables-persistent , openssl (>= 1.1.1g) , slapd (>= 2.4.49) , dovecot-core (>= 1:2.3.7) - , redis-server (>= 5:5.0.7) + , redis-server (>= 5:5.1) , fail2ban (>= 0.11) , iptables (>= 1.8.3) Description: manageable and configured self-hosting server From 1cc3e44038746455dc5008ad2cae7f81abe9bc0e Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Sat, 6 Nov 2021 16:45:25 +0100 Subject: [PATCH 110/619] nginx: Refine experimental CSP header (in the end still gotta enable unsafe-inline and unsafe-eval for a bunch of things, but better than no policy at all...) --- data/templates/nginx/security.conf.inc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/data/templates/nginx/security.conf.inc b/data/templates/nginx/security.conf.inc index bcb821770..8d261daeb 100644 --- a/data/templates/nginx/security.conf.inc +++ b/data/templates/nginx/security.conf.inc @@ -26,11 +26,11 @@ ssl_dhparam /usr/share/yunohost/other/ffdhe2048.pem; # https://wiki.mozilla.org/Security/Guidelines/Web_Security # https://observatory.mozilla.org/ {% if experimental == "True" %} -more_set_headers "Content-Security-Policy : upgrade-insecure-requests; default-src https: data:"; +more_set_headers "Content-Security-Policy : upgrade-insecure-requests; default-src https: data: blob: ; object-src https: data: 'unsafe-inline'; style-src https: data: 'unsafe-inline' ; script-src https: data: 'unsafe-inline' 'unsafe-eval'"; {% else %} more_set_headers "Content-Security-Policy : upgrade-insecure-requests"; +more_set_headers "Content-Security-Policy-Report-Only : default-src https: data: blob: ; object-src https: data: 'unsafe-inline'; style-src https: data: 'unsafe-inline' ; script-src https: data: 'unsafe-inline' 'unsafe-eval'"; {% endif %} -more_set_headers "Content-Security-Policy-Report-Only : default-src https: data: 'unsafe-inline' 'unsafe-eval' "; more_set_headers "X-Content-Type-Options : nosniff"; more_set_headers "X-XSS-Protection : 1; mode=block"; more_set_headers "X-Download-Options : noopen"; From e6effd49d80916a272f0961fc6a9dfcb6444d5d5 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Sat, 6 Nov 2021 16:59:10 +0100 Subject: [PATCH 111/619] Update changelog for 4.3.2.1 --- debian/changelog | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/debian/changelog b/debian/changelog index 88d29d377..732e4af7b 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,11 @@ +yunohost (4.3.2.1) stable; urgency=low + + - [enh] mdns: Add possibility to manually add .local aliases via /etc/yunohost/mdns.aliases (meant for internetcube) (3da2df6e) + - [fix] debian: Fix conflict with redis-server (6558b23d) + - [fix] nginx: Refine experimental CSP header (in the end still gotta enable unsafe-inline and unsafe-eval for a bunch of things, but better than no policy at all...) (1cc3e440) + + -- Alexandre Aubin Sat, 06 Nov 2021 16:58:07 +0100 + yunohost (4.3.2) stable; urgency=low - Release as stable From 74e2a51e4daa0e2eca5f3c984e7822358935a4a1 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Sat, 6 Nov 2021 17:39:46 +0100 Subject: [PATCH 112/619] nginx: Try to fix again the webadmin cache hell --- data/templates/nginx/yunohost_admin.conf.inc | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/data/templates/nginx/yunohost_admin.conf.inc b/data/templates/nginx/yunohost_admin.conf.inc index 150fce6f6..b5eff7a5e 100644 --- a/data/templates/nginx/yunohost_admin.conf.inc +++ b/data/templates/nginx/yunohost_admin.conf.inc @@ -13,6 +13,12 @@ location /yunohost/admin/ { deny all; {% endif %} + location = /yunohost/admin/index.html { + etag off; + expires off; + more_set_headers "Cache-Control: no-store, no-cache, must-revalidate"; + } + more_set_headers "Content-Security-Policy: upgrade-insecure-requests; default-src 'self'; connect-src 'self' https://paste.yunohost.org wss://$host; style-src 'self' 'unsafe-inline'; script-src 'self' 'unsafe-eval'; object-src 'none'; img-src 'self' data:;"; more_set_headers "Content-Security-Policy-Report-Only:"; } From 5a08206837c6ed593bc2cee0514aaf2ee32ea1d8 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Sat, 6 Nov 2021 17:40:31 +0100 Subject: [PATCH 113/619] Update changelog for 4.3.2.2 --- debian/changelog | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/debian/changelog b/debian/changelog index 732e4af7b..7adbe59dc 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,9 @@ +yunohost (4.3.2.2) stable; urgency=low + + - [fix] nginx: Try to fix again the webadmin cache hell (74e2a51e) + + -- Alexandre Aubin Sat, 06 Nov 2021 17:39:58 +0100 + yunohost (4.3.2.1) stable; urgency=low - [enh] mdns: Add possibility to manually add .local aliases via /etc/yunohost/mdns.aliases (meant for internetcube) (3da2df6e) From fff1a8a4d682ca8177e49bcb66420dd5e516e811 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Sat, 6 Nov 2021 18:58:31 +0100 Subject: [PATCH 114/619] [enh] Smarter API self-upgrade mechanics --- debian/postinst | 11 +++ debian/rules | 2 +- src/yunohost/tools.py | 169 ++++++++++-------------------------------- 3 files changed, 51 insertions(+), 131 deletions(-) diff --git a/debian/postinst b/debian/postinst index 0dd1dedd0..b49260ae5 100644 --- a/debian/postinst +++ b/debian/postinst @@ -33,6 +33,17 @@ do_configure() { yunohost diagnosis run --force fi + # Trick to let yunohost handle the restart of the API, + # to prevent the webadmin from cutting the branch it's sitting on + if systemctl is-enabled yunohost-api --quiet + then + if [[ "${YUNOHOST_API_RESTART_WILL_BE_HANDLED_BY_YUNOHOST:-}" != "yes" ]]; + then + systemctl restart yunohost-api + else + echo "(Delaying the restart of yunohost-api, this should automatically happen after the end of this upgrade)" + fi + fi } # summary of how this script can be called: diff --git a/debian/rules b/debian/rules index 3790c0ef2..015143610 100755 --- a/debian/rules +++ b/debian/rules @@ -13,7 +13,7 @@ override_dh_auto_build: python3 doc/generate_manpages.py --gzip --output doc/yunohost.8.gz override_dh_installinit: - dh_installinit -pyunohost --name=yunohost-api --restart-after-upgrade + dh_installinit -pyunohost --name=yunohost-api --noscripts dh_installinit -pyunohost --name=yunohost-firewall --noscripts override_dh_systemd_enable: diff --git a/src/yunohost/tools.py b/src/yunohost/tools.py index fb9839814..ef84d98bd 100644 --- a/src/yunohost/tools.py +++ b/src/yunohost/tools.py @@ -531,19 +531,10 @@ def tools_upgrade( logger.info(m18n.n("upgrading_packages")) operation_logger.start() - # Critical packages are packages that we can't just upgrade - # randomly from yunohost itself... upgrading them is likely to - critical_packages = ["moulinette", "yunohost", "yunohost-admin", "ssowat"] - - critical_packages_upgradable = [ - p["name"] for p in upgradables if p["name"] in critical_packages - ] - noncritical_packages_upgradable = [ - p["name"] for p in upgradables if p["name"] not in critical_packages - ] - # Prepare dist-upgrade command dist_upgrade = "DEBIAN_FRONTEND=noninteractive" + if Moulinette.interface.type == "api": + dist_upgrade += "YUNOHOST_API_RESTART_WILL_BE_HANDLED_BY_YUNOHOST=yes" dist_upgrade += " APT_LISTCHANGES_FRONTEND=none" dist_upgrade += " apt-get" dist_upgrade += ( @@ -553,136 +544,54 @@ def tools_upgrade( dist_upgrade += ' -o Dpkg::Options::="--force-conf{}"'.format(conf_flag) dist_upgrade += " dist-upgrade" - # - # "Regular" packages upgrade - # - if noncritical_packages_upgradable: + logger.info(m18n.n("tools_upgrade")) - logger.info(m18n.n("tools_upgrade_regular_packages")) + logger.debug("Running apt command :\n{}".format(dist_upgrade)) - # Mark all critical packages as held - for package in critical_packages: - check_output("apt-mark hold %s" % package) + def is_relevant(line): + irrelevants = [ + "service sudo-ldap already provided", + "Reading database ...", + ] + return all(i not in line.rstrip() for i in irrelevants) - # Doublecheck with apt-mark showhold that packages are indeed held ... - held_packages = check_output("apt-mark showhold").split("\n") - if any(p not in held_packages for p in critical_packages): - logger.warning(m18n.n("tools_upgrade_cant_hold_critical_packages")) - operation_logger.error(m18n.n("packages_upgrade_failed")) - raise YunohostError(m18n.n("packages_upgrade_failed")) + callbacks = ( + lambda l: logger.info("+ " + l.rstrip() + "\r") + if is_relevant(l) + else logger.debug(l.rstrip() + "\r"), + lambda l: logger.warning(l.rstrip()) + if is_relevant(l) + else logger.debug(l.rstrip()), + ) + returncode = call_async_output(dist_upgrade, callbacks, shell=True) - logger.debug("Running apt command :\n{}".format(dist_upgrade)) + # If yunohost is being upgraded from the webadmin + if "yunohost" in upgradables and Moulinette.interface.type == "api": - def is_relevant(line): - irrelevants = [ - "service sudo-ldap already provided", - "Reading database ...", - ] - return all(i not in line.rstrip() for i in irrelevants) - - callbacks = ( - lambda l: logger.info("+ " + l.rstrip() + "\r") - if is_relevant(l) - else logger.debug(l.rstrip() + "\r"), - lambda l: logger.warning(l.rstrip()) - if is_relevant(l) - else logger.debug(l.rstrip()), + # Restart the API after 10 sec (at now doesn't support sub-minute times...) + # We do this so that the API / webadmin still gets the proper HTTP response + # It's then up to the webadmin to implement a proper UX process to wait 10 sec and then auto-fresh the webadmin + cmd = ( + "at -M now >/dev/null 2>&1 <<< \"sleep 10; systemctl restart yunohost-api\"" ) - returncode = call_async_output(dist_upgrade, callbacks, shell=True) - if returncode != 0: - upgradables = list(_list_upgradable_apt_packages()) - noncritical_packages_upgradable = [ - p["name"] for p in upgradables if p["name"] not in critical_packages - ] - logger.warning( - m18n.n( - "tools_upgrade_regular_packages_failed", - packages_list=", ".join(noncritical_packages_upgradable), - ) - ) - operation_logger.error(m18n.n("packages_upgrade_failed")) - raise YunohostError(m18n.n("packages_upgrade_failed")) + # For some reason subprocess doesn't like the redirections so we have to use bash -c explicity... + subprocess.check_call(["bash", "-c", cmd]) - # - # Critical packages upgrade - # - if critical_packages_upgradable and allow_yunohost_upgrade: - - logger.info(m18n.n("tools_upgrade_special_packages")) - - # Mark all critical packages as unheld - for package in critical_packages: - check_output("apt-mark unhold %s" % package) - - # Doublecheck with apt-mark showhold that packages are indeed unheld ... - held_packages = check_output("apt-mark showhold").split("\n") - if any(p in held_packages for p in critical_packages): - logger.warning(m18n.n("tools_upgrade_cant_unhold_critical_packages")) - operation_logger.error(m18n.n("packages_upgrade_failed")) - raise YunohostError(m18n.n("packages_upgrade_failed")) - - # - # Here we use a dirty hack to run a command after the current - # "yunohost tools upgrade", because the upgrade of yunohost - # will also trigger other yunohost commands (e.g. "yunohost tools migrations run") - # (also the upgrade of the package, if executed from the webadmin, is - # likely to kill/restart the api which is in turn likely to kill this - # command before it ends...) - # - logfile = operation_logger.log_path - dist_upgrade = dist_upgrade + " 2>&1 | tee -a {}".format(logfile) - - MOULINETTE_LOCK = "/var/run/moulinette_yunohost.lock" - wait_until_end_of_yunohost_command = ( - "(while [ -f {} ]; do sleep 2; done)".format(MOULINETTE_LOCK) - ) - mark_success = ( - "(echo 'Done!' | tee -a {} && echo 'success: true' >> {})".format( - logfile, operation_logger.md_path + if returncode != 0: + upgradables = list(_list_upgradable_apt_packages()) + logger.warning( + m18n.n( + "tools_upgrade_failed", + packages_list=", ".join(upgradables), ) ) - mark_failure = ( - "(echo 'Failed :(' | tee -a {} && echo 'success: false' >> {})".format( - logfile, operation_logger.md_path - ) - ) - update_log_metadata = "sed -i \"s/ended_at: .*$/ended_at: $(date -u +'%Y-%m-%d %H:%M:%S.%N')/\" {}" - update_log_metadata = update_log_metadata.format(operation_logger.md_path) + operation_logger.error(m18n.n("packages_upgrade_failed")) + raise YunohostError(m18n.n("packages_upgrade_failed")) - # Dirty hack such that the operation_logger does not add ended_at - # and success keys in the log metadata. (c.f. the code of the - # is_unit_operation + operation_logger.close()) We take care of - # this ourselves (c.f. the mark_success and updated_log_metadata in - # the huge command launched by os.system) - operation_logger.ended_at = "notyet" + # FIXME : add a dpkg --audit / check dpkg is broken here ? - upgrade_completed = "\n" + m18n.n( - "tools_upgrade_special_packages_completed" - ) - command = "({wait} && {dist_upgrade}) && {mark_success} || {mark_failure}; {update_metadata}; echo '{done}'".format( - wait=wait_until_end_of_yunohost_command, - dist_upgrade=dist_upgrade, - mark_success=mark_success, - mark_failure=mark_failure, - update_metadata=update_log_metadata, - done=upgrade_completed, - ) - - logger.warning(m18n.n("tools_upgrade_special_packages_explanation")) - logger.debug("Running command :\n{}".format(command)) - open("/tmp/yunohost-selfupgrade", "w").write( - "rm /tmp/yunohost-selfupgrade; " + command - ) - # Using systemd-run --scope is like nohup/disown and &, but more robust somehow - # (despite using nohup/disown and &, the self-upgrade process was still getting killed...) - # ref: https://unix.stackexchange.com/questions/420594/why-process-killed-with-nohup - # (though I still don't understand it 100%...) - os.system("systemd-run --scope bash /tmp/yunohost-selfupgrade &") - return - - else: - logger.success(m18n.n("system_upgraded")) - operation_logger.success() + logger.success(m18n.n("system_upgraded")) + operation_logger.success() @is_unit_operation() From b166abab1db9157b2b730ec9291daa881d661888 Mon Sep 17 00:00:00 2001 From: Romain Thouvenin Date: Sun, 7 Nov 2021 21:13:34 +0000 Subject: [PATCH 115/619] Read DNS Blacklist answer and compare it against list of non-BL codes --- data/hooks/diagnosis/24-mail.py | 4 ++-- data/other/dnsbl_list.yml | 27 +++++++++++++++++++++++++++ 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/data/hooks/diagnosis/24-mail.py b/data/hooks/diagnosis/24-mail.py index c5af4bbc6..7b7f5f502 100644 --- a/data/hooks/diagnosis/24-mail.py +++ b/data/hooks/diagnosis/24-mail.py @@ -209,8 +209,8 @@ class MailDiagnoser(Diagnoser): query = subdomain + "." + blacklist["dns_server"] # Do the DNS Query - status, _ = dig(query, "A") - if status != "ok": + status, answers = dig(query, "A") + if status != "ok" or (answers and set(answers) <= set(blacklist["non_blacklisted_return_code"])): continue # Try to get the reason diff --git a/data/other/dnsbl_list.yml b/data/other/dnsbl_list.yml index 1dc0175a3..ad86fd2a6 100644 --- a/data/other/dnsbl_list.yml +++ b/data/other/dnsbl_list.yml @@ -5,138 +5,161 @@ ipv4: true ipv6: true domain: false + non_blacklisted_return_code: [] - name: Barracuda Reputation Block List dns_server: b.barracudacentral.org website: https://barracudacentral.org/rbl/ ipv4: true ipv6: false domain: false + non_blacklisted_return_code: [] - name: Hostkarma dns_server: hostkarma.junkemailfilter.com website: https://ipadmin.junkemailfilter.com/remove.php ipv4: true ipv6: false domain: false + non_blacklisted_return_code: ['127.0.0.1', '127.0.0.5'] - name: ImproWare IP based spamlist dns_server: spamrbl.imp.ch website: https://antispam.imp.ch/ ipv4: true ipv6: false domain: false + non_blacklisted_return_code: [] - name: ImproWare IP based wormlist dns_server: wormrbl.imp.ch website: https://antispam.imp.ch/ ipv4: true ipv6: false domain: false + non_blacklisted_return_code: [] - name: Backscatterer.org dns_server: ips.backscatterer.org website: http://www.backscatterer.org/ ipv4: true ipv6: false domain: false + non_blacklisted_return_code: [] - name: inps.de dns_server: dnsbl.inps.de website: http://dnsbl.inps.de/ ipv4: true ipv6: false domain: false + non_blacklisted_return_code: [] - name: LASHBACK dns_server: ubl.unsubscore.com website: https://blacklist.lashback.com/ ipv4: true ipv6: false domain: false + non_blacklisted_return_code: [] - name: Mailspike.org dns_server: bl.mailspike.net website: http://www.mailspike.net/ ipv4: true ipv6: false domain: false + non_blacklisted_return_code: [] - name: NiX Spam dns_server: ix.dnsbl.manitu.net website: http://www.dnsbl.manitu.net/ ipv4: true ipv6: false domain: false + non_blacklisted_return_code: [] - name: REDHAWK dns_server: access.redhawk.org website: https://www.redhawk.org/SpamHawk/query.php ipv4: true ipv6: false domain: false + non_blacklisted_return_code: [] - name: SORBS Open SMTP relays dns_server: smtp.dnsbl.sorbs.net website: http://www.sorbs.net/ ipv4: true ipv6: false domain: false + non_blacklisted_return_code: [] - name: SORBS Spamhost (last 28 days) dns_server: recent.spam.dnsbl.sorbs.net website: http://www.sorbs.net/ ipv4: true ipv6: false domain: false + non_blacklisted_return_code: [] - name: SORBS Spamhost (last 48 hours) dns_server: new.spam.dnsbl.sorbs.net website: http://www.sorbs.net/ ipv4: true ipv6: false domain: false + non_blacklisted_return_code: [] - name: SpamCop Blocking List dns_server: bl.spamcop.net website: https://www.spamcop.net/bl.shtml ipv4: true ipv6: false domain: false + non_blacklisted_return_code: [] - name: Spam Eating Monkey SEM-BACKSCATTER dns_server: backscatter.spameatingmonkey.net website: https://spameatingmonkey.com/services ipv4: true ipv6: false domain: false + non_blacklisted_return_code: [] - name: Spam Eating Monkey SEM-BLACK dns_server: bl.spameatingmonkey.net website: https://spameatingmonkey.com/services ipv4: true ipv6: false domain: false + non_blacklisted_return_code: [] - name: Spam Eating Monkey SEM-IPV6BL dns_server: bl.ipv6.spameatingmonkey.net website: https://spameatingmonkey.com/services ipv4: false ipv6: true domain: false + non_blacklisted_return_code: [] - name: SpamRATS! all dns_server: all.spamrats.com website: http://www.spamrats.com/ ipv4: true ipv6: false domain: false + non_blacklisted_return_code: [] - name: PSBL (Passive Spam Block List) dns_server: psbl.surriel.com website: http://psbl.surriel.com/ ipv4: true ipv6: false domain: false + non_blacklisted_return_code: [] - name: SWINOG dns_server: dnsrbl.swinog.ch website: https://antispam.imp.ch/ ipv4: true ipv6: false domain: false + non_blacklisted_return_code: [] - name: GBUdb Truncate dns_server: truncate.gbudb.net website: http://www.gbudb.com/truncate/index.jsp ipv4: true ipv6: false domain: false + non_blacklisted_return_code: [] - name: Weighted Private Block List dns_server: db.wpbl.info website: http://www.wpbl.info/ ipv4: true ipv6: false domain: false + non_blacklisted_return_code: [] # Used by GAFAM - name: Composite Blocking List dns_server: cbl.abuseat.org @@ -144,6 +167,7 @@ ipv4: true ipv6: false domain: false + non_blacklisted_return_code: [] # Used by GAFAM - name: SenderScore Blacklist dns_server: bl.score.senderscore.com @@ -152,18 +176,21 @@ ipv6: false domain: false # Added cause it supports IPv6 + non_blacklisted_return_code: [] - name: AntiCaptcha.NET IPv6 dns_server: dnsbl6.anticaptcha.net website: http://anticaptcha.net/ ipv4: false ipv6: true domain: false + non_blacklisted_return_code: [] - name: Suomispam Blacklist dns_server: bl.suomispam.net website: http://suomispam.net/ ipv4: true ipv6: true domain: false + non_blacklisted_return_code: [] - name: NordSpam dns_server: bl.nordspam.com website: https://www.nordspam.com/ From 0a5bf3d021680def73a024a211501e07b4fc5c9d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?F=C3=A9lix=20Pi=C3=A9dallu?= Date: Mon, 8 Nov 2021 10:01:38 +0100 Subject: [PATCH 116/619] Fix dump_script_log_extract_for_debugging : We want to catch the last exit in the logs, not the first one. --- src/yunohost/log.py | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/yunohost/log.py b/src/yunohost/log.py index d73a62cd0..b4f8e181b 100644 --- a/src/yunohost/log.py +++ b/src/yunohost/log.py @@ -753,8 +753,16 @@ class OperationLogger(object): filters = [re.compile(f_) for f_ in filters] lines_to_display = [] - for line in lines: + # The logs may contain multiple ynh_exit_properly (backup + upgrade e.g) + # We want to get the last one. + rev_lines = reversed(lines) + for line in rev_lines: + if line.endswith("+ ynh_exit_properly") or " + ynh_die " in line: + lines_to_display.append(line) + break + + for line in rev_lines: if ": " not in line.strip(): continue @@ -768,10 +776,10 @@ class OperationLogger(object): lines_to_display.append(line) - if line.endswith("+ ynh_exit_properly") or " + ynh_die " in line: + if len(lines_to_display) > 20: break - elif len(lines_to_display) > 20: - lines_to_display.pop(0) + + lines_to_display.reverse() logger.warning( "Here's an extract of the logs before the crash. It might help debugging the error:" From a9b0619f426724d3e3d43a7cbe11b73c41bfbb59 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Mon, 8 Nov 2021 12:57:28 +0100 Subject: [PATCH 117/619] log: Factorize boring/irrelevant log line filter definition --- src/yunohost/log.py | 65 +++++++++++++++++++-------------------------- 1 file changed, 27 insertions(+), 38 deletions(-) diff --git a/src/yunohost/log.py b/src/yunohost/log.py index b4f8e181b..e2f6a7510 100644 --- a/src/yunohost/log.py +++ b/src/yunohost/log.py @@ -42,12 +42,36 @@ from yunohost.utils.packages import get_ynh_package_version from moulinette.utils.log import getActionLogger from moulinette.utils.filesystem import read_file, read_yaml +logger = getActionLogger("yunohost.log") + CATEGORIES_PATH = "/var/log/yunohost/categories/" OPERATIONS_PATH = "/var/log/yunohost/categories/operation/" METADATA_FILE_EXT = ".yml" LOG_FILE_EXT = ".log" -logger = getActionLogger("yunohost.log") +BORING_LOG_LINES = [ + r"set [+-]x$", + r"set [+-]o xtrace$", + r"set [+-]o errexit$", + r"set [+-]o nounset$", + r"trap '' EXIT", + r"local \w+$", + r"local exit_code=(1|0)$", + r"local legacy_args=.*$", + r"local -A args_array$", + r"args_array=.*$", + r"ret_code=1", + r".*Helper used in legacy mode.*", + r"ynh_handle_getopts_args", + r"ynh_script_progression", + r"sleep 0.5", + r"'\[' (1|0) -eq (1|0) '\]'$", + r"\[?\['? -n '' '?\]\]?$", + r"rm -rf /var/cache/yunohost/download/$", + r"type -t ynh_clean_setup$", + r"DEBUG - \+ echo '", + r"DEBUG - \+ exit (1|0)$", +] def log_list(limit=None, with_details=False, with_suboperations=False): @@ -163,30 +187,7 @@ def log_show( if filter_irrelevant: def _filter(lines): - filters = [ - r"set [+-]x$", - r"set [+-]o xtrace$", - r"set [+-]o errexit$", - r"set [+-]o nounset$", - r"trap '' EXIT", - r"local \w+$", - r"local exit_code=(1|0)$", - r"local legacy_args=.*$", - r"local -A args_array$", - r"args_array=.*$", - r"ret_code=1", - r".*Helper used in legacy mode.*", - r"ynh_handle_getopts_args", - r"ynh_script_progression", - r"sleep 0.5", - r"'\[' (1|0) -eq (1|0) '\]'$", - r"\[?\['? -n '' '?\]\]?$", - r"rm -rf /var/cache/yunohost/download/$", - r"type -t ynh_clean_setup$", - r"DEBUG - \+ echo '", - r"DEBUG - \+ exit (1|0)$", - ] - filters = [re.compile(f) for f in filters] + filters = [re.compile(f) for f in BORING_LOG_LINES] return [ line for line in lines @@ -738,19 +739,7 @@ class OperationLogger(object): with open(self.log_path, "r") as f: lines = f.readlines() - filters = [ - r"set [+-]x$", - r"set [+-]o xtrace$", - r"local \w+$", - r"local legacy_args=.*$", - r".*Helper used in legacy mode.*", - r"args_array=.*$", - r"local -A args_array$", - r"ynh_handle_getopts_args", - r"ynh_script_progression", - ] - - filters = [re.compile(f_) for f_ in filters] + filters = [re.compile(f_) for f_ in BORING_LOG_LINES] lines_to_display = [] From 03065dda4ea699c63df4a938226907850322dc45 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Mon, 8 Nov 2021 13:36:06 +0100 Subject: [PATCH 118/619] log: Simplify code to fetch lines before ynh_exit_properly in dump_script_log_extract_for_debugging --- src/yunohost/log.py | 43 +++++++++++++++++++------------------------ 1 file changed, 19 insertions(+), 24 deletions(-) diff --git a/src/yunohost/log.py b/src/yunohost/log.py index e2f6a7510..347fe2e65 100644 --- a/src/yunohost/log.py +++ b/src/yunohost/log.py @@ -739,36 +739,31 @@ class OperationLogger(object): with open(self.log_path, "r") as f: lines = f.readlines() + # 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 - " + lines = [line for line in lines if ":" in line.strip()] + lines = [line.strip().split(": ", 1)[1] for line in lines] + # And we ignore boring/irrelevant lines + # Annnnnnd we also ignore lines matching [number] + such as + # 72971 DEBUG 29739 + ynh_exit_properly + # which are lines from backup-before-upgrade or restore-after-failed-upgrade ... filters = [re.compile(f_) for f_ in BORING_LOG_LINES] + filters.append(re.compile(r'\d+ \+ ')) + lines = [line for line in lines if not any(filter_.search(line) for filter_ in filters)] lines_to_display = [] - # The logs may contain multiple ynh_exit_properly (backup + upgrade e.g) - # We want to get the last one. - rev_lines = reversed(lines) - for line in rev_lines: - if line.endswith("+ ynh_exit_properly") or " + ynh_die " in line: - lines_to_display.append(line) + # Get the 20 lines before the last 'ynh_exit_properly' + rev_lines = list(reversed(lines)) + for i, line in enumerate(rev_lines): + if line.endswith("+ ynh_exit_properly"): + lines_to_display = reversed(rev_lines[i:i + 20]) break - for line in rev_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] - - if any(filter_.search(line) for filter_ in filters): - continue - - lines_to_display.append(line) - - if len(lines_to_display) > 20: - break - - lines_to_display.reverse() + # If didnt find anything, just get the last 20 lines + if not lines_to_display: + lines_to_display = lines[-20:] logger.warning( "Here's an extract of the logs before the crash. It might help debugging the error:" From 7c569d16b787c52f36f4d07b2d5b31c06d29b778 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Mon, 8 Nov 2021 18:13:08 +0100 Subject: [PATCH 119/619] certificate: fix stupid certificate/diagnosis issue with subdomains of ynh domains --- src/yunohost/certificate.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/yunohost/certificate.py b/src/yunohost/certificate.py index fe350bf95..2679b2429 100644 --- a/src/yunohost/certificate.py +++ b/src/yunohost/certificate.py @@ -853,6 +853,7 @@ def _check_domain_is_ready_for_ACME(domain): from yunohost.domain import _get_parent_domain_of from yunohost.dns import _get_dns_zone_for_domain + from yunohost.utils.dns import is_yunohost_dyndns_domain httpreachable = ( Diagnoser.get_cached_report( @@ -876,6 +877,15 @@ def _check_domain_is_ready_for_ACME(domain): record_name = ( domain.replace(f".{base_dns_zone}", "") if domain != base_dns_zone else "@" ) + + # Stupid edge case for subdomains of ynh dyndns domains ... + # ... related to the fact that we don't actually check subdomains for + # dyndns domains because we assume that there's already the wildcard doing + # the job, hence no "A:foobar" ... Instead, just check that the parent domain + # is correctly configured. + if is_yunohost_dyndns_domain(parent_domain): + record_name = "@" + A_record_status = dnsrecords.get("data").get(f"A:{record_name}") AAAA_record_status = dnsrecords.get("data").get(f"AAAA:{record_name}") From 5de9e4fe6a2da619d1def5e91bd3ee30b53faddd Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Wed, 10 Nov 2021 17:56:02 +0100 Subject: [PATCH 120/619] Yolorework the repo dir structure --- {data/templates => conf}/dnsmasq/domain.tpl | 0 {data/templates => conf}/dnsmasq/plain/dnsmasq.conf | 0 {data/templates => conf}/dnsmasq/plain/etcdefault | 0 .../dnsmasq/plain/resolv.dnsmasq.conf | 0 {data/templates => conf}/dovecot/dovecot-ldap.conf | 0 {data/templates => conf}/dovecot/dovecot.conf | 0 {data/templates => conf}/dovecot/dovecot.sieve | 0 {data/templates => conf}/dovecot/post-ext.conf | 0 {data/templates => conf}/dovecot/pre-ext.conf | 0 {data/templates => conf}/fail2ban/jail.conf | 0 .../templates => conf}/fail2ban/yunohost-jails.conf | 0 {data/templates => conf}/fail2ban/yunohost.conf | 0 {data/templates => conf}/mdns/yunomdns.service | 0 .../templates => conf}/metronome/domain.tpl.cfg.lua | 0 .../templates => conf}/metronome/metronome.cfg.lua | 0 {lib => conf}/metronome/modules/ldap.lib.lua | 0 {lib => conf}/metronome/modules/mod_auth_ldap2.lua | 0 {lib => conf}/metronome/modules/mod_legacyauth.lua | 0 .../metronome/modules/mod_storage_ldap.lua | 0 {lib => conf}/metronome/modules/vcard.lib.lua | 0 {data/templates => conf}/nginx/autoconfig.tpl.xml | 0 .../nginx/plain/acme-challenge.conf.inc | 0 {data/templates => conf}/nginx/plain/global.conf | 0 {data/templates => conf}/nginx/plain/ssowat.conf | 0 .../nginx/plain/yunohost_panel.conf.inc | 0 .../nginx/plain/yunohost_sso.conf.inc | 0 .../templates => conf}/nginx/redirect_to_admin.conf | 0 {data/templates => conf}/nginx/security.conf.inc | 0 {data/templates => conf}/nginx/server.tpl.conf | 0 {data/templates => conf}/nginx/yunohost_admin.conf | 0 .../nginx/yunohost_admin.conf.inc | 0 .../templates => conf}/nginx/yunohost_api.conf.inc | 0 {data/templates => conf}/nslcd/nslcd.conf | 0 {data/templates => conf}/nsswitch/nsswitch.conf | 0 {data/templates => conf}/postfix/main.cf | 0 .../templates => conf}/postfix/plain/header_checks | 0 .../postfix/plain/ldap-accounts.cf | 0 .../postfix/plain/ldap-aliases.cf | 0 .../postfix/plain/ldap-domains.cf | 0 {data/templates => conf}/postfix/plain/master.cf | 0 .../postfix/plain/sender_canonical | 0 .../postfix/plain/smtp_reply_filter | 0 {data/templates => conf}/postfix/postsrsd | 0 {data/templates => conf}/rspamd/dkim_signing.conf | 0 {data/templates => conf}/rspamd/metrics.local.conf | 0 {data/templates => conf}/rspamd/milter_headers.conf | 0 {data/templates => conf}/rspamd/rspamd.sieve | 0 {data/templates => conf}/slapd/config.ldif | 0 {data/templates => conf}/slapd/db_init.ldif | 0 {data/templates => conf}/slapd/ldap.conf | 0 {data/templates => conf}/slapd/mailserver.ldif | 0 {data/templates => conf}/slapd/permission.ldif | 0 {data/templates => conf}/slapd/slapd.default | 0 {data/templates => conf}/slapd/sudo.ldif | 0 .../templates => conf}/slapd/systemd-override.conf | 0 {data/templates => conf}/ssh/sshd_config | 0 {data/templates => conf}/ssl/openssl.cnf | 0 {data/templates => conf}/yunohost/dpkg-origins | 0 {data/templates => conf}/yunohost/firewall.yml | 0 .../yunohost/proc-hidepid.service | 0 {data/templates => conf}/yunohost/services.yml | 0 .../templates => conf}/yunohost/yunoprompt.service | 0 .../generate_bash_completion.py | 0 {data/helpers.d => helpers}/apt | 0 {data/helpers.d => helpers}/backup | 0 {data/helpers.d => helpers}/config | 0 {data/helpers.d => helpers}/fail2ban | 0 {data/helpers.d => helpers}/getopts | 0 {data/helpers.d => helpers}/hardware | 0 {data/helpers.d => helpers}/logging | 0 {data/helpers.d => helpers}/logrotate | 0 {data/helpers.d => helpers}/multimedia | 0 {data/helpers.d => helpers}/mysql | 0 {data/helpers.d => helpers}/network | 0 {data/helpers.d => helpers}/nginx | 0 {data/helpers.d => helpers}/nodejs | 0 {data/helpers.d => helpers}/permission | 0 {data/helpers.d => helpers}/php | 0 {data/helpers.d => helpers}/postgresql | 0 {data/helpers.d => helpers}/setting | 0 {data/helpers.d => helpers}/string | 0 {data/helpers.d => helpers}/systemd | 0 {data/helpers.d => helpers}/user | 0 {data/helpers.d => helpers}/utils | 0 {data/hooks => hooks}/backup/05-conf_ldap | 0 {data/hooks => hooks}/backup/17-data_home | 0 {data/hooks => hooks}/backup/18-data_multimedia | 0 {data/hooks => hooks}/backup/20-conf_ynh_settings | 0 {data/hooks => hooks}/backup/21-conf_ynh_certs | 0 {data/hooks => hooks}/backup/23-data_mail | 0 {data/hooks => hooks}/backup/27-data_xmpp | 0 .../backup/50-conf_manually_modified_files | 0 {data/hooks => hooks}/conf_regen/01-yunohost | 0 {data/hooks => hooks}/conf_regen/02-ssl | 0 {data/hooks => hooks}/conf_regen/03-ssh | 0 {data/hooks => hooks}/conf_regen/06-slapd | 0 {data/hooks => hooks}/conf_regen/09-nslcd | 0 {data/hooks => hooks}/conf_regen/10-apt | 0 {data/hooks => hooks}/conf_regen/12-metronome | 0 {data/hooks => hooks}/conf_regen/15-nginx | 0 {data/hooks => hooks}/conf_regen/19-postfix | 0 {data/hooks => hooks}/conf_regen/25-dovecot | 0 {data/hooks => hooks}/conf_regen/31-rspamd | 0 {data/hooks => hooks}/conf_regen/34-mysql | 0 {data/hooks => hooks}/conf_regen/35-redis | 0 {data/hooks => hooks}/conf_regen/37-mdns | 0 {data/hooks => hooks}/conf_regen/43-dnsmasq | 0 {data/hooks => hooks}/conf_regen/46-nsswitch | 0 {data/hooks => hooks}/conf_regen/52-fail2ban | 0 .../hooks => hooks}/post_user_create/ynh_multimedia | 0 .../hooks => hooks}/post_user_delete/ynh_multimedia | 0 {data/hooks => hooks}/restore/05-conf_ldap | 0 {data/hooks => hooks}/restore/17-data_home | 0 {data/hooks => hooks}/restore/18-data_multimedia | 0 {data/hooks => hooks}/restore/20-conf_ynh_settings | 0 {data/hooks => hooks}/restore/21-conf_ynh_certs | 0 {data/hooks => hooks}/restore/23-data_mail | 0 {data/hooks => hooks}/restore/27-data_xmpp | 0 .../restore/50-conf_manually_modified_files | 0 .../100000-most-used-passwords.txt.gz | Bin .../actionsmap/yunohost.yml => share/actionsmap.yml | 0 {data/other => share}/config_domain.toml | 0 {data/other => share}/dnsbl_list.yml | 0 {data/other => share}/ffdhe2048.pem | 0 {data => share}/helpers | 0 {data/other => share}/registrar_list.toml | 0 src/{yunohost => }/__init__.py | 0 src/{yunohost => }/app.py | 0 src/{yunohost => }/app_catalog.py | 0 src/{yunohost => }/authenticators/ldap_admin.py | 0 src/{yunohost => }/backup.py | 0 src/{yunohost => }/certificate.py | 0 .../data_migrations/0021_migrate_to_bullseye.py | 0 .../data_migrations/0022_php73_to_php74_pools.py | 0 .../data_migrations/0023_postgresql_11_to_13.py | 0 src/{yunohost => }/data_migrations/__init__.py | 0 src/{yunohost => }/diagnosis.py | 0 {data/hooks => src}/diagnosis/00-basesystem.py | 0 {data/hooks => src}/diagnosis/10-ip.py | 0 {data/hooks => src}/diagnosis/12-dnsrecords.py | 0 {data/hooks => src}/diagnosis/14-ports.py | 0 {data/hooks => src}/diagnosis/21-web.py | 0 {data/hooks => src}/diagnosis/24-mail.py | 0 {data/hooks => src}/diagnosis/30-services.py | 0 {data/hooks => src}/diagnosis/50-systemresources.py | 0 {data/hooks => src}/diagnosis/70-regenconf.py | 0 {data/hooks => src}/diagnosis/80-apps.py | 0 src/{yunohost => }/dns.py | 0 src/{yunohost => }/domain.py | 0 src/{yunohost => }/dyndns.py | 0 src/{yunohost => }/firewall.py | 0 src/{yunohost => }/hook.py | 0 src/{yunohost => }/log.py | 0 src/{yunohost => }/permission.py | 0 src/{yunohost => }/regenconf.py | 0 src/{yunohost => }/service.py | 0 src/{yunohost => }/settings.py | 0 src/{yunohost => }/ssh.py | 0 src/{yunohost => }/tests/__init__.py | 0 src/{yunohost => }/tests/conftest.py | 0 src/{yunohost => }/tests/test_app_catalog.py | 0 src/{yunohost => }/tests/test_app_config.py | 0 src/{yunohost => }/tests/test_apps.py | 0 src/{yunohost => }/tests/test_appurl.py | 0 src/{yunohost => }/tests/test_backuprestore.py | 0 src/{yunohost => }/tests/test_changeurl.py | 0 src/{yunohost => }/tests/test_dns.py | 0 src/{yunohost => }/tests/test_domains.py | 0 src/{yunohost => }/tests/test_ldapauth.py | 0 src/{yunohost => }/tests/test_permission.py | 0 src/{yunohost => }/tests/test_questions.py | 0 src/{yunohost => }/tests/test_regenconf.py | 0 src/{yunohost => }/tests/test_service.py | 0 src/{yunohost => }/tests/test_settings.py | 0 src/{yunohost => }/tests/test_user-group.py | 0 src/{yunohost => }/tools.py | 0 src/{yunohost => }/user.py | 0 src/{yunohost => }/utils/__init__.py | 0 src/{yunohost => }/utils/config.py | 0 src/{yunohost => }/utils/dns.py | 0 src/{yunohost => }/utils/error.py | 0 src/{yunohost => }/utils/filesystem.py | 0 src/{yunohost => }/utils/i18n.py | 0 src/{yunohost => }/utils/ldap.py | 0 src/{yunohost => }/utils/legacy.py | 0 src/{yunohost => }/utils/network.py | 0 src/{yunohost => }/utils/packages.py | 0 src/{yunohost => }/utils/password.py | 0 src/{yunohost => }/utils/yunopaste.py | 0 src/{yunohost => }/vendor/__init__.py | 0 src/{yunohost => }/vendor/acme_tiny/__init__.py | 0 src/{yunohost => }/vendor/acme_tiny/acme_tiny.py | 0 .../vendor/spectre-meltdown-checker/Dockerfile | 0 .../vendor/spectre-meltdown-checker/LICENSE | 0 .../vendor/spectre-meltdown-checker/README.md | 0 .../spectre-meltdown-checker/docker-compose.yml | 0 .../spectre-meltdown-checker.sh | 0 197 files changed, 0 insertions(+), 0 deletions(-) rename {data/templates => conf}/dnsmasq/domain.tpl (100%) rename {data/templates => conf}/dnsmasq/plain/dnsmasq.conf (100%) rename {data/templates => conf}/dnsmasq/plain/etcdefault (100%) rename {data/templates => conf}/dnsmasq/plain/resolv.dnsmasq.conf (100%) rename {data/templates => conf}/dovecot/dovecot-ldap.conf (100%) rename {data/templates => conf}/dovecot/dovecot.conf (100%) rename {data/templates => conf}/dovecot/dovecot.sieve (100%) rename {data/templates => conf}/dovecot/post-ext.conf (100%) rename {data/templates => conf}/dovecot/pre-ext.conf (100%) rename {data/templates => conf}/fail2ban/jail.conf (100%) rename {data/templates => conf}/fail2ban/yunohost-jails.conf (100%) rename {data/templates => conf}/fail2ban/yunohost.conf (100%) rename {data/templates => conf}/mdns/yunomdns.service (100%) rename {data/templates => conf}/metronome/domain.tpl.cfg.lua (100%) rename {data/templates => conf}/metronome/metronome.cfg.lua (100%) rename {lib => conf}/metronome/modules/ldap.lib.lua (100%) rename {lib => conf}/metronome/modules/mod_auth_ldap2.lua (100%) rename {lib => conf}/metronome/modules/mod_legacyauth.lua (100%) rename {lib => conf}/metronome/modules/mod_storage_ldap.lua (100%) rename {lib => conf}/metronome/modules/vcard.lib.lua (100%) rename {data/templates => conf}/nginx/autoconfig.tpl.xml (100%) rename {data/templates => conf}/nginx/plain/acme-challenge.conf.inc (100%) rename {data/templates => conf}/nginx/plain/global.conf (100%) rename {data/templates => conf}/nginx/plain/ssowat.conf (100%) rename {data/templates => conf}/nginx/plain/yunohost_panel.conf.inc (100%) rename {data/templates => conf}/nginx/plain/yunohost_sso.conf.inc (100%) rename {data/templates => conf}/nginx/redirect_to_admin.conf (100%) rename {data/templates => conf}/nginx/security.conf.inc (100%) rename {data/templates => conf}/nginx/server.tpl.conf (100%) rename {data/templates => conf}/nginx/yunohost_admin.conf (100%) rename {data/templates => conf}/nginx/yunohost_admin.conf.inc (100%) rename {data/templates => conf}/nginx/yunohost_api.conf.inc (100%) rename {data/templates => conf}/nslcd/nslcd.conf (100%) rename {data/templates => conf}/nsswitch/nsswitch.conf (100%) rename {data/templates => conf}/postfix/main.cf (100%) rename {data/templates => conf}/postfix/plain/header_checks (100%) rename {data/templates => conf}/postfix/plain/ldap-accounts.cf (100%) rename {data/templates => conf}/postfix/plain/ldap-aliases.cf (100%) rename {data/templates => conf}/postfix/plain/ldap-domains.cf (100%) rename {data/templates => conf}/postfix/plain/master.cf (100%) rename {data/templates => conf}/postfix/plain/sender_canonical (100%) rename {data/templates => conf}/postfix/plain/smtp_reply_filter (100%) rename {data/templates => conf}/postfix/postsrsd (100%) rename {data/templates => conf}/rspamd/dkim_signing.conf (100%) rename {data/templates => conf}/rspamd/metrics.local.conf (100%) rename {data/templates => conf}/rspamd/milter_headers.conf (100%) rename {data/templates => conf}/rspamd/rspamd.sieve (100%) rename {data/templates => conf}/slapd/config.ldif (100%) rename {data/templates => conf}/slapd/db_init.ldif (100%) rename {data/templates => conf}/slapd/ldap.conf (100%) rename {data/templates => conf}/slapd/mailserver.ldif (100%) rename {data/templates => conf}/slapd/permission.ldif (100%) rename {data/templates => conf}/slapd/slapd.default (100%) rename {data/templates => conf}/slapd/sudo.ldif (100%) rename {data/templates => conf}/slapd/systemd-override.conf (100%) rename {data/templates => conf}/ssh/sshd_config (100%) rename {data/templates => conf}/ssl/openssl.cnf (100%) rename {data/templates => conf}/yunohost/dpkg-origins (100%) rename {data/templates => conf}/yunohost/firewall.yml (100%) rename {data/templates => conf}/yunohost/proc-hidepid.service (100%) rename {data/templates => conf}/yunohost/services.yml (100%) rename {data/templates => conf}/yunohost/yunoprompt.service (100%) rename data/actionsmap/yunohost_completion.py => doc/generate_bash_completion.py (100%) rename {data/helpers.d => helpers}/apt (100%) rename {data/helpers.d => helpers}/backup (100%) rename {data/helpers.d => helpers}/config (100%) rename {data/helpers.d => helpers}/fail2ban (100%) rename {data/helpers.d => helpers}/getopts (100%) rename {data/helpers.d => helpers}/hardware (100%) rename {data/helpers.d => helpers}/logging (100%) rename {data/helpers.d => helpers}/logrotate (100%) rename {data/helpers.d => helpers}/multimedia (100%) rename {data/helpers.d => helpers}/mysql (100%) rename {data/helpers.d => helpers}/network (100%) rename {data/helpers.d => helpers}/nginx (100%) rename {data/helpers.d => helpers}/nodejs (100%) rename {data/helpers.d => helpers}/permission (100%) rename {data/helpers.d => helpers}/php (100%) rename {data/helpers.d => helpers}/postgresql (100%) rename {data/helpers.d => helpers}/setting (100%) rename {data/helpers.d => helpers}/string (100%) rename {data/helpers.d => helpers}/systemd (100%) rename {data/helpers.d => helpers}/user (100%) rename {data/helpers.d => helpers}/utils (100%) rename {data/hooks => hooks}/backup/05-conf_ldap (100%) rename {data/hooks => hooks}/backup/17-data_home (100%) rename {data/hooks => hooks}/backup/18-data_multimedia (100%) rename {data/hooks => hooks}/backup/20-conf_ynh_settings (100%) rename {data/hooks => hooks}/backup/21-conf_ynh_certs (100%) rename {data/hooks => hooks}/backup/23-data_mail (100%) rename {data/hooks => hooks}/backup/27-data_xmpp (100%) rename {data/hooks => hooks}/backup/50-conf_manually_modified_files (100%) rename {data/hooks => hooks}/conf_regen/01-yunohost (100%) rename {data/hooks => hooks}/conf_regen/02-ssl (100%) rename {data/hooks => hooks}/conf_regen/03-ssh (100%) rename {data/hooks => hooks}/conf_regen/06-slapd (100%) rename {data/hooks => hooks}/conf_regen/09-nslcd (100%) rename {data/hooks => hooks}/conf_regen/10-apt (100%) rename {data/hooks => hooks}/conf_regen/12-metronome (100%) rename {data/hooks => hooks}/conf_regen/15-nginx (100%) rename {data/hooks => hooks}/conf_regen/19-postfix (100%) rename {data/hooks => hooks}/conf_regen/25-dovecot (100%) rename {data/hooks => hooks}/conf_regen/31-rspamd (100%) rename {data/hooks => hooks}/conf_regen/34-mysql (100%) rename {data/hooks => hooks}/conf_regen/35-redis (100%) rename {data/hooks => hooks}/conf_regen/37-mdns (100%) rename {data/hooks => hooks}/conf_regen/43-dnsmasq (100%) rename {data/hooks => hooks}/conf_regen/46-nsswitch (100%) rename {data/hooks => hooks}/conf_regen/52-fail2ban (100%) rename {data/hooks => hooks}/post_user_create/ynh_multimedia (100%) rename {data/hooks => hooks}/post_user_delete/ynh_multimedia (100%) rename {data/hooks => hooks}/restore/05-conf_ldap (100%) rename {data/hooks => hooks}/restore/17-data_home (100%) rename {data/hooks => hooks}/restore/18-data_multimedia (100%) rename {data/hooks => hooks}/restore/20-conf_ynh_settings (100%) rename {data/hooks => hooks}/restore/21-conf_ynh_certs (100%) rename {data/hooks => hooks}/restore/23-data_mail (100%) rename {data/hooks => hooks}/restore/27-data_xmpp (100%) rename {data/hooks => hooks}/restore/50-conf_manually_modified_files (100%) rename data/other/password/100000-most-used.txt.gz => share/100000-most-used-passwords.txt.gz (100%) rename data/actionsmap/yunohost.yml => share/actionsmap.yml (100%) rename {data/other => share}/config_domain.toml (100%) rename {data/other => share}/dnsbl_list.yml (100%) rename {data/other => share}/ffdhe2048.pem (100%) rename {data => share}/helpers (100%) rename {data/other => share}/registrar_list.toml (100%) rename src/{yunohost => }/__init__.py (100%) rename src/{yunohost => }/app.py (100%) rename src/{yunohost => }/app_catalog.py (100%) rename src/{yunohost => }/authenticators/ldap_admin.py (100%) rename src/{yunohost => }/backup.py (100%) rename src/{yunohost => }/certificate.py (100%) rename src/{yunohost => }/data_migrations/0021_migrate_to_bullseye.py (100%) rename src/{yunohost => }/data_migrations/0022_php73_to_php74_pools.py (100%) rename src/{yunohost => }/data_migrations/0023_postgresql_11_to_13.py (100%) rename src/{yunohost => }/data_migrations/__init__.py (100%) rename src/{yunohost => }/diagnosis.py (100%) rename {data/hooks => src}/diagnosis/00-basesystem.py (100%) rename {data/hooks => src}/diagnosis/10-ip.py (100%) rename {data/hooks => src}/diagnosis/12-dnsrecords.py (100%) rename {data/hooks => src}/diagnosis/14-ports.py (100%) rename {data/hooks => src}/diagnosis/21-web.py (100%) rename {data/hooks => src}/diagnosis/24-mail.py (100%) rename {data/hooks => src}/diagnosis/30-services.py (100%) rename {data/hooks => src}/diagnosis/50-systemresources.py (100%) rename {data/hooks => src}/diagnosis/70-regenconf.py (100%) rename {data/hooks => src}/diagnosis/80-apps.py (100%) rename src/{yunohost => }/dns.py (100%) rename src/{yunohost => }/domain.py (100%) rename src/{yunohost => }/dyndns.py (100%) rename src/{yunohost => }/firewall.py (100%) rename src/{yunohost => }/hook.py (100%) rename src/{yunohost => }/log.py (100%) rename src/{yunohost => }/permission.py (100%) rename src/{yunohost => }/regenconf.py (100%) rename src/{yunohost => }/service.py (100%) rename src/{yunohost => }/settings.py (100%) rename src/{yunohost => }/ssh.py (100%) rename src/{yunohost => }/tests/__init__.py (100%) rename src/{yunohost => }/tests/conftest.py (100%) rename src/{yunohost => }/tests/test_app_catalog.py (100%) rename src/{yunohost => }/tests/test_app_config.py (100%) rename src/{yunohost => }/tests/test_apps.py (100%) rename src/{yunohost => }/tests/test_appurl.py (100%) rename src/{yunohost => }/tests/test_backuprestore.py (100%) rename src/{yunohost => }/tests/test_changeurl.py (100%) rename src/{yunohost => }/tests/test_dns.py (100%) rename src/{yunohost => }/tests/test_domains.py (100%) rename src/{yunohost => }/tests/test_ldapauth.py (100%) rename src/{yunohost => }/tests/test_permission.py (100%) rename src/{yunohost => }/tests/test_questions.py (100%) rename src/{yunohost => }/tests/test_regenconf.py (100%) rename src/{yunohost => }/tests/test_service.py (100%) rename src/{yunohost => }/tests/test_settings.py (100%) rename src/{yunohost => }/tests/test_user-group.py (100%) rename src/{yunohost => }/tools.py (100%) rename src/{yunohost => }/user.py (100%) rename src/{yunohost => }/utils/__init__.py (100%) rename src/{yunohost => }/utils/config.py (100%) rename src/{yunohost => }/utils/dns.py (100%) rename src/{yunohost => }/utils/error.py (100%) rename src/{yunohost => }/utils/filesystem.py (100%) rename src/{yunohost => }/utils/i18n.py (100%) rename src/{yunohost => }/utils/ldap.py (100%) rename src/{yunohost => }/utils/legacy.py (100%) rename src/{yunohost => }/utils/network.py (100%) rename src/{yunohost => }/utils/packages.py (100%) rename src/{yunohost => }/utils/password.py (100%) rename src/{yunohost => }/utils/yunopaste.py (100%) rename src/{yunohost => }/vendor/__init__.py (100%) rename src/{yunohost => }/vendor/acme_tiny/__init__.py (100%) rename src/{yunohost => }/vendor/acme_tiny/acme_tiny.py (100%) rename src/{yunohost => }/vendor/spectre-meltdown-checker/Dockerfile (100%) rename src/{yunohost => }/vendor/spectre-meltdown-checker/LICENSE (100%) rename src/{yunohost => }/vendor/spectre-meltdown-checker/README.md (100%) rename src/{yunohost => }/vendor/spectre-meltdown-checker/docker-compose.yml (100%) rename src/{yunohost => }/vendor/spectre-meltdown-checker/spectre-meltdown-checker.sh (100%) diff --git a/data/templates/dnsmasq/domain.tpl b/conf/dnsmasq/domain.tpl similarity index 100% rename from data/templates/dnsmasq/domain.tpl rename to conf/dnsmasq/domain.tpl diff --git a/data/templates/dnsmasq/plain/dnsmasq.conf b/conf/dnsmasq/plain/dnsmasq.conf similarity index 100% rename from data/templates/dnsmasq/plain/dnsmasq.conf rename to conf/dnsmasq/plain/dnsmasq.conf diff --git a/data/templates/dnsmasq/plain/etcdefault b/conf/dnsmasq/plain/etcdefault similarity index 100% rename from data/templates/dnsmasq/plain/etcdefault rename to conf/dnsmasq/plain/etcdefault diff --git a/data/templates/dnsmasq/plain/resolv.dnsmasq.conf b/conf/dnsmasq/plain/resolv.dnsmasq.conf similarity index 100% rename from data/templates/dnsmasq/plain/resolv.dnsmasq.conf rename to conf/dnsmasq/plain/resolv.dnsmasq.conf diff --git a/data/templates/dovecot/dovecot-ldap.conf b/conf/dovecot/dovecot-ldap.conf similarity index 100% rename from data/templates/dovecot/dovecot-ldap.conf rename to conf/dovecot/dovecot-ldap.conf diff --git a/data/templates/dovecot/dovecot.conf b/conf/dovecot/dovecot.conf similarity index 100% rename from data/templates/dovecot/dovecot.conf rename to conf/dovecot/dovecot.conf diff --git a/data/templates/dovecot/dovecot.sieve b/conf/dovecot/dovecot.sieve similarity index 100% rename from data/templates/dovecot/dovecot.sieve rename to conf/dovecot/dovecot.sieve diff --git a/data/templates/dovecot/post-ext.conf b/conf/dovecot/post-ext.conf similarity index 100% rename from data/templates/dovecot/post-ext.conf rename to conf/dovecot/post-ext.conf diff --git a/data/templates/dovecot/pre-ext.conf b/conf/dovecot/pre-ext.conf similarity index 100% rename from data/templates/dovecot/pre-ext.conf rename to conf/dovecot/pre-ext.conf diff --git a/data/templates/fail2ban/jail.conf b/conf/fail2ban/jail.conf similarity index 100% rename from data/templates/fail2ban/jail.conf rename to conf/fail2ban/jail.conf diff --git a/data/templates/fail2ban/yunohost-jails.conf b/conf/fail2ban/yunohost-jails.conf similarity index 100% rename from data/templates/fail2ban/yunohost-jails.conf rename to conf/fail2ban/yunohost-jails.conf diff --git a/data/templates/fail2ban/yunohost.conf b/conf/fail2ban/yunohost.conf similarity index 100% rename from data/templates/fail2ban/yunohost.conf rename to conf/fail2ban/yunohost.conf diff --git a/data/templates/mdns/yunomdns.service b/conf/mdns/yunomdns.service similarity index 100% rename from data/templates/mdns/yunomdns.service rename to conf/mdns/yunomdns.service diff --git a/data/templates/metronome/domain.tpl.cfg.lua b/conf/metronome/domain.tpl.cfg.lua similarity index 100% rename from data/templates/metronome/domain.tpl.cfg.lua rename to conf/metronome/domain.tpl.cfg.lua diff --git a/data/templates/metronome/metronome.cfg.lua b/conf/metronome/metronome.cfg.lua similarity index 100% rename from data/templates/metronome/metronome.cfg.lua rename to conf/metronome/metronome.cfg.lua diff --git a/lib/metronome/modules/ldap.lib.lua b/conf/metronome/modules/ldap.lib.lua similarity index 100% rename from lib/metronome/modules/ldap.lib.lua rename to conf/metronome/modules/ldap.lib.lua diff --git a/lib/metronome/modules/mod_auth_ldap2.lua b/conf/metronome/modules/mod_auth_ldap2.lua similarity index 100% rename from lib/metronome/modules/mod_auth_ldap2.lua rename to conf/metronome/modules/mod_auth_ldap2.lua diff --git a/lib/metronome/modules/mod_legacyauth.lua b/conf/metronome/modules/mod_legacyauth.lua similarity index 100% rename from lib/metronome/modules/mod_legacyauth.lua rename to conf/metronome/modules/mod_legacyauth.lua diff --git a/lib/metronome/modules/mod_storage_ldap.lua b/conf/metronome/modules/mod_storage_ldap.lua similarity index 100% rename from lib/metronome/modules/mod_storage_ldap.lua rename to conf/metronome/modules/mod_storage_ldap.lua diff --git a/lib/metronome/modules/vcard.lib.lua b/conf/metronome/modules/vcard.lib.lua similarity index 100% rename from lib/metronome/modules/vcard.lib.lua rename to conf/metronome/modules/vcard.lib.lua diff --git a/data/templates/nginx/autoconfig.tpl.xml b/conf/nginx/autoconfig.tpl.xml similarity index 100% rename from data/templates/nginx/autoconfig.tpl.xml rename to conf/nginx/autoconfig.tpl.xml diff --git a/data/templates/nginx/plain/acme-challenge.conf.inc b/conf/nginx/plain/acme-challenge.conf.inc similarity index 100% rename from data/templates/nginx/plain/acme-challenge.conf.inc rename to conf/nginx/plain/acme-challenge.conf.inc diff --git a/data/templates/nginx/plain/global.conf b/conf/nginx/plain/global.conf similarity index 100% rename from data/templates/nginx/plain/global.conf rename to conf/nginx/plain/global.conf diff --git a/data/templates/nginx/plain/ssowat.conf b/conf/nginx/plain/ssowat.conf similarity index 100% rename from data/templates/nginx/plain/ssowat.conf rename to conf/nginx/plain/ssowat.conf diff --git a/data/templates/nginx/plain/yunohost_panel.conf.inc b/conf/nginx/plain/yunohost_panel.conf.inc similarity index 100% rename from data/templates/nginx/plain/yunohost_panel.conf.inc rename to conf/nginx/plain/yunohost_panel.conf.inc diff --git a/data/templates/nginx/plain/yunohost_sso.conf.inc b/conf/nginx/plain/yunohost_sso.conf.inc similarity index 100% rename from data/templates/nginx/plain/yunohost_sso.conf.inc rename to conf/nginx/plain/yunohost_sso.conf.inc diff --git a/data/templates/nginx/redirect_to_admin.conf b/conf/nginx/redirect_to_admin.conf similarity index 100% rename from data/templates/nginx/redirect_to_admin.conf rename to conf/nginx/redirect_to_admin.conf diff --git a/data/templates/nginx/security.conf.inc b/conf/nginx/security.conf.inc similarity index 100% rename from data/templates/nginx/security.conf.inc rename to conf/nginx/security.conf.inc diff --git a/data/templates/nginx/server.tpl.conf b/conf/nginx/server.tpl.conf similarity index 100% rename from data/templates/nginx/server.tpl.conf rename to conf/nginx/server.tpl.conf diff --git a/data/templates/nginx/yunohost_admin.conf b/conf/nginx/yunohost_admin.conf similarity index 100% rename from data/templates/nginx/yunohost_admin.conf rename to conf/nginx/yunohost_admin.conf diff --git a/data/templates/nginx/yunohost_admin.conf.inc b/conf/nginx/yunohost_admin.conf.inc similarity index 100% rename from data/templates/nginx/yunohost_admin.conf.inc rename to conf/nginx/yunohost_admin.conf.inc diff --git a/data/templates/nginx/yunohost_api.conf.inc b/conf/nginx/yunohost_api.conf.inc similarity index 100% rename from data/templates/nginx/yunohost_api.conf.inc rename to conf/nginx/yunohost_api.conf.inc diff --git a/data/templates/nslcd/nslcd.conf b/conf/nslcd/nslcd.conf similarity index 100% rename from data/templates/nslcd/nslcd.conf rename to conf/nslcd/nslcd.conf diff --git a/data/templates/nsswitch/nsswitch.conf b/conf/nsswitch/nsswitch.conf similarity index 100% rename from data/templates/nsswitch/nsswitch.conf rename to conf/nsswitch/nsswitch.conf diff --git a/data/templates/postfix/main.cf b/conf/postfix/main.cf similarity index 100% rename from data/templates/postfix/main.cf rename to conf/postfix/main.cf diff --git a/data/templates/postfix/plain/header_checks b/conf/postfix/plain/header_checks similarity index 100% rename from data/templates/postfix/plain/header_checks rename to conf/postfix/plain/header_checks diff --git a/data/templates/postfix/plain/ldap-accounts.cf b/conf/postfix/plain/ldap-accounts.cf similarity index 100% rename from data/templates/postfix/plain/ldap-accounts.cf rename to conf/postfix/plain/ldap-accounts.cf diff --git a/data/templates/postfix/plain/ldap-aliases.cf b/conf/postfix/plain/ldap-aliases.cf similarity index 100% rename from data/templates/postfix/plain/ldap-aliases.cf rename to conf/postfix/plain/ldap-aliases.cf diff --git a/data/templates/postfix/plain/ldap-domains.cf b/conf/postfix/plain/ldap-domains.cf similarity index 100% rename from data/templates/postfix/plain/ldap-domains.cf rename to conf/postfix/plain/ldap-domains.cf diff --git a/data/templates/postfix/plain/master.cf b/conf/postfix/plain/master.cf similarity index 100% rename from data/templates/postfix/plain/master.cf rename to conf/postfix/plain/master.cf diff --git a/data/templates/postfix/plain/sender_canonical b/conf/postfix/plain/sender_canonical similarity index 100% rename from data/templates/postfix/plain/sender_canonical rename to conf/postfix/plain/sender_canonical diff --git a/data/templates/postfix/plain/smtp_reply_filter b/conf/postfix/plain/smtp_reply_filter similarity index 100% rename from data/templates/postfix/plain/smtp_reply_filter rename to conf/postfix/plain/smtp_reply_filter diff --git a/data/templates/postfix/postsrsd b/conf/postfix/postsrsd similarity index 100% rename from data/templates/postfix/postsrsd rename to conf/postfix/postsrsd diff --git a/data/templates/rspamd/dkim_signing.conf b/conf/rspamd/dkim_signing.conf similarity index 100% rename from data/templates/rspamd/dkim_signing.conf rename to conf/rspamd/dkim_signing.conf diff --git a/data/templates/rspamd/metrics.local.conf b/conf/rspamd/metrics.local.conf similarity index 100% rename from data/templates/rspamd/metrics.local.conf rename to conf/rspamd/metrics.local.conf diff --git a/data/templates/rspamd/milter_headers.conf b/conf/rspamd/milter_headers.conf similarity index 100% rename from data/templates/rspamd/milter_headers.conf rename to conf/rspamd/milter_headers.conf diff --git a/data/templates/rspamd/rspamd.sieve b/conf/rspamd/rspamd.sieve similarity index 100% rename from data/templates/rspamd/rspamd.sieve rename to conf/rspamd/rspamd.sieve diff --git a/data/templates/slapd/config.ldif b/conf/slapd/config.ldif similarity index 100% rename from data/templates/slapd/config.ldif rename to conf/slapd/config.ldif diff --git a/data/templates/slapd/db_init.ldif b/conf/slapd/db_init.ldif similarity index 100% rename from data/templates/slapd/db_init.ldif rename to conf/slapd/db_init.ldif diff --git a/data/templates/slapd/ldap.conf b/conf/slapd/ldap.conf similarity index 100% rename from data/templates/slapd/ldap.conf rename to conf/slapd/ldap.conf diff --git a/data/templates/slapd/mailserver.ldif b/conf/slapd/mailserver.ldif similarity index 100% rename from data/templates/slapd/mailserver.ldif rename to conf/slapd/mailserver.ldif diff --git a/data/templates/slapd/permission.ldif b/conf/slapd/permission.ldif similarity index 100% rename from data/templates/slapd/permission.ldif rename to conf/slapd/permission.ldif diff --git a/data/templates/slapd/slapd.default b/conf/slapd/slapd.default similarity index 100% rename from data/templates/slapd/slapd.default rename to conf/slapd/slapd.default diff --git a/data/templates/slapd/sudo.ldif b/conf/slapd/sudo.ldif similarity index 100% rename from data/templates/slapd/sudo.ldif rename to conf/slapd/sudo.ldif diff --git a/data/templates/slapd/systemd-override.conf b/conf/slapd/systemd-override.conf similarity index 100% rename from data/templates/slapd/systemd-override.conf rename to conf/slapd/systemd-override.conf diff --git a/data/templates/ssh/sshd_config b/conf/ssh/sshd_config similarity index 100% rename from data/templates/ssh/sshd_config rename to conf/ssh/sshd_config diff --git a/data/templates/ssl/openssl.cnf b/conf/ssl/openssl.cnf similarity index 100% rename from data/templates/ssl/openssl.cnf rename to conf/ssl/openssl.cnf diff --git a/data/templates/yunohost/dpkg-origins b/conf/yunohost/dpkg-origins similarity index 100% rename from data/templates/yunohost/dpkg-origins rename to conf/yunohost/dpkg-origins diff --git a/data/templates/yunohost/firewall.yml b/conf/yunohost/firewall.yml similarity index 100% rename from data/templates/yunohost/firewall.yml rename to conf/yunohost/firewall.yml diff --git a/data/templates/yunohost/proc-hidepid.service b/conf/yunohost/proc-hidepid.service similarity index 100% rename from data/templates/yunohost/proc-hidepid.service rename to conf/yunohost/proc-hidepid.service diff --git a/data/templates/yunohost/services.yml b/conf/yunohost/services.yml similarity index 100% rename from data/templates/yunohost/services.yml rename to conf/yunohost/services.yml diff --git a/data/templates/yunohost/yunoprompt.service b/conf/yunohost/yunoprompt.service similarity index 100% rename from data/templates/yunohost/yunoprompt.service rename to conf/yunohost/yunoprompt.service diff --git a/data/actionsmap/yunohost_completion.py b/doc/generate_bash_completion.py similarity index 100% rename from data/actionsmap/yunohost_completion.py rename to doc/generate_bash_completion.py diff --git a/data/helpers.d/apt b/helpers/apt similarity index 100% rename from data/helpers.d/apt rename to helpers/apt diff --git a/data/helpers.d/backup b/helpers/backup similarity index 100% rename from data/helpers.d/backup rename to helpers/backup diff --git a/data/helpers.d/config b/helpers/config similarity index 100% rename from data/helpers.d/config rename to helpers/config diff --git a/data/helpers.d/fail2ban b/helpers/fail2ban similarity index 100% rename from data/helpers.d/fail2ban rename to helpers/fail2ban diff --git a/data/helpers.d/getopts b/helpers/getopts similarity index 100% rename from data/helpers.d/getopts rename to helpers/getopts diff --git a/data/helpers.d/hardware b/helpers/hardware similarity index 100% rename from data/helpers.d/hardware rename to helpers/hardware diff --git a/data/helpers.d/logging b/helpers/logging similarity index 100% rename from data/helpers.d/logging rename to helpers/logging diff --git a/data/helpers.d/logrotate b/helpers/logrotate similarity index 100% rename from data/helpers.d/logrotate rename to helpers/logrotate diff --git a/data/helpers.d/multimedia b/helpers/multimedia similarity index 100% rename from data/helpers.d/multimedia rename to helpers/multimedia diff --git a/data/helpers.d/mysql b/helpers/mysql similarity index 100% rename from data/helpers.d/mysql rename to helpers/mysql diff --git a/data/helpers.d/network b/helpers/network similarity index 100% rename from data/helpers.d/network rename to helpers/network diff --git a/data/helpers.d/nginx b/helpers/nginx similarity index 100% rename from data/helpers.d/nginx rename to helpers/nginx diff --git a/data/helpers.d/nodejs b/helpers/nodejs similarity index 100% rename from data/helpers.d/nodejs rename to helpers/nodejs diff --git a/data/helpers.d/permission b/helpers/permission similarity index 100% rename from data/helpers.d/permission rename to helpers/permission diff --git a/data/helpers.d/php b/helpers/php similarity index 100% rename from data/helpers.d/php rename to helpers/php diff --git a/data/helpers.d/postgresql b/helpers/postgresql similarity index 100% rename from data/helpers.d/postgresql rename to helpers/postgresql diff --git a/data/helpers.d/setting b/helpers/setting similarity index 100% rename from data/helpers.d/setting rename to helpers/setting diff --git a/data/helpers.d/string b/helpers/string similarity index 100% rename from data/helpers.d/string rename to helpers/string diff --git a/data/helpers.d/systemd b/helpers/systemd similarity index 100% rename from data/helpers.d/systemd rename to helpers/systemd diff --git a/data/helpers.d/user b/helpers/user similarity index 100% rename from data/helpers.d/user rename to helpers/user diff --git a/data/helpers.d/utils b/helpers/utils similarity index 100% rename from data/helpers.d/utils rename to helpers/utils diff --git a/data/hooks/backup/05-conf_ldap b/hooks/backup/05-conf_ldap similarity index 100% rename from data/hooks/backup/05-conf_ldap rename to hooks/backup/05-conf_ldap diff --git a/data/hooks/backup/17-data_home b/hooks/backup/17-data_home similarity index 100% rename from data/hooks/backup/17-data_home rename to hooks/backup/17-data_home diff --git a/data/hooks/backup/18-data_multimedia b/hooks/backup/18-data_multimedia similarity index 100% rename from data/hooks/backup/18-data_multimedia rename to hooks/backup/18-data_multimedia diff --git a/data/hooks/backup/20-conf_ynh_settings b/hooks/backup/20-conf_ynh_settings similarity index 100% rename from data/hooks/backup/20-conf_ynh_settings rename to hooks/backup/20-conf_ynh_settings diff --git a/data/hooks/backup/21-conf_ynh_certs b/hooks/backup/21-conf_ynh_certs similarity index 100% rename from data/hooks/backup/21-conf_ynh_certs rename to hooks/backup/21-conf_ynh_certs diff --git a/data/hooks/backup/23-data_mail b/hooks/backup/23-data_mail similarity index 100% rename from data/hooks/backup/23-data_mail rename to hooks/backup/23-data_mail diff --git a/data/hooks/backup/27-data_xmpp b/hooks/backup/27-data_xmpp similarity index 100% rename from data/hooks/backup/27-data_xmpp rename to hooks/backup/27-data_xmpp diff --git a/data/hooks/backup/50-conf_manually_modified_files b/hooks/backup/50-conf_manually_modified_files similarity index 100% rename from data/hooks/backup/50-conf_manually_modified_files rename to hooks/backup/50-conf_manually_modified_files diff --git a/data/hooks/conf_regen/01-yunohost b/hooks/conf_regen/01-yunohost similarity index 100% rename from data/hooks/conf_regen/01-yunohost rename to hooks/conf_regen/01-yunohost diff --git a/data/hooks/conf_regen/02-ssl b/hooks/conf_regen/02-ssl similarity index 100% rename from data/hooks/conf_regen/02-ssl rename to hooks/conf_regen/02-ssl diff --git a/data/hooks/conf_regen/03-ssh b/hooks/conf_regen/03-ssh similarity index 100% rename from data/hooks/conf_regen/03-ssh rename to hooks/conf_regen/03-ssh diff --git a/data/hooks/conf_regen/06-slapd b/hooks/conf_regen/06-slapd similarity index 100% rename from data/hooks/conf_regen/06-slapd rename to hooks/conf_regen/06-slapd diff --git a/data/hooks/conf_regen/09-nslcd b/hooks/conf_regen/09-nslcd similarity index 100% rename from data/hooks/conf_regen/09-nslcd rename to hooks/conf_regen/09-nslcd diff --git a/data/hooks/conf_regen/10-apt b/hooks/conf_regen/10-apt similarity index 100% rename from data/hooks/conf_regen/10-apt rename to hooks/conf_regen/10-apt diff --git a/data/hooks/conf_regen/12-metronome b/hooks/conf_regen/12-metronome similarity index 100% rename from data/hooks/conf_regen/12-metronome rename to hooks/conf_regen/12-metronome diff --git a/data/hooks/conf_regen/15-nginx b/hooks/conf_regen/15-nginx similarity index 100% rename from data/hooks/conf_regen/15-nginx rename to hooks/conf_regen/15-nginx diff --git a/data/hooks/conf_regen/19-postfix b/hooks/conf_regen/19-postfix similarity index 100% rename from data/hooks/conf_regen/19-postfix rename to hooks/conf_regen/19-postfix diff --git a/data/hooks/conf_regen/25-dovecot b/hooks/conf_regen/25-dovecot similarity index 100% rename from data/hooks/conf_regen/25-dovecot rename to hooks/conf_regen/25-dovecot diff --git a/data/hooks/conf_regen/31-rspamd b/hooks/conf_regen/31-rspamd similarity index 100% rename from data/hooks/conf_regen/31-rspamd rename to hooks/conf_regen/31-rspamd diff --git a/data/hooks/conf_regen/34-mysql b/hooks/conf_regen/34-mysql similarity index 100% rename from data/hooks/conf_regen/34-mysql rename to hooks/conf_regen/34-mysql diff --git a/data/hooks/conf_regen/35-redis b/hooks/conf_regen/35-redis similarity index 100% rename from data/hooks/conf_regen/35-redis rename to hooks/conf_regen/35-redis diff --git a/data/hooks/conf_regen/37-mdns b/hooks/conf_regen/37-mdns similarity index 100% rename from data/hooks/conf_regen/37-mdns rename to hooks/conf_regen/37-mdns diff --git a/data/hooks/conf_regen/43-dnsmasq b/hooks/conf_regen/43-dnsmasq similarity index 100% rename from data/hooks/conf_regen/43-dnsmasq rename to hooks/conf_regen/43-dnsmasq diff --git a/data/hooks/conf_regen/46-nsswitch b/hooks/conf_regen/46-nsswitch similarity index 100% rename from data/hooks/conf_regen/46-nsswitch rename to hooks/conf_regen/46-nsswitch diff --git a/data/hooks/conf_regen/52-fail2ban b/hooks/conf_regen/52-fail2ban similarity index 100% rename from data/hooks/conf_regen/52-fail2ban rename to hooks/conf_regen/52-fail2ban diff --git a/data/hooks/post_user_create/ynh_multimedia b/hooks/post_user_create/ynh_multimedia similarity index 100% rename from data/hooks/post_user_create/ynh_multimedia rename to hooks/post_user_create/ynh_multimedia diff --git a/data/hooks/post_user_delete/ynh_multimedia b/hooks/post_user_delete/ynh_multimedia similarity index 100% rename from data/hooks/post_user_delete/ynh_multimedia rename to hooks/post_user_delete/ynh_multimedia diff --git a/data/hooks/restore/05-conf_ldap b/hooks/restore/05-conf_ldap similarity index 100% rename from data/hooks/restore/05-conf_ldap rename to hooks/restore/05-conf_ldap diff --git a/data/hooks/restore/17-data_home b/hooks/restore/17-data_home similarity index 100% rename from data/hooks/restore/17-data_home rename to hooks/restore/17-data_home diff --git a/data/hooks/restore/18-data_multimedia b/hooks/restore/18-data_multimedia similarity index 100% rename from data/hooks/restore/18-data_multimedia rename to hooks/restore/18-data_multimedia diff --git a/data/hooks/restore/20-conf_ynh_settings b/hooks/restore/20-conf_ynh_settings similarity index 100% rename from data/hooks/restore/20-conf_ynh_settings rename to hooks/restore/20-conf_ynh_settings diff --git a/data/hooks/restore/21-conf_ynh_certs b/hooks/restore/21-conf_ynh_certs similarity index 100% rename from data/hooks/restore/21-conf_ynh_certs rename to hooks/restore/21-conf_ynh_certs diff --git a/data/hooks/restore/23-data_mail b/hooks/restore/23-data_mail similarity index 100% rename from data/hooks/restore/23-data_mail rename to hooks/restore/23-data_mail diff --git a/data/hooks/restore/27-data_xmpp b/hooks/restore/27-data_xmpp similarity index 100% rename from data/hooks/restore/27-data_xmpp rename to hooks/restore/27-data_xmpp diff --git a/data/hooks/restore/50-conf_manually_modified_files b/hooks/restore/50-conf_manually_modified_files similarity index 100% rename from data/hooks/restore/50-conf_manually_modified_files rename to hooks/restore/50-conf_manually_modified_files diff --git a/data/other/password/100000-most-used.txt.gz b/share/100000-most-used-passwords.txt.gz similarity index 100% rename from data/other/password/100000-most-used.txt.gz rename to share/100000-most-used-passwords.txt.gz diff --git a/data/actionsmap/yunohost.yml b/share/actionsmap.yml similarity index 100% rename from data/actionsmap/yunohost.yml rename to share/actionsmap.yml diff --git a/data/other/config_domain.toml b/share/config_domain.toml similarity index 100% rename from data/other/config_domain.toml rename to share/config_domain.toml diff --git a/data/other/dnsbl_list.yml b/share/dnsbl_list.yml similarity index 100% rename from data/other/dnsbl_list.yml rename to share/dnsbl_list.yml diff --git a/data/other/ffdhe2048.pem b/share/ffdhe2048.pem similarity index 100% rename from data/other/ffdhe2048.pem rename to share/ffdhe2048.pem diff --git a/data/helpers b/share/helpers similarity index 100% rename from data/helpers rename to share/helpers diff --git a/data/other/registrar_list.toml b/share/registrar_list.toml similarity index 100% rename from data/other/registrar_list.toml rename to share/registrar_list.toml diff --git a/src/yunohost/__init__.py b/src/__init__.py similarity index 100% rename from src/yunohost/__init__.py rename to src/__init__.py diff --git a/src/yunohost/app.py b/src/app.py similarity index 100% rename from src/yunohost/app.py rename to src/app.py diff --git a/src/yunohost/app_catalog.py b/src/app_catalog.py similarity index 100% rename from src/yunohost/app_catalog.py rename to src/app_catalog.py diff --git a/src/yunohost/authenticators/ldap_admin.py b/src/authenticators/ldap_admin.py similarity index 100% rename from src/yunohost/authenticators/ldap_admin.py rename to src/authenticators/ldap_admin.py diff --git a/src/yunohost/backup.py b/src/backup.py similarity index 100% rename from src/yunohost/backup.py rename to src/backup.py diff --git a/src/yunohost/certificate.py b/src/certificate.py similarity index 100% rename from src/yunohost/certificate.py rename to src/certificate.py diff --git a/src/yunohost/data_migrations/0021_migrate_to_bullseye.py b/src/data_migrations/0021_migrate_to_bullseye.py similarity index 100% rename from src/yunohost/data_migrations/0021_migrate_to_bullseye.py rename to src/data_migrations/0021_migrate_to_bullseye.py diff --git a/src/yunohost/data_migrations/0022_php73_to_php74_pools.py b/src/data_migrations/0022_php73_to_php74_pools.py similarity index 100% rename from src/yunohost/data_migrations/0022_php73_to_php74_pools.py rename to src/data_migrations/0022_php73_to_php74_pools.py diff --git a/src/yunohost/data_migrations/0023_postgresql_11_to_13.py b/src/data_migrations/0023_postgresql_11_to_13.py similarity index 100% rename from src/yunohost/data_migrations/0023_postgresql_11_to_13.py rename to src/data_migrations/0023_postgresql_11_to_13.py diff --git a/src/yunohost/data_migrations/__init__.py b/src/data_migrations/__init__.py similarity index 100% rename from src/yunohost/data_migrations/__init__.py rename to src/data_migrations/__init__.py diff --git a/src/yunohost/diagnosis.py b/src/diagnosis.py similarity index 100% rename from src/yunohost/diagnosis.py rename to src/diagnosis.py diff --git a/data/hooks/diagnosis/00-basesystem.py b/src/diagnosis/00-basesystem.py similarity index 100% rename from data/hooks/diagnosis/00-basesystem.py rename to src/diagnosis/00-basesystem.py diff --git a/data/hooks/diagnosis/10-ip.py b/src/diagnosis/10-ip.py similarity index 100% rename from data/hooks/diagnosis/10-ip.py rename to src/diagnosis/10-ip.py diff --git a/data/hooks/diagnosis/12-dnsrecords.py b/src/diagnosis/12-dnsrecords.py similarity index 100% rename from data/hooks/diagnosis/12-dnsrecords.py rename to src/diagnosis/12-dnsrecords.py diff --git a/data/hooks/diagnosis/14-ports.py b/src/diagnosis/14-ports.py similarity index 100% rename from data/hooks/diagnosis/14-ports.py rename to src/diagnosis/14-ports.py diff --git a/data/hooks/diagnosis/21-web.py b/src/diagnosis/21-web.py similarity index 100% rename from data/hooks/diagnosis/21-web.py rename to src/diagnosis/21-web.py diff --git a/data/hooks/diagnosis/24-mail.py b/src/diagnosis/24-mail.py similarity index 100% rename from data/hooks/diagnosis/24-mail.py rename to src/diagnosis/24-mail.py diff --git a/data/hooks/diagnosis/30-services.py b/src/diagnosis/30-services.py similarity index 100% rename from data/hooks/diagnosis/30-services.py rename to src/diagnosis/30-services.py diff --git a/data/hooks/diagnosis/50-systemresources.py b/src/diagnosis/50-systemresources.py similarity index 100% rename from data/hooks/diagnosis/50-systemresources.py rename to src/diagnosis/50-systemresources.py diff --git a/data/hooks/diagnosis/70-regenconf.py b/src/diagnosis/70-regenconf.py similarity index 100% rename from data/hooks/diagnosis/70-regenconf.py rename to src/diagnosis/70-regenconf.py diff --git a/data/hooks/diagnosis/80-apps.py b/src/diagnosis/80-apps.py similarity index 100% rename from data/hooks/diagnosis/80-apps.py rename to src/diagnosis/80-apps.py diff --git a/src/yunohost/dns.py b/src/dns.py similarity index 100% rename from src/yunohost/dns.py rename to src/dns.py diff --git a/src/yunohost/domain.py b/src/domain.py similarity index 100% rename from src/yunohost/domain.py rename to src/domain.py diff --git a/src/yunohost/dyndns.py b/src/dyndns.py similarity index 100% rename from src/yunohost/dyndns.py rename to src/dyndns.py diff --git a/src/yunohost/firewall.py b/src/firewall.py similarity index 100% rename from src/yunohost/firewall.py rename to src/firewall.py diff --git a/src/yunohost/hook.py b/src/hook.py similarity index 100% rename from src/yunohost/hook.py rename to src/hook.py diff --git a/src/yunohost/log.py b/src/log.py similarity index 100% rename from src/yunohost/log.py rename to src/log.py diff --git a/src/yunohost/permission.py b/src/permission.py similarity index 100% rename from src/yunohost/permission.py rename to src/permission.py diff --git a/src/yunohost/regenconf.py b/src/regenconf.py similarity index 100% rename from src/yunohost/regenconf.py rename to src/regenconf.py diff --git a/src/yunohost/service.py b/src/service.py similarity index 100% rename from src/yunohost/service.py rename to src/service.py diff --git a/src/yunohost/settings.py b/src/settings.py similarity index 100% rename from src/yunohost/settings.py rename to src/settings.py diff --git a/src/yunohost/ssh.py b/src/ssh.py similarity index 100% rename from src/yunohost/ssh.py rename to src/ssh.py diff --git a/src/yunohost/tests/__init__.py b/src/tests/__init__.py similarity index 100% rename from src/yunohost/tests/__init__.py rename to src/tests/__init__.py diff --git a/src/yunohost/tests/conftest.py b/src/tests/conftest.py similarity index 100% rename from src/yunohost/tests/conftest.py rename to src/tests/conftest.py diff --git a/src/yunohost/tests/test_app_catalog.py b/src/tests/test_app_catalog.py similarity index 100% rename from src/yunohost/tests/test_app_catalog.py rename to src/tests/test_app_catalog.py diff --git a/src/yunohost/tests/test_app_config.py b/src/tests/test_app_config.py similarity index 100% rename from src/yunohost/tests/test_app_config.py rename to src/tests/test_app_config.py diff --git a/src/yunohost/tests/test_apps.py b/src/tests/test_apps.py similarity index 100% rename from src/yunohost/tests/test_apps.py rename to src/tests/test_apps.py diff --git a/src/yunohost/tests/test_appurl.py b/src/tests/test_appurl.py similarity index 100% rename from src/yunohost/tests/test_appurl.py rename to src/tests/test_appurl.py diff --git a/src/yunohost/tests/test_backuprestore.py b/src/tests/test_backuprestore.py similarity index 100% rename from src/yunohost/tests/test_backuprestore.py rename to src/tests/test_backuprestore.py diff --git a/src/yunohost/tests/test_changeurl.py b/src/tests/test_changeurl.py similarity index 100% rename from src/yunohost/tests/test_changeurl.py rename to src/tests/test_changeurl.py diff --git a/src/yunohost/tests/test_dns.py b/src/tests/test_dns.py similarity index 100% rename from src/yunohost/tests/test_dns.py rename to src/tests/test_dns.py diff --git a/src/yunohost/tests/test_domains.py b/src/tests/test_domains.py similarity index 100% rename from src/yunohost/tests/test_domains.py rename to src/tests/test_domains.py diff --git a/src/yunohost/tests/test_ldapauth.py b/src/tests/test_ldapauth.py similarity index 100% rename from src/yunohost/tests/test_ldapauth.py rename to src/tests/test_ldapauth.py diff --git a/src/yunohost/tests/test_permission.py b/src/tests/test_permission.py similarity index 100% rename from src/yunohost/tests/test_permission.py rename to src/tests/test_permission.py diff --git a/src/yunohost/tests/test_questions.py b/src/tests/test_questions.py similarity index 100% rename from src/yunohost/tests/test_questions.py rename to src/tests/test_questions.py diff --git a/src/yunohost/tests/test_regenconf.py b/src/tests/test_regenconf.py similarity index 100% rename from src/yunohost/tests/test_regenconf.py rename to src/tests/test_regenconf.py diff --git a/src/yunohost/tests/test_service.py b/src/tests/test_service.py similarity index 100% rename from src/yunohost/tests/test_service.py rename to src/tests/test_service.py diff --git a/src/yunohost/tests/test_settings.py b/src/tests/test_settings.py similarity index 100% rename from src/yunohost/tests/test_settings.py rename to src/tests/test_settings.py diff --git a/src/yunohost/tests/test_user-group.py b/src/tests/test_user-group.py similarity index 100% rename from src/yunohost/tests/test_user-group.py rename to src/tests/test_user-group.py diff --git a/src/yunohost/tools.py b/src/tools.py similarity index 100% rename from src/yunohost/tools.py rename to src/tools.py diff --git a/src/yunohost/user.py b/src/user.py similarity index 100% rename from src/yunohost/user.py rename to src/user.py diff --git a/src/yunohost/utils/__init__.py b/src/utils/__init__.py similarity index 100% rename from src/yunohost/utils/__init__.py rename to src/utils/__init__.py diff --git a/src/yunohost/utils/config.py b/src/utils/config.py similarity index 100% rename from src/yunohost/utils/config.py rename to src/utils/config.py diff --git a/src/yunohost/utils/dns.py b/src/utils/dns.py similarity index 100% rename from src/yunohost/utils/dns.py rename to src/utils/dns.py diff --git a/src/yunohost/utils/error.py b/src/utils/error.py similarity index 100% rename from src/yunohost/utils/error.py rename to src/utils/error.py diff --git a/src/yunohost/utils/filesystem.py b/src/utils/filesystem.py similarity index 100% rename from src/yunohost/utils/filesystem.py rename to src/utils/filesystem.py diff --git a/src/yunohost/utils/i18n.py b/src/utils/i18n.py similarity index 100% rename from src/yunohost/utils/i18n.py rename to src/utils/i18n.py diff --git a/src/yunohost/utils/ldap.py b/src/utils/ldap.py similarity index 100% rename from src/yunohost/utils/ldap.py rename to src/utils/ldap.py diff --git a/src/yunohost/utils/legacy.py b/src/utils/legacy.py similarity index 100% rename from src/yunohost/utils/legacy.py rename to src/utils/legacy.py diff --git a/src/yunohost/utils/network.py b/src/utils/network.py similarity index 100% rename from src/yunohost/utils/network.py rename to src/utils/network.py diff --git a/src/yunohost/utils/packages.py b/src/utils/packages.py similarity index 100% rename from src/yunohost/utils/packages.py rename to src/utils/packages.py diff --git a/src/yunohost/utils/password.py b/src/utils/password.py similarity index 100% rename from src/yunohost/utils/password.py rename to src/utils/password.py diff --git a/src/yunohost/utils/yunopaste.py b/src/utils/yunopaste.py similarity index 100% rename from src/yunohost/utils/yunopaste.py rename to src/utils/yunopaste.py diff --git a/src/yunohost/vendor/__init__.py b/src/vendor/__init__.py similarity index 100% rename from src/yunohost/vendor/__init__.py rename to src/vendor/__init__.py diff --git a/src/yunohost/vendor/acme_tiny/__init__.py b/src/vendor/acme_tiny/__init__.py similarity index 100% rename from src/yunohost/vendor/acme_tiny/__init__.py rename to src/vendor/acme_tiny/__init__.py diff --git a/src/yunohost/vendor/acme_tiny/acme_tiny.py b/src/vendor/acme_tiny/acme_tiny.py similarity index 100% rename from src/yunohost/vendor/acme_tiny/acme_tiny.py rename to src/vendor/acme_tiny/acme_tiny.py diff --git a/src/yunohost/vendor/spectre-meltdown-checker/Dockerfile b/src/vendor/spectre-meltdown-checker/Dockerfile similarity index 100% rename from src/yunohost/vendor/spectre-meltdown-checker/Dockerfile rename to src/vendor/spectre-meltdown-checker/Dockerfile diff --git a/src/yunohost/vendor/spectre-meltdown-checker/LICENSE b/src/vendor/spectre-meltdown-checker/LICENSE similarity index 100% rename from src/yunohost/vendor/spectre-meltdown-checker/LICENSE rename to src/vendor/spectre-meltdown-checker/LICENSE diff --git a/src/yunohost/vendor/spectre-meltdown-checker/README.md b/src/vendor/spectre-meltdown-checker/README.md similarity index 100% rename from src/yunohost/vendor/spectre-meltdown-checker/README.md rename to src/vendor/spectre-meltdown-checker/README.md diff --git a/src/yunohost/vendor/spectre-meltdown-checker/docker-compose.yml b/src/vendor/spectre-meltdown-checker/docker-compose.yml similarity index 100% rename from src/yunohost/vendor/spectre-meltdown-checker/docker-compose.yml rename to src/vendor/spectre-meltdown-checker/docker-compose.yml diff --git a/src/yunohost/vendor/spectre-meltdown-checker/spectre-meltdown-checker.sh b/src/vendor/spectre-meltdown-checker/spectre-meltdown-checker.sh similarity index 100% rename from src/yunohost/vendor/spectre-meltdown-checker/spectre-meltdown-checker.sh rename to src/vendor/spectre-meltdown-checker/spectre-meltdown-checker.sh From 05f25fa85fa8495f97a81927991c1af9de6b1723 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Wed, 10 Nov 2021 18:25:37 +0100 Subject: [PATCH 121/619] Propagate dir structure change to scripts etc --- .coveragerc | 2 +- .gitignore | 4 +- .gitlab/ci/test.gitlab-ci.yml | 76 ++++++++++++++++----------------- conf/dovecot/dovecot.conf | 2 +- conf/nginx/security.conf.inc | 2 +- conf/postfix/main.cf | 2 +- debian/install | 9 ++-- debian/rules | 2 +- doc/generate_bash_completion.py | 5 +-- doc/generate_helper_doc.py | 2 +- doc/generate_manpages.py | 2 +- doc/helper_doc_template.md | 2 +- hooks/conf_regen/01-yunohost | 4 +- hooks/conf_regen/02-ssl | 8 ++-- hooks/conf_regen/03-ssh | 2 +- hooks/conf_regen/06-slapd | 6 +-- hooks/conf_regen/09-nslcd | 2 +- hooks/conf_regen/12-metronome | 2 +- hooks/conf_regen/15-nginx | 4 +- hooks/conf_regen/19-postfix | 2 +- hooks/conf_regen/25-dovecot | 2 +- hooks/conf_regen/31-rspamd | 2 +- hooks/conf_regen/34-mysql | 2 +- hooks/conf_regen/37-mdns | 2 +- hooks/conf_regen/43-dnsmasq | 2 +- hooks/conf_regen/46-nsswitch | 2 +- hooks/conf_regen/52-fail2ban | 2 +- src/diagnosis/10-ip.py | 2 +- src/diagnosis/24-mail.py | 2 +- src/dns.py | 2 +- src/domain.py | 2 +- src/service.py | 2 +- src/utils/config.py | 2 +- src/utils/password.py | 2 +- tests/add_missing_keys.py | 22 +++++----- tests/test_actionmap.py | 2 +- tests/test_i18n_keys.py | 26 +++++------ tox.ini | 6 +-- 38 files changed, 113 insertions(+), 111 deletions(-) diff --git a/.coveragerc b/.coveragerc index ed13dfa68..fe22c8381 100644 --- a/.coveragerc +++ b/.coveragerc @@ -1,2 +1,2 @@ [report] -omit=src/yunohost/tests/*,src/yunohost/vendor/*,/usr/lib/moulinette/yunohost/* +omit=src/tests/*,src/vendor/*,/usr/lib/moulinette/yunohost/* diff --git a/.gitignore b/.gitignore index 75f4ae6ea..eae46b4c5 100644 --- a/.gitignore +++ b/.gitignore @@ -31,7 +31,7 @@ pip-log.txt .mr.developer.cfg # moulinette lib -src/yunohost/locales +src/locales # Test -src/yunohost/tests/apps +src/tests/apps diff --git a/.gitlab/ci/test.gitlab-ci.yml b/.gitlab/ci/test.gitlab-ci.yml index 1aad46fbe..49c07e4b6 100644 --- a/.gitlab/ci/test.gitlab-ci.yml +++ b/.gitlab/ci/test.gitlab-ci.yml @@ -11,7 +11,7 @@ - *install_debs cache: paths: - - src/yunohost/tests/apps + - src/tests/apps key: "$CI_JOB_STAGE-$CI_COMMIT_REF_SLUG" needs: - job: build-yunohost @@ -36,7 +36,7 @@ full-tests: - *install_debs - yunohost tools postinstall -d domain.tld -p the_password --ignore-dyndns --force-diskspace script: - - python3 -m pytest --cov=yunohost tests/ src/yunohost/tests/ data/hooks/diagnosis/ --junitxml=report.xml + - python3 -m pytest --cov=yunohost tests/ src/tests/ src/diagnosis/ --junitxml=report.xml - cd tests - bash test_helpers.sh needs: @@ -57,8 +57,8 @@ test-i18n-keys: only: changes: - locales/en.json - - src/yunohost/*.py - - data/hooks/diagnosis/*.py + - src/*.py + - src/diagnosis/*.py test-translation-format-consistency: extends: .test-stage @@ -74,7 +74,7 @@ test-actionmap: - python3 -m pytest tests/test_actionmap.py only: changes: - - data/actionsmap/*.yml + - share/actionsmap.yml test-helpers: extends: .test-stage @@ -83,126 +83,126 @@ test-helpers: - bash test_helpers.sh only: changes: - - data/helpers.d/* + - helpers/* test-domains: extends: .test-stage script: - - python3 -m pytest src/yunohost/tests/test_domains.py + - python3 -m pytest src/tests/test_domains.py only: changes: - - src/yunohost/domain.py + - src/domain.py test-dns: extends: .test-stage script: - - python3 -m pytest src/yunohost/tests/test_dns.py + - python3 -m pytest src/tests/test_dns.py only: changes: - - src/yunohost/dns.py - - src/yunohost/utils/dns.py + - src/dns.py + - src/utils/dns.py test-apps: extends: .test-stage script: - - python3 -m pytest src/yunohost/tests/test_apps.py + - python3 -m pytest src/tests/test_apps.py only: changes: - - src/yunohost/app.py + - src/app.py test-appscatalog: extends: .test-stage script: - - python3 -m pytest src/yunohost/tests/test_app_catalog.py + - python3 -m pytest src/tests/test_app_catalog.py only: changes: - - src/yunohost/app_calalog.py + - src/app_calalog.py test-appurl: extends: .test-stage script: - - python3 -m pytest src/yunohost/tests/test_appurl.py + - python3 -m pytest src/tests/test_appurl.py only: changes: - - src/yunohost/app.py + - src/app.py test-questions: extends: .test-stage script: - - python3 -m pytest src/yunohost/tests/test_questions.py + - python3 -m pytest src/tests/test_questions.py only: changes: - - src/yunohost/utils/config.py + - src/utils/config.py test-app-config: extends: .test-stage script: - - python3 -m pytest src/yunohost/tests/test_app_config.py + - python3 -m pytest src/tests/test_app_config.py only: changes: - - src/yunohost/app.py - - src/yunohost/utils/config.py + - src/app.py + - src/utils/config.py test-changeurl: extends: .test-stage script: - - python3 -m pytest src/yunohost/tests/test_changeurl.py + - python3 -m pytest src/tests/test_changeurl.py only: changes: - - src/yunohost/app.py + - src/app.py test-backuprestore: extends: .test-stage script: - - python3 -m pytest src/yunohost/tests/test_backuprestore.py + - python3 -m pytest src/tests/test_backuprestore.py only: changes: - - src/yunohost/backup.py + - src/backup.py test-permission: extends: .test-stage script: - - python3 -m pytest src/yunohost/tests/test_permission.py + - python3 -m pytest src/tests/test_permission.py only: changes: - - src/yunohost/permission.py + - src/permission.py test-settings: extends: .test-stage script: - - python3 -m pytest src/yunohost/tests/test_settings.py + - python3 -m pytest src/tests/test_settings.py only: changes: - - src/yunohost/settings.py + - src/settings.py test-user-group: extends: .test-stage script: - - python3 -m pytest src/yunohost/tests/test_user-group.py + - python3 -m pytest src/tests/test_user-group.py only: changes: - - src/yunohost/user.py + - src/user.py test-regenconf: extends: .test-stage script: - - python3 -m pytest src/yunohost/tests/test_regenconf.py + - python3 -m pytest src/tests/test_regenconf.py only: changes: - - src/yunohost/regenconf.py + - src/regenconf.py test-service: extends: .test-stage script: - - python3 -m pytest src/yunohost/tests/test_service.py + - python3 -m pytest src/tests/test_service.py only: changes: - - src/yunohost/service.py + - src/service.py test-ldapauth: extends: .test-stage script: - - python3 -m pytest src/yunohost/tests/test_ldapauth.py + - python3 -m pytest src/tests/test_ldapauth.py only: changes: - - src/yunohost/authenticators/*.py + - src/authenticators/*.py diff --git a/conf/dovecot/dovecot.conf b/conf/dovecot/dovecot.conf index c7e937979..273bd45dc 100644 --- a/conf/dovecot/dovecot.conf +++ b/conf/dovecot/dovecot.conf @@ -23,7 +23,7 @@ ssl_cert = /path/to/dhparam -ssl_dh = /path/to/dhparam.pem # not actually 1024 bits, this applies to all DHE >= 1024 bits -smtpd_tls_dh1024_param_file = /usr/share/yunohost/other/ffdhe2048.pem +smtpd_tls_dh1024_param_file = /usr/share/yunohost/ffdhe2048.pem tls_medium_cipherlist = ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384 {% else %} diff --git a/debian/install b/debian/install index 4680bc6be..55c535ae8 100644 --- a/debian/install +++ b/debian/install @@ -1,7 +1,10 @@ bin/* /usr/bin/ -data/* /usr/share/yunohost/ -data/bash-completion.d/yunohost /etc/bash_completion.d/ +share/* /usr/share/yunohost/ +hooks/* /usr/share/yunohost/hooks/ +helpers/* /usr/share/yunohost/helpers.d/ +conf/* /usr/share/yunohost/conf/ doc/yunohost.8.gz /usr/share/man/man8/ +doc/bash-completion.sh /etc/bash_completion.d/yunohost lib/metronome/modules/* /usr/lib/metronome/modules/ locales/* /usr/lib/moulinette/yunohost/locales/ -src/yunohost /usr/lib/moulinette +src/ /usr/lib/moulinette/yunohost diff --git a/debian/rules b/debian/rules index 341ba2b01..d0cbd5138 100755 --- a/debian/rules +++ b/debian/rules @@ -6,7 +6,7 @@ override_dh_auto_build: # Generate bash completion file - python3 data/actionsmap/yunohost_completion.py + python3 doc/generate_bash_completion.py python3 doc/generate_manpages.py --gzip --output doc/yunohost.8.gz override_dh_installinit: diff --git a/doc/generate_bash_completion.py b/doc/generate_bash_completion.py index c801e2f3c..72a524210 100644 --- a/doc/generate_bash_completion.py +++ b/doc/generate_bash_completion.py @@ -12,9 +12,8 @@ import os import yaml THIS_SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__)) -ACTIONSMAP_FILE = THIS_SCRIPT_DIR + "/yunohost.yml" -os.system(f"mkdir {THIS_SCRIPT_DIR}/../bash-completion.d") -BASH_COMPLETION_FILE = THIS_SCRIPT_DIR + "/../bash-completion.d/yunohost" +ACTIONSMAP_FILE = THIS_SCRIPT_DIR + "/../share/actionsmap.yml" +BASH_COMPLETION_FILE = THIS_SCRIPT_DIR + "/bash-completion.sh" def get_dict_actions(OPTION_SUBTREE, category): diff --git a/doc/generate_helper_doc.py b/doc/generate_helper_doc.py index f2d5bf444..189a445d4 100644 --- a/doc/generate_helper_doc.py +++ b/doc/generate_helper_doc.py @@ -217,7 +217,7 @@ def malformed_error(line_number): def main(): - helper_files = sorted(glob.glob("../data/helpers.d/*")) + helper_files = sorted(glob.glob("../helpers/*")) helpers = [] for helper_file in helper_files: diff --git a/doc/generate_manpages.py b/doc/generate_manpages.py index fa042fb17..bdb1fcaee 100644 --- a/doc/generate_manpages.py +++ b/doc/generate_manpages.py @@ -22,7 +22,7 @@ template = Template(open(os.path.join(base_path, "manpage.template")).read()) THIS_SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__)) -ACTIONSMAP_FILE = os.path.join(THIS_SCRIPT_DIR, "../data/actionsmap/yunohost.yml") +ACTIONSMAP_FILE = os.path.join(THIS_SCRIPT_DIR, "../share/actionsmap.yml") def ordered_yaml_load(stream): diff --git a/doc/helper_doc_template.md b/doc/helper_doc_template.md index d41c0b6e9..ac5d455fb 100644 --- a/doc/helper_doc_template.md +++ b/doc/helper_doc_template.md @@ -52,7 +52,7 @@ Doc auto-generated by [this script](https://github.com/YunoHost/yunohost/blob/{{ {{ h.details }} {%- endif %} -[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/{{ current_commit }}/data/helpers.d/{{ category }}#L{{ h.line + 1 }}) +[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/{{ current_commit }}/helpers/{{ category }}#L{{ h.line + 1 }}) [/details] ---------------- {% endfor %} diff --git a/hooks/conf_regen/01-yunohost b/hooks/conf_regen/01-yunohost index 963bd49d3..027be8020 100755 --- a/hooks/conf_regen/01-yunohost +++ b/hooks/conf_regen/01-yunohost @@ -8,7 +8,7 @@ do_init_regen() { exit 1 fi - cd /usr/share/yunohost/templates/yunohost + cd /usr/share/yunohost/conf/yunohost [[ -d /etc/yunohost ]] || mkdir -p /etc/yunohost @@ -71,7 +71,7 @@ do_init_regen() { do_pre_regen() { pending_dir=$1 - cd /usr/share/yunohost/templates/yunohost + cd /usr/share/yunohost/conf/yunohost mkdir -p $pending_dir/etc/systemd/system mkdir -p $pending_dir/etc/cron.d/ diff --git a/hooks/conf_regen/02-ssl b/hooks/conf_regen/02-ssl index 03478552c..f27a23cf8 100755 --- a/hooks/conf_regen/02-ssl +++ b/hooks/conf_regen/02-ssl @@ -6,7 +6,7 @@ ssl_dir="/usr/share/yunohost/yunohost-config/ssl/yunoCA" ynh_ca="/etc/yunohost/certs/yunohost.org/ca.pem" ynh_crt="/etc/yunohost/certs/yunohost.org/crt.pem" ynh_key="/etc/yunohost/certs/yunohost.org/key.pem" -openssl_conf="/usr/share/yunohost/templates/ssl/openssl.cnf" +openssl_conf="/usr/share/yunohost/conf/ssl/openssl.cnf" regen_local_ca() { @@ -26,7 +26,7 @@ regen_local_ca() { RANDFILE=.rnd openssl rand -hex 19 >serial rm -f index.txt touch index.txt - cp /usr/share/yunohost/templates/ssl/openssl.cnf openssl.ca.cnf + cp /usr/share/yunohost/conf/ssl/openssl.cnf openssl.ca.cnf sed -i "s/yunohost.org/${domain}/g" openssl.ca.cnf openssl req -x509 \ -new \ @@ -57,7 +57,7 @@ do_init_regen() { # Make sure this conf exists mkdir -p ${ssl_dir} - cp /usr/share/yunohost/templates/ssl/openssl.cnf ${ssl_dir}/openssl.ca.cnf + cp /usr/share/yunohost/conf/ssl/openssl.cnf ${ssl_dir}/openssl.ca.cnf # create default certificates if [[ ! -f "$ynh_ca" ]]; then @@ -99,7 +99,7 @@ do_init_regen() { do_pre_regen() { pending_dir=$1 - cd /usr/share/yunohost/templates/ssl + cd /usr/share/yunohost/conf/ssl install -D -m 644 openssl.cnf "${pending_dir}/${ssl_dir}/openssl.cnf" } diff --git a/hooks/conf_regen/03-ssh b/hooks/conf_regen/03-ssh index dd1589204..0c700c01f 100755 --- a/hooks/conf_regen/03-ssh +++ b/hooks/conf_regen/03-ssh @@ -7,7 +7,7 @@ set -e do_pre_regen() { pending_dir=$1 - cd /usr/share/yunohost/templates/ssh + cd /usr/share/yunohost/conf/ssh # do not listen to IPv6 if unavailable [[ -f /proc/net/if_inet6 ]] && ipv6_enabled=true || ipv6_enabled=false diff --git a/hooks/conf_regen/06-slapd b/hooks/conf_regen/06-slapd index 0c52e4998..616b383ec 100755 --- a/hooks/conf_regen/06-slapd +++ b/hooks/conf_regen/06-slapd @@ -4,8 +4,8 @@ set -e tmp_backup_dir_file="/root/slapd-backup-dir.txt" -config="/usr/share/yunohost/templates/slapd/config.ldif" -db_init="/usr/share/yunohost/templates/slapd/db_init.ldif" +config="/usr/share/yunohost/conf/slapd/config.ldif" +db_init="/usr/share/yunohost/conf/slapd/db_init.ldif" do_init_regen() { if [[ $EUID -ne 0 ]]; then @@ -109,7 +109,7 @@ do_pre_regen() { schema_dir="${ldap_dir}/schema" mkdir -p "$ldap_dir" "$schema_dir" - cd /usr/share/yunohost/templates/slapd + cd /usr/share/yunohost/conf/slapd # copy configuration files cp -a ldap.conf "$ldap_dir" diff --git a/hooks/conf_regen/09-nslcd b/hooks/conf_regen/09-nslcd index ff1c05433..9d5e5e538 100755 --- a/hooks/conf_regen/09-nslcd +++ b/hooks/conf_regen/09-nslcd @@ -10,7 +10,7 @@ do_init_regen() { do_pre_regen() { pending_dir=$1 - cd /usr/share/yunohost/templates/nslcd + cd /usr/share/yunohost/conf/nslcd install -D -m 644 nslcd.conf "${pending_dir}/etc/nslcd.conf" } diff --git a/hooks/conf_regen/12-metronome b/hooks/conf_regen/12-metronome index 5dfa7b5dc..4802b750e 100755 --- a/hooks/conf_regen/12-metronome +++ b/hooks/conf_regen/12-metronome @@ -5,7 +5,7 @@ set -e do_pre_regen() { pending_dir=$1 - cd /usr/share/yunohost/templates/metronome + cd /usr/share/yunohost/conf/metronome # create directories for pending conf metronome_dir="${pending_dir}/etc/metronome" diff --git a/hooks/conf_regen/15-nginx b/hooks/conf_regen/15-nginx index b585e3cb5..c1d943681 100755 --- a/hooks/conf_regen/15-nginx +++ b/hooks/conf_regen/15-nginx @@ -10,7 +10,7 @@ do_init_regen() { exit 1 fi - cd /usr/share/yunohost/templates/nginx + cd /usr/share/yunohost/conf/nginx nginx_dir="/etc/nginx" nginx_conf_dir="${nginx_dir}/conf.d" @@ -47,7 +47,7 @@ do_init_regen() { do_pre_regen() { pending_dir=$1 - cd /usr/share/yunohost/templates/nginx + cd /usr/share/yunohost/conf/nginx nginx_dir="${pending_dir}/etc/nginx" nginx_conf_dir="${nginx_dir}/conf.d" diff --git a/hooks/conf_regen/19-postfix b/hooks/conf_regen/19-postfix index 7865cd312..4a7325c41 100755 --- a/hooks/conf_regen/19-postfix +++ b/hooks/conf_regen/19-postfix @@ -7,7 +7,7 @@ set -e do_pre_regen() { pending_dir=$1 - cd /usr/share/yunohost/templates/postfix + cd /usr/share/yunohost/conf/postfix postfix_dir="${pending_dir}/etc/postfix" mkdir -p "$postfix_dir" diff --git a/hooks/conf_regen/25-dovecot b/hooks/conf_regen/25-dovecot index e95816604..9a51d0363 100755 --- a/hooks/conf_regen/25-dovecot +++ b/hooks/conf_regen/25-dovecot @@ -7,7 +7,7 @@ set -e do_pre_regen() { pending_dir=$1 - cd /usr/share/yunohost/templates/dovecot + cd /usr/share/yunohost/conf/dovecot dovecot_dir="${pending_dir}/etc/dovecot" mkdir -p "${dovecot_dir}/global_script" diff --git a/hooks/conf_regen/31-rspamd b/hooks/conf_regen/31-rspamd index 72a35fdcc..536aec7c2 100755 --- a/hooks/conf_regen/31-rspamd +++ b/hooks/conf_regen/31-rspamd @@ -5,7 +5,7 @@ set -e do_pre_regen() { pending_dir=$1 - cd /usr/share/yunohost/templates/rspamd + cd /usr/share/yunohost/conf/rspamd install -D -m 644 metrics.local.conf \ "${pending_dir}/etc/rspamd/local.d/metrics.conf" diff --git a/hooks/conf_regen/34-mysql b/hooks/conf_regen/34-mysql index 13730e0bb..d7ddf1a90 100755 --- a/hooks/conf_regen/34-mysql +++ b/hooks/conf_regen/34-mysql @@ -6,7 +6,7 @@ set -e do_pre_regen() { pending_dir=$1 - cd /usr/share/yunohost/templates/mysql + cd /usr/share/yunohost/conf/mysql # Nothing to do } diff --git a/hooks/conf_regen/37-mdns b/hooks/conf_regen/37-mdns index faa581efa..ff674c391 100755 --- a/hooks/conf_regen/37-mdns +++ b/hooks/conf_regen/37-mdns @@ -29,7 +29,7 @@ do_init_regen() { do_pre_regen() { pending_dir="$1" - cd /usr/share/yunohost/templates/mdns + cd /usr/share/yunohost/conf/mdns mkdir -p ${pending_dir}/etc/systemd/system/ cp yunomdns.service ${pending_dir}/etc/systemd/system/ diff --git a/hooks/conf_regen/43-dnsmasq b/hooks/conf_regen/43-dnsmasq index 13c442158..406762ecb 100755 --- a/hooks/conf_regen/43-dnsmasq +++ b/hooks/conf_regen/43-dnsmasq @@ -6,7 +6,7 @@ set -e do_pre_regen() { pending_dir=$1 - cd /usr/share/yunohost/templates/dnsmasq + cd /usr/share/yunohost/conf/dnsmasq # create directory for pending conf dnsmasq_dir="${pending_dir}/etc/dnsmasq.d" diff --git a/hooks/conf_regen/46-nsswitch b/hooks/conf_regen/46-nsswitch index 2c984a905..cc34d0277 100755 --- a/hooks/conf_regen/46-nsswitch +++ b/hooks/conf_regen/46-nsswitch @@ -10,7 +10,7 @@ do_init_regen() { do_pre_regen() { pending_dir=$1 - cd /usr/share/yunohost/templates/nsswitch + cd /usr/share/yunohost/conf/nsswitch install -D -m 644 nsswitch.conf "${pending_dir}/etc/nsswitch.conf" } diff --git a/hooks/conf_regen/52-fail2ban b/hooks/conf_regen/52-fail2ban index 6cbebbfb1..8129e977d 100755 --- a/hooks/conf_regen/52-fail2ban +++ b/hooks/conf_regen/52-fail2ban @@ -7,7 +7,7 @@ set -e do_pre_regen() { pending_dir=$1 - cd /usr/share/yunohost/templates/fail2ban + cd /usr/share/yunohost/conf/fail2ban fail2ban_dir="${pending_dir}/etc/fail2ban" mkdir -p "${fail2ban_dir}/filter.d" diff --git a/src/diagnosis/10-ip.py b/src/diagnosis/10-ip.py index 408019668..bc00fe25c 100644 --- a/src/diagnosis/10-ip.py +++ b/src/diagnosis/10-ip.py @@ -152,7 +152,7 @@ class IPDiagnoser(Diagnoser): # We use the resolver file as a list of well-known, trustable (ie not google ;)) IPs that we can ping resolver_file = ( - "/usr/share/yunohost/templates/dnsmasq/plain/resolv.dnsmasq.conf" + "/usr/share/yunohost/conf/dnsmasq/plain/resolv.dnsmasq.conf" ) resolvers = [ r.split(" ")[1] diff --git a/src/diagnosis/24-mail.py b/src/diagnosis/24-mail.py index c5af4bbc6..f29b2786d 100644 --- a/src/diagnosis/24-mail.py +++ b/src/diagnosis/24-mail.py @@ -14,7 +14,7 @@ from yunohost.domain import _get_maindomain, domain_list from yunohost.settings import settings_get from yunohost.utils.dns import dig -DEFAULT_DNS_BLACKLIST = "/usr/share/yunohost/other/dnsbl_list.yml" +DEFAULT_DNS_BLACKLIST = "/usr/share/yunohost/dnsbl_list.yml" class MailDiagnoser(Diagnoser): diff --git a/src/dns.py b/src/dns.py index 534ade918..cad0ff2f5 100644 --- a/src/dns.py +++ b/src/dns.py @@ -50,7 +50,7 @@ from yunohost.hook import hook_callback logger = getActionLogger("yunohost.domain") -DOMAIN_REGISTRAR_LIST_PATH = "/usr/share/yunohost/other/registrar_list.toml" +DOMAIN_REGISTRAR_LIST_PATH = "/usr/share/yunohost/registrar_list.toml" def domain_dns_suggest(domain): diff --git a/src/domain.py b/src/domain.py index 0bd84ea82..3c244f9cf 100644 --- a/src/domain.py +++ b/src/domain.py @@ -44,7 +44,7 @@ from yunohost.log import is_unit_operation logger = getActionLogger("yunohost.domain") -DOMAIN_CONFIG_PATH = "/usr/share/yunohost/other/config_domain.toml" +DOMAIN_CONFIG_PATH = "/usr/share/yunohost/config_domain.toml" DOMAIN_SETTINGS_DIR = "/etc/yunohost/domains" # Lazy dev caching to avoid re-query ldap every time we need the domain list diff --git a/src/service.py b/src/service.py index 73534e2e3..527ca5813 100644 --- a/src/service.py +++ b/src/service.py @@ -48,7 +48,7 @@ from moulinette.utils.filesystem import ( MOULINETTE_LOCK = "/var/run/moulinette_yunohost.lock" SERVICES_CONF = "/etc/yunohost/services.yml" -SERVICES_CONF_BASE = "/usr/share/yunohost/templates/yunohost/services.yml" +SERVICES_CONF_BASE = "/usr/share/yunohost/conf/yunohost/services.yml" logger = getActionLogger("yunohost.service") diff --git a/src/utils/config.py b/src/utils/config.py index 5d1d1f9d2..352e25be6 100644 --- a/src/utils/config.py +++ b/src/utils/config.py @@ -192,7 +192,7 @@ def evaluate_simple_js_expression(expr, context={}): class ConfigPanel: entity_type = "config" save_path_tpl: Union[str, None] = None - config_path_tpl = "/usr/share/yunohost/other/config_{entity_type}.toml" + config_path_tpl = "/usr/share/yunohost/config_{entity_type}.toml" save_mode = "full" @classmethod diff --git a/src/utils/password.py b/src/utils/password.py index 188850183..04a1ed272 100644 --- a/src/utils/password.py +++ b/src/utils/password.py @@ -36,7 +36,7 @@ SMALL_PWD_LIST = [ "rpi", ] -MOST_USED_PASSWORDS = "/usr/share/yunohost/other/password/100000-most-used.txt" +MOST_USED_PASSWORDS = "/usr/share/yunohost/password/100000-most-used-passwords.txt" # Length, digits, lowers, uppers, others STRENGTH_LEVELS = [ diff --git a/tests/add_missing_keys.py b/tests/add_missing_keys.py index 30c6c6640..1bf335418 100644 --- a/tests/add_missing_keys.py +++ b/tests/add_missing_keys.py @@ -24,11 +24,11 @@ def find_expected_string_keys(): p3 = re.compile(r"YunohostValidationError\(\n*\s*[\'\"](\w+)[\'\"]") p4 = re.compile(r"# i18n: [\'\"]?(\w+)[\'\"]?") - python_files = glob.glob("src/yunohost/*.py") - python_files.extend(glob.glob("src/yunohost/utils/*.py")) - python_files.extend(glob.glob("src/yunohost/data_migrations/*.py")) - python_files.extend(glob.glob("src/yunohost/authenticators/*.py")) - python_files.extend(glob.glob("data/hooks/diagnosis/*.py")) + python_files = glob.glob("src/*.py") + python_files.extend(glob.glob("src/utils/*.py")) + python_files.extend(glob.glob("src/data_migrations/*.py")) + python_files.extend(glob.glob("src/authenticators/*.py")) + python_files.extend(glob.glob("src/diagnosis/*.py")) python_files.append("bin/yunohost") for python_file in python_files: @@ -51,7 +51,7 @@ def find_expected_string_keys(): # For each diagnosis, try to find strings like "diagnosis_stuff_foo" (c.f. diagnosis summaries) # Also we expect to have "diagnosis_description_" for each diagnosis p3 = re.compile(r"[\"\'](diagnosis_[a-z]+_\w+)[\"\']") - for python_file in glob.glob("data/hooks/diagnosis/*.py"): + for python_file in glob.glob("src/diagnosis/*.py"): content = open(python_file).read() for m in p3.findall(content): if m.endswith("_"): @@ -63,14 +63,14 @@ def find_expected_string_keys(): ] # For each migration, expect to find "migration_description_" - for path in glob.glob("src/yunohost/data_migrations/*.py"): + for path in glob.glob("src/data_migrations/*.py"): if "__init__" in path: continue yield "migration_description_" + os.path.basename(path)[:-3] # For each default service, expect to find "service_description_" for service, info in yaml.safe_load( - open("data/templates/yunohost/services.yml") + open("conf/yunohost/services.yml") ).items(): if info is None: continue @@ -79,7 +79,7 @@ def find_expected_string_keys(): # For all unit operations, expect to find "log_" # A unit operation is created either using the @is_unit_operation decorator # or using OperationLogger( - cmd = "grep -hr '@is_unit_operation' src/yunohost/ -A3 2>/dev/null | grep '^def' | sed -E 's@^def (\\w+)\\(.*@\\1@g'" + cmd = "grep -hr '@is_unit_operation' src/ -A3 2>/dev/null | grep '^def' | sed -E 's@^def (\\w+)\\(.*@\\1@g'" for funcname in ( subprocess.check_output(cmd, shell=True).decode("utf-8").strip().split("\n") ): @@ -94,14 +94,14 @@ def find_expected_string_keys(): # Global settings descriptions # Will be on a line like : ("service.ssh.allow_deprecated_dsa_hostkey", {"type": "bool", ... p5 = re.compile(r" \(\n*\s*[\"\'](\w[\w\.]+)[\"\'],") - content = open("src/yunohost/settings.py").read() + content = open("src/settings.py").read() for m in ( "global_settings_setting_" + s.replace(".", "_") for s in p5.findall(content) ): yield m # Keys for the actionmap ... - for category in yaml.safe_load(open("data/actionsmap/yunohost.yml")).values(): + for category in yaml.safe_load(open("share/actionsmap.yml")).values(): if "actions" not in category.keys(): continue for action in category["actions"].values(): diff --git a/tests/test_actionmap.py b/tests/test_actionmap.py index 0b8abb152..e482bdfe1 100644 --- a/tests/test_actionmap.py +++ b/tests/test_actionmap.py @@ -2,4 +2,4 @@ import yaml def test_yaml_syntax(): - yaml.safe_load(open("data/actionsmap/yunohost.yml")) + yaml.safe_load(open("share/actionsmap.yml")) diff --git a/tests/test_i18n_keys.py b/tests/test_i18n_keys.py index 103241085..d0ae75bfc 100644 --- a/tests/test_i18n_keys.py +++ b/tests/test_i18n_keys.py @@ -25,11 +25,11 @@ def find_expected_string_keys(): p3 = re.compile(r"YunohostValidationError\(\n*\s*[\'\"](\w+)[\'\"]") p4 = re.compile(r"# i18n: [\'\"]?(\w+)[\'\"]?") - python_files = glob.glob("src/yunohost/*.py") - python_files.extend(glob.glob("src/yunohost/utils/*.py")) - python_files.extend(glob.glob("src/yunohost/data_migrations/*.py")) - python_files.extend(glob.glob("src/yunohost/authenticators/*.py")) - python_files.extend(glob.glob("data/hooks/diagnosis/*.py")) + python_files = glob.glob("src/*.py") + python_files.extend(glob.glob("src/utils/*.py")) + python_files.extend(glob.glob("src/data_migrations/*.py")) + python_files.extend(glob.glob("src/authenticators/*.py")) + python_files.extend(glob.glob("src/diagnosis/*.py")) python_files.append("bin/yunohost") for python_file in python_files: @@ -52,7 +52,7 @@ def find_expected_string_keys(): # For each diagnosis, try to find strings like "diagnosis_stuff_foo" (c.f. diagnosis summaries) # Also we expect to have "diagnosis_description_" for each diagnosis p3 = re.compile(r"[\"\'](diagnosis_[a-z]+_\w+)[\"\']") - for python_file in glob.glob("data/hooks/diagnosis/*.py"): + for python_file in glob.glob("src/diagnosis/*.py"): content = open(python_file).read() for m in p3.findall(content): if m.endswith("_"): @@ -64,14 +64,14 @@ def find_expected_string_keys(): ] # For each migration, expect to find "migration_description_" - for path in glob.glob("src/yunohost/data_migrations/*.py"): + for path in glob.glob("src/data_migrations/*.py"): if "__init__" in path: continue yield "migration_description_" + os.path.basename(path)[:-3] # For each default service, expect to find "service_description_" for service, info in yaml.safe_load( - open("data/templates/yunohost/services.yml") + open("conf/yunohost/services.yml") ).items(): if info is None: continue @@ -80,7 +80,7 @@ def find_expected_string_keys(): # For all unit operations, expect to find "log_" # A unit operation is created either using the @is_unit_operation decorator # or using OperationLogger( - cmd = "grep -hr '@is_unit_operation' src/yunohost/ -A3 2>/dev/null | grep '^def' | sed -E 's@^def (\\w+)\\(.*@\\1@g'" + cmd = "grep -hr '@is_unit_operation' src/ -A3 2>/dev/null | grep '^def' | sed -E 's@^def (\\w+)\\(.*@\\1@g'" for funcname in ( subprocess.check_output(cmd, shell=True).decode("utf-8").strip().split("\n") ): @@ -95,14 +95,14 @@ def find_expected_string_keys(): # Global settings descriptions # Will be on a line like : ("service.ssh.allow_deprecated_dsa_hostkey", {"type": "bool", ... p5 = re.compile(r" \(\n*\s*[\"\'](\w[\w\.]+)[\"\'],") - content = open("src/yunohost/settings.py").read() + content = open("src/settings.py").read() for m in ( "global_settings_setting_" + s.replace(".", "_") for s in p5.findall(content) ): yield m # Keys for the actionmap ... - for category in yaml.safe_load(open("data/actionsmap/yunohost.yml")).values(): + for category in yaml.safe_load(open("src/actionsmap.yml")).values(): if "actions" not in category.keys(): continue for action in category["actions"].values(): @@ -130,13 +130,13 @@ def find_expected_string_keys(): yield "backup_applying_method_%s" % method yield "backup_method_%s_finished" % method - registrars = toml.load(open("data/other/registrar_list.toml")) + registrars = toml.load(open("share/registrar_list.toml")) supported_registrars = ["ovh", "gandi", "godaddy"] for registrar in supported_registrars: for key in registrars[registrar].keys(): yield f"domain_config_{key}" - domain_config = toml.load(open("data/other/config_domain.toml")) + domain_config = toml.load(open("share/config_domain.toml")) for panel in domain_config.values(): if not isinstance(panel, dict): continue diff --git a/tox.ini b/tox.ini index f00cc7fb8..e5cffb696 100644 --- a/tox.ini +++ b/tox.ini @@ -8,8 +8,8 @@ deps = py39-black-{run,check}: black py39-mypy: mypy >= 0.900 commands = - py39-lint: flake8 src doc data tests --ignore E402,E501,E203,W503 --exclude src/yunohost/vendor - py39-invalidcode: flake8 src data --exclude src/yunohost/tests,src/yunohost/vendor --select F,E722,W605 + py39-lint: flake8 src doc data tests --ignore E402,E501,E203,W503 --exclude src/vendor + py39-invalidcode: flake8 src data --exclude src/tests,src/vendor --select F,E722,W605 py39-black-check: black --check --diff src doc data tests py39-black-run: black src doc data tests - py39-mypy: mypy --ignore-missing-import --install-types --non-interactive --follow-imports silent src/yunohost/ --exclude (acme_tiny|data_migrations) + py39-mypy: mypy --ignore-missing-import --install-types --non-interactive --follow-imports silent src/ --exclude (acme_tiny|data_migrations) From ebf9d522e05f01038ffbe948e9c23e162c57baa9 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Wed, 10 Nov 2021 19:51:11 +0100 Subject: [PATCH 122/619] Adapt diagnosers code to load them as python modules instead of hooks --- src/diagnosis.py | 68 ++++++++++++++++++----------- src/diagnosis/00-basesystem.py | 21 +++++---- src/diagnosis/10-ip.py | 13 +++--- src/diagnosis/12-dnsrecords.py | 12 +++-- src/diagnosis/14-ports.py | 6 +-- src/diagnosis/21-web.py | 6 +-- src/diagnosis/24-mail.py | 11 +++-- src/diagnosis/30-services.py | 6 +-- src/diagnosis/50-systemresources.py | 6 +-- src/diagnosis/70-regenconf.py | 6 +-- src/diagnosis/80-apps.py | 6 +-- 11 files changed, 74 insertions(+), 87 deletions(-) diff --git a/src/diagnosis.py b/src/diagnosis.py index 4ac5e2731..a7b6c725c 100644 --- a/src/diagnosis.py +++ b/src/diagnosis.py @@ -27,6 +27,8 @@ import re import os import time +import glob +from importlib import import_module from moulinette import m18n, Moulinette from moulinette.utils import log @@ -38,7 +40,6 @@ from moulinette.utils.filesystem import ( ) from yunohost.utils.error import YunohostError, YunohostValidationError -from yunohost.hook import hook_list, hook_exec logger = log.getActionLogger("yunohost.diagnosis") @@ -48,15 +49,13 @@ DIAGNOSIS_SERVER = "diagnosis.yunohost.org" def diagnosis_list(): - all_categories_names = [h for h, _ in _list_diagnosis_categories()] - return {"categories": all_categories_names} + return {"categories": _list_diagnosis_categories()} def diagnosis_get(category, item): # Get all the categories - all_categories = _list_diagnosis_categories() - all_categories_names = [c for c, _ in all_categories] + all_categories_names = _list_diagnosis_categories() if category not in all_categories_names: raise YunohostValidationError( @@ -84,8 +83,7 @@ def diagnosis_show( return # Get all the categories - all_categories = _list_diagnosis_categories() - all_categories_names = [category for category, _ in all_categories] + all_categories_names = _list_diagnosis_categories() # Check the requested category makes sense if categories == []: @@ -174,8 +172,7 @@ def diagnosis_run( return # Get all the categories - all_categories = _list_diagnosis_categories() - all_categories_names = [category for category, _ in all_categories] + all_categories_names = _list_diagnosis_categories() # Check the requested category makes sense if categories == []: @@ -192,10 +189,11 @@ def diagnosis_run( diagnosed_categories = [] for category in categories: logger.debug("Running diagnosis for %s ..." % category) - path = [p for n, p in all_categories if n == category][0] + + diagnoser = _load_diagnoser(category) try: - code, report = hook_exec(path, args={"force": force}, env=None) + code, report = diagnoser.diagnose(force=force) except Exception: import traceback @@ -275,8 +273,7 @@ def _diagnosis_ignore(add_filter=None, remove_filter=None, list=False): def validate_filter_criterias(filter_): # Get all the categories - all_categories = _list_diagnosis_categories() - all_categories_names = [category for category, _ in all_categories] + all_categories_names = _list_diagnosis_categories() # Sanity checks for the provided arguments if len(filter_) == 0: @@ -404,12 +401,8 @@ def add_ignore_flag_to_issues(report): class Diagnoser: - def __init__(self, args, env, loggers): + def __init__(self): - # FIXME ? That stuff with custom loggers is weird ... (mainly inherited from the bash hooks, idk) - self.logger_debug, self.logger_warning, self.logger_info = loggers - self.env = env - self.args = args or {} self.cache_file = Diagnoser.cache_file(self.id_) self.description = Diagnoser.get_description(self.id_) @@ -424,10 +417,10 @@ class Diagnoser: os.makedirs(DIAGNOSIS_CACHE) return write_to_json(self.cache_file, report) - def diagnose(self): + def diagnose(self, force=False): if ( - not self.args.get("force", False) + not force and self.cached_time_ago() < self.cache_duration ): self.logger_debug("Cache still valid : %s" % self.cache_file) @@ -666,13 +659,36 @@ class Diagnoser: def _list_diagnosis_categories(): - hooks_raw = hook_list("diagnosis", list_by="priority", show_info=True)["hooks"] - hooks = [] - for _, some_hooks in sorted(hooks_raw.items(), key=lambda h: int(h[0])): - for name, info in some_hooks.items(): - hooks.append((name, info["path"])) - return hooks + paths = glob.glob(os.path.dirname(__file__) + "/diagnosis/??-*.py") + names = sorted([os.path.basename(path)[: -len(".py")] for path in paths]) + + return names + + +def _load_diagnoser(diagnoser_name): + + logger.debug(f"Loading diagnoser {diagnoser_name}") + + paths = glob.glob(os.path.dirname(__file__) + f"/diagnosis/??-{diagnoser_name}.py") + + if len(paths) != 1: + raise YunohostError(f"Uhoh, found several matches (or none?) for diagnoser {diagnoser_name} : {paths}", raw_msg=True) + + module_id = os.path.basename(paths[0][: -len(".py")]) + + try: + # this is python builtin method to import a module using a name, we + # use that to import the migration as a python object so we'll be + # able to run it in the next loop + module = import_module("yunohost.diagnosis.{}".format(module_id)) + return module.MyDiagnoser() + except Exception as e: + import traceback + + traceback.print_exc() + + raise YunohostError(f"Failed to load diagnoser {diagnoser_name} : {e}", raw_msg=True) def _email_diagnosis_issues(): diff --git a/src/diagnosis/00-basesystem.py b/src/diagnosis/00-basesystem.py index b472a2d32..66a2bf47b 100644 --- a/src/diagnosis/00-basesystem.py +++ b/src/diagnosis/00-basesystem.py @@ -4,13 +4,16 @@ import os import json import subprocess +from moulinette.utils import log from moulinette.utils.process import check_output from moulinette.utils.filesystem import read_file, read_json, write_to_json from yunohost.diagnosis import Diagnoser from yunohost.utils.packages import ynh_packages_version +logger = log.getActionLogger("yunohost.diagnosis") -class BaseSystemDiagnoser(Diagnoser): + +class MyDiagnoser(Diagnoser): id_ = os.path.splitext(os.path.basename(__file__))[0].split("-")[1] cache_duration = 600 @@ -172,7 +175,7 @@ class BaseSystemDiagnoser(Diagnoser): try: return int(n_failures) except Exception: - self.logger_warning( + logger.warning( "Failed to parse number of recent auth failures, expected an int, got '%s'" % n_failures ) @@ -196,7 +199,7 @@ class BaseSystemDiagnoser(Diagnoser): if not os.path.exists(dpkg_log) or os.path.getmtime( cache_file ) > os.path.getmtime(dpkg_log): - self.logger_debug( + logger.debug( "Using cached results for meltdown checker, from %s" % cache_file ) return read_json(cache_file)[0]["VULNERABLE"] @@ -209,7 +212,7 @@ class BaseSystemDiagnoser(Diagnoser): # example output from the script: # [{"NAME":"MELTDOWN","CVE":"CVE-2017-5754","VULNERABLE":false,"INFOS":"PTI mitigates the vulnerability"}] try: - self.logger_debug("Running meltdown vulnerability checker") + logger.debug("Running meltdown vulnerability checker") call = subprocess.Popen( "bash %s --batch json --variant 3" % SCRIPT_PATH, shell=True, @@ -231,7 +234,7 @@ class BaseSystemDiagnoser(Diagnoser): # stuff which should be the last line output = output.strip() if "\n" in output: - self.logger_debug("Original meltdown checker output : %s" % output) + logger.debug("Original meltdown checker output : %s" % output) output = output.split("\n")[-1] CVEs = json.loads(output) @@ -241,18 +244,14 @@ class BaseSystemDiagnoser(Diagnoser): import traceback traceback.print_exc() - self.logger_warning( + logger.warning( "Something wrong happened when trying to diagnose Meltdown vunerability, exception: %s" % e ) raise Exception("Command output for failed meltdown check: '%s'" % output) - self.logger_debug( + logger.debug( "Writing results from meltdown checker to cache file, %s" % cache_file ) write_to_json(cache_file, CVEs) return CVEs[0]["VULNERABLE"] - - -def main(args, env, loggers): - return BaseSystemDiagnoser(args, env, loggers).diagnose() diff --git a/src/diagnosis/10-ip.py b/src/diagnosis/10-ip.py index bc00fe25c..4ad4cfbfc 100644 --- a/src/diagnosis/10-ip.py +++ b/src/diagnosis/10-ip.py @@ -4,6 +4,7 @@ import re import os import random +from moulinette.utils import log from moulinette.utils.network import download_text from moulinette.utils.process import check_output from moulinette.utils.filesystem import read_file @@ -11,8 +12,10 @@ from moulinette.utils.filesystem import read_file from yunohost.diagnosis import Diagnoser from yunohost.utils.network import get_network_interfaces +logger = log.getActionLogger("yunohost.diagnosis") -class IPDiagnoser(Diagnoser): + +class MyDiagnoser(Diagnoser): id_ = os.path.splitext(os.path.basename(__file__))[0].split("-")[1] cache_duration = 600 @@ -144,7 +147,7 @@ class IPDiagnoser(Diagnoser): ) if not any(is_default_route(r) for r in routes): - self.logger_debug( + logger.debug( "No default route for IPv%s, so assuming there's no IP address for that version" % protocol ) @@ -220,11 +223,7 @@ class IPDiagnoser(Diagnoser): try: return download_text(url, timeout=30).strip() except Exception as e: - self.logger_debug( + logger.debug( "Could not get public IPv%s : %s" % (str(protocol), str(e)) ) return None - - -def main(args, env, loggers): - return IPDiagnoser(args, env, loggers).diagnose() diff --git a/src/diagnosis/12-dnsrecords.py b/src/diagnosis/12-dnsrecords.py index d45ebd9b8..305fda79b 100644 --- a/src/diagnosis/12-dnsrecords.py +++ b/src/diagnosis/12-dnsrecords.py @@ -6,6 +6,7 @@ import re from datetime import datetime, timedelta from publicsuffix2 import PublicSuffixList +from moulinette.utils import log from moulinette.utils.process import check_output from yunohost.utils.dns import ( @@ -18,8 +19,9 @@ from yunohost.diagnosis import Diagnoser from yunohost.domain import domain_list, _get_maindomain from yunohost.dns import _build_dns_conf, _get_dns_zone_for_domain +logger = log.getActionLogger("yunohost.diagnosis") -class DNSRecordsDiagnoser(Diagnoser): +class MyDiagnoser(Diagnoser): id_ = os.path.splitext(os.path.basename(__file__))[0].split("-")[1] cache_duration = 600 @@ -31,7 +33,7 @@ class DNSRecordsDiagnoser(Diagnoser): major_domains = domain_list(exclude_subdomains=True)["domains"] for domain in major_domains: - self.logger_debug("Diagnosing DNS conf for %s" % domain) + logger.debug("Diagnosing DNS conf for %s" % domain) for report in self.check_domain( domain, @@ -223,7 +225,7 @@ class DNSRecordsDiagnoser(Diagnoser): ) ) else: - self.logger_debug("Dyndns domain: %s" % (domain)) + logger.debug("Dyndns domain: %s" % (domain)) continue expire_in = expire_date - datetime.now() @@ -298,7 +300,3 @@ class DNSRecordsDiagnoser(Diagnoser): return datetime.strptime(match.group(1), "%d-%b-%Y") return "expiration_not_found" - - -def main(args, env, loggers): - return DNSRecordsDiagnoser(args, env, loggers).diagnose() diff --git a/src/diagnosis/14-ports.py b/src/diagnosis/14-ports.py index 7581a1ac6..e339a946c 100644 --- a/src/diagnosis/14-ports.py +++ b/src/diagnosis/14-ports.py @@ -6,7 +6,7 @@ from yunohost.diagnosis import Diagnoser from yunohost.service import _get_services -class PortsDiagnoser(Diagnoser): +class MyDiagnoser(Diagnoser): id_ = os.path.splitext(os.path.basename(__file__))[0].split("-")[1] cache_duration = 600 @@ -146,7 +146,3 @@ class PortsDiagnoser(Diagnoser): "diagnosis_ports_forwarding_tip", ], ) - - -def main(args, env, loggers): - return PortsDiagnoser(args, env, loggers).diagnose() diff --git a/src/diagnosis/21-web.py b/src/diagnosis/21-web.py index 450296e7e..3d9fb9f73 100644 --- a/src/diagnosis/21-web.py +++ b/src/diagnosis/21-web.py @@ -13,7 +13,7 @@ from yunohost.utils.dns import is_special_use_tld DIAGNOSIS_SERVER = "diagnosis.yunohost.org" -class WebDiagnoser(Diagnoser): +class MyDiagnoser(Diagnoser): id_ = os.path.splitext(os.path.basename(__file__))[0].split("-")[1] cache_duration = 600 @@ -198,7 +198,3 @@ class WebDiagnoser(Diagnoser): summary="diagnosis_http_partially_unreachable", details=[detail.replace("error_http_check", "diagnosis_http")], ) - - -def main(args, env, loggers): - return WebDiagnoser(args, env, loggers).diagnose() diff --git a/src/diagnosis/24-mail.py b/src/diagnosis/24-mail.py index f29b2786d..af7af1a16 100644 --- a/src/diagnosis/24-mail.py +++ b/src/diagnosis/24-mail.py @@ -6,6 +6,7 @@ import re from subprocess import CalledProcessError +from moulinette.utils import log from moulinette.utils.process import check_output from moulinette.utils.filesystem import read_yaml @@ -16,8 +17,10 @@ from yunohost.utils.dns import dig DEFAULT_DNS_BLACKLIST = "/usr/share/yunohost/dnsbl_list.yml" +logger = log.getActionLogger("yunohost.diagnosis") -class MailDiagnoser(Diagnoser): + +class MyDiagnoser(Diagnoser): id_ = os.path.splitext(os.path.basename(__file__))[0].split("-")[1] cache_duration = 600 @@ -42,7 +45,7 @@ class MailDiagnoser(Diagnoser): "check_queue", # i18n: diagnosis_mail_queue_ok ] for check in checks: - self.logger_debug("Running " + check) + logger.debug("Running " + check) reports = list(getattr(self, check)()) for report in reports: yield report @@ -292,7 +295,3 @@ class MailDiagnoser(Diagnoser): if global_ipv6: outgoing_ips.append(global_ipv6) return (outgoing_ipversions, outgoing_ips) - - -def main(args, env, loggers): - return MailDiagnoser(args, env, loggers).diagnose() diff --git a/src/diagnosis/30-services.py b/src/diagnosis/30-services.py index adbcc73b9..daf86ab1e 100644 --- a/src/diagnosis/30-services.py +++ b/src/diagnosis/30-services.py @@ -6,7 +6,7 @@ from yunohost.diagnosis import Diagnoser from yunohost.service import service_status -class ServicesDiagnoser(Diagnoser): +class MyDiagnoser(Diagnoser): id_ = os.path.splitext(os.path.basename(__file__))[0].split("-")[1] cache_duration = 300 @@ -41,7 +41,3 @@ class ServicesDiagnoser(Diagnoser): item["summary"] = "diagnosis_services_running" yield item - - -def main(args, env, loggers): - return ServicesDiagnoser(args, env, loggers).diagnose() diff --git a/src/diagnosis/50-systemresources.py b/src/diagnosis/50-systemresources.py index a662e392e..265e62acb 100644 --- a/src/diagnosis/50-systemresources.py +++ b/src/diagnosis/50-systemresources.py @@ -9,7 +9,7 @@ from moulinette.utils.process import check_output from yunohost.diagnosis import Diagnoser -class SystemResourcesDiagnoser(Diagnoser): +class MyDiagnoser(Diagnoser): id_ = os.path.splitext(os.path.basename(__file__))[0].split("-")[1] cache_duration = 300 @@ -214,7 +214,3 @@ def round_(n): if n > 10: n = int(round(n)) return n - - -def main(args, env, loggers): - return SystemResourcesDiagnoser(args, env, loggers).diagnose() diff --git a/src/diagnosis/70-regenconf.py b/src/diagnosis/70-regenconf.py index 8ccbeed58..63f6f2b32 100644 --- a/src/diagnosis/70-regenconf.py +++ b/src/diagnosis/70-regenconf.py @@ -9,7 +9,7 @@ from yunohost.regenconf import _get_regenconf_infos, _calculate_hash from moulinette.utils.filesystem import read_file -class RegenconfDiagnoser(Diagnoser): +class MyDiagnoser(Diagnoser): id_ = os.path.splitext(os.path.basename(__file__))[0].split("-")[1] cache_duration = 300 @@ -70,7 +70,3 @@ class RegenconfDiagnoser(Diagnoser): for path, hash_ in infos["conffiles"].items(): if hash_ != _calculate_hash(path): yield {"path": path, "category": category} - - -def main(args, env, loggers): - return RegenconfDiagnoser(args, env, loggers).diagnose() diff --git a/src/diagnosis/80-apps.py b/src/diagnosis/80-apps.py index 5aec48ed8..e62acaa1f 100644 --- a/src/diagnosis/80-apps.py +++ b/src/diagnosis/80-apps.py @@ -7,7 +7,7 @@ from yunohost.app import app_list from yunohost.diagnosis import Diagnoser -class AppDiagnoser(Diagnoser): +class MyDiagnoser(Diagnoser): id_ = os.path.splitext(os.path.basename(__file__))[0].split("-")[1] cache_duration = 300 @@ -90,7 +90,3 @@ class AppDiagnoser(Diagnoser): == 0 ): yield ("error", "diagnosis_apps_deprecated_practices") - - -def main(args, env, loggers): - return AppDiagnoser(args, env, loggers).diagnose() From 248d7f5678437ef0f25b0783e90fda510eae213f Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Wed, 10 Nov 2021 19:53:05 +0100 Subject: [PATCH 123/619] data_migrations -> migrations --- .../0021_migrate_to_bullseye.py | 0 .../0022_php73_to_php74_pools.py | 0 .../0023_postgresql_11_to_13.py | 0 src/{data_migrations => migrations}/__init__.py | 0 src/tools.py | 10 +++++----- tests/add_missing_keys.py | 4 ++-- tests/test_i18n_keys.py | 4 ++-- tox.ini | 2 +- 8 files changed, 10 insertions(+), 10 deletions(-) rename src/{data_migrations => migrations}/0021_migrate_to_bullseye.py (100%) rename src/{data_migrations => migrations}/0022_php73_to_php74_pools.py (100%) rename src/{data_migrations => migrations}/0023_postgresql_11_to_13.py (100%) rename src/{data_migrations => migrations}/__init__.py (100%) diff --git a/src/data_migrations/0021_migrate_to_bullseye.py b/src/migrations/0021_migrate_to_bullseye.py similarity index 100% rename from src/data_migrations/0021_migrate_to_bullseye.py rename to src/migrations/0021_migrate_to_bullseye.py diff --git a/src/data_migrations/0022_php73_to_php74_pools.py b/src/migrations/0022_php73_to_php74_pools.py similarity index 100% rename from src/data_migrations/0022_php73_to_php74_pools.py rename to src/migrations/0022_php73_to_php74_pools.py diff --git a/src/data_migrations/0023_postgresql_11_to_13.py b/src/migrations/0023_postgresql_11_to_13.py similarity index 100% rename from src/data_migrations/0023_postgresql_11_to_13.py rename to src/migrations/0023_postgresql_11_to_13.py diff --git a/src/data_migrations/__init__.py b/src/migrations/__init__.py similarity index 100% rename from src/data_migrations/__init__.py rename to src/migrations/__init__.py diff --git a/src/tools.py b/src/tools.py index a92e478de..f9de32cfe 100644 --- a/src/tools.py +++ b/src/tools.py @@ -933,12 +933,12 @@ def _get_migrations_list(): migrations = [] try: - from . import data_migrations + from . import migrations except ImportError: # not data migrations present, return empty list return migrations - migrations_path = data_migrations.__path__[0] + migrations_path = migrations.__path__[0] if not os.path.exists(migrations_path): logger.warn(m18n.n("migrations_cant_reach_migration_file", migrations_path)) @@ -973,11 +973,11 @@ def _get_migration_by_name(migration_name): """ try: - from . import data_migrations + from . import migrations except ImportError: raise AssertionError("Unable to find migration with name %s" % migration_name) - migrations_path = data_migrations.__path__[0] + migrations_path = migrations.__path__[0] migrations_found = [ x for x in os.listdir(migrations_path) @@ -1001,7 +1001,7 @@ def _load_migration(migration_file): # this is python builtin method to import a module using a name, we # use that to import the migration as a python object so we'll be # able to run it in the next loop - module = import_module("yunohost.data_migrations.{}".format(migration_id)) + module = import_module("yunohost.migrations.{}".format(migration_id)) return module.MyMigration(migration_id) except Exception as e: import traceback diff --git a/tests/add_missing_keys.py b/tests/add_missing_keys.py index 1bf335418..e1ecbf56e 100644 --- a/tests/add_missing_keys.py +++ b/tests/add_missing_keys.py @@ -26,7 +26,7 @@ def find_expected_string_keys(): python_files = glob.glob("src/*.py") python_files.extend(glob.glob("src/utils/*.py")) - python_files.extend(glob.glob("src/data_migrations/*.py")) + python_files.extend(glob.glob("src/migrations/*.py")) python_files.extend(glob.glob("src/authenticators/*.py")) python_files.extend(glob.glob("src/diagnosis/*.py")) python_files.append("bin/yunohost") @@ -63,7 +63,7 @@ def find_expected_string_keys(): ] # For each migration, expect to find "migration_description_" - for path in glob.glob("src/data_migrations/*.py"): + for path in glob.glob("src/migrations/*.py"): if "__init__" in path: continue yield "migration_description_" + os.path.basename(path)[:-3] diff --git a/tests/test_i18n_keys.py b/tests/test_i18n_keys.py index d0ae75bfc..b25d35923 100644 --- a/tests/test_i18n_keys.py +++ b/tests/test_i18n_keys.py @@ -27,7 +27,7 @@ def find_expected_string_keys(): python_files = glob.glob("src/*.py") python_files.extend(glob.glob("src/utils/*.py")) - python_files.extend(glob.glob("src/data_migrations/*.py")) + python_files.extend(glob.glob("src/migrations/*.py")) python_files.extend(glob.glob("src/authenticators/*.py")) python_files.extend(glob.glob("src/diagnosis/*.py")) python_files.append("bin/yunohost") @@ -64,7 +64,7 @@ def find_expected_string_keys(): ] # For each migration, expect to find "migration_description_" - for path in glob.glob("src/data_migrations/*.py"): + for path in glob.glob("src/migrations/*.py"): if "__init__" in path: continue yield "migration_description_" + os.path.basename(path)[:-3] diff --git a/tox.ini b/tox.ini index e5cffb696..3e3fcbf2e 100644 --- a/tox.ini +++ b/tox.ini @@ -12,4 +12,4 @@ commands = py39-invalidcode: flake8 src data --exclude src/tests,src/vendor --select F,E722,W605 py39-black-check: black --check --diff src doc data tests py39-black-run: black src doc data tests - py39-mypy: mypy --ignore-missing-import --install-types --non-interactive --follow-imports silent src/ --exclude (acme_tiny|data_migrations) + py39-mypy: mypy --ignore-missing-import --install-types --non-interactive --follow-imports silent src/ --exclude (acme_tiny|migrations) From e19330b0c2b13f32f47e1f0d51a4695893b6e210 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Wed, 10 Nov 2021 19:56:59 +0100 Subject: [PATCH 124/619] Aaaaand forgot to git add diagnosis/__init__.py --- src/diagnosis/__init__.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 src/diagnosis/__init__.py diff --git a/src/diagnosis/__init__.py b/src/diagnosis/__init__.py new file mode 100644 index 000000000..e69de29bb From 244287bdd0e1dd0cba83e50f6352dc467afe50a8 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Fri, 12 Nov 2021 21:31:11 +0100 Subject: [PATCH 125/619] ci: Idk why dch ain't there by default anymore but meh, installing devscripts should solve the issue... --- .gitlab/ci/build.gitlab-ci.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitlab/ci/build.gitlab-ci.yml b/.gitlab/ci/build.gitlab-ci.yml index 82def4eb3..db691b9d2 100644 --- a/.gitlab/ci/build.gitlab-ci.yml +++ b/.gitlab/ci/build.gitlab-ci.yml @@ -11,6 +11,7 @@ - $YNH_BUILD_DIR/*.deb .build_script: &build_script + - DEBIAN_FRONTEND=noninteractive apt --assume-yes -o Dpkg::Options::="--force-confold" install devscripts --no-install-recommends - cd $YNH_BUILD_DIR/$PACKAGE - VERSION=$(dpkg-parsechangelog -S Version 2>/dev/null) - VERSION_NIGHTLY="${VERSION}+$(date +%Y%m%d%H%M)" From 51d5dca03387d18842388379b5177b6e83833e4d Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Sat, 13 Nov 2021 18:36:38 +0100 Subject: [PATCH 126/619] Make ynh_add_fpm_config more robust to some edge cases --- data/helpers.d/php | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/data/helpers.d/php b/data/helpers.d/php index b0e9fa59d..d6ccc52cd 100644 --- a/data/helpers.d/php +++ b/data/helpers.d/php @@ -90,9 +90,11 @@ ynh_add_fpm_config() { local old_php_fpm_config_dir=$(ynh_app_setting_get --app=$app --key=fpm_config_dir) local old_php_finalphpconf="$old_php_fpm_config_dir/pool.d/$app.conf" - ynh_backup_if_checksum_is_different --file="$old_php_finalphpconf" - - ynh_remove_fpm_config + if [[ -f "$old_php_finalphpconf" ]] + then + ynh_backup_if_checksum_is_different --file="$old_php_finalphpconf" + ynh_remove_fpm_config + fi fi # Legacy args (packager should just list their php dependency as regular apt dependencies... From 044038d1c7c254fbef4c5effe9bb3673df3d4c18 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Sat, 13 Nov 2021 20:12:52 +0100 Subject: [PATCH 127/619] ci: Attempt to ignore branches created by the CI .. --- .gitlab-ci.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index d1cb36b73..ba0d9fd3e 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -19,6 +19,8 @@ workflow: - if: $CI_PIPELINE_SOURCE == "merge_request_event" # If we move to gitlab one day - if: $CI_PIPELINE_SOURCE == "external_pull_request_event" # For github PR - if: $CI_COMMIT_TAG # For tags + - if: $CI_COMMIT_REF_NAME =~ /^ci-/ # Ignore branches names ci-* (created by those pipelines) + when: never - if: $CI_COMMIT_REF_NAME != $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE == "push" # If it's not the default branch and if it's a push, then do not trigger a build when: never - when: always From 8d5e69566b1b54926ca2557b4ae979ab3ae74a23 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Sat, 13 Nov 2021 20:14:25 +0100 Subject: [PATCH 128/619] Fix error during mysql regenconf, no templates folder anymoar --- data/hooks/conf_regen/34-mysql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/hooks/conf_regen/34-mysql b/data/hooks/conf_regen/34-mysql index 13730e0bb..27c956ced 100755 --- a/data/hooks/conf_regen/34-mysql +++ b/data/hooks/conf_regen/34-mysql @@ -6,7 +6,7 @@ set -e do_pre_regen() { pending_dir=$1 - cd /usr/share/yunohost/templates/mysql + #cd /usr/share/yunohost/templates/mysql # Nothing to do } From 38f5352fc0f80a6ef57006a72012652dcbe3af7c Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Sun, 14 Nov 2021 16:06:04 +0100 Subject: [PATCH 129/619] Fix -conf_ynh_settings backup/restore when /etc/yunohost/domains doesn't exist --- data/hooks/backup/20-conf_ynh_settings | 2 +- data/hooks/restore/20-conf_ynh_settings | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/data/hooks/backup/20-conf_ynh_settings b/data/hooks/backup/20-conf_ynh_settings index 9b56f1579..76ab0aaca 100644 --- a/data/hooks/backup/20-conf_ynh_settings +++ b/data/hooks/backup/20-conf_ynh_settings @@ -12,7 +12,7 @@ backup_dir="${1}/conf/ynh" # Backup the configuration ynh_backup "/etc/yunohost/firewall.yml" "${backup_dir}/firewall.yml" ynh_backup "/etc/yunohost/current_host" "${backup_dir}/current_host" -ynh_backup "/etc/yunohost/domains" "${backup_dir}/domains" +[ ! -d "/etc/yunohost/domains" ] || ynh_backup "/etc/yunohost/domains" "${backup_dir}/domains" [ ! -e "/etc/yunohost/settings.json" ] || ynh_backup "/etc/yunohost/settings.json" "${backup_dir}/settings.json" [ ! -d "/etc/yunohost/dyndns" ] || ynh_backup "/etc/yunohost/dyndns" "${backup_dir}/dyndns" [ ! -d "/etc/dkim" ] || ynh_backup "/etc/dkim" "${backup_dir}/dkim" diff --git a/data/hooks/restore/20-conf_ynh_settings b/data/hooks/restore/20-conf_ynh_settings index 4c4c6ed5e..2d731bd54 100644 --- a/data/hooks/restore/20-conf_ynh_settings +++ b/data/hooks/restore/20-conf_ynh_settings @@ -2,7 +2,7 @@ backup_dir="$1/conf/ynh" cp -a "${backup_dir}/current_host" /etc/yunohost/current_host cp -a "${backup_dir}/firewall.yml" /etc/yunohost/firewall.yml -cp -a "${backup_dir}/domains" /etc/yunohost/domains +[ ! -d "${backup_dir}/domains" ] || cp -a "${backup_dir}/domains" /etc/yunohost/domains [ ! -e "${backup_dir}/settings.json" ] || cp -a "${backup_dir}/settings.json" "/etc/yunohost/settings.json" [ ! -d "${backup_dir}/dyndns" ] || cp -raT "${backup_dir}/dyndns" "/etc/yunohost/dyndns" [ ! -d "${backup_dir}/dkim" ] || cp -raT "${backup_dir}/dkim" "/etc/dkim" From 02e397ccc8aa099f40f905abdf5bd9ebdf121260 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Sun, 14 Nov 2021 17:43:34 +0100 Subject: [PATCH 130/619] ci: Fix filter on ci branches ... my regex doesn't seem to be working :| --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index ba0d9fd3e..8403cb8e8 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -19,7 +19,7 @@ workflow: - if: $CI_PIPELINE_SOURCE == "merge_request_event" # If we move to gitlab one day - if: $CI_PIPELINE_SOURCE == "external_pull_request_event" # For github PR - if: $CI_COMMIT_TAG # For tags - - if: $CI_COMMIT_REF_NAME =~ /^ci-/ # Ignore branches names ci-* (created by those pipelines) + - if: $CI_COMMIT_REF_NAME == "ci-format-dev" # Ignore black formatting branch created by the CI when: never - if: $CI_COMMIT_REF_NAME != $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE == "push" # If it's not the default branch and if it's a push, then do not trigger a build when: never From 697dd8b9c2289b089c1093018e351a822a6f2195 Mon Sep 17 00:00:00 2001 From: yunohost-bot Date: Sun, 14 Nov 2021 16:52:57 +0000 Subject: [PATCH 131/619] [CI] Format code with Black --- data/hooks/diagnosis/24-mail.py | 5 ++++- src/yunohost/log.py | 10 +++++++--- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/data/hooks/diagnosis/24-mail.py b/data/hooks/diagnosis/24-mail.py index 7b7f5f502..99a4aef28 100644 --- a/data/hooks/diagnosis/24-mail.py +++ b/data/hooks/diagnosis/24-mail.py @@ -210,7 +210,10 @@ class MailDiagnoser(Diagnoser): # Do the DNS Query status, answers = dig(query, "A") - if status != "ok" or (answers and set(answers) <= set(blacklist["non_blacklisted_return_code"])): + if status != "ok" or ( + answers + and set(answers) <= set(blacklist["non_blacklisted_return_code"]) + ): continue # Try to get the reason diff --git a/src/yunohost/log.py b/src/yunohost/log.py index 347fe2e65..0e534f9f8 100644 --- a/src/yunohost/log.py +++ b/src/yunohost/log.py @@ -749,8 +749,12 @@ class OperationLogger(object): # 72971 DEBUG 29739 + ynh_exit_properly # which are lines from backup-before-upgrade or restore-after-failed-upgrade ... filters = [re.compile(f_) for f_ in BORING_LOG_LINES] - filters.append(re.compile(r'\d+ \+ ')) - lines = [line for line in lines if not any(filter_.search(line) for filter_ in filters)] + filters.append(re.compile(r"\d+ \+ ")) + lines = [ + line + for line in lines + if not any(filter_.search(line) for filter_ in filters) + ] lines_to_display = [] @@ -758,7 +762,7 @@ class OperationLogger(object): rev_lines = list(reversed(lines)) for i, line in enumerate(rev_lines): if line.endswith("+ ynh_exit_properly"): - lines_to_display = reversed(rev_lines[i:i + 20]) + lines_to_display = reversed(rev_lines[i : i + 20]) break # If didnt find anything, just get the last 20 lines From 094c5f0807037149d740f34b998ef93d57f7ae6d Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Sun, 14 Nov 2021 21:10:44 +0100 Subject: [PATCH 132/619] Attempt to fix the CI again ... for some reason it complains that pytest ain't in the image despite being installed ... --- .gitlab/ci/test.gitlab-ci.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitlab/ci/test.gitlab-ci.yml b/.gitlab/ci/test.gitlab-ci.yml index 1aad46fbe..776e3474c 100644 --- a/.gitlab/ci/test.gitlab-ci.yml +++ b/.gitlab/ci/test.gitlab-ci.yml @@ -1,6 +1,7 @@ .install_debs: &install_debs - apt-get update -o Acquire::Retries=3 - DEBIAN_FRONTEND=noninteractive SUDO_FORCE_REMOVE=yes apt --assume-yes -o Dpkg::Options::="--force-confold" --allow-downgrades install ./$YNH_BUILD_DIR/*.deb + - pip3 install -U mock pip pytest pytest-cov pytest-mock pytest-sugar requests-mock tox ansi2html black jinja2 .test-stage: stage: tests From 1d33a74b4c585d42f52c549207727d8b5995ecb9 Mon Sep 17 00:00:00 2001 From: punkrockgirl Date: Fri, 5 Nov 2021 15:39:30 +0000 Subject: [PATCH 133/619] Translated using Weblate (Basque) Currently translated at 100.0% (705 of 705 strings) Translation: YunoHost/core Translate-URL: https://translate.yunohost.org/projects/yunohost/core/eu/ --- locales/eu.json | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/locales/eu.json b/locales/eu.json index b5f98dec5..1f69866bb 100644 --- a/locales/eu.json +++ b/locales/eu.json @@ -131,9 +131,9 @@ "diagnosis_ip_no_ipv4": "Zerbitzariak ez du dabilen IPv4rik.", "diagnosis_ip_no_ipv6": "Zerbitzariak ez du dabilen IPv6rik.", "diagnosis_ip_broken_dnsresolution": "Domeinu izenaren ebazpena kaltetuta dagoela dirudi… Suebakiren bat ote dago DNS eskaerak oztopatzen?", - "diagnosis_diskusage_low": "{mountpoint} fitxategi-sistemak ({device} euskarrian) edukieraren {free} ({free_percent}%) bakarrik ditu erabilgarri ({total} orotara). Kontuz ibili.", + "diagnosis_diskusage_low": "{mountpoint} fitxategi-sistemak ({device} euskarrian) edukieraren {free} (%{free_percent}a) bakarrik ditu erabilgarri ({total} orotara). Kontuz ibili.", "diagnosis_dns_good_conf": "DNS ezarpenak zuzen konfiguratuta daude {domain} domeinurako ({category} atala)", - "diagnosis_diskusage_verylow": "{mountpoint} fitxategi-sistemak ({device} euskarrian) edukieraren {free} ({free_percent}%) bakarrik ditu erabilgarri ({total} orotara). Zertxobait hustu beharko zenuke!", + "diagnosis_diskusage_verylow": "{mountpoint} fitxategi-sistemak ({device} euskarrian) edukieraren {free} (%{free_percent}a) bakarrik ditu erabilgarri ({total} orotara). Zertxobait hustu beharko zenuke!", "diagnosis_description_basesystem": "Sistemaren oinarria", "diagnosis_description_services": "Zerbitzuen egoeraren egiaztapena", "diagnosis_http_could_not_diagnose": "Ezinezkoa izan da domeinuak IPv{ipversion} kanpotik eskuragarri dauden egiaztatzea.", @@ -145,7 +145,7 @@ "diagnosis_description_mail": "Posta elektronikoa", "diagnosis_http_connection_error": "Arazoa konexioan: ezin izan da domeinu horretara konektatu, litekeena da eskuragarri ez egotea.", "diagnosis_description_web": "Weba", - "diagnosis_display_tip": "Aurkitu diren arazoak ikusteko joan Diagnosien atalera administrazio-webgunean, edo exekutatu 'yunohost diagnosis show --issues --human-readable' komandoak nahiago badituzu.", + "diagnosis_display_tip": "Aurkitu diren arazoak ikusteko joan administrazio-atariko Diagnostikoak atalera, edo exekutatu 'yunohost diagnosis show --issues --human-readable' komandoak nahiago badituzu.", "diagnosis_dns_point_to_doc": "Mesedez, irakurri dokumentazioa DNS erregistroekin laguntza behar baduzu.", "diagnosis_mail_ehlo_unreachable": "SMTP posta zerbitzaria ez dago eskuragarri IPv{ipversion}ko sare lokaletik kanpo eta, beraz, ez da posta elektronikoa jasotzeko gai.", "diagnosis_mail_ehlo_bad_answer_details": "Litekeena da zure zerbitzaria ez den beste gailu batek erantzun izana.", @@ -175,7 +175,7 @@ "diagnosis_failed": "Ezinezkoa izan da '{category}' ataleko diagnostikoa lortzea: {error}", "diagnosis_ip_weird_resolvconf": "DNS ebazpena badabilela dirudi, baina antza denez moldatutako /etc/resolv.conf fitxategia erabiltzen ari zara.", "diagnosis_dns_bad_conf": "DNS balio batzuk falta dira edo ez dira zuzenak {domain} domeinurako ({category} atala)", - "diagnosis_diskusage_ok": "{mountpoint} fitxategi-sistemak ({device} euskarrian) edukieraren {free} ({free_percent}%) ditu erabilgarri oraindik ({total} orotara)!", + "diagnosis_diskusage_ok": "{mountpoint} fitxategi-sistemak ({device} euskarrian) edukieraren {free} (%{free_percent}a) ditu erabilgarri oraindik ({total} orotara)!", "apps_catalog_update_success": "Aplikazioen katalogoa eguneratu da!", "certmanager_warning_subdomain_dns_record": "'{subdomain}' azpidomeinuak ez dauka '{domain}'(e)k duen IP bera. Ezaugarri batzuk ez dira erabilgarri egongo hau zuzendu arte eta ziurtagiri bat birsortu arte.", "app_argument_choice_invalid": "Hautatu ({choices}) aukeretako bat '{name}' argumenturako: '{value}' ez dago aukera horien artean", @@ -295,7 +295,7 @@ "global_settings_setting_security_experimental_enabled": "Gaitu segurtasun funtzio esperimentalak (ez ezazu egin ez badakizu zertan ari zaren!)", "good_practices_about_admin_password": "Administrazio-pasahitz berria ezartzear zaude. Pasahitzak zortzi karaktere izan beharko lituzke gutxienez, baina gomendagarria da pasahitz luzeagoa erabiltzea (esaldi bat, esaterako) edota karaktere desberdinak erabiltzea (hizki larriak, txikiak, zenbakiak eta karaktere bereziak).", "log_help_to_get_failed_log": "Ezin izan da '{desc}' eragiketa exekutatu. Mesedez, laguntza nahi baduzu partekatu eragiketa honen erregistro osoa 'yunohost log share {name}' komandoa erabiliz", - "global_settings_setting_security_webadmin_allowlist_enabled": "Baimendu IP zehatz batzuk bakarrik administrazio-webgunean.", + "global_settings_setting_security_webadmin_allowlist_enabled": "Baimendu IP zehatz batzuk bakarrik administrazio-atarian.", "group_unknown": "'{group}' taldea ezezaguna da", "group_updated": "'{group}' taldea eguneratu da", "group_update_failed": "Ezinezkoa izan da '{group}' taldea eguneratzea: {error}", @@ -408,7 +408,7 @@ "diagnosis_swap_notsomuch": "Sistemak {total} swap baino ez ditu. Gutxienez {recommended} izaten saiatu beharko zinateke sistema memoriarik gabe gera ez dadin.", "diagnosis_security_vulnerable_to_meltdown_details": "Arazoa konpontzeko, sistema eguneratu eta berrabiarazi beharko zenuke linux-en kernel berriagoa erabiltzeko (edo zerbitzariaren arduradunarekin jarri harremanetan). Ikus https://meltdownattack.com/ argibide gehiagorako.", "diagnosis_services_conf_broken": "{service} zerbitzuko konfigurazioa hondatuta dago!", - "diagnosis_services_bad_status_tip": "Zerbitzua berrabiarazten saia zaitezke eta nahikoa ez bada, aztertu zerbitzuaren erregistroa administrariaren webgunean. (komandoak nahiago badituzu yunohost service restart {service} eta yunohost service log {service} hurrenez hurren).", + "diagnosis_services_bad_status_tip": "Zerbitzua berrabiarazten saia zaitezke eta nahikoa ez bada, aztertu zerbitzuaren erregistroa administrazio-atarian. (komandoak nahiago badituzu yunohost service restart {service} eta yunohost service log {service} hurrenez hurren).", "diagnosis_mail_ehlo_unreachable_details": "Ezinezkoa izan da zure zerbitzariko 25. atakari konektatzea IPv{ipversion} erabiliz. Badirudi ez dagoela eskuragarri.
1. Arazo honen zergati ohikoena 25. ataka egoki birbideratuta ez egotea da.
2. Egiaztatu postfix zerbitzua martxan dagoela.
3. Konfigurazio konplexuagoetan: egiaztatu suebaki edo reverse-proxyak konexioa oztopatzen ez dutela.", "group_already_exist_on_system_but_removing_it": "{group} taldea existitzen da sistemaren taldeetan, baina YunoHostek ezabatuko du…", "diagnosis_mail_fcrdns_nok_details": "Lehenik eta behin zure routerraren konfigurazio gunean edo hostingaren enpresaren aukeretan alderantzizko DNSa konfiguratzen saiatu beharko zinateke {ehlo_domain} erabiliz. (Hosting enpresaren arabera, ezinbestekoa da beraiekin harremanetan jartzea).", @@ -470,7 +470,7 @@ "diagnosis_mail_fcrdns_dns_missing": "Ez da alderantzizko DNSrik ezarri IPv{ipversion}rako. Litekeena da hartzaileak posta elektroniko batzuk jaso ezin izatea edo mezuok spam modura etiketatuak izatea.", "log_backup_create": "Sortu babeskopia fitxategia", "global_settings_setting_backup_compress_tar_archives": "Babeskopia berriak sortzean, konprimitu fitxategiak (.tar.gz) konprimitu gabeko fitxategien (.tar) ordez. Aukera hau gaitzean babeskopiek espazio gutxiago beharko dute, baina hasierako prozesua luzeagoa izango da eta CPUari lan handiagoa eragingo dio.", - "global_settings_setting_security_webadmin_allowlist": "Administrazio-webgunea bisita ditzaketen IP helbideak, koma bidez bereiziak.", + "global_settings_setting_security_webadmin_allowlist": "Administrazio-ataria bisita dezaketen IP helbideak, koma bidez bereiziak.", "global_settings_key_doesnt_exists": "'{settings_key}' gakoa ez da existitzen konfigurazio orokorrean; erabilgarri dauden gakoak ikus ditzakezu 'yunohost settings list' exekutatuz", "global_settings_setting_ssowat_panel_overlay_enabled": "Gaitu SSOwat paneleko \"overlay\"a", "log_backup_restore_system": "Lehengoratu sistema babeskopia fitxategi batetik", @@ -505,12 +505,12 @@ "yunohost_already_installed": "YunoHost instalatuta dago dagoeneko", "migration_0015_not_stretch": "Debianen oraingo bertsioa ez da Stretch!", "migrations_success_forward": "{id} migrazioak amaitu du", - "migrations_to_be_ran_manually": "{id} migrazioa eskuz abiarazi behar da. Mesedez, joan Erramintak → Migrazioak atalera administrazio-webgunean edo bestela exekutatu 'yunohost tools migrations run'.", + "migrations_to_be_ran_manually": "{id} migrazioa eskuz abiarazi behar da. Mesedez, joan Erramintak → Migrazioak atalera administrazio-atarian edo bestela exekutatu 'yunohost tools migrations run'.", "permission_currently_allowed_for_all_users": "Baimen hau erabiltzaile guztiei esleitzen zaie eta baita beste talde batzuei ere. Litekeena da 'all users' baimena edo esleituta duten taldeei baimena kendu nahi izatea.", "permission_require_account": "'{permission}' baimena zerbitzarian kontua duten erabiltzaileentzat da eta, beraz, ezin da gaitu bisitarientzat.", "postinstall_low_rootfsspace": "'root' fitxategi-sistemak 10 GB edo espazio gutxiago dauka, kezkatzekoa dena! Litekeena da espaziorik gabe geratzea aurki! Gomendagarria da 'root' fitxategi-sistemak gutxienez 16 GB libre izatea. Jakinarazpen honen ondoren YunoHost instalatzen jarraitu nahi baduzu, berrabiarazi agindua '--force-diskspace' gehituz", "this_action_broke_dpkg": "Eragiketa honek dpkg/APT (sistemaren pakete kudeatzaileak) kaltetu ditu… Arazoa konpontzeko SSH bidez konektatu eta 'sudo apt install --fix-broken' edota 'sudo dpkg --configure -a' exekutatu dezakezu.", - "tools_upgrade_special_packages_explanation": "Eguneraketa bereziak atzeko planoan jarraituko du. Mesedez, ez abiarazi bestelako eragiketarik datozen ~10 minutuetan (zure hardwarearen abiaduraren arabera). Honen ondoren litekeena da saioa berriro hasi behar izatea. Eguneraketaren erregistroa Erramintak → Erregistroak (administrazio-webgunean) edo 'yunohost log list' komandoa erabiliz egongo da ikusgai.", + "tools_upgrade_special_packages_explanation": "Eguneraketa bereziak atzeko planoan jarraituko du. Mesedez, ez abiarazi bestelako eragiketarik datozen ~10 minutuetan (zure hardwarearen abiaduraren arabera). Honen ondoren litekeena da saioa berriro hasi behar izatea. Eguneraketaren erregistroa Erramintak → Erregistroak atalean (administrazio-atarian) edo 'yunohost log list' komandoa erabiliz egongo da ikusgai.", "user_import_bad_line": "{line} lerro okerra: {details}", "restore_complete": "Lehengoratzea amaitu da", "restore_extracting": "Behar diren fitxategiak ateratzen…", @@ -659,7 +659,7 @@ "port_already_opened": "{port}. ataka dagoeneko irekita dago {ip_version} konexioetarako", "user_home_creation_failed": "Ezin izan da erabiltzailearentzat '{home}' direktorioa sortu", "user_unknown": "Erabiltzaile ezezaguna: {user}", - "yunohost_postinstall_end_tip": "Instalazio ondorengo prozesua amaitu da! Sistemaren konfigurazioa bukatzeko:\n- gehitu erabiltzaile bat administrazio-webguneko 'Erabiltzaileak' atalean (edo 'yunohost user create ' komandoa erabiliz);\n- erabili 'Diagnostikoa' atala ohiko arazoei aurre hartzeko. Administrazio-webgunean abiarazi edo 'yunohost diagnosis run' exekutatu;\n- irakurri 'Finalizing your setup' eta 'Getting to know YunoHost' atalak. Dokumentazioan aurki ditzakezu: https://yunohost.org/admindoc.", + "yunohost_postinstall_end_tip": "Instalazio ondorengo prozesua amaitu da! Sistemaren konfigurazioa bukatzeko:\n- gehitu erabiltzaile bat administrazio-atariko 'Erabiltzaileak' atalean (edo 'yunohost user create ' komandoa erabiliz);\n- erabili 'Diagnostikoak' atala ohiko arazoei aurre hartzeko. Administrazio-atarian abiarazi edo 'yunohost diagnosis run' exekutatu;\n- irakurri 'Finalizing your setup' eta 'Getting to know YunoHost' atalak. Dokumentazioan aurki ditzakezu: https://yunohost.org/admindoc.", "yunohost_not_installed": "YunoHost ez da zuzen instalatu. Mesedez, exekutatu 'yunohost tools postinstall'", "migration_0019_slapd_config_will_be_overwritten": "Badirudi eskuz moldatu duzula slapd konfigurazioa. Migrazio garrantzitsu honetarako, YunoHostek slapd ezarpenak eguneratu behar ditu. Oraingo fitxategiak {conf_backup_folder}-n kopiatuko dira.", "unlimit": "Mugarik ez", From 983c1a81ba54bb30c68ed6804e021634c96c3988 Mon Sep 17 00:00:00 2001 From: dagangtie Date: Fri, 5 Nov 2021 14:31:34 +0000 Subject: [PATCH 134/619] Translated using Weblate (Chinese (Simplified)) Currently translated at 89.2% (629 of 705 strings) Translation: YunoHost/core Translate-URL: https://translate.yunohost.org/projects/yunohost/core/zh_Hans/ --- locales/zh_Hans.json | 29 +++++++++++++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/locales/zh_Hans.json b/locales/zh_Hans.json index 9176ebab9..fa3b7bb03 100644 --- a/locales/zh_Hans.json +++ b/locales/zh_Hans.json @@ -625,5 +625,30 @@ "log_user_group_delete": "删除组'{}'", "log_user_group_create": "创建组'{}'", "log_user_delete": "删除用户'{}'", - "log_user_create": "添加用户'{}'" -} \ No newline at end of file + "log_user_create": "添加用户'{}'", + "domain_registrar_is_not_configured": "尚未为域 {domain} 配置注册商。", + "domain_dns_push_not_applicable": "的自动DNS配置的特征是不适用域{域}。您应该按照 https://yunohost.org/dns_config 上的文档手动配置DNS 记录。", + "disk_space_not_sufficient_update": "没有足够的磁盘空间来更新此应用程序", + "diagnosis_high_number_auth_failures": "最近出现了大量可疑的失败身份验证。您的fail2ban正在运行且配置正确,或使用自定义端口的SSH作为https://yunohost.org/解释的安全性。", + "diagnosis_apps_not_in_app_catalog": "此应用程序不在 YunoHost 的应用程序目录中。如果它过去有被删除过,您应该考虑卸载此应用程,因为它不会更新,并且可能会损害您系统的完整和安全性。", + "app_config_unable_to_apply": "无法应用配置面板值。", + "app_config_unable_to_read": "无法读取配置面板值。", + "config_forbidden_keyword": "关键字“{keyword}”是保留的,您不能创建或使用带有此 ID 的问题的配置面板。", + "config_no_panel": "未找到配置面板。", + "config_unknown_filter_key": "该过滤器钥匙“{filter_key}”有误。", + "diagnosis_apps_outdated_ynh_requirement": "此应用程序的安装 版本只需要 yunohost >= 2.x,这往往表明它与推荐的打包实践和帮助程序不是最新的。你真的应该考虑更新它。", + "disk_space_not_sufficient_install": "没有足够的磁盘空间来安装此应用程序", + "config_apply_failed": "应用新配置 失败:{错误}", + "config_cant_set_value_on_section": "无法在整个配置部分设置单个值 。", + "config_validate_color": "是有效的 RGB 十六进制颜色", + "config_validate_date": "有效日期格式为YYYY-MM-DD", + "config_validate_email": "是有效的电子邮件", + "config_validate_time": "应该是像 HH:MM 这样的有效时间", + "config_validate_url": "应该是有效的URL", + "config_version_not_supported": "不支持配置面板版本“{ version }”。", + "danger": "警告:", + "diagnosis_apps_allgood": "所有已安装的应用程序都遵守基本的打包原则", + "diagnosis_apps_deprecated_practices": "此应用程序的安装 版本仍然使用一些超旧的弃用打包原则。推荐您升级它。", + "diagnosis_apps_issue": "发现应用{ app } 存在问题", + "diagnosis_description_apps": "应用" +} From d066aab364b4f1a382a96e5e917a718defd6bbdf Mon Sep 17 00:00:00 2001 From: liimee Date: Sat, 6 Nov 2021 00:46:35 +0000 Subject: [PATCH 135/619] Translated using Weblate (Indonesian) Currently translated at 6.2% (44 of 705 strings) Translation: YunoHost/core Translate-URL: https://translate.yunohost.org/projects/yunohost/core/id/ --- locales/id.json | 47 ++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 46 insertions(+), 1 deletion(-) diff --git a/locales/id.json b/locales/id.json index 9e26dfeeb..1f28ae7e5 100644 --- a/locales/id.json +++ b/locales/id.json @@ -1 +1,46 @@ -{} \ No newline at end of file +{ + "admin_password": "Kata sandi administrasi", + "admin_password_change_failed": "Tidak dapat mengubah kata sandi", + "admin_password_changed": "Kata sandi administrasi diubah", + "admin_password_too_long": "Harap pilih kata sandi yang lebih pendek dari 127 karakter", + "already_up_to_date": "Tak ada yang harus dilakukan. Semuanya sudah mutakhir.", + "app_action_broke_system": "Tindakan ini sepertinya telah merusak layanan-layanan penting ini: {services}", + "app_already_installed": "{app} sudah terpasang", + "app_already_up_to_date": "{app} sudah dalam versi mutakhir", + "app_argument_required": "Argumen '{name}' dibutuhkan", + "app_change_url_identical_domains": "Domain)url_path yang lama dan baru identik ('{domain}{path}'), tak ada yang perlu dilakukan.", + "app_change_url_no_script": "Aplikasi '{app_name}' belum mendukung pengubahan URL. Mungkin Anda harus memperbaruinya.", + "app_change_url_success": "URL {app} sekarang adalah {domain}{path}", + "app_id_invalid": "ID aplikasi tidak valid", + "app_install_failed": "Tidak dapat memasang {app}: {error}", + "app_install_files_invalid": "Berkas-berkas ini tidak dapat dipasang", + "app_install_script_failed": "Sebuah kesalahan terjadi pada script pemasangan aplikasi", + "app_manifest_install_ask_admin": "Pilih seorang administrator untuk aplikasi ini", + "app_manifest_install_ask_domain": "Pilih di domain mana aplikasi ini harus dipasang", + "app_not_installed": "Tidak dapat menemukan {app} di daftar aplikasi yang terpasang: {all_apps}", + "app_not_properly_removed": "{app} belum dihapus dengan benar", + "app_remove_after_failed_install": "Menghapus aplikasi mengikuti kegagalan pemasangan...", + "app_removed": "{app} dihapus", + "app_restore_failed": "Tidak dapat memulihkan {app}: {error}", + "app_upgrade_some_app_failed": "Beberapa aplikasi tidak dapat diperbarui", + "app_upgraded": "{app} diperbarui", + "apps_already_up_to_date": "Semua aplikasi sudah pada versi mutakhir", + "apps_catalog_update_success": "Katalog aplikasi telah diperbarui!", + "apps_catalog_updating": "Memperbarui katalog aplikasi...", + "ask_firstname": "Nama depan", + "ask_lastname": "Nama belakang", + "ask_main_domain": "Domain utama", + "ask_new_domain": "Domain baru", + "ask_user_domain": "Domain yang digunakan untuk alamat surel dan akun XMPP pengguna", + "app_not_correctly_installed": "{app} kelihatannya terpasang dengan salah", + "app_start_restore": "Memulihkan {app}...", + "app_unknown": "Aplikasi tak dikenal", + "ask_new_admin_password": "Kata sandi administrasi baru", + "ask_password": "Kata sandi", + "app_upgrade_app_name": "Memperbarui {app}...", + "app_upgrade_failed": "Tidak dapat memperbarui {app}: {error}", + "app_start_install": "Memasang {app}...", + "app_start_remove": "Menghapus {app}...", + "app_manifest_install_ask_password": "Pilih kata sandi administrasi untuk aplikasi ini", + "app_upgrade_several_apps": "Aplikasi-aplikasi berikut akan diperbarui: {apps}" +} From 347e972693581a720324cb42160a4d3adb1604e2 Mon Sep 17 00:00:00 2001 From: Flavio Cristoforetti Date: Mon, 8 Nov 2021 11:56:54 +0000 Subject: [PATCH 136/619] Translated using Weblate (Italian) Currently translated at 88.6% (625 of 705 strings) Translation: YunoHost/core Translate-URL: https://translate.yunohost.org/projects/yunohost/core/it/ --- locales/it.json | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/locales/it.json b/locales/it.json index 1332712ef..f47223a37 100644 --- a/locales/it.json +++ b/locales/it.json @@ -629,5 +629,7 @@ "global_settings_setting_security_webadmin_allowlist": "Indirizzi IP con il permesso di accedere al webadmin, separati da virgola.", "global_settings_setting_security_webadmin_allowlist_enabled": "Permetti solo ad alcuni IP di accedere al webadmin.", "disk_space_not_sufficient_update": "Non c'è abbastanza spazio libero per aggiornare questa applicazione", - "disk_space_not_sufficient_install": "Non c'è abbastanza spazio libero per installare questa applicazione" -} \ No newline at end of file + "disk_space_not_sufficient_install": "Non c'è abbastanza spazio libero per installare questa applicazione", + "app_config_unable_to_apply": "Applicazione dei valori nel pannello di configurazione non riuscita.", + "app_config_unable_to_read": "Lettura dei valori nel pannello di configurazione non riuscita." +} From cfb05e0ca50f5e335195d37bdac1d01fb8bd5d2d Mon Sep 17 00:00:00 2001 From: Tymofii-Lytvynenko Date: Wed, 10 Nov 2021 11:56:01 +0000 Subject: [PATCH 137/619] Translated using Weblate (Ukrainian) Currently translated at 100.0% (705 of 705 strings) Translation: YunoHost/core Translate-URL: https://translate.yunohost.org/projects/yunohost/core/uk/ --- locales/uk.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/locales/uk.json b/locales/uk.json index 648c97fca..4baf6d20f 100644 --- a/locales/uk.json +++ b/locales/uk.json @@ -247,8 +247,8 @@ "log_help_to_get_log": "Щоб переглянути журнал операції '{desc}', використовуйте команду 'yunohost log show {name}'", "log_link_to_log": "Повний журнал цієї операції: '{desc}'", "log_corrupted_md_file": "Файл метаданих YAML, пов'язаний з журналами, пошкоджено: '{md_file}\nПомилка: {error}'", - "iptables_unavailable": "Ви не можете грати з iptables тут. Ви перебуваєте або в контейнері, або ваше ядро не підтримує його", - "ip6tables_unavailable": "Ви не можете грати з ip6tables тут. Ви перебуваєте або в контейнері, або ваше ядро не підтримує його", + "iptables_unavailable": "Ви не можете відтворювати з iptables тут. Ви перебуваєте або в контейнері, або ваше ядро не підтримує його", + "ip6tables_unavailable": "Ви не можете відтворювати з ip6tables тут. Ви перебуваєте або в контейнері, або ваше ядро не підтримує його", "invalid_regex": "Неприпустимий regex: '{regex}'", "installation_complete": "Установлення завершено", "hook_name_unknown": "Невідома назва хука '{name}'", From d9b53b08ea58140f546d3e794c791b2b0e66b2e8 Mon Sep 17 00:00:00 2001 From: Tommi Date: Sun, 14 Nov 2021 12:17:12 +0000 Subject: [PATCH 138/619] Translated using Weblate (Italian) Currently translated at 99.8% (704 of 705 strings) Translation: YunoHost/core Translate-URL: https://translate.yunohost.org/projects/yunohost/core/it/ --- locales/it.json | 80 +++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 77 insertions(+), 3 deletions(-) diff --git a/locales/it.json b/locales/it.json index f47223a37..7f3997839 100644 --- a/locales/it.json +++ b/locales/it.json @@ -42,7 +42,7 @@ "ask_new_admin_password": "Nuova password dell'amministrazione", "backup_app_failed": "Non è possibile fare il backup {app}", "backup_archive_app_not_found": "{app} non è stata trovata nel archivio di backup", - "app_argument_choice_invalid": "Usa una delle seguenti scelte '{choices}' per il parametro '{name}' invece di '{value}'", + "app_argument_choice_invalid": "Scegli un opzione valida per il parametro '{name}': '{value}' non è fra le opzioni disponibili ('{choices}')", "app_argument_invalid": "Scegli un valore valido per il parametro '{name}': {error}", "app_argument_required": "L'argomento '{name}' è requisito", "app_id_invalid": "Identificativo dell'applicazione non valido", @@ -301,7 +301,7 @@ "app_manifest_install_ask_is_public": "Quest'applicazione dovrà essere visibile ai visitatori anonimi?", "app_manifest_install_ask_admin": "Scegli un utente amministratore per quest'applicazione", "app_manifest_install_ask_password": "Scegli una password di amministrazione per quest'applicazione", - "app_manifest_install_ask_path": "Scegli il percorso dove installare quest'applicazione", + "app_manifest_install_ask_path": "Scegli il percorso URL (dopo il dominio) dove installare quest'applicazione", "app_manifest_install_ask_domain": "Scegli il dominio dove installare quest'app", "app_argument_password_no_default": "Errore durante il parsing dell'argomento '{name}': l'argomento password non può avere un valore di default per ragioni di sicurezza", "additional_urls_already_added": "L'URL aggiuntivo '{url}' è già utilizzato come URL aggiuntivo per il permesso '{permission}'", @@ -631,5 +631,79 @@ "disk_space_not_sufficient_update": "Non c'è abbastanza spazio libero per aggiornare questa applicazione", "disk_space_not_sufficient_install": "Non c'è abbastanza spazio libero per installare questa applicazione", "app_config_unable_to_apply": "Applicazione dei valori nel pannello di configurazione non riuscita.", - "app_config_unable_to_read": "Lettura dei valori nel pannello di configurazione non riuscita." + "app_config_unable_to_read": "Lettura dei valori nel pannello di configurazione non riuscita.", + "diagnosis_apps_issue": "È stato rilevato un errore per l’app {app}", + "global_settings_setting_security_nginx_redirect_to_https": "Reindirizza richieste HTTP a HTTPs di default (NON DISABILITARE a meno che tu non sappia veramente bene cosa stai facendo!)", + "diagnosis_http_special_use_tld": "Il dominio {domain} è basato su un dominio di primo livello (TLD) dall’uso speciale, come .local o .test, perciò non è previsto che sia esposto al di fuori della rete locale.", + "domain_dns_conf_special_use_tld": "Questo dominio è basato su un dominio di primo livello (TLD) dall’uso speciale, come .local o .test, perciò non è previsto abbia reali record DNS.", + "domain_dns_push_not_applicable": "La configurazione automatica del DNS non è applicabile al dominio {domain}. Dovresti configurare i tuoi record DNS manualmente, seguendo la documentazione su https://yunohost.org/dns_config.", + "domain_dns_registrar_not_supported": "YunoHost non è riuscito a riconoscere quale registrar sta gestendo questo dominio. Dovresti configurare i tuoi record DNS manualmente, seguendo la documentazione.", + "domain_dns_registrar_experimental": "Per ora, il collegamento con le API di **{registrar}** non è stata opportunamente testata e revisionata dalla comunità di YunoHost. Questa funzionalità è **altamente sperimentale**, fai attenzione!", + "domain_dns_push_failed_to_authenticate": "L’autenticazione sulle API del registrar per il dominio '{domain}' è fallita. Probabilmente le credenziali non sono corrette. (Error: {error})", + "domain_dns_push_failed_to_list": "Il reperimento dei record attuali usando le API del registrar è fallito: {error}", + "domain_dns_push_already_up_to_date": "I record sono aggiornati, nulla da fare.", + "domain_dns_pushing": "Sincronizzando i record DNS…", + "domain_config_mail_out": "Email in uscita", + "domain_config_xmpp": "Messaggistica (XMPP)", + "domain_config_auth_token": "Token di autenticazione", + "domain_config_auth_key": "Chiave di autenticazione", + "domain_config_auth_secret": "Autenticazione segreta", + "domain_config_api_protocol": "Protocollo API", + "domain_config_auth_entrypoint": "API entry point", + "other_available_options": "… e {n} altre opzioni di variabili non mostrate", + "service_description_yunomdns": "Ti permette di raggiungere il tuo server usando 'yunohost.local' all’interno della tua rete locale", + "user_import_nothing_to_do": "Nessun utente deve essere importato", + "user_import_partial_failed": "L’importazione degli utenti è parzialmente fallita", + "domain_unknown": "Il dominio '{domain}' è sconosciuto", + "log_user_import": "Importa utenti", + "invalid_password": "Password non valida", + "diagnosis_high_number_auth_failures": "Recentemente c’è stato un numero insolitamente alto di autenticazioni fallite. Potresti assicurarti che fail2ban stia funzionando e che sia configurato correttamente, oppure usare una differente porta SSH, come spiegato in https://yunohost.org/security.", + "diagnosis_apps_allgood": "Tutte le applicazioni installate rispettano le pratiche di packaging di base", + "config_apply_failed": "L’applicazione della nuova configurazione è fallita: {error}", + "diagnosis_apps_outdated_ynh_requirement": "La versione installata di quest’app richiede esclusivamente YunoHost >= 2.x, che tendenzialmente significa che non è aggiornata secondo le pratiche di packaging raccomandate. Dovresti proprio considerare di aggiornarla.", + "global_settings_setting_security_experimental_enabled": "Abilita funzionalità di sicurezza sperimentali (non abilitare se non sai cosa stai facendo!)", + "invalid_number_min": "Deve essere più grande di {min}", + "invalid_number_max": "Deve essere meno di {max}", + "log_app_config_set": "Applica la configurazione all’app '{}'", + "log_domain_dns_push": "Sincronizza i record DNS per il dominio '{}'", + "user_import_bad_file": "Il tuo file CSV non è formattato correttamente e sarà ignorato per evitare potenziali perdite di dati", + "user_import_failed": "L’operazione di importazione è completamente fallita", + "user_import_missing_columns": "Mancano le seguenti colonne: {columns}", + "user_import_success": "Utenti importati con successo", + "diagnosis_apps_bad_quality": "Sul catalogo delle applicazioni di YunoHost, questa applicazione è momentaneamente segnalata come non funzionante. Potrebbe trattarsi di un problema temporaneo, mentre i manutentori provano a risolverlo. Nel frattempo, l’aggiornamento di quest’app è disabilitato.", + "diagnosis_apps_broken": "Sul catalogo delle applicazioni di YunoHost, questa applicazione è momentaneamente segnalata come non funzionante. Potrebbe trattarsi di un problema temporaneo, mentre i manutentori provano a risolverlo. Nel frattempo, l’aggiornamento di quest’app è disabilitato.", + "diagnosis_apps_deprecated_practices": "La versione installata di questa app usa ancora delle pratiche di packaging super-vecchie oppure deprecate. Dovresti proprio considerare di aggiornarla.", + "diagnosis_apps_not_in_app_catalog": "Questa applicazione non è nel catalogo delle applicazioni di YunoHost. Se precedentemente lo era ed è stata rimossa, dovresti considerare di disinstallare l’app, dato che non riceverà aggiornamenti e potrebbe compromettere l’integrità e la sicurezza del tuo sistema.", + "diagnosis_dns_specialusedomain": "Il dominio {domain} è basato su un dominio di primo livello (TLD) dall’uso speciale, come .local o .test, perciò non è previsto abbia reali record DNS.", + "domain_dns_registrar_supported": "YunoHost ha automaticamente riconosciuto che questo dominio è gestito dal registrar **{registrar}**. Se vuoi e se fornirai le credenziali API appropriate, YunoHost può configurare automaticamente questa zona DNS. Puoi trovare la documentazione su come ottenere le tue credenziali API su questa pagina. (Puoi anche configurare i tuoi record DNS manualmente, seguendo la documentazione)", + "service_not_reloading_because_conf_broken": "Non sto ricaricando/riavviando il servizio '{name}' perché la sua configurazione è rotta: {errors}", + "config_cant_set_value_on_section": "Non puoi impostare un unico parametro in un’intera sezione della configurazione.", + "config_forbidden_keyword": "La parola chiave '{keyword}' è riservata, non puoi creare o utilizzare un pannello di configurazione con una domanda con questo id.", + "config_no_panel": "Nessun panello di configurazione trovato.", + "config_unknown_filter_key": "Il valore del filtro '{filter_key}' non è corretto.", + "config_validate_color": "È necessario inserire un codice colore in RGB esadecimale", + "config_validate_date": "È necessario inserire una data valida nel formato AAAA-MM-GG", + "config_validate_email": "È necessario inserire un’email valida", + "diagnosis_description_apps": "Applicazioni", + "domain_registrar_is_not_configured": "Il registrar non è ancora configurato per il dominio {domain}.", + "domain_dns_registrar_managed_in_parent_domain": "Questo dominio è un sotto-dominio di {parent_domain_link}. La configurazione del registrar DNS dovrebbe essere gestita dal pannello di configurazione di {parent_domain}.", + "domain_dns_registrar_yunohost": "Questo dominio è un nohost.me / nohost.st / ynh.fr, perciò la sua configurazione DNS è gestita automaticamente da YunoHost, senza alcuna ulteriore configurazione. (vedi il comando yunohost dyndns update)", + "domain_dns_push_success": "Record DNS aggiornati!", + "domain_dns_push_failed": "L’aggiornamento dei record DNS è miseramente fallito.", + "domain_dns_push_partial_failure": "Record DNS parzialmente aggiornati: alcuni segnali/errori sono stati riportati.", + "domain_config_features_disclaimer": "Per ora, abilitare/disabilitare le impostazioni di posta o XMPP impatta unicamente sulle configurazioni DNS raccomandate o ottimizzate, non cambia quelle di sistema!", + "domain_config_mail_in": "Email in arrivo", + "domain_config_auth_application_key": "Chiave applicazione", + "domain_config_auth_application_secret": "Chiave segreta applicazione", + "domain_config_auth_consumer_key": "Chiave consumatore", + "ldap_attribute_already_exists": "L’attributo LDAP '{attribute}' esiste già con il valore '{value}'", + "config_validate_time": "È necessario inserire un orario valido, come HH:MM", + "config_version_not_supported": "Le versioni '{version}' del pannello di configurazione non sono supportate.", + "danger": "Attenzione:", + "log_domain_config_set": "Aggiorna la configurazione per il dominio '{}'", + "domain_dns_push_managed_in_parent_domain": "La configurazione automatica del DNS è gestita nel dominio genitore {parent_domain}.", + "user_import_bad_line": "Linea errata {line}: {details}", + "config_validate_url": "È necessario inserire un URL web valido", + "ldap_server_down": "Impossibile raggiungere il server LDAP", + "ldap_server_is_down_restart_it": "Il servizio LDAP è down, prova a riavviarlo…" } From 4154ece1bbbe09eb9d668411114bfb06910c754a Mon Sep 17 00:00:00 2001 From: yunohost-bot Date: Sun, 14 Nov 2021 21:07:58 +0000 Subject: [PATCH 139/619] [CI] Reformat / remove stale translated strings --- locales/ca.json | 3 --- locales/de.json | 5 +---- locales/eo.json | 2 -- locales/es.json | 5 +---- locales/eu.json | 3 +-- locales/fa.json | 4 ---- locales/fr.json | 9 +-------- locales/gl.json | 9 +-------- locales/hi.json | 1 - locales/id.json | 2 +- locales/it.json | 5 +---- locales/nb_NO.json | 1 - locales/nl.json | 1 - locales/oc.json | 4 +--- locales/pt.json | 3 +-- locales/ru.json | 3 +-- locales/sl.json | 2 +- locales/uk.json | 9 +-------- locales/zh_Hans.json | 9 +++------ 19 files changed, 15 insertions(+), 65 deletions(-) diff --git a/locales/ca.json b/locales/ca.json index b29a94fb6..bb656214f 100644 --- a/locales/ca.json +++ b/locales/ca.json @@ -17,7 +17,6 @@ "app_install_files_invalid": "Aquests fitxers no es poden instal·lar", "app_make_default_location_already_used": "No es pot fer l'aplicació '{app}' l'aplicació per defecte en el domini «{domain}», ja que ja és utilitzat per '{other_app}'", "app_location_unavailable": "Aquesta URL no està disponible o entra en conflicte amb aplicacions ja instal·lades:\n{apps}", - "app_manifest_invalid": "Hi ha algun error amb el manifest de l'aplicació: {error}", "app_not_correctly_installed": "{app} sembla estar mal instal·lada", "app_not_installed": "No s'ha trobat {app} en la llista d'aplicacions instal·lades: {all_apps}", "app_not_properly_removed": "{app} no s'ha pogut suprimir correctament", @@ -132,7 +131,6 @@ "domains_available": "Dominis disponibles:", "done": "Fet", "downloading": "Descarregant...", - "dyndns_could_not_check_provide": "No s'ha pogut verificar si {provider} pot oferir {domain}.", "dyndns_could_not_check_available": "No s'ha pogut verificar la disponibilitat de {domain} a {provider}.", "dyndns_ip_update_failed": "No s'ha pogut actualitzar l'adreça IP al DynDNS", "dyndns_ip_updated": "S'ha actualitzat l'adreça IP al DynDNS", @@ -590,7 +588,6 @@ "global_settings_setting_smtp_relay_password": "Tramesa de la contrasenya d'amfitrió SMTP", "global_settings_setting_smtp_relay_user": "Tramesa de compte d'usuari SMTP", "global_settings_setting_smtp_relay_port": "Port de tramesa SMTP", - "domain_name_unknown": "Domini «{domain}» desconegut", "diagnosis_processes_killed_by_oom_reaper": "El sistema ha matat alguns processos recentment perquè s'ha quedat sense memòria. Això acostuma a ser un símptoma de falta de memòria en el sistema o d'un procés que consumeix massa memòria. Llista dels processos que s'han matat:\n{kills_summary}", "diagnosis_package_installed_from_sury_details": "Alguns paquets s'han instal·lat per equivocació des d'un repositori de tercers anomenat Sury. L'equip de YunoHost a millorat l'estratègia per a gestionar aquests paquets, però s'espera que algunes configuracions que han instal·lat aplicacions PHP7.3 a Stretch puguin tenir algunes inconsistències. Per a resoldre aquesta situació, hauríeu d'intentar executar la següent ordre: {cmd_to_fix}", "diagnosis_package_installed_from_sury": "Alguns paquets del sistema s'han de tornar a versions anteriors", diff --git a/locales/de.json b/locales/de.json index 5dd8c059d..e491c5ac2 100644 --- a/locales/de.json +++ b/locales/de.json @@ -10,7 +10,6 @@ "app_extraction_failed": "Installationsdateien konnten nicht entpackt werden", "app_id_invalid": "Falsche App-ID", "app_install_files_invalid": "Diese Dateien können nicht installiert werden", - "app_manifest_invalid": "Mit dem App-Manifest stimmt etwas nicht: {error}", "app_not_installed": "{app} konnte nicht in der Liste installierter Apps gefunden werden: {all_apps}", "app_removed": "{app} wurde entfernt", "app_sources_fetch_failed": "Quelldateien konnten nicht abgerufen werden, ist die URL korrekt?", @@ -185,7 +184,6 @@ "experimental_feature": "Warnung: Der Maintainer hat diese Funktion als experimentell gekennzeichnet. Sie ist nicht stabil. Sie sollten sie nur verwenden, wenn Sie wissen, was Sie tun.", "dyndns_domain_not_provided": "Der DynDNS-Anbieter {provider} kann die Domäne(n) {domain} nicht bereitstellen.", "dyndns_could_not_check_available": "Konnte nicht überprüfen, ob {domain} auf {provider} verfügbar ist.", - "dyndns_could_not_check_provide": "Konnte nicht überprüft, ob {provider} die Domain(s) {domain} bereitstellen kann.", "domain_dns_conf_is_just_a_recommendation": "Dieser Befehl zeigt dir die *empfohlene* Konfiguration. Er konfiguriert *nicht* das DNS für dich. Es liegt in deiner Verantwortung, die DNS-Zone bei deinem DNS-Registrar nach dieser Empfehlung zu konfigurieren.", "dpkg_lock_not_available": "Dieser Befehl kann momentan nicht ausgeführt werden, da anscheinend ein anderes Programm die Sperre von dpkg (dem Systempaket-Manager) verwendet", "confirm_app_install_thirdparty": "WARNUNG! Diese Applikation ist nicht Teil des YunoHost-Applikationskatalogs. Das Installieren von Drittanbieterapplikationen könnte die Sicherheit und Integrität Ihres Systems beeinträchtigen. Sie sollten wahrscheinlich NICHT fortfahren, es sei denn, Sie wissen, was Sie tun. Es wird KEIN SUPPORT angeboten, wenn die Applikation nicht funktionieren oder Ihr System beschädigen sollte... Wenn Sie das Risiko trotzdem eingehen möchten, tippen Sie '{answers}'", @@ -435,7 +433,6 @@ "diagnosis_http_nginx_conf_not_up_to_date_details": "Um dieses Problem zu beheben, geben Sie in der Kommandozeile yunohost tools regen-conf nginx --dry-run --with-diff ein. Dieses Tool zeigt ihnen den Unterschied an. Wenn Sie damit einverstanden sind, können Sie mit yunohost tools regen-conf nginx --force die Änderungen übernehmen.", "diagnosis_backports_in_sources_list": "Sie haben anscheinend apt (den Paketmanager) für das Backports-Repository konfiguriert. Wir raten strikte davon ab, Pakete aus dem Backports-Repository zu installieren. Diese würden wahrscheinlich zu Instabilitäten und Konflikten führen. Es sei denn, Sie wissen was Sie tun.", "diagnosis_basesystem_hardware_model": "Das Servermodell ist {model}", - "domain_name_unknown": "Domäne '{domain}' unbekannt", "group_user_not_in_group": "Benutzer:in {user} ist nicht in der Gruppe {group}", "group_user_already_in_group": "Benutzer:in {user} ist bereits in der Gruppe {group}", "group_cannot_edit_visitors": "Die Gruppe \"Besucher\" kann nicht manuell editiert werden. Sie ist eine Sondergruppe und repräsentiert anonyme Besucher", @@ -642,4 +639,4 @@ "config_validate_time": "Sollte eine zulässige Zeit wie HH:MM sein", "config_validate_url": "Sollte eine zulässige web URL sein", "config_version_not_supported": "Konfigurationspanel Versionen '{version}' sind nicht unterstützt." -} +} \ No newline at end of file diff --git a/locales/eo.json b/locales/eo.json index 8973e6344..49040b768 100644 --- a/locales/eo.json +++ b/locales/eo.json @@ -51,7 +51,6 @@ "ask_new_path": "Nova vojo", "backup_custom_mount_error": "Propra rezerva metodo ne povis preterpasi la paŝon 'monto'", "app_upgrade_app_name": "Nun ĝisdatigu {app}...", - "app_manifest_invalid": "Io misas pri la aplika manifesto: {error}", "backup_cleaning_failed": "Ne povis purigi la provizoran rezervan dosierujon", "backup_creation_failed": "Ne povis krei la rezervan ar archiveivon", "backup_hook_unknown": "La rezerva hoko '{hook}' estas nekonata", @@ -244,7 +243,6 @@ "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 share {name}' por akiri helpon", "port_already_closed": "Haveno {port} estas jam fermita por {ip_version} rilatoj", "hook_name_unknown": "Nekonata hoko-nomo '{name}'", - "dyndns_could_not_check_provide": "Ne povis kontroli ĉu {provider} povas provizi {domain}.", "restore_nothings_done": "Nenio estis restarigita", "log_tools_postinstall": "Afiŝu vian servilon YunoHost", "dyndns_unavailable": "La domajno '{domain}' ne haveblas.", diff --git a/locales/es.json b/locales/es.json index dec90b42b..d6382c262 100644 --- a/locales/es.json +++ b/locales/es.json @@ -10,7 +10,6 @@ "app_extraction_failed": "No se pudieron extraer los archivos de instalación", "app_id_invalid": "ID de la aplicación no válida", "app_install_files_invalid": "Estos archivos no se pueden instalar", - "app_manifest_invalid": "Algo va mal con el manifiesto de la aplicación: {error}", "app_not_correctly_installed": "La aplicación {app} 8 parece estar incorrectamente instalada", "app_not_installed": "No se pudo encontrar «{app}» en la lista de aplicaciones instaladas: {all_apps}", "app_not_properly_removed": "La {app} 0 no ha sido desinstalada correctamente", @@ -194,7 +193,6 @@ "backup_system_part_failed": "No se pudo respaldar la parte del sistema «{part}»", "backup_with_no_backup_script_for_app": "La aplicación «{app}» no tiene un guión de respaldo. Omitiendo.", "backup_with_no_restore_script_for_app": "«{app}» no tiene un script de restauración, no podá restaurar automáticamente la copia de seguridad de esta aplicación.", - "dyndns_could_not_check_provide": "No se pudo verificar si {provider} puede ofrecer {domain}.", "dyndns_domain_not_provided": "El proveedor de DynDNS {provider} no puede proporcionar el dominio {domain}.", "experimental_feature": "Aviso : esta funcionalidad es experimental y no se considera estable, no debería usarla a menos que sepa lo que está haciendo.", "good_practices_about_user_password": "Ahora está a punto de definir una nueva contraseña de usuario. La contraseña debe tener al menos 8 caracteres, aunque es una buena práctica usar una contraseña más larga (es decir, una frase de contraseña) y / o una variación de caracteres (mayúsculas, minúsculas, dígitos y caracteres especiales).", @@ -544,7 +542,6 @@ "global_settings_setting_smtp_relay_port": "Puerto de envio / relay SMTP", "global_settings_setting_smtp_relay_host": "El servidor relay de SMTP para enviar correo en lugar de esta instalación YunoHost. Útil si estás en una de estas situaciones: tu puerto 25 esta bloqueado por tu ISP o VPS, si estás en usado una IP marcada como residencial o DUHL, si no puedes configurar un DNS inverso o si el servidor no está directamente expuesto a internet y quieres utilizar otro servidor para enviar correos.", "global_settings_setting_smtp_allow_ipv6": "Permitir el uso de IPv6 para enviar y recibir correo", - "domain_name_unknown": "Dominio «{domain}» desconocido", "diagnosis_processes_killed_by_oom_reaper": "Algunos procesos fueron terminados por el sistema recientemente porque se quedó sin memoria. Típicamente es sintoma de falta de memoria o de un proceso que se adjudicó demasiada memoria.
Resumen de los procesos terminados:
\n{kills_summary}", "diagnosis_http_nginx_conf_not_up_to_date_details": "Para arreglar este asunto, estudia las diferencias mediante el comando yunohost tools regen-conf nginx --dry-run --with-diff y si te parecen bien aplica los cambios mediante yunohost tools regen-conf nginx --force.", "diagnosis_http_nginx_conf_not_up_to_date": "Parece que la configuración nginx de este dominio haya sido modificada manualmente, esto no deja que YunoHost pueda diagnosticar si es accesible mediante HTTP.", @@ -587,4 +584,4 @@ "app_config_unable_to_read": "No se pudieron leer los valores del panel configuración.", "backup_create_size_estimation": "El archivo contendrá aproximadamente {size} de datos.", "config_cant_set_value_on_section": "No puede establecer un único valor en una sección de configuración completa." -} +} \ No newline at end of file diff --git a/locales/eu.json b/locales/eu.json index 1f69866bb..21c23260c 100644 --- a/locales/eu.json +++ b/locales/eu.json @@ -368,7 +368,6 @@ "log_app_change_url": "'{}' aplikazioaren URLa aldatu", "log_app_config_set": "Ezarri '{}' aplikazioko konfigurazioa", "downloading": "Deskargatzen…", - "dyndns_could_not_check_provide": "Ezinezkoa izan da {provider}(e)k {domain} eskaini dezakeen egiaztatzea.", "log_available_on_yunopaste": "Erregistroa {url} estekan ikus daiteke", "log_dyndns_update": "Eguneratu YunoHosten '{}' domeinuari lotutako IP helbidea", "log_letsencrypt_cert_install": "Instalatu Let's Encrypt ziurtagiria '{}' domeinurako", @@ -705,4 +704,4 @@ "service_description_rspamd": "Spama bahetu eta posta elektronikoarekin zerikusia duten bestelako futzioen ardura dauka", "service_description_slapd": "Erabiltzaileak, domeinuak eta hauei lotutako informazioa gordetzen du", "service_description_yunohost-api": "YunoHosten web-atariaren eta sistemaren arteko hartuemana kudeatzen du" -} +} \ No newline at end of file diff --git a/locales/fa.json b/locales/fa.json index f566fed90..e7ab1595f 100644 --- a/locales/fa.json +++ b/locales/fa.json @@ -183,7 +183,6 @@ "app_manifest_install_ask_password": "گذرواژه مدیریتی را برای این برنامه انتخاب کنید", "app_manifest_install_ask_path": "مسیر URL (بعد از دامنه) را انتخاب کنید که این برنامه باید در آن نصب شود", "app_manifest_install_ask_domain": "دامنه ای را انتخاب کنید که این برنامه باید در آن نصب شود", - "app_manifest_invalid": "مشکلی در مانیفست برنامه وجود دارد: {error}", "app_location_unavailable": "این نشانی وب یا در دسترس نیست یا با برنامه (هایی) که قبلاً نصب شده در تعارض است:\n{apps}", "app_label_deprecated": "این دستور منسوخ شده است! لطفاً برای مدیریت برچسب برنامه از فرمان جدید'yunohost به روز رسانی مجوز کاربر' استفاده کنید.", "app_make_default_location_already_used": "نمی توان '{app}' را برنامه پیش فرض در دامنه قرار داد ، '{domain}' قبلاً توسط '{other_app}' استفاده می شود", @@ -199,7 +198,6 @@ "diagnosis_http_connection_error": "خطای اتصال: ارتباط با دامنه درخواست شده امکان پذیر نیست، به احتمال زیاد غیرقابل دسترسی است.", "diagnosis_http_timeout": "زمان تلاش برای تماس با سرور از خارج به پایان رسید. به نظر می رسد غیرقابل دسترسی است.
1. شایع ترین علت برای این مشکل ، پورت 80 است (و 443) به درستی به سرور شما ارسال نمی شوند.
2. همچنین باید مطمئن شوید که سرویس nginx در حال اجرا است
3. در تنظیمات پیچیده تر: مطمئن شوید که هیچ فایروال یا پروکسی معکوسی تداخل نداشته باشد.", "diagnosis_http_ok": "دامنه {domain} از طریق HTTP از خارج از شبکه محلی قابل دسترسی است.", - "diagnosis_http_localdomain": "انتظار نمی رود که دامنه {domain} ، با TLD محلی. از خارج از شبکه محلی به آن دسترسی پیدا کند.", "diagnosis_http_could_not_diagnose_details": "خطا: {error}", "diagnosis_http_could_not_diagnose": "نمی توان تشخیص داد که در IPv{ipversion} دامنه ها از خارج قابل دسترسی هستند یا خیر.", "diagnosis_http_hairpinning_issue_details": "این احتمالاً به دلیل جعبه / روتر ISP شما است. در نتیجه ، افراد خارج از شبکه محلی شما می توانند به سرور شما مطابق انتظار دسترسی پیدا کنند ، اما افراد داخل شبکه محلی (احتمالاً مثل شما؟) هنگام استفاده از نام دامنه یا IP جهانی. ممکن است بتوانید وضعیت را بهبود بخشید با نگاهی به https://yunohost.org/dns_local_network", @@ -348,13 +346,11 @@ "dyndns_ip_updated": "IP خود را در DynDNS به روز کرد", "dyndns_ip_update_failed": "آدرس IP را به DynDNS به روز نکرد", "dyndns_could_not_check_available": "بررسی نشد که آیا {domain} در {provider} در دسترس است یا خیر.", - "dyndns_could_not_check_provide": "بررسی نشد که آیا {provider} می تواند {domain} را ارائه دهد یا خیر.", "dpkg_lock_not_available": "این دستور در حال حاضر قابل اجرا نیست زیرا به نظر می رسد برنامه دیگری از قفل dpkg (مدیر بسته سیستم) استفاده می کند", "dpkg_is_broken": "شما نمی توانید این کار را در حال حاضر انجام دهید زیرا dpkg/APT (اداره کنندگان سیستم بسته ها) به نظر می رسد در وضعیت خرابی است… می توانید با اتصال از طریق SSH و اجرا این فرمان `sudo apt install --fix-broken` and/or `sudo dpkg --configure -a` مشکل را حل کنید.", "downloading": "در حال بارگیری...", "done": "انجام شد", "domains_available": "دامنه های موجود:", - "domain_name_unknown": "دامنه '{domain}' ناشناخته است", "domain_uninstall_app_first": "این برنامه ها هنوز روی دامنه شما نصب هستند:\n{apps}\n\nلطفاً قبل از اقدام به حذف دامنه ، آنها را با استفاده از 'برنامه yunohost remove the_app_id' حذف کرده یا با استفاده از 'yunohost app change-url the_app_id' به دامنه دیگری منتقل کنید", "domain_remove_confirm_apps_removal": "حذف این دامنه برنامه های زیر را حذف می کند:\n{apps}\n\nآیا طمئن هستید که میخواهید انجام دهید؟ [{answers}]", "domain_hostname_failed": "نام میزبان جدید قابل تنظیم نیست. این ممکن است بعداً مشکلی ایجاد کند (ممکن هم هست خوب باشد).", diff --git a/locales/fr.json b/locales/fr.json index 5b2ea6225..07bdcfad3 100644 --- a/locales/fr.json +++ b/locales/fr.json @@ -10,7 +10,6 @@ "app_extraction_failed": "Impossible d'extraire les fichiers d'installation", "app_id_invalid": "Identifiant d'application invalide", "app_install_files_invalid": "Fichiers d'installation incorrects", - "app_manifest_invalid": "Manifeste d'application incorrect : {error}", "app_not_correctly_installed": "{app} semble être mal installé", "app_not_installed": "Nous n'avons pas trouvé {app} dans la liste des applications installées : {all_apps}", "app_not_properly_removed": "{app} n'a pas été supprimé correctement", @@ -223,7 +222,6 @@ "server_reboot": "Le serveur va redémarrer", "server_reboot_confirm": "Le serveur va redémarrer immédiatement, le voulez-vous vraiment ? [{answers}]", "app_upgrade_some_app_failed": "Certaines applications n'ont pas été mises à jour", - "dyndns_could_not_check_provide": "Impossible de vérifier si {provider} peut fournir {domain}.", "dyndns_domain_not_provided": "Le fournisseur DynDNS {provider} ne peut pas fournir le domaine {domain}.", "app_make_default_location_already_used": "Impossible de configurer l'application '{app}' par défaut pour le domaine '{domain}' car il est déjà utilisé par l'application '{other_app}'", "app_upgrade_app_name": "Mise à jour de {app}...", @@ -602,7 +600,6 @@ "migration_0019_add_new_attributes_in_ldap": "Ajouter de nouveaux attributs pour les autorisations dans la base de données LDAP", "migrating_legacy_permission_settings": "Migration des anciens paramètres d'autorisation...", "invalid_regex": "Regex non valide : '{regex}'", - "domain_name_unknown": "Domaine '{domain}' inconnu", "app_label_deprecated": "Cette commande est obsolète ! Veuillez utiliser la nouvelle commande 'yunohost user permission update' pour gérer l'étiquette de l'application.", "additional_urls_already_removed": "URL supplémentaire '{url}' déjà supprimées pour la permission '{permission}'", "invalid_number": "Doit être un nombre", @@ -631,7 +628,6 @@ "backup_create_size_estimation": "L'archive contiendra environ {size} de données.", "global_settings_setting_security_webadmin_allowlist": "Adresses IP autorisées à accéder à la webadmin. Elles doivent être séparées par une virgule.", "global_settings_setting_security_webadmin_allowlist_enabled": "Autoriser seulement certaines IP à accéder à la webadmin.", - "diagnosis_http_localdomain": "Le domaine {domain}, avec un TLD .local, ne devrait pas être exposé en dehors du réseau local.", "diagnosis_dns_specialusedomain": "Le domaine {domain} est basé sur un domaine de premier niveau (TLD) à usage spécial comme .local ou .test et ne devrait donc pas avoir d'enregistrements DNS réels.", "invalid_password": "Mot de passe incorrect", "ldap_server_is_down_restart_it": "Le service LDAP est en panne, essayez de le redémarrer...", @@ -669,13 +665,10 @@ "config_validate_url": "Doit être une URL Web valide", "config_version_not_supported": "Les versions du panneau de configuration '{version}' ne sont pas prises en charge.", "danger": "Danger :", - "file_extension_not_accepted": "Le fichier '{path}' est refusé car son extension ne fait pas partie des extensions acceptées : {accept}", "invalid_number_min": "Doit être supérieur à {min}", "invalid_number_max": "Doit être inférieur à {max}", "log_app_config_set": "Appliquer la configuration à l'application '{}'", "service_not_reloading_because_conf_broken": "Le service '{name}' n'a pas été rechargé/redémarré car sa configuration est cassée : {errors}", - "app_argument_password_help_keep": "Tapez sur Entrée pour conserver la valeur actuelle", - "app_argument_password_help_optional": "Tapez un espace pour vider le mot de passe", "domain_registrar_is_not_configured": "Le registrar n'est pas encore configuré pour le domaine {domain}.", "domain_dns_push_not_applicable": "La fonction de configuration DNS automatique n'est pas applicable au domaine {domain}. Vous devez configurer manuellement vos enregistrements DNS en suivant la documentation sur https://yunohost.org/dns_config.", "domain_dns_registrar_yunohost": "Ce domaine est de type nohost.me / nohost.st / ynh.fr et sa configuration DNS est donc automatiquement gérée par YunoHost sans qu'il n'y ait d'autre configuration à faire. (voir la commande 'yunohost dyndns update')", @@ -711,4 +704,4 @@ "other_available_options": "... et {n} autres options disponibles non affichées", "domain_config_auth_consumer_key": "Consumer key", "domain_unknown": "Domaine '{domain}' inconnu" -} +} \ No newline at end of file diff --git a/locales/gl.json b/locales/gl.json index 0d7d1afee..ac41200a6 100644 --- a/locales/gl.json +++ b/locales/gl.json @@ -76,7 +76,6 @@ "app_manifest_install_ask_password": "Elixe un contrasinal de administración para esta app", "app_manifest_install_ask_path": "Elixe a ruta URL (após o dominio) onde será instalada esta app", "app_manifest_install_ask_domain": "Elixe o dominio onde queres instalar esta app", - "app_manifest_invalid": "Hai algún erro no manifesto da app: {error}", "app_location_unavailable": "Este URL ou ben non está dispoñible ou entra en conflito cunha app(s) xa instalada:\n{apps}", "app_label_deprecated": "Este comando está anticuado! Utiliza o novo comando 'yunohost user permission update' para xestionar a etiqueta da app.", "app_make_default_location_already_used": "Non se puido establecer a '{app}' como app por defecto no dominio, '{domain}' xa está utilizado por '{other_app}'", @@ -288,13 +287,11 @@ "dyndns_ip_updated": "Actualizouse o IP en DynDNS", "dyndns_ip_update_failed": "Non se actualizou o enderezo IP en DynDNS", "dyndns_could_not_check_available": "Non se comprobou se {domain} está dispoñible en {provider}.", - "dyndns_could_not_check_provide": "Non se comprobou se {provider} pode proporcionar {domain}.", "dpkg_lock_not_available": "Non se pode executar agora mesmo este comando porque semella que outro programa está a utilizar dpkg (o xestos de paquetes do sistema)", "dpkg_is_broken": "Non podes facer isto agora mesmo porque dpkg/APT (o xestor de paquetes do sistema) semella que non está a funcionar... Podes intentar solucionalo conectándote a través de SSH e executando `sudo apt install --fix-broken`e/ou `sudo dpkg --configure -a`.", "downloading": "Descargando...", "done": "Feito", "domains_available": "Dominios dispoñibles:", - "domain_name_unknown": "Dominio '{domain}' descoñecido", "domain_uninstall_app_first": "Aínda están instaladas estas aplicacións no teu dominio:\n{apps}\n\nPrimeiro desinstalaas utilizando 'yunohost app remove id_da_app' ou móveas a outro dominio con 'yunohost app change-url id_da_app' antes de eliminar o dominio", "domain_remove_confirm_apps_removal": "Ao eliminar o dominio tamén vas eliminar estas aplicacións:\n{apps}\n\nTes a certeza de querer facelo? [{answers}]", "domain_hostname_failed": "Non se puido establecer o novo nome de servidor. Esto pode causar problemas máis tarde (tamén podería ser correcto).", @@ -454,7 +451,6 @@ "migration_0015_specific_upgrade": "Iniciando a actualización dos paquetes do sistema que precisan ser actualizados de xeito independente...", "migration_0015_modified_files": "Ten en conta que os seguintes ficheiros semella que foron modificados manualmente e poderían ser sobrescritos na actualización: {manually_modified_files}", "migration_0015_problematic_apps_warning": "Ten en conta que se detectaron as seguintes apps que poderían ser problemáticas. Semella que non foron instaladas usando o catálogo de YunoHost, ou non están marcadas como 'funcionais'. En consecuencia, non se pode garantir que seguirán funcionando após a actualización: {problematic_apps}", - "diagnosis_http_localdomain": "O dominio {domain}, cun TLD .local, non é de agardar que esté exposto ao exterior da rede local.", "diagnosis_dns_specialusedomain": "O dominio {domain} baséase un dominio de nivel alto e uso especial (TLD) como .local ou .test polo que non é de agardar que realmente teña rexistros DNS.", "upnp_enabled": "UPnP activado", "upnp_disabled": "UPnP desactivado", @@ -655,13 +651,11 @@ "diagnosis_apps_broken": "Actualmente esta aplicación está marcada como estragada no catálogo de aplicacións de YunoHost. Podería tratarse dun problema temporal mentras as mantedoras intentan arraxala. Entanto así a actualización da app está desactivada.", "diagnosis_apps_issue": "Atopouse un problema na app {app}", "diagnosis_apps_not_in_app_catalog": "Esta aplicación non está no catálgo de aplicacións de YunoHost. Se estivo no pasado e foi eliminada, deberías considerar desinstalala porque non recibirá actualizacións, e podería comprometer a integridade e seguridade do teu sistema.", - "app_argument_password_help_optional": "Escribe un espazo para limpar o contrasinal", "config_validate_date": "Debe ser unha data válida co formato YYYY-MM-DD", "config_validate_email": "Debe ser un email válido", "config_validate_time": "Debe ser unha hora válida tal que HH:MM", "config_validate_url": "Debe ser un URL válido", "danger": "Perigo:", - "app_argument_password_help_keep": "Preme Enter para manter o valor actual", "app_config_unable_to_read": "Fallou a lectura dos valores de configuración.", "config_apply_failed": "Fallou a aplicación da nova configuración: {error}", "config_forbidden_keyword": "O palabra chave '{keyword}' está reservada, non podes crear ou usar un panel de configuración cunha pregunta con este id.", @@ -673,7 +667,6 @@ "app_config_unable_to_apply": "Fallou a aplicación dos valores de configuración.", "config_cant_set_value_on_section": "Non podes establecer un valor único na sección completa de configuración.", "config_version_not_supported": "A versión do panel de configuración '{version}' non está soportada.", - "file_extension_not_accepted": "Rexeitouse o ficheiro '{path}' porque a súa extensión non está entre as aceptadas: {accept}", "invalid_number_max": "Ten que ser menor de {max}", "service_not_reloading_because_conf_broken": "Non se recargou/reiniciou o servizo '{name}' porque a súa configuración está estragada: {errors}", "diagnosis_http_special_use_tld": "O dominio {domain} baséase nun dominio de alto-nivel (TLD) especial como .local ou .test e por isto non é de agardar que esté exposto fóra da rede local.", @@ -711,4 +704,4 @@ "ldap_attribute_already_exists": "Xa existe o atributo LDAP '{attribute}' con valor '{value}'", "log_domain_config_set": "Actualizar configuración para o dominio '{}'", "domain_unknown": "Dominio '{domain}' descoñecido" -} +} \ No newline at end of file diff --git a/locales/hi.json b/locales/hi.json index 5f521b1dc..1eed9faa4 100644 --- a/locales/hi.json +++ b/locales/hi.json @@ -10,7 +10,6 @@ "app_extraction_failed": "इन्सटाल्ड फ़ाइलों को निकालने में असमर्थ", "app_id_invalid": "अवैध एप्लिकेशन id", "app_install_files_invalid": "फाइलों की अमान्य स्थापना", - "app_manifest_invalid": "एप्लीकेशन का मैनिफेस्ट अमान्य", "app_not_correctly_installed": "{app} ठीक ढंग से इनस्टॉल नहीं हुई", "app_not_installed": "{app} इनस्टॉल नहीं हुई", "app_not_properly_removed": "{app} ठीक ढंग से नहीं अनइन्सटॉल की गई", diff --git a/locales/id.json b/locales/id.json index 1f28ae7e5..c9778dd5f 100644 --- a/locales/id.json +++ b/locales/id.json @@ -43,4 +43,4 @@ "app_start_remove": "Menghapus {app}...", "app_manifest_install_ask_password": "Pilih kata sandi administrasi untuk aplikasi ini", "app_upgrade_several_apps": "Aplikasi-aplikasi berikut akan diperbarui: {apps}" -} +} \ No newline at end of file diff --git a/locales/it.json b/locales/it.json index 7f3997839..742e38b0d 100644 --- a/locales/it.json +++ b/locales/it.json @@ -26,7 +26,6 @@ "admin_password_change_failed": "Impossibile cambiare la password", "admin_password_changed": "La password d'amministrazione è stata cambiata", "app_install_files_invalid": "Questi file non possono essere installati", - "app_manifest_invalid": "C'è qualcosa di scorretto nel manifesto dell'applicazione: {error}", "app_not_correctly_installed": "{app} sembra di non essere installata correttamente", "app_not_properly_removed": "{app} non è stata correttamente rimossa", "action_invalid": "L'azione '{action}' non è valida", @@ -223,7 +222,6 @@ "dpkg_is_broken": "Non puoi eseguire questo ora perchè dpkg/APT (i gestori di pacchetti del sistema) sembrano essere in stato danneggiato... Puoi provare a risolvere il problema connettendoti via SSH ed eseguire `sudo apt install --fix-broken` e/o `sudo dpkg --configure -a`.", "domain_cannot_remove_main": "Non puoi rimuovere '{domain}' essendo il dominio principale, prima devi impostare un nuovo dominio principale con il comando 'yunohost domain main-domain -n '; ecco la lista dei domini candidati: {other_domains}", "domain_dns_conf_is_just_a_recommendation": "Questo comando ti mostra la configurazione *raccomandata*. Non ti imposta la configurazione DNS al tuo posto. È tua responsabilità configurare la tua zona DNS nel tuo registrar in accordo con queste raccomandazioni.", - "dyndns_could_not_check_provide": "Impossibile controllare se {provider} possano fornire {domain}.", "dyndns_could_not_check_available": "Impossibile controllare se {domain} è disponibile su {provider}.", "dyndns_domain_not_provided": "Il fornitore DynDNS {provider} non può fornire il dominio {domain}.", "experimental_feature": "Attenzione: Questa funzionalità è sperimentale e non è considerata stabile, non dovresti utilizzarla a meno che tu non sappia cosa stai facendo.", @@ -558,7 +556,6 @@ "global_settings_setting_pop3_enabled": "Abilita il protocollo POP3 per il server mail", "dyndns_provider_unreachable": "Incapace di raggiungere il provider DynDNS {provider}: o il tuo YunoHost non è connesso ad internet o il server dynette è down.", "dpkg_lock_not_available": "Impossibile eseguire il comando in questo momento perché un altro programma sta bloccando dpkg (il package manager di sistema)", - "domain_name_unknown": "Dominio '{domain}' sconosciuto", "domain_cannot_remove_main_add_new_one": "Non puoi rimuovere '{domain}' visto che è il dominio principale nonché il tuo unico dominio, devi prima aggiungere un altro dominio eseguendo 'yunohost domain add ', impostarlo come dominio principale con 'yunohost domain main-domain n ', e solo allora potrai rimuovere il dominio '{domain}' eseguendo 'yunohost domain remove {domain}'.'", "domain_cannot_add_xmpp_upload": "Non puoi aggiungere domini che iniziano per 'xmpp-upload.'. Questo tipo di nome è riservato per la funzionalità di upload XMPP integrata in YunoHost.", "diagnosis_processes_killed_by_oom_reaper": "Alcuni processi sono stati terminati dal sistema che era a corto di memoria. Questo è un sintomo di insufficienza di memoria nel sistema o di un processo che richiede troppa memoria. Lista dei processi terminati:\n{kills_summary}", @@ -706,4 +703,4 @@ "config_validate_url": "È necessario inserire un URL web valido", "ldap_server_down": "Impossibile raggiungere il server LDAP", "ldap_server_is_down_restart_it": "Il servizio LDAP è down, prova a riavviarlo…" -} +} \ No newline at end of file diff --git a/locales/nb_NO.json b/locales/nb_NO.json index dc217d74e..e81d3af05 100644 --- a/locales/nb_NO.json +++ b/locales/nb_NO.json @@ -30,7 +30,6 @@ "domains_available": "Tilgjengelige domener:", "done": "Ferdig", "downloading": "Laster ned…", - "dyndns_could_not_check_provide": "Kunne ikke sjekke om {provider} kan tilby {domain}.", "dyndns_could_not_check_available": "Kunne ikke sjekke om {domain} er tilgjengelig på {provider}.", "mail_domain_unknown": "Ukjent e-postadresse for domenet '{domain}'", "log_remove_on_failed_restore": "Fjern '{}' etter mislykket gjenoppretting fra sikkerhetskopiarkiv", diff --git a/locales/nl.json b/locales/nl.json index 5e612fc77..f5923fa9a 100644 --- a/locales/nl.json +++ b/locales/nl.json @@ -8,7 +8,6 @@ "app_extraction_failed": "Kan installatiebestanden niet uitpakken", "app_id_invalid": "Ongeldige app-id", "app_install_files_invalid": "Deze bestanden kunnen niet worden geïnstalleerd", - "app_manifest_invalid": "Ongeldig app-manifest", "app_not_installed": "{app} is niet geïnstalleerd", "app_removed": "{app} succesvol verwijderd", "app_sources_fetch_failed": "Kan bronbestanden niet ophalen, klopt de URL?", diff --git a/locales/oc.json b/locales/oc.json index a794f5e04..9de7944c5 100644 --- a/locales/oc.json +++ b/locales/oc.json @@ -33,7 +33,6 @@ "app_change_url_identical_domains": "L’ancian e lo novèl coble domeni/camin son identics per {domain}{path}, pas res a far.", "app_change_url_success": "L’URL de l’aplicacion {app} es ara {domain}{path}", "app_extraction_failed": "Extraccion dels fichièrs d’installacion impossibla", - "app_manifest_invalid": "I a quicòm que truca amb lo manifest de l’aplicacion : {error}", "app_requirements_checking": "Verificacion dels paquets requesits per {app}...", "app_sources_fetch_failed": "Recuperacion dels fichièrs fonts impossibla, l’URL es corrècta ?", "app_unsupported_remote_type": "Lo tipe alonhat utilizat per l’aplicacion es pas suportat", @@ -110,7 +109,6 @@ "domains_available": "Domenis disponibles :", "done": "Acabat", "downloading": "Telecargament…", - "dyndns_could_not_check_provide": "Impossible de verificar se {provider} pòt provesir {domain}.", "dyndns_ip_update_failed": "Impossible d’actualizar l’adreça IP sul domeni DynDNS", "dyndns_ip_updated": "Vòstra adreça IP actualizada pel domeni DynDNS", "dyndns_key_generating": "La clau DNS es a se generar… pòt trigar una estona.", @@ -513,4 +511,4 @@ "diagnosis_domain_expiration_not_found": "Impossible de verificar la data d’expiracion d’unes domenis", "backup_create_size_estimation": "L’archiu contendrà apr’aquí {size} de donadas.", "app_restore_script_failed": "Una error s’es producha a l’interior del script de restauracion de l’aplicacion" -} +} \ No newline at end of file diff --git a/locales/pt.json b/locales/pt.json index d285948be..154ab700f 100644 --- a/locales/pt.json +++ b/locales/pt.json @@ -7,7 +7,6 @@ "app_extraction_failed": "Não foi possível extrair os arquivos para instalação", "app_id_invalid": "App ID invaĺido", "app_install_files_invalid": "Esses arquivos não podem ser instalados", - "app_manifest_invalid": "Manifesto da aplicação inválido: {error}", "app_not_installed": "Não foi possível encontrar {app} na lista de aplicações instaladas: {all_apps}", "app_removed": "{app} desinstalada", "app_sources_fetch_failed": "Não foi possível carregar os arquivos de código fonte, a URL está correta?", @@ -255,4 +254,4 @@ "diagnosis_backports_in_sources_list": "Parece que o apt (o gerenciador de pacotes) está configurado para usar o repositório backport. A não ser que você saiba o que você esteá fazendo, desencorajamos fortemente a instalação de pacotes de backports porque é provável que crie instabilidades ou conflitos no seu sistema.", "certmanager_cert_renew_success": "Certificado Let's Encrypt renovado para o domínio '{domain}'", "certmanager_warning_subdomain_dns_record": "O subdomínio '{subdomain}' não resolve para o mesmo IP que '{domain}'. Algumas funcionalidades não estarão disponíveis até que você conserte isto e regenere o certificado." -} +} \ No newline at end of file diff --git a/locales/ru.json b/locales/ru.json index 5c9a39322..58bd1846d 100644 --- a/locales/ru.json +++ b/locales/ru.json @@ -16,7 +16,6 @@ "app_id_invalid": "Неправильный ID приложения", "app_install_files_invalid": "Эти файлы не могут быть установлены", "app_location_unavailable": "Этот URL отсутствует или конфликтует с уже установленным приложением или приложениями:\n{apps}", - "app_manifest_invalid": "Недопустимый манифест приложения: {error}", "app_not_correctly_installed": "{app} , кажется, установлены неправильно", "app_not_installed": "{app} не найдено в списке установленных приложений: {all_apps}", "app_not_properly_removed": "{app} удалены неправильно", @@ -75,4 +74,4 @@ "yunohost_already_installed": "YunoHost уже установлен", "yunohost_configured": "Теперь YunoHost настроен", "upgrading_packages": "Обновление пакетов..." -} +} \ No newline at end of file diff --git a/locales/sl.json b/locales/sl.json index 0967ef424..9e26dfeeb 100644 --- a/locales/sl.json +++ b/locales/sl.json @@ -1 +1 @@ -{} +{} \ No newline at end of file diff --git a/locales/uk.json b/locales/uk.json index 4baf6d20f..ae59b0274 100644 --- a/locales/uk.json +++ b/locales/uk.json @@ -1,6 +1,5 @@ { "app_manifest_install_ask_domain": "Оберіть домен, в якому треба встановити цей застосунок", - "app_manifest_invalid": "Щось не так з маніфестом застосунку: {error}", "app_location_unavailable": "Ця URL-адреса або недоступна, або конфліктує з уже встановленим застосунком (застосунками):\n{apps}", "app_label_deprecated": "Ця команда застаріла! Будь ласка, використовуйте нову команду 'yunohost user permission update' для управління заголовком застосунку.", "app_make_default_location_already_used": "Неможливо зробити '{app}' типовим застосунком на домені, '{domain}' вже використовується '{other_app}'", @@ -318,13 +317,11 @@ "dyndns_ip_updated": "Вашу IP-адресу в DynDNS оновлено", "dyndns_ip_update_failed": "Не вдалося оновити IP-адресу в DynDNS", "dyndns_could_not_check_available": "Не вдалося перевірити, чи {domain} доступний у {provider}.", - "dyndns_could_not_check_provide": "Не вдалося перевірити, чи може {provider} надати {domain}.", "dpkg_lock_not_available": "Ця команда не може бути виконана прямо зараз, тому що інша програма, схоже, використовує блокування dpkg (системного менеджера пакетів)", "dpkg_is_broken": "Ви не можете зробити це прямо зараз, тому що dpkg/APT (системні менеджери пакетів), схоже, знаходяться в зламаному стані... Ви можете спробувати вирішити цю проблему, під'єднавшись через SSH і виконавши `sudo apt install --fix-broken` та/або `sudo dpkg --configure -a`.", "downloading": "Завантаження…", "done": "Готово", "domains_available": "Доступні домени:", - "domain_name_unknown": "Домен '{domain}' невідомий", "domain_uninstall_app_first": "Ці застосунки все ще встановлені на вашому домені:\n{apps}\n\nВидаліть їх за допомогою 'yunohost app remove the_app_id' або перемістіть їх на інший домен за допомогою 'yunohost app change-url the_app_id', перш ніж приступити до вилучення домену", "domain_remove_confirm_apps_removal": "Вилучення цього домену призведе до вилучення таких застосунків:\n{apps}\n\nВи впевнені, що хочете це зробити? [{answers}]", "domain_hostname_failed": "Неможливо встановити нову назву хоста. Це може викликати проблеми в подальшому (можливо, все буде в порядку).", @@ -356,7 +353,6 @@ "diagnosis_http_connection_error": "Помилка з'єднання: не вдалося з'єднатися із запитуваним доменом, швидше за все, він недоступний.", "diagnosis_http_timeout": "При спробі зв'язатися з вашим сервером ззовні стався тайм-аут. Він здається недоступним.
1. Найбільш поширеною причиною цієї проблеми є те, що порт 80 (і 443) неправильно перенаправлено на ваш сервер .
2. Ви також повинні переконатися, що служба nginx запущена
3.На більш складних установках: переконайтеся, що немає фаєрвола або зворотного проксі.", "diagnosis_http_ok": "Домен {domain} доступний по HTTP поза локальною мережею.", - "diagnosis_http_localdomain": "Домен {domain} з .local TLD не може бути доступний ззовні локальної мережі.", "diagnosis_http_could_not_diagnose_details": "Помилка: {error}", "diagnosis_http_could_not_diagnose": "Не вдалося діагностувати досяжність доменів ззовні в IPv{ipversion}.", "diagnosis_http_hairpinning_issue_details": "Можливо, це пов'язано з коробкою/маршрутизатором вашого інтернет-провайдера. В результаті, люди ззовні вашої локальної мережі зможуть отримати доступ до вашого сервера, як і очікувалося, але не люди зсередини локальної мережі (як ви, ймовірно?) При використанні доменного імені або глобального IP. Можливо, ви зможете поліпшити ситуацію, глянувши https://yunohost.org/dns_local_network ", @@ -669,13 +665,10 @@ "config_validate_url": "Вебадреса має бути дійсною", "config_version_not_supported": "Версії конфігураційної панелі '{version}' не підтримуються.", "danger": "Небезпека:", - "file_extension_not_accepted": "Файл '{path}' відхиляється, бо його розширення не входить в число прийнятих розширень: {accept}", "invalid_number_min": "Має бути більшим за {min}", "invalid_number_max": "Має бути меншим за {max}", "log_app_config_set": "Застосувати конфігурацію до застосунку '{}'", "service_not_reloading_because_conf_broken": "Неможливо перезавантажити/перезапустити службу '{name}', тому що її конфігурацію порушено: {errors}", - "app_argument_password_help_optional": "Введіть один пробіл, щоб очистити пароль", - "app_argument_password_help_keep": "Натисніть Enter, щоб зберегти поточне значення", "domain_registrar_is_not_configured": "Реєстратор ще не конфігуровано для домену {domain}.", "domain_dns_push_not_applicable": "Функція автоматичної конфігурації DNS не застосовується до домену {domain}. Вам слід вручну конфігурувати записи DNS відповідно до документації за адресою https://yunohost.org/dns_config.", "domain_dns_registrar_not_supported": "YunoHost не зміг автоматично виявити реєстратора, який обробляє цей домен. Вам слід вручну конфігурувати записи DNS відповідно до документації за адресою https://yunohost.org/dns.", @@ -711,4 +704,4 @@ "ldap_attribute_already_exists": "Атрибут LDAP '{attribute}' вже існує зі значенням '{value}'", "domain_dns_push_already_up_to_date": "Записи вже оновлені, нічого не потрібно робити.", "domain_unknown": "Домен '{domain}' є невідомим" -} +} \ No newline at end of file diff --git a/locales/zh_Hans.json b/locales/zh_Hans.json index fa3b7bb03..c1cad8425 100644 --- a/locales/zh_Hans.json +++ b/locales/zh_Hans.json @@ -137,7 +137,6 @@ "additional_urls_already_removed": "权限'{permission}'的其他URL中已经删除了附加URL'{url}'", "app_manifest_install_ask_path": "选择安装此应用的路径", "app_manifest_install_ask_domain": "选择应安装此应用程序的域", - "app_manifest_invalid": "应用清单错误: {error}", "app_location_unavailable": "该URL不可用,或与已安装的应用冲突:\n{apps}", "app_label_deprecated": "不推荐使用此命令!请使用新命令 'yunohost user permission update'来管理应用标签。", "app_make_default_location_already_used": "无法将'{app}' 设置为域上的默认应用,'{other_app}'已在使用'{domain}'", @@ -353,13 +352,11 @@ "dyndns_ip_updated": "在DynDNS上更新了您的IP", "dyndns_ip_update_failed": "无法将IP地址更新到DynDNS", "dyndns_could_not_check_available": "无法检查{provider}上是否可用 {domain}。", - "dyndns_could_not_check_provide": "无法检查{provider}是否可以提供 {domain}.", "dpkg_lock_not_available": "该命令现在无法运行,因为另一个程序似乎正在使用dpkg锁(系统软件包管理器)", "dpkg_is_broken": "您现在不能执行此操作,因为dpkg / APT(系统软件包管理器)似乎处于损坏状态……您可以尝试通过SSH连接并运行sudo apt install --fix-broken和/或 sudo dpkg --configure-a 来解决此问题.", "downloading": "下载中…", "done": "完成", "domains_available": "可用域:", - "domain_name_unknown": "域'{domain}'未知", "domain_uninstall_app_first": "这些应用程序仍安装在您的域中:\n{apps}\n\n请先使用 'yunohost app remove the_app_id' 将其卸载,或使用 'yunohost app change-url the_app_id'将其移至另一个域,然后再继续删除域", "domain_remove_confirm_apps_removal": "删除该域将删除这些应用程序:\n{apps}\n\n您确定要这样做吗? [{answers}]", "domain_hostname_failed": "无法设置新的主机名。稍后可能会引起问题(可能没问题)。", @@ -627,7 +624,7 @@ "log_user_delete": "删除用户'{}'", "log_user_create": "添加用户'{}'", "domain_registrar_is_not_configured": "尚未为域 {domain} 配置注册商。", - "domain_dns_push_not_applicable": "的自动DNS配置的特征是不适用域{域}。您应该按照 https://yunohost.org/dns_config 上的文档手动配置DNS 记录。", + "domain_dns_push_not_applicable": "的自动DNS配置的特征是不适用域{domain}。您应该按照 https://yunohost.org/dns_config 上的文档手动配置DNS 记录。", "disk_space_not_sufficient_update": "没有足够的磁盘空间来更新此应用程序", "diagnosis_high_number_auth_failures": "最近出现了大量可疑的失败身份验证。您的fail2ban正在运行且配置正确,或使用自定义端口的SSH作为https://yunohost.org/解释的安全性。", "diagnosis_apps_not_in_app_catalog": "此应用程序不在 YunoHost 的应用程序目录中。如果它过去有被删除过,您应该考虑卸载此应用程,因为它不会更新,并且可能会损害您系统的完整和安全性。", @@ -638,7 +635,7 @@ "config_unknown_filter_key": "该过滤器钥匙“{filter_key}”有误。", "diagnosis_apps_outdated_ynh_requirement": "此应用程序的安装 版本只需要 yunohost >= 2.x,这往往表明它与推荐的打包实践和帮助程序不是最新的。你真的应该考虑更新它。", "disk_space_not_sufficient_install": "没有足够的磁盘空间来安装此应用程序", - "config_apply_failed": "应用新配置 失败:{错误}", + "config_apply_failed": "应用新配置 失败:{error}", "config_cant_set_value_on_section": "无法在整个配置部分设置单个值 。", "config_validate_color": "是有效的 RGB 十六进制颜色", "config_validate_date": "有效日期格式为YYYY-MM-DD", @@ -651,4 +648,4 @@ "diagnosis_apps_deprecated_practices": "此应用程序的安装 版本仍然使用一些超旧的弃用打包原则。推荐您升级它。", "diagnosis_apps_issue": "发现应用{ app } 存在问题", "diagnosis_description_apps": "应用" -} +} \ No newline at end of file From 35850f75cd62831ed7af329f1b9dfae1f735a1b7 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Sun, 14 Nov 2021 22:58:43 +0100 Subject: [PATCH 140/619] Update changelog for 4.3.3 --- debian/changelog | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/debian/changelog b/debian/changelog index 7adbe59dc..f2266e871 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,17 @@ +yunohost (4.3.3) stable; urgency=low + + - [fix] log: fix dump_script_log_extract_for_debugging displaying wrong log snippet during failed upgrade ([#1376](https://github.com/YunoHost/yunohost/pull/1376)) + - [fix] certificate: fix stupid certificate/diagnosis issue with subdomains of ynh domains (7c569d16) + - [fix] diagnosis: Read DNS Blacklist answer and compare it against list of non-BL codes ([#1375](https://github.com/YunoHost/yunohost/pull/1375)) + - [enh] helpers: Update n to 8.0.0 ([#1372](https://github.com/YunoHost/yunohost/pull/1372)) + - [fix] helpers: Make ynh_add_fpm_config more robust to some edge cases (51d5dca0) + - [fix] backup: conf_ynh_settings backup/restore hook, /etc/yunohost/domains may not exist (38f5352f) + - [i18n] Translations updated for Basque, Chinese (Simplified), Indonesian, Italian, Ukrainian + + Thanks to all contributors <3 ! (dagangtie, ericgaspar, Félix Piédallu, Flavio Cristoforetti, liimee, punkrockgirl, Romain Thouvenin, Tommi, Tymofii-Lytvynenko) + + -- Alexandre Aubin Sun, 14 Nov 2021 22:55:16 +0100 + yunohost (4.3.2.2) stable; urgency=low - [fix] nginx: Try to fix again the webadmin cache hell (74e2a51e) From 6b9ac717de86f8925d5e92b737e3126a1baaf290 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Sun, 14 Nov 2021 23:15:08 +0100 Subject: [PATCH 141/619] debian: fix metronome modules install --- debian/install | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/debian/install b/debian/install index 55c535ae8..0a23cbfc9 100644 --- a/debian/install +++ b/debian/install @@ -5,6 +5,6 @@ helpers/* /usr/share/yunohost/helpers.d/ conf/* /usr/share/yunohost/conf/ doc/yunohost.8.gz /usr/share/man/man8/ doc/bash-completion.sh /etc/bash_completion.d/yunohost -lib/metronome/modules/* /usr/lib/metronome/modules/ +conf/metronome/modules/* /usr/lib/metronome/modules/ locales/* /usr/lib/moulinette/yunohost/locales/ src/ /usr/lib/moulinette/yunohost From 42e86a80c5e46799839a5291756fc016eb42be0d Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Mon, 15 Nov 2021 03:17:43 +0100 Subject: [PATCH 142/619] debian: bump ssowat and moulinette requirements --- debian/control | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/debian/control b/debian/control index a06823a16..17eb56f55 100644 --- a/debian/control +++ b/debian/control @@ -10,7 +10,7 @@ Package: yunohost Essential: yes Architecture: all Depends: ${python3:Depends}, ${misc:Depends} - , moulinette (>= 4.3), ssowat (>= 4.3) + , moulinette (>= 11.0), ssowat (>= 11.0) , python3-psutil, python3-requests, python3-dnspython, python3-openssl , python3-miniupnpc, python3-dbus, python3-jinja2 , python3-toml, python3-packaging, python3-publicsuffix2 From 467c04f3820572ed82860c0ba296a2ab6b0541c6 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Mon, 15 Nov 2021 04:00:47 +0100 Subject: [PATCH 143/619] codequality: Apply black on python script in bin/ --- bin/yunohost | 51 +++++++++++++++++++++++++++--------------------- bin/yunohost-api | 38 ++++++++++++++++++++++++------------ bin/yunomdns | 43 ++++++++++++++++++++++++++++------------ 3 files changed, 85 insertions(+), 47 deletions(-) diff --git a/bin/yunohost b/bin/yunohost index 0220c5f09..d3af76d92 100755 --- a/bin/yunohost +++ b/bin/yunohost @@ -12,37 +12,42 @@ import yunohost def _parse_cli_args(): """Parse additional arguments for the cli""" parser = argparse.ArgumentParser(add_help=False) - parser.add_argument('--output-as', - choices=['json', 'plain', 'none'], default=None, - help="Output result in another format" + parser.add_argument( + "--output-as", + choices=["json", "plain", "none"], + default=None, + help="Output result in another format", ) - parser.add_argument('--debug', - action='store_true', default=False, - help="Log and print debug messages" + parser.add_argument( + "--debug", + action="store_true", + default=False, + help="Log and print debug messages", ) - parser.add_argument('--quiet', - action='store_true', default=False, - help="Don't produce any output" + parser.add_argument( + "--quiet", action="store_true", default=False, help="Don't produce any output" ) - parser.add_argument('--timeout', - type=int, default=None, - help="Number of seconds before this command will timeout because it can't acquire the lock (meaning that another command is currently running), by default there is no timeout and the command will wait until it can get the lock" + parser.add_argument( + "--timeout", + type=int, + default=None, + help="Number of seconds before this command will timeout because it can't acquire the lock (meaning that another command is currently running), by default there is no timeout and the command will wait until it can get the lock", ) # deprecated arguments - parser.add_argument('--plain', - action='store_true', default=False, help=argparse.SUPPRESS + parser.add_argument( + "--plain", action="store_true", default=False, help=argparse.SUPPRESS ) - parser.add_argument('--json', - action='store_true', default=False, help=argparse.SUPPRESS + parser.add_argument( + "--json", action="store_true", default=False, help=argparse.SUPPRESS ) opts, args = parser.parse_known_args() # output compatibility if opts.plain: - opts.output_as = 'plain' + opts.output_as = "plain" elif opts.json: - opts.output_as = 'json' + opts.output_as = "json" return (parser, opts, args) @@ -54,10 +59,12 @@ if os.environ["PATH"] != default_path: # Main action ---------------------------------------------------------- -if __name__ == '__main__': +if __name__ == "__main__": if os.geteuid() != 0: - sys.stderr.write("\033[1;31mError:\033[0m yunohost command must be " - "run as root or with sudo.\n") + sys.stderr.write( + "\033[1;31mError:\033[0m yunohost command must be " + "run as root or with sudo.\n" + ) sys.exit(1) parser, opts, args = _parse_cli_args() @@ -69,5 +76,5 @@ if __name__ == '__main__': output_as=opts.output_as, timeout=opts.timeout, args=args, - parser=parser + parser=parser, ) diff --git a/bin/yunohost-api b/bin/yunohost-api index b3ed3a817..6a809b198 100755 --- a/bin/yunohost-api +++ b/bin/yunohost-api @@ -8,37 +8,49 @@ sys.path.insert(0, "/usr/lib/moulinette/") import yunohost # Default server configuration -DEFAULT_HOST = 'localhost' +DEFAULT_HOST = "localhost" DEFAULT_PORT = 6787 def _parse_api_args(): """Parse main arguments for the api""" - parser = argparse.ArgumentParser(add_help=False, + parser = argparse.ArgumentParser( + add_help=False, description="Run the YunoHost API to manage your server.", ) - srv_group = parser.add_argument_group('server configuration') - srv_group.add_argument('-h', '--host', - action='store', default=DEFAULT_HOST, + srv_group = parser.add_argument_group("server configuration") + srv_group.add_argument( + "-h", + "--host", + action="store", + default=DEFAULT_HOST, help="Host to listen on (default: %s)" % DEFAULT_HOST, ) - srv_group.add_argument('-p', '--port', - action='store', default=DEFAULT_PORT, type=int, + srv_group.add_argument( + "-p", + "--port", + action="store", + default=DEFAULT_PORT, + type=int, help="Port to listen on (default: %d)" % DEFAULT_PORT, ) - glob_group = parser.add_argument_group('global arguments') - glob_group.add_argument('--debug', - action='store_true', default=False, + glob_group = parser.add_argument_group("global arguments") + glob_group.add_argument( + "--debug", + action="store_true", + default=False, help="Set log level to DEBUG", ) - glob_group.add_argument('--help', - action='help', help="Show this help message and exit", + glob_group.add_argument( + "--help", + action="help", + help="Show this help message and exit", ) return parser.parse_args() -if __name__ == '__main__': +if __name__ == "__main__": opts = _parse_api_args() # Run the server yunohost.api(debug=opts.debug, host=opts.host, port=opts.port) diff --git a/bin/yunomdns b/bin/yunomdns index 0aee28195..661c7c71f 100755 --- a/bin/yunomdns +++ b/bin/yunomdns @@ -21,8 +21,18 @@ def get_network_local_interfaces() -> Dict[str, Dict[str, List[str]]]: interfaces = { adapter.name: { - "ipv4": [ip.ip for ip in adapter.ips if ip.is_IPv4 and ip_address(ip.ip).is_private], - "ipv6": [ip.ip[0] for ip in adapter.ips if ip.is_IPv6 and ip_address(ip.ip[0]).is_private and not ip_address(ip.ip[0]).is_link_local], + "ipv4": [ + ip.ip + for ip in adapter.ips + if ip.is_IPv4 and ip_address(ip.ip).is_private + ], + "ipv6": [ + ip.ip[0] + for ip in adapter.ips + if ip.is_IPv6 + and ip_address(ip.ip[0]).is_private + and not ip_address(ip.ip[0]).is_link_local + ], } for adapter in ifaddr.get_adapters() if adapter.name != "lo" @@ -33,7 +43,6 @@ def get_network_local_interfaces() -> Dict[str, Dict[str, List[str]]]: # Listener class, to detect duplicates on the network # Stores the list of servers in its list property class Listener: - def __init__(self): self.list = [] @@ -66,14 +75,18 @@ def main() -> bool: return False if "interfaces" not in config: - config["interfaces"] = [interface - for interface, local_ips in interfaces.items() - if local_ips["ipv4"]] + config["interfaces"] = [ + interface + for interface, local_ips in interfaces.items() + if local_ips["ipv4"] + ] if "ban_interfaces" in config: - config["interfaces"] = [interface - for interface in config["interfaces"] - if interface not in config["ban_interfaces"]] + config["interfaces"] = [ + interface + for interface in config["interfaces"] + if interface not in config["ban_interfaces"] + ] # Let's discover currently published .local domains accross the network zc = Zeroconf() @@ -103,14 +116,18 @@ def main() -> bool: return domain_i - config['domains'] = [find_domain_not_already_published(domain) for domain in config['domains']] + config["domains"] = [ + find_domain_not_already_published(domain) for domain in config["domains"] + ] zcs: Dict[Zeroconf, List[ServiceInfo]] = {} for interface in config["interfaces"]: if interface not in interfaces: - print(f"Interface {interface} listed in config file is not present on system.") + print( + f"Interface {interface} listed in config file is not present on system." + ) continue # Only broadcast IPv4 because IPv6 is buggy ... because we ain't using python3-ifaddr >= 0.1.7 @@ -149,7 +166,9 @@ def main() -> bool: print("Registering...") for zc, infos in zcs.items(): for info in infos: - zc.register_service(info, allow_name_change=True, cooperating_responders=True) + zc.register_service( + info, allow_name_change=True, cooperating_responders=True + ) try: print("Registered. Press Ctrl+C or stop service to stop.") From 01ff6c932cff90b40b5e19ba5aeccd929e7ea50e Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Mon, 15 Nov 2021 04:02:45 +0100 Subject: [PATCH 144/619] Attempt to fix debian install following repo structure change --- debian/install | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/debian/install b/debian/install index 0a23cbfc9..534dccebd 100644 --- a/debian/install +++ b/debian/install @@ -7,4 +7,4 @@ doc/yunohost.8.gz /usr/share/man/man8/ doc/bash-completion.sh /etc/bash_completion.d/yunohost conf/metronome/modules/* /usr/lib/metronome/modules/ locales/* /usr/lib/moulinette/yunohost/locales/ -src/ /usr/lib/moulinette/yunohost +src/* /usr/lib/moulinette/yunohost/ From 26e6b4a41450449f1c3cbad8548d6253e309e4fc Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Mon, 15 Nov 2021 04:34:25 +0100 Subject: [PATCH 145/619] debian: another tweak to install actionsmap to the right place --- debian/install | 1 + 1 file changed, 1 insertion(+) diff --git a/debian/install b/debian/install index 534dccebd..37840662b 100644 --- a/debian/install +++ b/debian/install @@ -1,5 +1,6 @@ bin/* /usr/bin/ share/* /usr/share/yunohost/ +share/actionsmap.yml /usr/share/moulinette/actionsmap/yunohost.yml hooks/* /usr/share/yunohost/hooks/ helpers/* /usr/share/yunohost/helpers.d/ conf/* /usr/share/yunohost/conf/ From 16dba79a3983b979a19de1701773a5440ae9766f Mon Sep 17 00:00:00 2001 From: Kay0u Date: Wed, 17 Nov 2021 00:44:58 +0100 Subject: [PATCH 146/619] fix backup_delete when compress_tar_archives is True --- src/yunohost/backup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/yunohost/backup.py b/src/yunohost/backup.py index 058813502..f68e59b13 100644 --- a/src/yunohost/backup.py +++ b/src/yunohost/backup.py @@ -2592,7 +2592,7 @@ def backup_delete(name): hook_callback("pre_backup_delete", args=[name]) archive_file = "%s/%s.tar" % (ARCHIVES_PATH, name) - if os.path.exists(archive_file + ".gz"): + if not os.path.exists(archive_file) and os.path.exists(archive_file + ".gz"): archive_file += ".gz" info_file = "%s/%s.info.json" % (ARCHIVES_PATH, name) From 7bfa15d4716daf25cf76462aa3aecf99596137a4 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Wed, 17 Nov 2021 20:12:18 +0100 Subject: [PATCH 147/619] Propagate changes from moulinette --- bin/yunohost | 2 -- bin/yunohost-api | 3 --- debian/install | 5 ++--- share/actionsmap.yml | 3 ++- src/__init__.py | 13 +++++++++++-- 5 files changed, 15 insertions(+), 11 deletions(-) diff --git a/bin/yunohost b/bin/yunohost index d3af76d92..8cebdee8e 100755 --- a/bin/yunohost +++ b/bin/yunohost @@ -4,8 +4,6 @@ import os import sys import argparse - -sys.path.insert(0, "/usr/lib/moulinette/") import yunohost diff --git a/bin/yunohost-api b/bin/yunohost-api index 6a809b198..8cf9d4f26 100755 --- a/bin/yunohost-api +++ b/bin/yunohost-api @@ -1,10 +1,7 @@ #! /usr/bin/python3 # -*- coding: utf-8 -*- -import sys import argparse - -sys.path.insert(0, "/usr/lib/moulinette/") import yunohost # Default server configuration diff --git a/debian/install b/debian/install index 37840662b..db88462ab 100644 --- a/debian/install +++ b/debian/install @@ -1,11 +1,10 @@ bin/* /usr/bin/ share/* /usr/share/yunohost/ -share/actionsmap.yml /usr/share/moulinette/actionsmap/yunohost.yml hooks/* /usr/share/yunohost/hooks/ helpers/* /usr/share/yunohost/helpers.d/ conf/* /usr/share/yunohost/conf/ +locales/* /usr/share/yunohost/locales/ doc/yunohost.8.gz /usr/share/man/man8/ doc/bash-completion.sh /etc/bash_completion.d/yunohost conf/metronome/modules/* /usr/lib/metronome/modules/ -locales/* /usr/lib/moulinette/yunohost/locales/ -src/* /usr/lib/moulinette/yunohost/ +src/* /usr/lib/python3/dist-packages/yunohost/ diff --git a/share/actionsmap.yml b/share/actionsmap.yml index 6ea82e8ab..cad0212b2 100644 --- a/share/actionsmap.yml +++ b/share/actionsmap.yml @@ -33,7 +33,8 @@ # Global parameters # ############################# _global: - name: yunohost.admin + namespace: yunohost + cookie_name: yunohost.admin authentication: api: ldap_admin cli: null diff --git a/src/__init__.py b/src/__init__.py index dad73e2a4..b9dcd93d9 100644 --- a/src/__init__.py +++ b/src/__init__.py @@ -22,7 +22,14 @@ def cli(debug, quiet, output_as, timeout, args, parser): if not is_installed(): check_command_is_valid_before_postinstall(args) - ret = moulinette.cli(args, output_as=output_as, timeout=timeout, top_parser=parser) + ret = moulinette.cli( + args, + actionsmap="/usr/share/yunohost/actionsmap.yml", + locales_dir="/usr/share/yunohost/locales/", + output_as=output_as, + timeout=timeout, + top_parser=parser + ) sys.exit(ret) @@ -39,6 +46,8 @@ def api(debug, host, port): ret = moulinette.api( host=host, port=port, + actionsmap="/usr/share/yunohost/actionsmap.yml", + locales_dir="/usr/share/yunohost/locales/", routes={("GET", "/installed"): is_installed_api}, ) sys.exit(ret) @@ -78,7 +87,7 @@ def init(interface="cli", debug=False, quiet=False, logdir="/var/log/yunohost"): def init_i18n(): # This should only be called when not willing to go through moulinette.cli # or moulinette.api but still willing to call m18n.n/g... - m18n.load_namespace("yunohost") + m18n.set_locales_dir("/usr/share/yunohost/locales/") m18n.set_locale(get_locale()) From bc9a9414a2e99ed5238ee8770380f854e93966a0 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Thu, 18 Nov 2021 01:23:00 +0100 Subject: [PATCH 148/619] Fix diagnosis/ vs. diagnosis.py ambiguity, breaking python imports --- .gitlab/ci/test.gitlab-ci.yml | 4 ++-- src/{diagnosis => diagnosers}/00-basesystem.py | 0 src/{diagnosis => diagnosers}/10-ip.py | 0 src/{diagnosis => diagnosers}/12-dnsrecords.py | 0 src/{diagnosis => diagnosers}/14-ports.py | 0 src/{diagnosis => diagnosers}/21-web.py | 0 src/{diagnosis => diagnosers}/24-mail.py | 0 src/{diagnosis => diagnosers}/30-services.py | 0 src/{diagnosis => diagnosers}/50-systemresources.py | 0 src/{diagnosis => diagnosers}/70-regenconf.py | 0 src/{diagnosis => diagnosers}/80-apps.py | 0 src/{diagnosis => diagnosers}/__init__.py | 0 src/diagnosis.py | 6 +++--- tests/add_missing_keys.py | 4 ++-- tests/test_i18n_keys.py | 4 ++-- 15 files changed, 9 insertions(+), 9 deletions(-) rename src/{diagnosis => diagnosers}/00-basesystem.py (100%) rename src/{diagnosis => diagnosers}/10-ip.py (100%) rename src/{diagnosis => diagnosers}/12-dnsrecords.py (100%) rename src/{diagnosis => diagnosers}/14-ports.py (100%) rename src/{diagnosis => diagnosers}/21-web.py (100%) rename src/{diagnosis => diagnosers}/24-mail.py (100%) rename src/{diagnosis => diagnosers}/30-services.py (100%) rename src/{diagnosis => diagnosers}/50-systemresources.py (100%) rename src/{diagnosis => diagnosers}/70-regenconf.py (100%) rename src/{diagnosis => diagnosers}/80-apps.py (100%) rename src/{diagnosis => diagnosers}/__init__.py (100%) diff --git a/.gitlab/ci/test.gitlab-ci.yml b/.gitlab/ci/test.gitlab-ci.yml index e98927f38..1165e4826 100644 --- a/.gitlab/ci/test.gitlab-ci.yml +++ b/.gitlab/ci/test.gitlab-ci.yml @@ -37,7 +37,7 @@ full-tests: - *install_debs - yunohost tools postinstall -d domain.tld -p the_password --ignore-dyndns --force-diskspace script: - - python3 -m pytest --cov=yunohost tests/ src/tests/ src/diagnosis/ --junitxml=report.xml + - python3 -m pytest --cov=yunohost tests/ src/tests/ src/diagnosers/ --junitxml=report.xml - cd tests - bash test_helpers.sh needs: @@ -59,7 +59,7 @@ test-i18n-keys: changes: - locales/en.json - src/*.py - - src/diagnosis/*.py + - src/diagnosers/*.py test-translation-format-consistency: extends: .test-stage diff --git a/src/diagnosis/00-basesystem.py b/src/diagnosers/00-basesystem.py similarity index 100% rename from src/diagnosis/00-basesystem.py rename to src/diagnosers/00-basesystem.py diff --git a/src/diagnosis/10-ip.py b/src/diagnosers/10-ip.py similarity index 100% rename from src/diagnosis/10-ip.py rename to src/diagnosers/10-ip.py diff --git a/src/diagnosis/12-dnsrecords.py b/src/diagnosers/12-dnsrecords.py similarity index 100% rename from src/diagnosis/12-dnsrecords.py rename to src/diagnosers/12-dnsrecords.py diff --git a/src/diagnosis/14-ports.py b/src/diagnosers/14-ports.py similarity index 100% rename from src/diagnosis/14-ports.py rename to src/diagnosers/14-ports.py diff --git a/src/diagnosis/21-web.py b/src/diagnosers/21-web.py similarity index 100% rename from src/diagnosis/21-web.py rename to src/diagnosers/21-web.py diff --git a/src/diagnosis/24-mail.py b/src/diagnosers/24-mail.py similarity index 100% rename from src/diagnosis/24-mail.py rename to src/diagnosers/24-mail.py diff --git a/src/diagnosis/30-services.py b/src/diagnosers/30-services.py similarity index 100% rename from src/diagnosis/30-services.py rename to src/diagnosers/30-services.py diff --git a/src/diagnosis/50-systemresources.py b/src/diagnosers/50-systemresources.py similarity index 100% rename from src/diagnosis/50-systemresources.py rename to src/diagnosers/50-systemresources.py diff --git a/src/diagnosis/70-regenconf.py b/src/diagnosers/70-regenconf.py similarity index 100% rename from src/diagnosis/70-regenconf.py rename to src/diagnosers/70-regenconf.py diff --git a/src/diagnosis/80-apps.py b/src/diagnosers/80-apps.py similarity index 100% rename from src/diagnosis/80-apps.py rename to src/diagnosers/80-apps.py diff --git a/src/diagnosis/__init__.py b/src/diagnosers/__init__.py similarity index 100% rename from src/diagnosis/__init__.py rename to src/diagnosers/__init__.py diff --git a/src/diagnosis.py b/src/diagnosis.py index a7b6c725c..67128217c 100644 --- a/src/diagnosis.py +++ b/src/diagnosis.py @@ -660,7 +660,7 @@ class Diagnoser: def _list_diagnosis_categories(): - paths = glob.glob(os.path.dirname(__file__) + "/diagnosis/??-*.py") + paths = glob.glob(os.path.dirname(__file__) + "/diagnosers/??-*.py") names = sorted([os.path.basename(path)[: -len(".py")] for path in paths]) return names @@ -670,7 +670,7 @@ def _load_diagnoser(diagnoser_name): logger.debug(f"Loading diagnoser {diagnoser_name}") - paths = glob.glob(os.path.dirname(__file__) + f"/diagnosis/??-{diagnoser_name}.py") + paths = glob.glob(os.path.dirname(__file__) + f"/diagnosers/??-{diagnoser_name}.py") if len(paths) != 1: raise YunohostError(f"Uhoh, found several matches (or none?) for diagnoser {diagnoser_name} : {paths}", raw_msg=True) @@ -681,7 +681,7 @@ def _load_diagnoser(diagnoser_name): # this is python builtin method to import a module using a name, we # use that to import the migration as a python object so we'll be # able to run it in the next loop - module = import_module("yunohost.diagnosis.{}".format(module_id)) + module = import_module("yunohost.diagnosers.{}".format(module_id)) return module.MyDiagnoser() except Exception as e: import traceback diff --git a/tests/add_missing_keys.py b/tests/add_missing_keys.py index e1ecbf56e..ebee80a1b 100644 --- a/tests/add_missing_keys.py +++ b/tests/add_missing_keys.py @@ -28,7 +28,7 @@ def find_expected_string_keys(): python_files.extend(glob.glob("src/utils/*.py")) python_files.extend(glob.glob("src/migrations/*.py")) python_files.extend(glob.glob("src/authenticators/*.py")) - python_files.extend(glob.glob("src/diagnosis/*.py")) + python_files.extend(glob.glob("src/diagnosers/*.py")) python_files.append("bin/yunohost") for python_file in python_files: @@ -51,7 +51,7 @@ def find_expected_string_keys(): # For each diagnosis, try to find strings like "diagnosis_stuff_foo" (c.f. diagnosis summaries) # Also we expect to have "diagnosis_description_" for each diagnosis p3 = re.compile(r"[\"\'](diagnosis_[a-z]+_\w+)[\"\']") - for python_file in glob.glob("src/diagnosis/*.py"): + for python_file in glob.glob("src/diagnosers/*.py"): content = open(python_file).read() for m in p3.findall(content): if m.endswith("_"): diff --git a/tests/test_i18n_keys.py b/tests/test_i18n_keys.py index b25d35923..62cad7cbb 100644 --- a/tests/test_i18n_keys.py +++ b/tests/test_i18n_keys.py @@ -29,7 +29,7 @@ def find_expected_string_keys(): python_files.extend(glob.glob("src/utils/*.py")) python_files.extend(glob.glob("src/migrations/*.py")) python_files.extend(glob.glob("src/authenticators/*.py")) - python_files.extend(glob.glob("src/diagnosis/*.py")) + python_files.extend(glob.glob("src/diagnosers/*.py")) python_files.append("bin/yunohost") for python_file in python_files: @@ -52,7 +52,7 @@ def find_expected_string_keys(): # For each diagnosis, try to find strings like "diagnosis_stuff_foo" (c.f. diagnosis summaries) # Also we expect to have "diagnosis_description_" for each diagnosis p3 = re.compile(r"[\"\'](diagnosis_[a-z]+_\w+)[\"\']") - for python_file in glob.glob("src/diagnosis/*.py"): + for python_file in glob.glob("src/diagnosers/*.py"): content = open(python_file).read() for m in p3.findall(content): if m.endswith("_"): From 124dc158fc8aa888cddc42dd230e412343f68d8a Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Thu, 18 Nov 2021 02:33:37 +0100 Subject: [PATCH 149/619] Fix redeclaration of 'migrations' var --- src/tools.py | 17 +++-------------- 1 file changed, 3 insertions(+), 14 deletions(-) diff --git a/src/tools.py b/src/tools.py index f9de32cfe..8962f41a3 100644 --- a/src/tools.py +++ b/src/tools.py @@ -930,19 +930,6 @@ def _write_migration_state(migration_id, state): def _get_migrations_list(): - migrations = [] - - try: - from . import migrations - except ImportError: - # not data migrations present, return empty list - return migrations - - migrations_path = migrations.__path__[0] - - if not os.path.exists(migrations_path): - logger.warn(m18n.n("migrations_cant_reach_migration_file", migrations_path)) - return migrations # states is a datastructure that represents the last run migration # it has this form: @@ -955,9 +942,11 @@ def _get_migrations_list(): # (in particular, pending migrations / not already ran are not listed states = tools_migrations_state()["migrations"] + migrations = [] + migrations_folder = os.path.dirname(__file__) + "/migrations/" for migration_file in [ x - for x in os.listdir(migrations_path) + for x in os.listdir(migrations_folder) if re.match(r"^\d+_[a-zA-Z0-9_]+\.py$", x) ]: m = _load_migration(migration_file) From 23b8418ee65230a4d8cf97dea30b0261a68caabe Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Thu, 18 Nov 2021 03:09:18 +0100 Subject: [PATCH 150/619] Fix diagnosis category listing --- src/diagnosis.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/diagnosis.py b/src/diagnosis.py index 67128217c..ea33b59f3 100644 --- a/src/diagnosis.py +++ b/src/diagnosis.py @@ -661,7 +661,7 @@ class Diagnoser: def _list_diagnosis_categories(): paths = glob.glob(os.path.dirname(__file__) + "/diagnosers/??-*.py") - names = sorted([os.path.basename(path)[: -len(".py")] for path in paths]) + names = sorted([os.path.basename(path)[: -len(".py")].split("-")[-1] for path in paths]) return names From 33d3db62b283b80d75973741f2c97d7f95449849 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Thu, 18 Nov 2021 03:12:08 +0100 Subject: [PATCH 151/619] Fix i18n key test --- tests/test_i18n_keys.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_i18n_keys.py b/tests/test_i18n_keys.py index 62cad7cbb..ec582ba72 100644 --- a/tests/test_i18n_keys.py +++ b/tests/test_i18n_keys.py @@ -102,7 +102,7 @@ def find_expected_string_keys(): yield m # Keys for the actionmap ... - for category in yaml.safe_load(open("src/actionsmap.yml")).values(): + for category in yaml.safe_load(open("share/actionsmap.yml")).values(): if "actions" not in category.keys(): continue for action in category["actions"].values(): From a792ed6e412d998c167945236be8005068e5e887 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Thu, 18 Nov 2021 03:54:25 +0100 Subject: [PATCH 152/619] Moar technical fixes --- src/diagnosis.py | 4 ++-- src/tests/conftest.py | 6 ------ 2 files changed, 2 insertions(+), 8 deletions(-) diff --git a/src/diagnosis.py b/src/diagnosis.py index ea33b59f3..cdb125eb1 100644 --- a/src/diagnosis.py +++ b/src/diagnosis.py @@ -423,7 +423,7 @@ class Diagnoser: not force and self.cached_time_ago() < self.cache_duration ): - self.logger_debug("Cache still valid : %s" % self.cache_file) + logger.debug("Cache still valid : %s" % self.cache_file) logger.info( m18n.n("diagnosis_cache_still_valid", category=self.description) ) @@ -457,7 +457,7 @@ class Diagnoser: new_report = {"id": self.id_, "cached_for": self.cache_duration, "items": items} - self.logger_debug("Updating cache %s" % self.cache_file) + logger.debug("Updating cache %s" % self.cache_file) self.write_cache(new_report) Diagnoser.i18n(new_report) add_ignore_flag_to_issues(new_report) diff --git a/src/tests/conftest.py b/src/tests/conftest.py index a07c44346..cd5cb307e 100644 --- a/src/tests/conftest.py +++ b/src/tests/conftest.py @@ -61,12 +61,6 @@ def new_translate(self, key, *args, **kwargs): moulinette.core.Translator.translate = new_translate -def new_m18nn(self, key, *args, **kwargs): - return self._namespaces[self._current_namespace].translate(key, *args, **kwargs) - - -moulinette.core.Moulinette18n.n = new_m18nn - # # Init the moulinette to have the cli loggers stuff # # From 799609c7a8e5946988d51779dce0eda4556b5fba Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Thu, 18 Nov 2021 13:53:00 +0100 Subject: [PATCH 153/619] Fix most used password file path --- src/utils/password.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/utils/password.py b/src/utils/password.py index 04a1ed272..f0dacc8f3 100644 --- a/src/utils/password.py +++ b/src/utils/password.py @@ -36,7 +36,7 @@ SMALL_PWD_LIST = [ "rpi", ] -MOST_USED_PASSWORDS = "/usr/share/yunohost/password/100000-most-used-passwords.txt" +MOST_USED_PASSWORDS = "/usr/share/yunohost/100000-most-used-passwords.txt" # Length, digits, lowers, uppers, others STRENGTH_LEVELS = [ From 9c28c07af4b342d6db6a53818353bf19e0325ad1 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Mon, 22 Nov 2021 08:10:14 +0100 Subject: [PATCH 154/619] Fix overly complex location for ssl workdir --- conf/ssl/openssl.cnf | 4 ++-- hooks/conf_regen/01-yunohost | 2 ++ hooks/conf_regen/02-ssl | 2 +- src/certificate.py | 2 +- 4 files changed, 6 insertions(+), 4 deletions(-) diff --git a/conf/ssl/openssl.cnf b/conf/ssl/openssl.cnf index 3ef7d80c3..a19a9c3df 100644 --- a/conf/ssl/openssl.cnf +++ b/conf/ssl/openssl.cnf @@ -5,7 +5,7 @@ # This definition stops the following lines choking if HOME isn't # defined. -HOME = /usr/share/yunohost/yunohost-config/ssl +HOME = /usr/share/yunohost/ssl RANDFILE = $ENV::HOME/.rnd # Extra OBJECT IDENTIFIER info: @@ -34,7 +34,7 @@ default_ca = Yunohost # The default ca section #################################################################### [ Yunohost ] -dir = /usr/share/yunohost/yunohost-config/ssl/yunoCA # Where everything is kept +dir = /usr/share/yunohost/ssl # Where everything is kept certs = $dir/certs # Where the issued certs are kept crl_dir = $dir/crl # Where the issued crl are kept database = $dir/index.txt # database index file. diff --git a/hooks/conf_regen/01-yunohost b/hooks/conf_regen/01-yunohost index 027be8020..7716f04c3 100755 --- a/hooks/conf_regen/01-yunohost +++ b/hooks/conf_regen/01-yunohost @@ -181,6 +181,8 @@ do_post_regen() { find /etc/cron.d/yunohost-* -type f -exec chmod 644 {} \; find /etc/cron.*/yunohost-* -type f -exec chown root:root {} \; + chmod 750 /usr/share/yunohost/ssl + chown root:root /var/cache/yunohost chmod 700 /var/cache/yunohost chown root:root /var/cache/moulinette diff --git a/hooks/conf_regen/02-ssl b/hooks/conf_regen/02-ssl index f27a23cf8..a824c91f8 100755 --- a/hooks/conf_regen/02-ssl +++ b/hooks/conf_regen/02-ssl @@ -2,7 +2,7 @@ set -e -ssl_dir="/usr/share/yunohost/yunohost-config/ssl/yunoCA" +ssl_dir="/usr/share/yunohost/ssl" ynh_ca="/etc/yunohost/certs/yunohost.org/ca.pem" ynh_crt="/etc/yunohost/certs/yunohost.org/crt.pem" ynh_key="/etc/yunohost/certs/yunohost.org/key.pem" diff --git a/src/certificate.py b/src/certificate.py index c697a487b..46aa9c818 100644 --- a/src/certificate.py +++ b/src/certificate.py @@ -54,7 +54,7 @@ WEBROOT_FOLDER = "/tmp/acme-challenge-public/" SELF_CA_FILE = "/etc/ssl/certs/ca-yunohost_crt.pem" ACCOUNT_KEY_FILE = "/etc/yunohost/letsencrypt_account.pem" -SSL_DIR = "/usr/share/yunohost/yunohost-config/ssl/yunoCA" +SSL_DIR = "/usr/share/yunohost/ssl" KEY_SIZE = 3072 From 10e00b3318a3350aff683a5d89c53fc9055fbd21 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Mon, 22 Nov 2021 08:13:14 +0100 Subject: [PATCH 155/619] Fix old moulinette stuff not relevant anymore --- debian/postinst | 4 ---- hooks/conf_regen/01-yunohost | 2 -- 2 files changed, 6 deletions(-) diff --git a/debian/postinst b/debian/postinst index 0dd1dedd0..aa2d17107 100644 --- a/debian/postinst +++ b/debian/postinst @@ -3,10 +3,6 @@ set -e do_configure() { - rm -rf /var/cache/moulinette/* - - mkdir -p /usr/share/moulinette/actionsmap/ - ln -sf /usr/share/yunohost/actionsmap/yunohost.yml /usr/share/moulinette/actionsmap/yunohost.yml if [ ! -f /etc/yunohost/installed ]; then # If apps/ is not empty, we're probably already installed in the past and diff --git a/hooks/conf_regen/01-yunohost b/hooks/conf_regen/01-yunohost index 7716f04c3..d73a899da 100755 --- a/hooks/conf_regen/01-yunohost +++ b/hooks/conf_regen/01-yunohost @@ -185,8 +185,6 @@ do_post_regen() { chown root:root /var/cache/yunohost chmod 700 /var/cache/yunohost - chown root:root /var/cache/moulinette - chmod 700 /var/cache/moulinette setfacl -m g:all_users:--- /var/www setfacl -m g:all_users:--- /var/log/nginx From a399675f6057790e1c9e63eef851a649cd066bb8 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Mon, 22 Nov 2021 08:14:45 +0100 Subject: [PATCH 156/619] Fix location for specte meltdown checker script --- src/diagnosers/00-basesystem.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/diagnosers/00-basesystem.py b/src/diagnosers/00-basesystem.py index 66a2bf47b..0ef1a5197 100644 --- a/src/diagnosers/00-basesystem.py +++ b/src/diagnosers/00-basesystem.py @@ -206,7 +206,7 @@ class MyDiagnoser(Diagnoser): # script taken from https://github.com/speed47/spectre-meltdown-checker # script commit id is store directly in the script - SCRIPT_PATH = "/usr/lib/moulinette/yunohost/vendor/spectre-meltdown-checker/spectre-meltdown-checker.sh" + SCRIPT_PATH = "/usr/lib/python3/dist-packages/yunohost/vendor/spectre-meltdown-checker/spectre-meltdown-checker.sh" # '--variant 3' corresponds to Meltdown # example output from the script: From dc4341f98cc75baeff03b32777e17045338ec144 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Mon, 22 Nov 2021 08:21:54 +0100 Subject: [PATCH 157/619] migrate_to_bullseye: /usr/share/yunohost/yunohost-config/ssl/yunoCA -> /usr/share/yunohost/ssl --- src/yunohost/data_migrations/0021_migrate_to_bullseye.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/yunohost/data_migrations/0021_migrate_to_bullseye.py b/src/yunohost/data_migrations/0021_migrate_to_bullseye.py index db10777bf..aee3bc2d6 100644 --- a/src/yunohost/data_migrations/0021_migrate_to_bullseye.py +++ b/src/yunohost/data_migrations/0021_migrate_to_bullseye.py @@ -77,6 +77,13 @@ class MyMigration(Migration): rm("/etc/mysql/my.cnf", force=True) self.apt_install("mariadb-common --reinstall -o Dpkg::Options::='--force-confmiss'") + # + # /usr/share/yunohost/yunohost-config/ssl/yunoCA -> /usr/share/yunohost/ssl + # + if os.path.exists("/usr/share/yunohost/yunohost-config/ssl/yunoCA"): + os.system("mv /usr/share/yunohost/yunohost-config/ssl/yunoCA /usr/share/yunohost/ssl") + rm("/usr/share/yunohost/yunohost-config", recursive=True, force=True) + # # Main upgrade # From 4f6d3c426ab5159230b017b1b23ea8e9bfe0a8f9 Mon Sep 17 00:00:00 2001 From: tituspijean Date: Tue, 23 Nov 2021 21:22:22 +0000 Subject: [PATCH 158/619] Allow tilde in username/organization for repo URLs --- src/yunohost/app.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/yunohost/app.py b/src/yunohost/app.py index 649110267..f6d940da8 100644 --- a/src/yunohost/app.py +++ b/src/yunohost/app.py @@ -79,7 +79,7 @@ re_app_instance_name = re.compile( ) APP_REPO_URL = re.compile( - r"^https://[a-zA-Z0-9-_.]+/[a-zA-Z0-9-_./]+/[a-zA-Z0-9-_.]+_ynh(/?(-/)?tree/[a-zA-Z0-9-_.]+)?(\.git)?/?$" + r"^https://[a-zA-Z0-9-_.]+/[a-zA-Z0-9-_./~]+/[a-zA-Z0-9-_.]+_ynh(/?(-/)?tree/[a-zA-Z0-9-_.]+)?(\.git)?/?$" ) APP_FILES_TO_COPY = [ From 6a8aa333eac7eada56f24f86771b30060f7fb66b Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Tue, 23 Nov 2021 23:11:37 +0100 Subject: [PATCH 159/619] appurl: Add test for app url containing tilde --- src/yunohost/tests/test_appurl.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/yunohost/tests/test_appurl.py b/src/yunohost/tests/test_appurl.py index 7b4c6e2e3..00bfe5c58 100644 --- a/src/yunohost/tests/test_appurl.py +++ b/src/yunohost/tests/test_appurl.py @@ -70,6 +70,7 @@ def test_repo_url_definition(): ) assert _is_app_repo_url("https://github.com/YunoHost-Apps/foobar_ynh/tree/1.23.4") assert _is_app_repo_url("git@github.com:YunoHost-Apps/foobar_ynh.git") + assert _is_app_repo_url("https://git.super.host/~max/foobar_ynh") assert not _is_app_repo_url("github.com/YunoHost-Apps/foobar_ynh") assert not _is_app_repo_url("http://github.com/YunoHost-Apps/foobar_ynh") From 6488b4f6493c65592c69a8f435b882f822449f7b Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Thu, 25 Nov 2021 20:01:54 +0100 Subject: [PATCH 160/619] Fix /etc/yunohost permissions on some setups --- data/hooks/conf_regen/01-yunohost | 3 +++ 1 file changed, 3 insertions(+) diff --git a/data/hooks/conf_regen/01-yunohost b/data/hooks/conf_regen/01-yunohost index 1703dccd1..e2ea1bbcb 100755 --- a/data/hooks/conf_regen/01-yunohost +++ b/data/hooks/conf_regen/01-yunohost @@ -179,6 +179,9 @@ do_post_regen() { chown admin:root /home/yunohost.backup chown admin:root /home/yunohost.backup/archives + # NB: x permission for 'others' is important for ssl-cert (and maybe mdns), otherwise slapd will fail to start because can't access the certs + chmod 755 /etc/yunohost + # Certs # We do this with find because there could be a lot of them... chown -R root:ssl-cert /etc/yunohost/certs From 7e7dbe41d711462d6db746e4d0dd4a44ad4c4b2e Mon Sep 17 00:00:00 2001 From: ljf Date: Fri, 26 Nov 2021 02:18:00 +0100 Subject: [PATCH 161/619] [enh] Hotspot and hairpining use cases --- data/hooks/conf_regen/43-dnsmasq | 17 ++++++++++++++--- data/templates/dnsmasq/domain.tpl | 6 ++++-- data/templates/dnsmasq/plain/dnsmasq.conf | 6 +++++- 3 files changed, 23 insertions(+), 6 deletions(-) diff --git a/data/hooks/conf_regen/43-dnsmasq b/data/hooks/conf_regen/43-dnsmasq index 13c442158..0370d10b4 100755 --- a/data/hooks/conf_regen/43-dnsmasq +++ b/data/hooks/conf_regen/43-dnsmasq @@ -14,7 +14,7 @@ do_pre_regen() { etcdefault_dir="${pending_dir}/etc/default" mkdir -p "$etcdefault_dir" - # add general conf files + # add default conf files cp plain/etcdefault ${pending_dir}/etc/default/dnsmasq cp plain/dnsmasq.conf ${pending_dir}/etc/dnsmasq.conf @@ -26,11 +26,22 @@ do_pre_regen() { ynh_validate_ip4 "$ipv4" || ipv4='127.0.0.1' ipv6=$(curl -s -6 https://ip6.yunohost.org 2>/dev/null || true) ynh_validate_ip6 "$ipv6" || ipv6='' + IFS=' ' read -a interfaces <<< "$(ls /sys/class/net)" + wireless_interfaces=() + for dev in "${interfaces[@]}"; do + if [ -d "/sys/class/net/$dev/wireless" ]; then + wireless_interfaces+=("$dev") + fi + done - export ipv4 - export ipv6 + # General configuration + export wireless_interfaces + ynh_render_template "dnsmasq.conf.tpl" "${pending_dir}/etc/dnsmasq.conf" # add domain conf files + export interfaces + export ipv4 + export ipv6 for domain in $YNH_DOMAINS; do [[ ! $domain =~ \.local$ ]] || continue export domain diff --git a/data/templates/dnsmasq/domain.tpl b/data/templates/dnsmasq/domain.tpl index c4bb56d1d..faa93954c 100644 --- a/data/templates/dnsmasq/domain.tpl +++ b/data/templates/dnsmasq/domain.tpl @@ -1,5 +1,7 @@ -host-record={{ domain }},{{ ipv4 }} -host-record=xmpp-upload.{{ domain }},{{ ipv4 }} +{% for interface in interfaces %} +interface-name={{ domain }},{{ interface }} +interface-name=xmpp-upload.{{ domain }},{{ interface }} +{% endfor %} {% if ipv6 %} host-record={{ domain }},{{ ipv6 }} host-record=xmpp-upload.{{ domain }},{{ ipv6 }} diff --git a/data/templates/dnsmasq/plain/dnsmasq.conf b/data/templates/dnsmasq/plain/dnsmasq.conf index 12a14048a..ac4d125de 100644 --- a/data/templates/dnsmasq/plain/dnsmasq.conf +++ b/data/templates/dnsmasq/plain/dnsmasq.conf @@ -1,6 +1,10 @@ domain-needed expand-hosts +localise-queries -listen-address=127.0.0.1 + +{% for interface in wireless_interfaces %} +interface={{ interface }} +{% endfor %} resolv-file=/etc/resolv.dnsmasq.conf cache-size=256 From c4f8c9e0221c5ba31cbc34b2a5b74583ca98c2ef Mon Sep 17 00:00:00 2001 From: ljf Date: Fri, 26 Nov 2021 02:18:33 +0100 Subject: [PATCH 162/619] [enh] Move dnsmasq conf in template dir --- data/templates/dnsmasq/{plain/dnsmasq.conf => dnsmasq.conf.tpl} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename data/templates/dnsmasq/{plain/dnsmasq.conf => dnsmasq.conf.tpl} (100%) diff --git a/data/templates/dnsmasq/plain/dnsmasq.conf b/data/templates/dnsmasq/dnsmasq.conf.tpl similarity index 100% rename from data/templates/dnsmasq/plain/dnsmasq.conf rename to data/templates/dnsmasq/dnsmasq.conf.tpl From c49628346f5c691639f93fb48b7b587d771c6aca Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Fri, 26 Nov 2021 18:20:40 +0100 Subject: [PATCH 163/619] mdns: Don't add yunohost.local in config if it's already among the yunohost domains --- data/hooks/conf_regen/37-mdns | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/data/hooks/conf_regen/37-mdns b/data/hooks/conf_regen/37-mdns index faa581efa..95c7a522b 100755 --- a/data/hooks/conf_regen/37-mdns +++ b/data/hooks/conf_regen/37-mdns @@ -4,7 +4,11 @@ set -e _generate_config() { echo "domains:" - echo " - yunohost.local" + # Add yunohost.local (only if yunohost.local ain't already in ynh_domains) + if ! echo "$YNH_DOMAINS" | tr ' ' '\n' | grep -q --line-regexp 'yunohost.local' + then + echo " - yunohost.local" + fi for domain in $YNH_DOMAINS; do # Only keep .local domains (don't keep [[ "$domain" =~ [^.]+\.[^.]+\.local$ ]] && echo "Subdomain $domain cannot be handled by Bonjour/Zeroconf/mDNS" >&2 From 321c8dd5ba94bf7b0eb999afd7fce532e7f67536 Mon Sep 17 00:00:00 2001 From: ljf Date: Fri, 26 Nov 2021 18:42:22 +0100 Subject: [PATCH 164/619] [fix] Bash array not supported in ynh_render_template --- data/hooks/conf_regen/43-dnsmasq | 6 +++--- data/templates/dnsmasq/dnsmasq.conf.tpl | 4 ++-- data/templates/dnsmasq/domain.tpl | 3 ++- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/data/hooks/conf_regen/43-dnsmasq b/data/hooks/conf_regen/43-dnsmasq index 0370d10b4..7f65b9494 100755 --- a/data/hooks/conf_regen/43-dnsmasq +++ b/data/hooks/conf_regen/43-dnsmasq @@ -26,11 +26,11 @@ do_pre_regen() { ynh_validate_ip4 "$ipv4" || ipv4='127.0.0.1' ipv6=$(curl -s -6 https://ip6.yunohost.org 2>/dev/null || true) ynh_validate_ip6 "$ipv6" || ipv6='' - IFS=' ' read -a interfaces <<< "$(ls /sys/class/net)" - wireless_interfaces=() + interfaces="$(ls /sys/class/net)" + wireless_interfaces="" for dev in "${interfaces[@]}"; do if [ -d "/sys/class/net/$dev/wireless" ]; then - wireless_interfaces+=("$dev") + wireless_interfaces+=" $dev" fi done diff --git a/data/templates/dnsmasq/dnsmasq.conf.tpl b/data/templates/dnsmasq/dnsmasq.conf.tpl index ac4d125de..eece530dc 100644 --- a/data/templates/dnsmasq/dnsmasq.conf.tpl +++ b/data/templates/dnsmasq/dnsmasq.conf.tpl @@ -2,8 +2,8 @@ domain-needed expand-hosts localise-queries - -{% for interface in wireless_interfaces %} +{% set interfaces = wireless_interfaces.strip().split(' ') %} +{% for interface in interfaces %} interface={{ interface }} {% endfor %} resolv-file=/etc/resolv.dnsmasq.conf diff --git a/data/templates/dnsmasq/domain.tpl b/data/templates/dnsmasq/domain.tpl index faa93954c..50b946176 100644 --- a/data/templates/dnsmasq/domain.tpl +++ b/data/templates/dnsmasq/domain.tpl @@ -1,4 +1,5 @@ -{% for interface in interfaces %} +{% set interfaces_list = interfaces.split(' ') %} +{% for interface in interfaces_list %} interface-name={{ domain }},{{ interface }} interface-name=xmpp-upload.{{ domain }},{{ interface }} {% endfor %} From f34f9e5fc35cbe3f6c1986ad3f23695da637fab7 Mon Sep 17 00:00:00 2001 From: ljf Date: Fri, 26 Nov 2021 19:39:37 +0100 Subject: [PATCH 165/619] [fix] DNSmasq template generation --- data/hooks/conf_regen/43-dnsmasq | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/data/hooks/conf_regen/43-dnsmasq b/data/hooks/conf_regen/43-dnsmasq index 7f65b9494..8b5691dc6 100755 --- a/data/hooks/conf_regen/43-dnsmasq +++ b/data/hooks/conf_regen/43-dnsmasq @@ -16,7 +16,6 @@ do_pre_regen() { # add default conf files cp plain/etcdefault ${pending_dir}/etc/default/dnsmasq - cp plain/dnsmasq.conf ${pending_dir}/etc/dnsmasq.conf # add resolver file cat plain/resolv.dnsmasq.conf | grep "^nameserver" | shuf >${pending_dir}/etc/resolv.dnsmasq.conf @@ -26,9 +25,9 @@ do_pre_regen() { ynh_validate_ip4 "$ipv4" || ipv4='127.0.0.1' ipv6=$(curl -s -6 https://ip6.yunohost.org 2>/dev/null || true) ynh_validate_ip6 "$ipv6" || ipv6='' - interfaces="$(ls /sys/class/net)" - wireless_interfaces="" - for dev in "${interfaces[@]}"; do + interfaces="$(ls -m /sys/class/net | sed s/,//g)" + wireless_interfaces="lo" + for dev in $(ls /sys/class/net); do if [ -d "/sys/class/net/$dev/wireless" ]; then wireless_interfaces+=" $dev" fi From a0344d44bd7e117dc2aec495408ec6aa135dc3ed Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Sat, 27 Nov 2021 00:56:03 +0100 Subject: [PATCH 166/619] Update changelog for 4.3.4 --- debian/changelog | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/debian/changelog b/debian/changelog index f2266e871..fbf9bcefd 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,14 @@ +yunohost (4.3.4) stable; urgency=low + + - [fix] apps: Allow tilde in username/organization for repo URLs ([#1382](https://github.com/YunoHost/yunohost/pull/1382)) + - [fix] misc: /etc/yunohost permissions broken on some setups (6488b4f6) + - [fix] mdns: Don't add yunohost.local in config if it's already among the yunohost domains (c4962834) + - [enh] dnsmasq: Tweak conf for better support of some stuff like the hotspot app ([#1383](https://github.com/YunoHost/yunohost/pull/1383)) + + Thanks to all contributors <3 ! (ljf, tituspijean) + + -- Alexandre Aubin Sat, 27 Nov 2021 00:53:16 +0100 + yunohost (4.3.3) stable; urgency=low - [fix] log: fix dump_script_log_extract_for_debugging displaying wrong log snippet during failed upgrade ([#1376](https://github.com/YunoHost/yunohost/pull/1376)) From 5881938c69b2eb2cd1a7dcf2d34aee77e6190556 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Sat, 27 Nov 2021 16:33:29 +0100 Subject: [PATCH 167/619] Force permission on /etc/resolv.dnsmasq.conf to fix an issue on some setup with umask=027 --- data/hooks/conf_regen/43-dnsmasq | 3 +++ 1 file changed, 3 insertions(+) diff --git a/data/hooks/conf_regen/43-dnsmasq b/data/hooks/conf_regen/43-dnsmasq index 8b5691dc6..7acc16e4b 100755 --- a/data/hooks/conf_regen/43-dnsmasq +++ b/data/hooks/conf_regen/43-dnsmasq @@ -61,6 +61,9 @@ do_pre_regen() { do_post_regen() { regen_conf_files=$1 + # Force permission (to cover some edge cases where root's umask is like 027 and then dnsmasq cant read this file) + chown 644 /etc/resolv.dnsmasq.conf + # Fuck it, those domain/search entries from dhclient are usually annoying # lying shit from the ISP trying to MiTM if grep -q -E "^ *(domain|search)" /run/resolvconf/resolv.conf; then From 31dfb19a02b431ebf538099d3c19e66753ee5a65 Mon Sep 17 00:00:00 2001 From: ljf Date: Sat, 27 Nov 2021 19:29:20 +0100 Subject: [PATCH 168/619] [fix] Try to fix the return line bug in dnsmasq conf --- data/hooks/conf_regen/43-dnsmasq | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/hooks/conf_regen/43-dnsmasq b/data/hooks/conf_regen/43-dnsmasq index 8b5691dc6..a2aa4520b 100755 --- a/data/hooks/conf_regen/43-dnsmasq +++ b/data/hooks/conf_regen/43-dnsmasq @@ -25,7 +25,7 @@ do_pre_regen() { ynh_validate_ip4 "$ipv4" || ipv4='127.0.0.1' ipv6=$(curl -s -6 https://ip6.yunohost.org 2>/dev/null || true) ynh_validate_ip6 "$ipv6" || ipv6='' - interfaces="$(ls -m /sys/class/net | sed s/,//g)" + interfaces="$(ip -j addr show | jq -r '[.[].ifname]|join(" ")')" wireless_interfaces="lo" for dev in $(ls /sys/class/net); do if [ -d "/sys/class/net/$dev/wireless" ]; then From b3df36dd168d52bfd81d4bc785bd42b074950920 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Sat, 27 Nov 2021 20:27:29 +0100 Subject: [PATCH 169/619] =?UTF-8?q?Typo=20=C3=A9=5F=C3=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- data/hooks/conf_regen/37-mdns | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/hooks/conf_regen/37-mdns b/data/hooks/conf_regen/37-mdns index 95c7a522b..bd11001e7 100755 --- a/data/hooks/conf_regen/37-mdns +++ b/data/hooks/conf_regen/37-mdns @@ -15,7 +15,7 @@ _generate_config() { [[ "$domain" =~ ^[^.]+\.local$ ]] || continue echo " - $domain" done - if [[ -e /etc/yunohot/mdns.aliases ]] + if [[ -e /etc/yunohost/mdns.aliases ]] then for localalias in $(cat /etc/yunohost/mdns.aliases | grep -v "^ *$") do From e3f33d6c203983820f4c9cd748cf5d63cede6af3 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Sat, 27 Nov 2021 21:17:06 +0100 Subject: [PATCH 170/619] Update changelog for 4.3.4.1 --- debian/changelog | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/debian/changelog b/debian/changelog index fbf9bcefd..f53b259b6 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,13 @@ +yunohost (4.3.4.1) stable; urgency=low + + - [fix] regenconf: Force permission on /etc/resolv.dnsmasq.conf to fix an issue on some setup with umask=027 (5881938c) + - [fix] regenconf: Typo in custom mdns alias regen conf (b3df36dd) + - [fix] regenconf: Try to fix the return line bug in dnsmasq conf ([#1385](https://github.com/YunoHost/yunohost/pull/1385)) + + Thanks to all contributors <3 ! (ljf) + + -- Alexandre Aubin Sat, 27 Nov 2021 21:15:29 +0100 + yunohost (4.3.4) stable; urgency=low - [fix] apps: Allow tilde in username/organization for repo URLs ([#1382](https://github.com/YunoHost/yunohost/pull/1382)) From 6854f23cca74fad1b131f5bdec7d92c7cc62aec4 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Sun, 28 Nov 2021 02:51:58 +0100 Subject: [PATCH 171/619] [fix] yunomdns: Ignore ipv4 link-local addresses --- bin/yunomdns | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/yunomdns b/bin/yunomdns index 0aee28195..11bed3215 100755 --- a/bin/yunomdns +++ b/bin/yunomdns @@ -21,7 +21,7 @@ def get_network_local_interfaces() -> Dict[str, Dict[str, List[str]]]: interfaces = { adapter.name: { - "ipv4": [ip.ip for ip in adapter.ips if ip.is_IPv4 and ip_address(ip.ip).is_private], + "ipv4": [ip.ip for ip in adapter.ips if ip.is_IPv4 and ip_address(ip.ip).is_private and not ip_address(ip.ip).is_link_local], "ipv6": [ip.ip[0] for ip in adapter.ips if ip.is_IPv6 and ip_address(ip.ip[0]).is_private and not ip_address(ip.ip[0]).is_link_local], } for adapter in ifaddr.get_adapters() From f43e567bf0930373e822d814ad21df3ec8b91bae Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Sun, 28 Nov 2021 16:12:24 +0100 Subject: [PATCH 172/619] apps: Remove the 'HOME' var from hook_exec env, because it's often defined in CLI but not in API because yunohost-api runs in a systemd service --- src/hook.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/hook.py b/src/hook.py index 98b624f12..fbf336ed7 100644 --- a/src/hook.py +++ b/src/hook.py @@ -439,6 +439,12 @@ def _hook_exec_bash(path, args, chdir, env, user, return_format, loggers): _env = os.environ.copy() _env.update(env) + # Remove the 'HOME' var which is causing some inconsistencies between + # cli and webapi (HOME ain't defined in yunohost-api because ran from systemd) + # Apps that need the HOME var should define it in the app scripts + if "HOME" in _env: + del _env["HOME"] + returncode = call_async_output(command, loggers, shell=False, cwd=chdir, env=_env) raw_content = None From bfa5092c103de871fb745d5a81a529c0e55e3d24 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Sun, 28 Nov 2021 13:39:16 +0100 Subject: [PATCH 173/619] ci: Yolorework i18n tests, add a maintenance/ folder --- .gitlab/ci/test.gitlab-ci.yml | 19 -- .gitlab/ci/translation.gitlab-ci.yml | 14 +- locales/ca.json | 34 --- locales/de.json | 38 +--- locales/en.json | 95 +++++---- locales/eo.json | 5 - locales/es.json | 21 +- locales/eu.json | 36 +--- locales/fa.json | 37 ---- locales/fr.json | 42 +--- locales/gl.json | 42 +--- locales/hi.json | 1 - locales/id.json | 2 +- locales/it.json | 38 +--- locales/nb_NO.json | 1 - locales/nl.json | 1 - locales/oc.json | 16 +- locales/pt.json | 3 +- locales/ru.json | 3 +- locales/sl.json | 2 +- locales/uk.json | 42 +--- locales/zh_Hans.json | 42 +--- maintenance/autofix_locale_format.py | 169 +++++++++++++++ maintenance/make_changelog.sh | 36 ++++ .../missing_i18n_keys.py | 95 +++++---- tests/add_missing_keys.py | 193 ------------------ tests/autofix_locale_format.py | 53 ----- tests/reformat_locales.py | 60 ------ tests/remove_stale_translated_strings.py | 25 --- tests/test_translation_format_consistency.py | 52 ----- 30 files changed, 334 insertions(+), 883 deletions(-) create mode 100644 maintenance/autofix_locale_format.py create mode 100644 maintenance/make_changelog.sh rename tests/test_i18n_keys.py => maintenance/missing_i18n_keys.py (71%) delete mode 100644 tests/add_missing_keys.py delete mode 100644 tests/autofix_locale_format.py delete mode 100644 tests/reformat_locales.py delete mode 100644 tests/remove_stale_translated_strings.py delete mode 100644 tests/test_translation_format_consistency.py diff --git a/.gitlab/ci/test.gitlab-ci.yml b/.gitlab/ci/test.gitlab-ci.yml index 1165e4826..27df0658d 100644 --- a/.gitlab/ci/test.gitlab-ci.yml +++ b/.gitlab/ci/test.gitlab-ci.yml @@ -23,7 +23,6 @@ artifacts: true - job: upgrade - ######################################## # TESTS ######################################## @@ -51,24 +50,6 @@ full-tests: reports: junit: report.xml -test-i18n-keys: - extends: .test-stage - script: - - python3 -m pytest tests/test_i18n_keys.py - only: - changes: - - locales/en.json - - src/*.py - - src/diagnosers/*.py - -test-translation-format-consistency: - extends: .test-stage - script: - - python3 -m pytest tests/test_translation_format_consistency.py - only: - changes: - - locales/* - test-actionmap: extends: .test-stage script: diff --git a/.gitlab/ci/translation.gitlab-ci.yml b/.gitlab/ci/translation.gitlab-ci.yml index 41e8c82d2..159dc7aa0 100644 --- a/.gitlab/ci/translation.gitlab-ci.yml +++ b/.gitlab/ci/translation.gitlab-ci.yml @@ -1,6 +1,14 @@ ######################################## # TRANSLATION ######################################## +test-i18n-keys: + script: + - python3 maintenance/missing_i18n_keys --check + only: + changes: + - locales/en.json + - src/*.py + - src/diagnosers/*.py autofix-translated-strings: stage: translation @@ -12,12 +20,10 @@ autofix-translated-strings: - git config --global user.name "$GITHUB_USER" - git remote set-url origin https://$GITHUB_TOKEN:x-oauth-basic@github.com/YunoHost/yunohost.git script: - - cd tests # Maybe move this script location to another folder? # create a local branch that will overwrite distant one - git checkout -b "ci-autofix-translated-strings-${CI_COMMIT_REF_NAME}" --no-track - - python3 remove_stale_translated_strings.py - - python3 autofix_locale_format.py - - python3 reformat_locales.py + - python3 maintenance/missing_i18n_keys --fix + - python3 maintenanceautofix_locale_format.py - '[ $(git diff -w | wc -l) != 0 ] || exit 0' # stop if there is nothing to commit - git commit -am "[CI] Reformat / remove stale translated strings" || true - git push -f origin "HEAD":"ci-remove-stale-translated-strings-${CI_COMMIT_REF_NAME}" diff --git a/locales/ca.json b/locales/ca.json index 00e3f65ad..4b1c51edd 100644 --- a/locales/ca.json +++ b/locales/ca.json @@ -17,7 +17,6 @@ "app_install_files_invalid": "Aquests fitxers no es poden instal·lar", "app_make_default_location_already_used": "No es pot fer l'aplicació '{app}' l'aplicació per defecte en el domini «{domain}», ja que ja és utilitzat per '{other_app}'", "app_location_unavailable": "Aquesta URL no està disponible o entra en conflicte amb aplicacions ja instal·lades:\n{apps}", - "app_manifest_invalid": "Hi ha algun error amb el manifest de l'aplicació: {error}", "app_not_correctly_installed": "{app} sembla estar mal instal·lada", "app_not_installed": "No s'ha trobat {app} en la llista d'aplicacions instal·lades: {all_apps}", "app_not_properly_removed": "{app} no s'ha pogut suprimir correctament", @@ -132,7 +131,6 @@ "domains_available": "Dominis disponibles:", "done": "Fet", "downloading": "Descarregant...", - "dyndns_could_not_check_provide": "No s'ha pogut verificar si {provider} pot oferir {domain}.", "dyndns_could_not_check_available": "No s'ha pogut verificar la disponibilitat de {domain} a {provider}.", "dyndns_ip_update_failed": "No s'ha pogut actualitzar l'adreça IP al DynDNS", "dyndns_ip_updated": "S'ha actualitzat l'adreça IP al DynDNS", @@ -297,7 +295,6 @@ "service_disabled": "El servei «{service}» ja no començarà al arrancar el sistema.", "service_enable_failed": "No s'ha pogut fer que el servei «{service}» comenci automàticament a l'arrancada.\n\nRegistres recents: {logs}", "service_enabled": "El servei «{service}» començarà automàticament durant l'arrancada del sistema.", - "service_regen_conf_is_deprecated": "«yunohost service regen-conf» està desfasat! Utilitzeu «yunohost tools regen-conf» en el seu lloc.", "service_remove_failed": "No s'ha pogut eliminar el servei «{service}»", "service_removed": "S'ha eliminat el servei «{service}»", "service_reload_failed": "No s'ha pogut tornar a carregar el servei «{service}»\n\nRegistres recents: {logs}", @@ -316,8 +313,6 @@ "system_upgraded": "S'ha actualitzat el sistema", "system_username_exists": "El nom d'usuari ja existeix en la llista d'usuaris de sistema", "this_action_broke_dpkg": "Aquesta acció a trencat dpkg/APT (els gestors de paquets del sistema)... Podeu intentar resoldre el problema connectant-vos amb SSH i executant «sudo apt install --fix-broken» i/o «sudo dpkg --configure -a».", - "tools_upgrade_at_least_one": "Especifiqueu «apps», o «system»", - "tools_upgrade_cant_both": "No es poden actualitzar tant el sistema com les aplicacions al mateix temps", "tools_upgrade_cant_hold_critical_packages": "No es poden mantenir els paquets crítics...", "tools_upgrade_cant_unhold_critical_packages": "No es poden deixar de mantenir els paquets crítics...", "tools_upgrade_regular_packages": "Actualitzant els paquets «normals» (no relacionats amb YunoHost)...", @@ -547,31 +542,7 @@ "restore_already_installed_apps": "No s'han pogut restaurar les següents aplicacions perquè ja estan instal·lades: {apps}", "app_packaging_format_not_supported": "No es pot instal·lar aquesta aplicació ja que el format del paquet no és compatible amb la versió de YunoHost del sistema. Hauríeu de considerar actualitzar el sistema.", "diagnosis_dns_try_dyndns_update_force": "La configuració DNS d'aquest domini hauria de ser gestionada automàticament per YunoHost. Si aquest no és el cas, podeu intentar forçar-ne l'actualització utilitzant yunohost dyndns update --force.", - "migration_0015_cleaning_up": "Netejant la memòria cau i els paquets que ja no són necessaris...", - "migration_0015_specific_upgrade": "Començant l'actualització dels paquets del sistema que s'han d'actualitzar de forma independent...", - "migration_0015_modified_files": "Tingueu en compte que s'han trobat els següents fitxers que es van modificar manualment i podria ser que es sobreescriguin durant l'actualització: {manually_modified_files}", - "migration_0015_problematic_apps_warning": "Tingueu en compte que s'han trobat les següents aplicacions que podrien ser problemàtiques. Sembla que aquestes aplicacions no s'han instal·lat des del catàleg d'aplicacions de YunoHost, o no estan marcades com «funcionant». En conseqüència, no es pot garantir que segueixin funcionant després de l'actualització: {problematic_apps}", - "migration_0015_general_warning": "Tingueu en compte que aquesta migració és una operació delicada. L'equip de YunoHost ha fet tots els possibles per revisar i testejar, però tot i això podria ser que la migració trenqui alguna part del sistema o algunes aplicacions.\n\nPer tant, està recomana:\n - Fer una còpia de seguretat de totes les dades o aplicacions crítiques. Més informació a https://yunohost.org/backup;\n - Ser pacient un cop comenci la migració: en funció de la connexió Internet i del maquinari, podria estar unes hores per actualitzar-ho tot.", - "migration_0015_system_not_fully_up_to_date": "El sistema no està completament al dia. Heu de fer una actualització normal abans de fer la migració a Buster.", - "migration_0015_not_enough_free_space": "Hi ha poc espai lliure a /var/! HI hauria d'haver un mínim de 1GB lliure per poder fer aquesta migració.", - "migration_0015_not_stretch": "La distribució actual de Debian no és Stretch!", - "migration_0015_yunohost_upgrade": "Començant l'actualització del nucli de YunoHost...", - "migration_0015_still_on_stretch_after_main_upgrade": "Alguna cosa ha anat malament durant la actualització principal, sembla que el sistema encara està en Debian Stretch", - "migration_0015_main_upgrade": "Començant l'actualització principal...", - "migration_0015_patching_sources_list": "Apedaçament de source.lists...", - "migration_0015_start": "Començant la migració a Buster", - "migration_description_0015_migrate_to_buster": "Actualitza els sistema a Debian Buster i YunoHost 4.x", "regenconf_need_to_explicitly_specify_ssh": "La configuració ssh ha estat modificada manualment, però heu d'especificar explícitament la categoria «ssh» amb --force per fer realment els canvis.", - "migration_0015_weak_certs": "S'han trobat els següents certificats que encara utilitzen algoritmes de signatura febles i s'han d'actualitzar per a ser compatibles amb la propera versió de nginx: {certs}", - "service_description_php7.4-fpm": "Executa aplicacions escrites en PHP amb NGINX", - "migration_0018_failed_to_reset_legacy_rules": "No s'ha pogut restaurar les regles legacy iptables: {error}", - "migration_0018_failed_to_migrate_iptables_rules": "No s'ha pogut migrar les regles legacy iptables a nftables: {error}", - "migration_0017_not_enough_space": "Feu suficient espai disponible en {path} per a realitzar la migració.", - "migration_0017_postgresql_11_not_installed": "PostgreSQL 9.6 està instal·lat, però postgreSQL 11 no? Potser que hagi passat alguna cosa rara en aquest sistema :(...", - "migration_0017_postgresql_96_not_installed": "PostgreSQL no està instal·lat en aquest sistema. No s'ha de realitzar cap operació.", - "migration_description_0018_xtable_to_nftable": "Migrar les regles del trànsit de xarxa al nou sistema nftable", - "migration_description_0017_postgresql_9p6_to_11": "Migrar les bases de dades de PosrgreSQL 9.6 a 11", - "migration_description_0016_php70_to_php73_pools": "Migrar els fitxers de configuració «pool» php7.0-fpm a php7.3", "global_settings_setting_backup_compress_tar_archives": "Comprimir els arxius (.tar.gz) en lloc d'arxius no comprimits (.tar) al crear noves còpies de seguretat. N.B.: activar aquesta opció permet fer arxius de còpia de seguretat més lleugers, però el procés inicial de còpia de seguretat serà significativament més llarg i més exigent a nivell de CPU.", "global_settings_setting_smtp_relay_host": "L'amfitrió de tramesa SMTP que s'ha d'utilitzar per enviar correus electrònics en lloc d'aquesta instància de YunoHost. És útil si esteu en una de les següents situacions: el port 25 està bloquejat per el vostre proveïdor d'accés a internet o proveïdor de servidor privat virtual, si teniu una IP residencial llistada a DUHL, si no podeu configurar el DNS invers o si el servidor no està directament exposat a internet i voleu utilitzar-ne un altre per enviar correus electrònics.", "unknown_main_domain_path": "Domini o ruta desconeguda per a «{app}». Heu d'especificar un domini i una ruta per a poder especificar una URL per al permís.", @@ -582,15 +553,10 @@ "permission_protected": "El permís {permission} està protegit. No podeu afegir o eliminar el grup visitants a o d'aquest permís.", "pattern_email_forward": "Ha de ser una adreça de correu vàlida, s'accepta el símbol «+» (per exemple, algu+etiqueta@exemple.cat)", "invalid_number": "Ha de ser una xifra", - "migration_0019_slapd_config_will_be_overwritten": "Sembla que heu modificat manualment la configuració sldap. Per a aquesta migració crítica, YunoHist necessita forçar l'actualització de la configuració sldap. Es crearà una còpia de seguretat dels fitxers originals a {conf_backup_folder}.", - "migration_0019_add_new_attributes_in_ldap": "Afegir nous atributs per als permisos en la base de dades LDAP", - "migration_description_0019_extend_permissions_features": "Amplia/refés el sistema de gestió dels permisos de l'aplicació", - "migrating_legacy_permission_settings": "Migració dels paràmetres de permisos antics...", "invalid_regex": "Regex no vàlid: «{regex}»", "global_settings_setting_smtp_relay_password": "Tramesa de la contrasenya d'amfitrió SMTP", "global_settings_setting_smtp_relay_user": "Tramesa de compte d'usuari SMTP", "global_settings_setting_smtp_relay_port": "Port de tramesa SMTP", - "domain_name_unknown": "Domini «{domain}» desconegut", "diagnosis_processes_killed_by_oom_reaper": "El sistema ha matat alguns processos recentment perquè s'ha quedat sense memòria. Això acostuma a ser un símptoma de falta de memòria en el sistema o d'un procés que consumeix massa memòria. Llista dels processos que s'han matat:\n{kills_summary}", "diagnosis_package_installed_from_sury_details": "Alguns paquets s'han instal·lat per equivocació des d'un repositori de tercers anomenat Sury. L'equip de YunoHost a millorat l'estratègia per a gestionar aquests paquets, però s'espera que algunes configuracions que han instal·lat aplicacions PHP7.3 a Stretch puguin tenir algunes inconsistències. Per a resoldre aquesta situació, hauríeu d'intentar executar la següent ordre: {cmd_to_fix}", "diagnosis_package_installed_from_sury": "Alguns paquets del sistema s'han de tornar a versions anteriors", diff --git a/locales/de.json b/locales/de.json index 5dd8c059d..260ba3214 100644 --- a/locales/de.json +++ b/locales/de.json @@ -10,7 +10,6 @@ "app_extraction_failed": "Installationsdateien konnten nicht entpackt werden", "app_id_invalid": "Falsche App-ID", "app_install_files_invalid": "Diese Dateien können nicht installiert werden", - "app_manifest_invalid": "Mit dem App-Manifest stimmt etwas nicht: {error}", "app_not_installed": "{app} konnte nicht in der Liste installierter Apps gefunden werden: {all_apps}", "app_removed": "{app} wurde entfernt", "app_sources_fetch_failed": "Quelldateien konnten nicht abgerufen werden, ist die URL korrekt?", @@ -185,7 +184,6 @@ "experimental_feature": "Warnung: Der Maintainer hat diese Funktion als experimentell gekennzeichnet. Sie ist nicht stabil. Sie sollten sie nur verwenden, wenn Sie wissen, was Sie tun.", "dyndns_domain_not_provided": "Der DynDNS-Anbieter {provider} kann die Domäne(n) {domain} nicht bereitstellen.", "dyndns_could_not_check_available": "Konnte nicht überprüfen, ob {domain} auf {provider} verfügbar ist.", - "dyndns_could_not_check_provide": "Konnte nicht überprüft, ob {provider} die Domain(s) {domain} bereitstellen kann.", "domain_dns_conf_is_just_a_recommendation": "Dieser Befehl zeigt dir die *empfohlene* Konfiguration. Er konfiguriert *nicht* das DNS für dich. Es liegt in deiner Verantwortung, die DNS-Zone bei deinem DNS-Registrar nach dieser Empfehlung zu konfigurieren.", "dpkg_lock_not_available": "Dieser Befehl kann momentan nicht ausgeführt werden, da anscheinend ein anderes Programm die Sperre von dpkg (dem Systempaket-Manager) verwendet", "confirm_app_install_thirdparty": "WARNUNG! Diese Applikation ist nicht Teil des YunoHost-Applikationskatalogs. Das Installieren von Drittanbieterapplikationen könnte die Sicherheit und Integrität Ihres Systems beeinträchtigen. Sie sollten wahrscheinlich NICHT fortfahren, es sei denn, Sie wissen, was Sie tun. Es wird KEIN SUPPORT angeboten, wenn die Applikation nicht funktionieren oder Ihr System beschädigen sollte... Wenn Sie das Risiko trotzdem eingehen möchten, tippen Sie '{answers}'", @@ -308,9 +306,6 @@ "backup_archive_cant_retrieve_info_json": "Die Informationen für das Archiv '{archive}' konnten nicht geladen werden... Die Datei info.json wurde nicht gefunden (oder ist kein gültiges json).", "app_packaging_format_not_supported": "Diese App kann nicht installiert werden da das Paketformat nicht von der YunoHost-Version unterstützt wird. Denken Sie darüber nach das System zu aktualisieren.", "certmanager_domain_not_diagnosed_yet": "Für die Domain {domain} gibt es noch keine Diagnose-Resultate. Bitte widerhole die Diagnose für die Kategorien 'DNS records' und 'Web' im Diagnose-Bereich um zu überprüfen ob die Domain für Let's Encrypt bereit ist. (Wenn du weißt was du tust, kannst du --no-checks benutzen, um diese Überprüfung zu überspringen.)", - "migration_0015_patching_sources_list": "sources.lists wird repariert...", - "migration_0015_start": "Start der Migration auf Buster", - "migration_description_0015_migrate_to_buster": "Auf Debian Buster und YunoHost 4.x upgraden", "mail_unavailable": "Diese E-Mail Adresse ist reserviert und wird dem/der ersten Benutzer:in automatisch zugewiesen", "diagnosis_services_conf_broken": "Die Konfiguration für den Dienst {service} ist fehlerhaft!", "diagnosis_services_running": "Dienst {service} läuft!", @@ -335,7 +330,6 @@ "diagnosis_http_timeout": "Wartezeit wurde beim Versuch, von außen eine Verbindung zum Server aufzubauen, überschritten. Er scheint nicht erreichbar zu sein.
1. Die häufigste Ursache für dieses Problem ist daß der Port 80 (und 433) nicht richtig zu Ihrem Server weitergeleitet werden.
2. Sie sollten auch sicherstellen, daß der Dienst nginx läuft.
3. In komplexeren Umgebungen: Stellen Sie sicher, daß keine Firewall oder Reverse-Proxy stört.", "service_reloaded_or_restarted": "Der Dienst '{service}' wurde erfolgreich neu geladen oder gestartet", "service_restarted": "Der Dienst '{service}' wurde neu gestartet", - "service_regen_conf_is_deprecated": "'yunohost service regen-conf' ist veraltet! Bitte verwenden Sie stattdessen 'yunohost tools regen-conf'.", "certmanager_warning_subdomain_dns_record": "Die Subdomäne \"{subdomain}\" löst nicht zur gleichen IP Adresse auf wie \"{domain}\". Einige Funktionen sind nicht verfügbar bis du dies behebst und die Zertifikate neu erzeugst.", "diagnosis_ports_ok": "Port {port} ist von außen erreichbar.", "diagnosis_ram_verylow": "Das System hat nur {available} ({available_percent}%) RAM zur Verfügung! (von insgesamt {total})", @@ -358,7 +352,6 @@ "diagnosis_swap_none": "Das System hat gar keinen Swap. Sie sollten sich überlegen mindestens {recommended} an Swap einzurichten, um Situationen zu verhindern, in welchen der RAM des Systems knapp wird.", "diagnosis_mail_ehlo_unreachable_details": "Konnte keine Verbindung zu Ihrem Server auf dem Port 25 herzustellen per IPv{ipversion}. Er scheint nicht erreichbar zu sein.
1. Das häufigste Problem ist, dass der Port 25 nicht richtig zu Ihrem Server weitergeleitet ist.
2. Sie sollten auch sicherstellen, dass der Postfix-Dienst läuft.
3. In komplexeren Umgebungen: Stellen Sie sicher, daß keine Firewall oder Reverse-Proxy stört.", "diagnosis_mail_ehlo_wrong": "Ein anderer SMTP-Server antwortet auf IPv{ipversion}. Ihr Server wird wahrscheinlich nicht in der Lage sein, E-Mails zu empfangen.", - "migration_description_0018_xtable_to_nftable": "Alte Netzwerkverkehrsregeln zum neuen nftable-System migrieren", "service_reload_failed": "Der Dienst '{service}' konnte nicht erneut geladen werden.\n\nKürzlich erstellte Logs des Dienstes: {logs}", "service_reloaded": "Der Dienst '{service}' wurde erneut geladen", "service_restart_failed": "Der Dienst '{service}' konnte nicht erneut gestartet werden.\n\nKürzlich erstellte Logs des Dienstes: {logs}", @@ -435,7 +428,6 @@ "diagnosis_http_nginx_conf_not_up_to_date_details": "Um dieses Problem zu beheben, geben Sie in der Kommandozeile yunohost tools regen-conf nginx --dry-run --with-diff ein. Dieses Tool zeigt ihnen den Unterschied an. Wenn Sie damit einverstanden sind, können Sie mit yunohost tools regen-conf nginx --force die Änderungen übernehmen.", "diagnosis_backports_in_sources_list": "Sie haben anscheinend apt (den Paketmanager) für das Backports-Repository konfiguriert. Wir raten strikte davon ab, Pakete aus dem Backports-Repository zu installieren. Diese würden wahrscheinlich zu Instabilitäten und Konflikten führen. Es sei denn, Sie wissen was Sie tun.", "diagnosis_basesystem_hardware_model": "Das Servermodell ist {model}", - "domain_name_unknown": "Domäne '{domain}' unbekannt", "group_user_not_in_group": "Benutzer:in {user} ist nicht in der Gruppe {group}", "group_user_already_in_group": "Benutzer:in {user} ist bereits in der Gruppe {group}", "group_cannot_edit_visitors": "Die Gruppe \"Besucher\" kann nicht manuell editiert werden. Sie ist eine Sondergruppe und repräsentiert anonyme Besucher", @@ -459,7 +451,6 @@ "log_available_on_yunopaste": "Das Protokoll ist nun via {url} verfügbar", "log_app_action_run": "Führe Aktion der Applikation '{}' aus", "invalid_regex": "Ungültige Regex:'{regex}'", - "migration_description_0016_php70_to_php73_pools": "Migrieren der php7.0-fpm-Konfigurationsdateien zu php7.3", "mailbox_disabled": "E-Mail für Benutzer:in {user} deaktiviert", "log_tools_reboot": "Server neustarten", "log_tools_shutdown": "Server ausschalten", @@ -483,28 +474,9 @@ "log_domain_remove": "Entfernen der Domäne '{}' aus der Systemkonfiguration", "log_domain_add": "Hinzufügen der Domäne '{}' zur Systemkonfiguration", "log_remove_on_failed_install": "Entfernen von '{}' nach einer fehlgeschlagenen Installation", - "migration_0015_still_on_stretch_after_main_upgrade": "Etwas ist schiefgelaufen während dem Haupt-Upgrade. Das System scheint immer noch auf Debian Stretch zu laufen", - "migration_0015_yunohost_upgrade": "Beginne YunoHost-Core-Upgrade...", - "migration_description_0019_extend_permissions_features": "Erweitern und überarbeiten des Applikationsberechtigungs-Managementsystems", - "migrating_legacy_permission_settings": "Migrieren der Legacy-Berechtigungseinstellungen...", - "migration_description_0017_postgresql_9p6_to_11": "Migrieren der Datenbanken von PostgreSQL 9.6 nach 11", - "migration_0015_main_upgrade": "Beginne Haupt-Upgrade...", - "migration_0015_not_stretch": "Die aktuelle Debian-Distribution ist nicht Stretch!", - "migration_0015_not_enough_free_space": "Der freie Speicher in /var/ ist sehr gering! Sie sollten minimal 1GB frei haben, um diese Migration durchzuführen.", "domain_remove_confirm_apps_removal": "Wenn Sie diese Domäne löschen, werden folgende Applikationen entfernt:\n{apps}\n\nSind Sie sicher? [{answers}]", - "migration_0015_cleaning_up": "Bereinigung des Cache und der Pakete, welche nicht mehr benötigt werden...", - "migration_0017_postgresql_96_not_installed": "PostgreSQL wurde auf ihrem System nicht installiert. Nichts zu tun.", - "migration_0015_system_not_fully_up_to_date": "Ihr System ist nicht vollständig auf dem neuesten Stand. Bitte führen Sie ein reguläres Upgrade durch, bevor Sie die Migration auf Buster durchführen.", - "migration_0015_modified_files": "Bitte beachten Sie, dass die folgenden Dateien als manuell bearbeitet erkannt wurden und beim nächsten Upgrade überschrieben werden könnten: {manually_modified_files}", - "migration_0015_general_warning": "Bitte beachten Sie, dass diese Migration eine heikle Angelegenheit darstellt. Das YunoHost-Team hat alles unternommen, um sie zu testen und zu überarbeiten. Dennoch ist es möglich, dass diese Migration Teile des Systems oder Applikationen beschädigen könnte.\n\nDeshalb ist folgendes zu empfehlen:\n…- Führen Sie ein Backup aller kritischen Daten und Applikationen durch. Mehr unter https://yunohost.org/backup;\n…- Seien Sie geduldig nachdem Sie die Migration gestartet haben: Abhängig von Ihrer Internetverbindung und Ihrer Hardware kann es einige Stunden dauern, bis das Upgrade fertig ist.", - "migration_0015_problematic_apps_warning": "Bitte beachten Sie, dass folgende möglicherweise problematischen Applikationen auf Ihrer Installation erkannt wurden. Es scheint, als ob sie nicht aus dem YunoHost-Applikationskatalog installiert oder nicht als 'working' gekennzeichnet worden sind. Folglich kann nicht garantiert werden, dass sie nach dem Upgrade immer noch funktionieren: {problematic_apps}", - "migration_0015_specific_upgrade": "Start des Upgrades der Systempakete, deren Upgrade separat durchgeführt werden muss...", - "migration_0015_weak_certs": "Die folgenden Zertifikate verwenden immer noch schwache Signierungsalgorithmen und müssen aktualisiert werden um mit der nächsten Version von nginx kompatibel zu sein: {certs}", "migrations_pending_cant_rerun": "Diese Migrationen sind immer noch anstehend und können deshalb nicht erneut durchgeführt werden: {ids}", - "migration_0019_add_new_attributes_in_ldap": "Hinzufügen neuer Attribute für die Berechtigungen in der LDAP-Datenbank", "migrations_not_pending_cant_skip": "Diese Migrationen sind nicht anstehend und können deshalb nicht übersprungen werden: {ids}", - "migration_0018_failed_to_reset_legacy_rules": "Zurücksetzen der veralteten iptables-Regeln fehlgeschlagen: {error}", - "migration_0019_slapd_config_will_be_overwritten": "Es schaut aus, als ob Sie die slapd-Konfigurationsdatei manuell bearbeitet haben. Für diese kritische Migration muss das Update der slapd-Konfiguration erzwungen werden. Von der Originaldatei wird ein Backup gemacht in {conf_backup_folder}.", "migrations_success_forward": "Migration {id} abgeschlossen", "migrations_cant_reach_migration_file": "Die Migrationsdateien konnten nicht aufgerufen werden im Verzeichnis '%s'", "migrations_dependencies_not_satisfied": "Führen Sie diese Migrationen aus: '{dependencies_id}', vor der Migration {id}.", @@ -516,9 +488,6 @@ "migrations_must_provide_explicit_targets": "Sie müssen konkrete Ziele angeben, wenn Sie '--skip' oder '--force-rerun' verwenden", "migrations_need_to_accept_disclaimer": "Um die Migration {id} durchzuführen, müssen Sie den Disclaimer akzeptieren.\n---\n{disclaimer}\n---\n Wenn Sie bestätigen, dass Sie die Migration durchführen wollen, wiederholen Sie bitte den Befehl mit der Option '--accept-disclaimer'.", "migrations_no_migrations_to_run": "Keine Migrationen durchzuführen", - "migration_0017_postgresql_11_not_installed": "PostgreSQL 9.6 ist installiert aber nicht postgreSQL 11? Etwas komisches ist Ihrem System zugestossen :(...", - "migration_0017_not_enough_space": "Stellen Siea ausreichend Speicherplatz im Verzeichnis {path} zur Verfügung um die Migration durchzuführen.", - "migration_0018_failed_to_migrate_iptables_rules": "Migration der veralteten iptables-Regeln zu nftables fehlgeschlagen: {error}", "migrations_exclusive_options": "'--auto', '--skip' und '--force-rerun' sind Optionen, die sich gegenseitig ausschliessen.", "migrations_no_such_migration": "Es existiert keine Migration genannt '{id}'", "migrations_running_forward": "Durchführen der Migrationen {id}...", @@ -572,7 +541,6 @@ "regex_with_only_domain": "Du kannst regex nicht als Domain verwenden, sondern nur als Pfad", "root_password_desynchronized": "Das Admin-Passwort wurde verändert, aber das Root-Passwort ist immer noch das alte!", "regenconf_need_to_explicitly_specify_ssh": "Die SSH-Konfiguration wurde manuell modifiziert, aber Sie müssen explizit die Kategorie 'SSH' mit --force spezifizieren, um die Änderungen tatsächlich anzuwenden.", - "migration_update_LDAP_schema": "Aktualisiere das LDAP-Schema...", "log_backup_create": "Erstelle ein Backup-Archiv", "diagnosis_sshd_config_inconsistent": "Es sieht aus, als ob der SSH-Port manuell geändert wurde in /etc/ssh/ssh_config. Seit YunoHost 4.2 ist eine neue globale Einstellung 'security.ssh.port' verfügbar um zu verhindern, dass die Konfiguration manuell verändert wird.", "diagnosis_sshd_config_insecure": "Die SSH-Konfiguration wurde scheinbar manuell geändert und ist unsicher, weil sie keine 'AllowGroups'- oder 'AllowUsers' -Direktiven für die Beschränkung des Zugriffs durch autorisierte Benutzer enthält.", @@ -582,7 +550,6 @@ "migration_ldap_rollback_success": "System-Rollback erfolgreich.", "migration_ldap_migration_failed_trying_to_rollback": "Migrieren war nicht möglich... Versuch, ein Rollback des Systems durchzuführen.", "migration_ldap_backup_before_migration": "Vor der eigentlichen Migration ein Backup der LDAP-Datenbank und der Applikations-Einstellungen erstellen.", - "migration_description_0020_ssh_sftp_permissions": "Unterstützung für SSH- und SFTP-Berechtigungen hinzufügen", "global_settings_setting_ssowat_panel_overlay_enabled": "Das SSOwat-Overlay-Panel aktivieren", "global_settings_setting_security_ssh_port": "SSH-Port", "diagnosis_sshd_config_inconsistent_details": "Bitte führen Sie yunohost settings set security.ssh.port -v YOUR_SSH_PORT aus, um den SSH-Port festzulegen, und prüfen Sie yunohost tools regen-conf ssh --dry-run --with-diff und yunohost tools regen-conf ssh --force um Ihre conf auf die YunoHost-Empfehlung zurückzusetzen.", @@ -603,7 +570,6 @@ "service_description_yunohost-firewall": "Verwaltet offene und geschlossene Ports zur Verbindung mit Diensten", "service_description_yunohost-api": "Verwaltet die Interaktionen zwischen der Weboberfläche von YunoHost und dem System", "service_description_ssh": "Ermöglicht die Verbindung zu Ihrem Server über ein Terminal (SSH-Protokoll)", - "service_description_php7.3-fpm": "Führt in PHP geschriebene Apps mit NGINX aus", "server_reboot_confirm": "Der Server wird sofort heruntergefahren, sind Sie sicher? [{answers}]", "server_reboot": "Der Server wird neu gestartet", "server_shutdown_confirm": "Der Server wird sofort heruntergefahren, sind Sie sicher? [{answers}]", @@ -615,8 +581,6 @@ "tools_upgrade_regular_packages": "Momentan werden Upgrades für das System (YunoHost-unabhängige) Pakete durchgeführt...", "tools_upgrade_cant_unhold_critical_packages": "Konnte für die kritischen Pakete das Flag 'hold' nicht aufheben...", "tools_upgrade_cant_hold_critical_packages": "Konnte für die kritischen Pakete das Flag 'hold' nicht setzen...", - "tools_upgrade_cant_both": "Kann das Upgrade für das System und die Applikation nicht gleichzeitig durchführen", - "tools_upgrade_at_least_one": "Bitte geben Sie '--apps' oder '--system' an", "this_action_broke_dpkg": "Diese Aktion hat unkonfigurierte Pakete verursacht, welche durch dpkg/apt (die Paketverwaltungen dieses Systems) zurückgelassen wurden... Sie können versuchen dieses Problem zu lösen, indem Sie 'sudo apt install --fix-broken' und/oder 'sudo dpkg --configure -a' ausführen.", "update_apt_cache_failed": "Kann den Cache von APT (Debians Paketmanager) nicht aktualisieren. Hier ist ein Auszug aus den sources.list-Zeilen, die helfen könnten, das Problem zu identifizieren:\n{sourceslist}", "tools_upgrade_special_packages_completed": "YunoHost-Paketupdate beendet.\nDrücke [Enter], um zurück zur Kommandoziele zu kommen", @@ -642,4 +606,4 @@ "config_validate_time": "Sollte eine zulässige Zeit wie HH:MM sein", "config_validate_url": "Sollte eine zulässige web URL sein", "config_version_not_supported": "Konfigurationspanel Versionen '{version}' sind nicht unterstützt." -} +} \ No newline at end of file diff --git a/locales/en.json b/locales/en.json index 20667d076..f720af34e 100644 --- a/locales/en.json +++ b/locales/en.json @@ -213,11 +213,11 @@ "diagnosis_http_could_not_diagnose_details": "Error: {error}", "diagnosis_http_hairpinning_issue": "Your local network does not seem to have hairpinning enabled.", "diagnosis_http_hairpinning_issue_details": "This is probably because of your ISP box / router. As a result, people from outside your local network will be able to access your server as expected, but not people from inside the local network (like you, probably?) when using the domain name or global IP. You may be able to improve the situation by having a look at https://yunohost.org/dns_local_network", - "diagnosis_http_special_use_tld": "Domain {domain} is based on a special-use top-level domain (TLD) such as .local or .test and is therefore not expected to be exposed outside the local network.", "diagnosis_http_nginx_conf_not_up_to_date": "This domain's nginx configuration appears to have been modified manually, and prevents YunoHost from diagnosing if it's reachable on HTTP.", "diagnosis_http_nginx_conf_not_up_to_date_details": "To fix the situation, inspect the difference with the command line using yunohost tools regen-conf nginx --dry-run --with-diff and if you're ok, apply the changes with yunohost tools regen-conf nginx --force.", "diagnosis_http_ok": "Domain {domain} is reachable through HTTP from outside the local network.", "diagnosis_http_partially_unreachable": "Domain {domain} appears unreachable through HTTP from outside the local network in IPv{failed}, though it works in IPv{passed}.", + "diagnosis_http_special_use_tld": "Domain {domain} is based on a special-use top-level domain (TLD) such as .local or .test and is therefore not expected to be exposed outside the local network.", "diagnosis_http_timeout": "Timed-out while trying to contact your server from outside. It appears to be unreachable.
1. The most common cause for this issue is that port 80 (and 443) are not correctly forwarded to your server.
2. You should also make sure that the service nginx is running
3. On more complex setups: make sure that no firewall or reverse-proxy is interfering.", "diagnosis_http_unreachable": "Domain {domain} appears unreachable through HTTP from outside the local network.", "diagnosis_ignored_issues": "(+ {nb_ignored} ignored issue(s))", @@ -302,47 +302,47 @@ "domain_cannot_remove_main": "You cannot remove '{domain}' since it's the main domain, you first need to set another domain as the main domain using 'yunohost domain main-domain -n '; here is the list of candidate domains: {other_domains}", "domain_cannot_remove_main_add_new_one": "You cannot remove '{domain}' since it's the main domain and your only domain, you need to first add another domain using 'yunohost domain add ', then set is as the main domain using 'yunohost domain main-domain -n ' and then you can remove the domain '{domain}' using 'yunohost domain remove {domain}'.'", "domain_cert_gen_failed": "Could not generate certificate", + "domain_config_api_protocol": "API protocol", + "domain_config_auth_application_key": "Application key", + "domain_config_auth_application_secret": "Application secret key", + "domain_config_auth_consumer_key": "Consumer key", + "domain_config_auth_entrypoint": "API entry point", + "domain_config_auth_key": "Authentication key", + "domain_config_auth_secret": "Authentication secret", + "domain_config_auth_token": "Authentication token", + "domain_config_features_disclaimer": "So far, enabling/disabling mail or XMPP features only impact the recommended and automatic DNS configuration, not system configurations!", + "domain_config_mail_in": "Incoming emails", + "domain_config_mail_out": "Outgoing emails", + "domain_config_xmpp": "Instant messaging (XMPP)", "domain_created": "Domain created", "domain_creation_failed": "Unable to create domain {domain}: {error}", "domain_deleted": "Domain deleted", "domain_deletion_failed": "Unable to delete domain {domain}: {error}", "domain_dns_conf_is_just_a_recommendation": "This command shows you the *recommended* configuration. It does not actually set up the DNS configuration for you. It is your responsability to configure your DNS zone in your registrar according to this recommendation.", "domain_dns_conf_special_use_tld": "This domain is based on a special-use top-level domain (TLD) such as .local or .test and is therefore not expected to have actual DNS records.", + "domain_dns_push_already_up_to_date": "Records already up to date, nothing to do.", + "domain_dns_push_failed": "Updating the DNS records failed miserably.", + "domain_dns_push_failed_to_authenticate": "Failed to authenticate on registrar's API for domain '{domain}'. Most probably the credentials are incorrect? (Error: {error})", + "domain_dns_push_failed_to_list": "Failed to list current records using the registrar's API: {error}", + "domain_dns_push_managed_in_parent_domain": "The automatic DNS configuration feature is managed in the parent domain {parent_domain}.", + "domain_dns_push_not_applicable": "The automatic DNS configuration feature is not applicable to domain {domain}. You should manually configure your DNS records following the documentation at https://yunohost.org/dns_config.", + "domain_dns_push_partial_failure": "DNS records partially updated: some warnings/errors were reported.", + "domain_dns_push_record_failed": "Failed to {action} record {type}/{name} : {error}", + "domain_dns_push_success": "DNS records updated!", + "domain_dns_pushing": "Pushing DNS records...", + "domain_dns_registrar_experimental": "So far, the interface with **{registrar}**'s API has not been properly tested and reviewed by the YunoHost community. Support is **very experimental** - be careful!", + "domain_dns_registrar_managed_in_parent_domain": "This domain is a subdomain of {parent_domain_link}. DNS registrar configuration should be managed in {parent_domain}'s configuration panel.", + "domain_dns_registrar_not_supported": "YunoHost could not automatically detect the registrar handling this domain. You should manually configure your DNS records following the documentation at https://yunohost.org/dns.", + "domain_dns_registrar_supported": "YunoHost automatically detected that this domain is handled by the registrar **{registrar}**. If you want, YunoHost will automatically configure this DNS zone, if you provide it with the appropriate API credentials. You can find documentation on how to obtain your API credentials on this page: https://yunohost.org/registar_api_{registrar}. (You can also manually configure your DNS records following the documentation at https://yunohost.org/dns )", + "domain_dns_registrar_yunohost": "This domain is a nohost.me / nohost.st / ynh.fr and its DNS configuration is therefore automatically handled by YunoHost without any further configuration. (see the 'yunohost dyndns update' command)", "domain_dyndns_already_subscribed": "You have already subscribed to a DynDNS domain", "domain_dyndns_root_unknown": "Unknown DynDNS root domain", "domain_exists": "The domain already exists", "domain_hostname_failed": "Unable to set new hostname. This might cause an issue later (it might be fine).", - "domain_unknown": "Domain '{domain}' unknown", + "domain_registrar_is_not_configured": "The registrar is not yet configured for domain {domain}.", "domain_remove_confirm_apps_removal": "Removing this domain will remove those applications:\n{apps}\n\nAre you sure you want to do that? [{answers}]", "domain_uninstall_app_first": "Those applications are still installed on your domain:\n{apps}\n\nPlease uninstall them using 'yunohost app remove the_app_id' or move them to another domain using 'yunohost app change-url the_app_id' before proceeding to domain removal", - "domain_registrar_is_not_configured": "The registrar is not yet configured for domain {domain}.", - "domain_dns_push_not_applicable": "The automatic DNS configuration feature is not applicable to domain {domain}. You should manually configure your DNS records following the documentation at https://yunohost.org/dns_config.", - "domain_dns_push_managed_in_parent_domain": "The automatic DNS configuration feature is managed in the parent domain {parent_domain}.", - "domain_dns_registrar_managed_in_parent_domain": "This domain is a subdomain of {parent_domain_link}. DNS registrar configuration should be managed in {parent_domain}'s configuration panel.", - "domain_dns_registrar_yunohost": "This domain is a nohost.me / nohost.st / ynh.fr and its DNS configuration is therefore automatically handled by YunoHost without any further configuration. (see the 'yunohost dyndns update' command)", - "domain_dns_registrar_not_supported": "YunoHost could not automatically detect the registrar handling this domain. You should manually configure your DNS records following the documentation at https://yunohost.org/dns.", - "domain_dns_registrar_supported": "YunoHost automatically detected that this domain is handled by the registrar **{registrar}**. If you want, YunoHost will automatically configure this DNS zone, if you provide it with the appropriate API credentials. You can find documentation on how to obtain your API credentials on this page: https://yunohost.org/registar_api_{registrar}. (You can also manually configure your DNS records following the documentation at https://yunohost.org/dns )", - "domain_dns_registrar_experimental": "So far, the interface with **{registrar}**'s API has not been properly tested and reviewed by the YunoHost community. Support is **very experimental** - be careful!", - "domain_dns_push_failed_to_authenticate": "Failed to authenticate on registrar's API for domain '{domain}'. Most probably the credentials are incorrect? (Error: {error})", - "domain_dns_push_failed_to_list": "Failed to list current records using the registrar's API: {error}", - "domain_dns_push_already_up_to_date": "Records already up to date, nothing to do.", - "domain_dns_pushing": "Pushing DNS records...", - "domain_dns_push_record_failed": "Failed to {action} record {type}/{name} : {error}", - "domain_dns_push_success": "DNS records updated!", - "domain_dns_push_failed": "Updating the DNS records failed miserably.", - "domain_dns_push_partial_failure": "DNS records partially updated: some warnings/errors were reported.", - "domain_config_features_disclaimer": "So far, enabling/disabling mail or XMPP features only impact the recommended and automatic DNS configuration, not system configurations!", - "domain_config_mail_in": "Incoming emails", - "domain_config_mail_out": "Outgoing emails", - "domain_config_xmpp": "Instant messaging (XMPP)", - "domain_config_auth_token": "Authentication token", - "domain_config_auth_key": "Authentication key", - "domain_config_auth_secret": "Authentication secret", - "domain_config_api_protocol": "API protocol", - "domain_config_auth_entrypoint": "API entry point", - "domain_config_auth_application_key": "Application key", - "domain_config_auth_application_secret": "Application secret key", - "domain_config_auth_consumer_key": "Consumer key", + "domain_unknown": "Domain '{domain}' unknown", "domains_available": "Available domains:", "done": "Done", "downloading": "Downloading...", @@ -419,15 +419,15 @@ "hook_name_unknown": "Unknown hook name '{name}'", "installation_complete": "Installation completed", "invalid_number": "Must be a number", - "invalid_number_min": "Must be greater than {min}", "invalid_number_max": "Must be lesser than {max}", + "invalid_number_min": "Must be greater than {min}", "invalid_password": "Invalid password", "invalid_regex": "Invalid regex:'{regex}'", "ip6tables_unavailable": "You cannot play with ip6tables here. You are either in a container or your kernel does not support it", "iptables_unavailable": "You cannot play with iptables here. You are either in a container or your kernel does not support it", + "ldap_attribute_already_exists": "LDAP attribute '{attribute}' already exists with value '{value}'", "ldap_server_down": "Unable to reach LDAP server", "ldap_server_is_down_restart_it": "The LDAP service is down, attempt to restart it...", - "ldap_attribute_already_exists": "LDAP attribute '{attribute}' already exists with value '{value}'", "log_app_action_run": "Run action of the '{}' app", "log_app_change_url": "Change the URL of the '{}' app", "log_app_config_set": "Apply config to the '{}' app", @@ -443,9 +443,9 @@ "log_does_exists": "There is no operation log with the name '{log}', use 'yunohost log list' to see all available operation logs", "log_domain_add": "Add '{}' domain into system configuration", "log_domain_config_set": "Update configuration for domain '{}'", + "log_domain_dns_push": "Push DNS records for domain '{}'", "log_domain_main_domain": "Make '{}' the main domain", "log_domain_remove": "Remove '{}' domain from system configuration", - "log_domain_dns_push": "Push DNS records for domain '{}'", "log_dyndns_subscribe": "Subscribe to a YunoHost subdomain '{}'", "log_dyndns_update": "Update the IP associated with your YunoHost subdomain '{}'", "log_help_to_get_failed_log": "The operation '{desc}' could not be completed. Please share the full log of this operation using the command 'yunohost log share {name}' to get help", @@ -484,22 +484,22 @@ "mailbox_used_space_dovecot_down": "The Dovecot mailbox service needs to be up if you want to fetch used mailbox space", "main_domain_change_failed": "Unable to change the main domain", "main_domain_changed": "The main domain has been changed", - "migration_0021_start" : "Starting migration to Bullseye", - "migration_0021_patching_sources_list": "Patching the sources.lists...", - "migration_0021_main_upgrade": "Starting main upgrade...", - "migration_0021_still_on_buster_after_main_upgrade": "Something went wrong during the main upgrade, the system appears to still be on Debian Buster", - "migration_0021_yunohost_upgrade" : "Starting YunoHost core upgrade...", - "migration_0021_not_buster" : "The current Debian distribution is not Buster!", - "migration_0021_not_enough_free_space" : "Free space is pretty low in /var/! You should have at least 1GB free to run this migration.", - "migration_0021_system_not_fully_up_to_date": "Your system is not fully up-to-date. Please perform a regular upgrade before running the migration to Bullseye.", - "migration_0021_general_warning": "Please note that this migration is a delicate operation. The YunoHost team did its best to review and test it, but the migration might still break parts of the system or its apps.\n\nTherefore, it is recommended to:\n - Perform a backup of any critical data or app. More info on https://yunohost.org/backup;\n - Be patient after launching the migration: Depending on your Internet connection and hardware, it might take up to a few hours for everything to upgrade.", - "migration_0021_problematic_apps_warning": "Please note that the following possibly problematic installed apps were detected. It looks like those were not installed from the YunoHost app catalog, or are not flagged as 'working'. Consequently, it cannot be guaranteed that they will still work after the upgrade: {problematic_apps}", - "migration_0021_modified_files": "Please note that the following files were found to be manually modified and might be overwritten following the upgrade: {manually_modified_files}", "migration_0021_cleaning_up": "Cleaning up cache and packages not useful anymore...", + "migration_0021_general_warning": "Please note that this migration is a delicate operation. The YunoHost team did its best to review and test it, but the migration might still break parts of the system or its apps.\n\nTherefore, it is recommended to:\n - Perform a backup of any critical data or app. More info on https://yunohost.org/backup;\n - Be patient after launching the migration: Depending on your Internet connection and hardware, it might take up to a few hours for everything to upgrade.", + "migration_0021_main_upgrade": "Starting main upgrade...", + "migration_0021_modified_files": "Please note that the following files were found to be manually modified and might be overwritten following the upgrade: {manually_modified_files}", + "migration_0021_not_buster": "The current Debian distribution is not Buster!", + "migration_0021_not_enough_free_space": "Free space is pretty low in /var/! You should have at least 1GB free to run this migration.", "migration_0021_patch_yunohost_conflicts": "Applying patch to workaround conflict issue...", + "migration_0021_patching_sources_list": "Patching the sources.lists...", + "migration_0021_problematic_apps_warning": "Please note that the following possibly problematic installed apps were detected. It looks like those were not installed from the YunoHost app catalog, or are not flagged as 'working'. Consequently, it cannot be guaranteed that they will still work after the upgrade: {problematic_apps}", + "migration_0021_start": "Starting migration to Bullseye", + "migration_0021_still_on_buster_after_main_upgrade": "Something went wrong during the main upgrade, the system appears to still be on Debian Buster", + "migration_0021_system_not_fully_up_to_date": "Your system is not fully up-to-date. Please perform a regular upgrade before running the migration to Bullseye.", + "migration_0021_yunohost_upgrade": "Starting YunoHost core upgrade...", + "migration_0023_not_enough_space": "Make sufficient space available in {path} to run the migration.", "migration_0023_postgresql_11_not_installed": "PostgreSQL was not installed on your system. Nothing to do.", "migration_0023_postgresql_13_not_installed": "PostgreSQL 11 is installed, but not postgresql 13!? Something weird might have happened on your system :(...", - "migration_0023_not_enough_space": "Make sufficient space available in {path} to run the migration.", "migration_description_0021_migrate_to_bullseye": "Upgrade the system to Debian Bullseye and YunoHost 11.x", "migration_description_0022_php73_to_php74_pools": "Migrate php7.3-fpm 'pool' conf files to php7.4", "migration_description_0023_postgresql_11_to_13": "Migrate databases from PostgreSQL 11 to 13", @@ -508,7 +508,6 @@ "migration_ldap_migration_failed_trying_to_rollback": "Could not migrate... trying to roll back the system.", "migration_ldap_rollback_success": "System rolled back.", "migrations_already_ran": "Those migrations are already done: {ids}", - "migrations_cant_reach_migration_file": "Could not access migrations files at the path '%s'", "migrations_dependencies_not_satisfied": "Run these migrations: '{dependencies_id}', before migration {id}.", "migrations_exclusive_options": "'--auto', '--skip', and '--force-rerun' are mutually exclusive options.", "migrations_failed_to_load_migration": "Could not load migration {id}: {error}", @@ -614,9 +613,9 @@ "service_description_fail2ban": "Protects against brute-force and other kinds of attacks from the Internet", "service_description_metronome": "Manage XMPP instant messaging accounts", "service_description_mysql": "Stores app data (SQL database)", - "service_description_postgresql": "Stores app data (SQL database)", "service_description_nginx": "Serves or provides access to all the websites hosted on your server", "service_description_postfix": "Used to send and receive e-mails", + "service_description_postgresql": "Stores app data (SQL database)", "service_description_redis-server": "A specialized database used for rapid data access, task queue, and communication between programs", "service_description_rspamd": "Filters spam, and other e-mail related features", "service_description_slapd": "Stores users, domains and related info", @@ -691,4 +690,4 @@ "yunohost_installing": "Installing YunoHost...", "yunohost_not_installed": "YunoHost is not correctly installed. Please run 'yunohost tools postinstall'", "yunohost_postinstall_end_tip": "The post-install completed! To finalize your setup, please consider:\n - adding a first user through the 'Users' section of the webadmin (or 'yunohost user create ' in command-line);\n - diagnose potential issues through the 'Diagnosis' section of the webadmin (or 'yunohost diagnosis run' in command-line);\n - reading the 'Finalizing your setup' and 'Getting to know YunoHost' parts in the admin documentation: https://yunohost.org/admindoc." -} +} \ No newline at end of file diff --git a/locales/eo.json b/locales/eo.json index 8973e6344..1d98e8597 100644 --- a/locales/eo.json +++ b/locales/eo.json @@ -51,7 +51,6 @@ "ask_new_path": "Nova vojo", "backup_custom_mount_error": "Propra rezerva metodo ne povis preterpasi la paŝon 'monto'", "app_upgrade_app_name": "Nun ĝisdatigu {app}...", - "app_manifest_invalid": "Io misas pri la aplika manifesto: {error}", "backup_cleaning_failed": "Ne povis purigi la provizoran rezervan dosierujon", "backup_creation_failed": "Ne povis krei la rezervan ar archiveivon", "backup_hook_unknown": "La rezerva hoko '{hook}' estas nekonata", @@ -219,7 +218,6 @@ "pattern_mailbox_quota": "Devas esti grandeco kun la sufikso b/k/M/G/T aŭ 0 por ne havi kvoton", "user_deletion_failed": "Ne povis forigi uzanton {user}: {error}", "backup_with_no_backup_script_for_app": "La app '{app}' ne havas sekretan skripton. Ignorante.", - "service_regen_conf_is_deprecated": "'yunohost service regen-conf' malakceptas! Bonvolu uzi anstataŭe 'yunohost tools regen-conf'.", "global_settings_key_doesnt_exists": "La ŝlosilo '{settings_key}' ne ekzistas en la tutmondaj agordoj, vi povas vidi ĉiujn disponeblajn klavojn per uzado de 'yunohost settings list'", "dyndns_no_domain_registered": "Neniu domajno registrita ĉe DynDNS", "dyndns_could_not_check_available": "Ne povis kontroli ĉu {domain} haveblas sur {provider}.", @@ -235,16 +233,13 @@ "service_stop_failed": "Ne povis maldaŭrigi la servon '{service}'\n\nLastatempaj servaj protokoloj: {logs}", "unbackup_app": "App '{app}' ne konserviĝos", "updating_apt_cache": "Akirante haveblajn ĝisdatigojn por sistemaj pakoj…", - "tools_upgrade_at_least_one": "Bonvolu specifi '--apps' aŭ '--system'", "service_already_stopped": "La servo '{service}' jam ĉesis", - "tools_upgrade_cant_both": "Ne eblas ĝisdatigi ambaŭ sistemon kaj programojn samtempe", "restore_extracting": "Eltirante bezonatajn dosierojn el la ar theivo…", "upnp_port_open_failed": "Ne povis malfermi havenon per UPnP", "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 share {name}' por akiri helpon", "port_already_closed": "Haveno {port} estas jam fermita por {ip_version} rilatoj", "hook_name_unknown": "Nekonata hoko-nomo '{name}'", - "dyndns_could_not_check_provide": "Ne povis kontroli ĉu {provider} povas provizi {domain}.", "restore_nothings_done": "Nenio estis restarigita", "log_tools_postinstall": "Afiŝu vian servilon YunoHost", "dyndns_unavailable": "La domajno '{domain}' ne haveblas.", diff --git a/locales/es.json b/locales/es.json index dec90b42b..4226b19e9 100644 --- a/locales/es.json +++ b/locales/es.json @@ -10,7 +10,6 @@ "app_extraction_failed": "No se pudieron extraer los archivos de instalación", "app_id_invalid": "ID de la aplicación no válida", "app_install_files_invalid": "Estos archivos no se pueden instalar", - "app_manifest_invalid": "Algo va mal con el manifiesto de la aplicación: {error}", "app_not_correctly_installed": "La aplicación {app} 8 parece estar incorrectamente instalada", "app_not_installed": "No se pudo encontrar «{app}» en la lista de aplicaciones instaladas: {all_apps}", "app_not_properly_removed": "La {app} 0 no ha sido desinstalada correctamente", @@ -194,7 +193,6 @@ "backup_system_part_failed": "No se pudo respaldar la parte del sistema «{part}»", "backup_with_no_backup_script_for_app": "La aplicación «{app}» no tiene un guión de respaldo. Omitiendo.", "backup_with_no_restore_script_for_app": "«{app}» no tiene un script de restauración, no podá restaurar automáticamente la copia de seguridad de esta aplicación.", - "dyndns_could_not_check_provide": "No se pudo verificar si {provider} puede ofrecer {domain}.", "dyndns_domain_not_provided": "El proveedor de DynDNS {provider} no puede proporcionar el dominio {domain}.", "experimental_feature": "Aviso : esta funcionalidad es experimental y no se considera estable, no debería usarla a menos que sepa lo que está haciendo.", "good_practices_about_user_password": "Ahora está a punto de definir una nueva contraseña de usuario. La contraseña debe tener al menos 8 caracteres, aunque es una buena práctica usar una contraseña más larga (es decir, una frase de contraseña) y / o una variación de caracteres (mayúsculas, minúsculas, dígitos y caracteres especiales).", @@ -212,8 +210,6 @@ "tools_upgrade_regular_packages": "Actualizando ahora paquetes «normales» (no relacionados con YunoHost)…", "tools_upgrade_cant_unhold_critical_packages": "No se pudo liberar los paquetes críticos…", "tools_upgrade_cant_hold_critical_packages": "No se pudieron retener los paquetes críticos…", - "tools_upgrade_cant_both": "No se puede actualizar el sistema y las aplicaciones al mismo tiempo", - "tools_upgrade_at_least_one": "Especifique «--apps», o «--system»", "this_action_broke_dpkg": "Esta acción rompió dpkg/APT(los gestores de paquetes del sistema)… Puede tratar de solucionar este problema conectando mediante SSH y ejecutando `sudo dpkg --configure -a`.", "service_reloaded_or_restarted": "El servicio '{service}' fue recargado o reiniciado", "service_reload_or_restart_failed": "No se pudo recargar o reiniciar el servicio «{service}»\n\nRegistro de servicios recientes:{logs}", @@ -221,7 +217,6 @@ "service_restart_failed": "No se pudo reiniciar el servicio «{service}»\n\nRegistro de servicios recientes:{logs}", "service_reloaded": "Servicio '{service}' recargado", "service_reload_failed": "No se pudo recargar el servicio «{service}»\n\nRegistro de servicios recientes:{logs}", - "service_regen_conf_is_deprecated": "¡«yunohost service regen-conf» está obsoleto! Use «yunohost tools regen-conf» en su lugar.", "service_description_yunohost-firewall": "Gestiona los puertos de conexiones abiertos y cerrados a los servicios", "service_description_yunohost-api": "Gestiona las interacciones entre la interfaz web de YunoHost y el sistema", "service_description_ssh": "Permite conectar a su servidor remotamente mediante un terminal (protocolo SSH)", @@ -524,19 +519,6 @@ "app_manifest_install_ask_domain": "Seleccione el dominio donde esta app debería ser instalada", "app_label_deprecated": "Este comando está depreciado! Favor usar el nuevo comando 'yunohost user permission update' para administrar la etiqueta de app.", "app_argument_password_no_default": "Error al interpretar argumento de contraseña'{name}': El argumento de contraseña no puede tener un valor por defecto por razón de seguridad", - "migration_0015_not_enough_free_space": "¡El espacio es muy bajo en `/var/`! Deberías tener almenos 1Gb de espacio libre para ejecutar la migración.", - "migration_0015_not_stretch": "¡La distribución actual de Debian no es Stretch!", - "migration_0015_yunohost_upgrade": "Iniciando la actualización del núcleo de YunoHost...", - "migration_0015_still_on_stretch_after_main_upgrade": "Algo fue mal durante la actualización principal, el sistema parece que está todavía en Debian Stretch", - "migration_0015_main_upgrade": "Comenzando la actualización principal...", - "migration_0015_patching_sources_list": "Adaptando las sources.lists...", - "migration_0015_start": "Comenzando la migración a Buster", - "migration_description_0019_extend_permissions_features": "Extiende/rehaz el sistema de gestión de permisos de la aplicación", - "migration_description_0018_xtable_to_nftable": "Migra las viejas reglas de tráfico de red al nuevo sistema nftable", - "migration_description_0017_postgresql_9p6_to_11": "Migra las bases de datos de PostgreSQL 9.6 a 11", - "migration_description_0016_php70_to_php73_pools": "Migra el «pool» de ficheros php7.0-fpm a php7.3", - "migration_description_0015_migrate_to_buster": "Actualiza el sistema a Debian Buster y YunoHost 4.x", - "migrating_legacy_permission_settings": "Migrando los antiguos parámetros de permisos...", "invalid_regex": "Regex no valido: «{regex}»", "global_settings_setting_backup_compress_tar_archives": "Cuando se creen nuevas copias de respaldo, comprimir los archivos (.tar.gz) en lugar de descomprimir los archivos (.tar). N.B.: activar esta opción quiere decir que los archivos serán más pequeños pero que el proceso tardará más y utilizará más CPU.", "global_settings_setting_smtp_relay_password": "Clave de uso del SMTP", @@ -544,7 +526,6 @@ "global_settings_setting_smtp_relay_port": "Puerto de envio / relay SMTP", "global_settings_setting_smtp_relay_host": "El servidor relay de SMTP para enviar correo en lugar de esta instalación YunoHost. Útil si estás en una de estas situaciones: tu puerto 25 esta bloqueado por tu ISP o VPS, si estás en usado una IP marcada como residencial o DUHL, si no puedes configurar un DNS inverso o si el servidor no está directamente expuesto a internet y quieres utilizar otro servidor para enviar correos.", "global_settings_setting_smtp_allow_ipv6": "Permitir el uso de IPv6 para enviar y recibir correo", - "domain_name_unknown": "Dominio «{domain}» desconocido", "diagnosis_processes_killed_by_oom_reaper": "Algunos procesos fueron terminados por el sistema recientemente porque se quedó sin memoria. Típicamente es sintoma de falta de memoria o de un proceso que se adjudicó demasiada memoria.
Resumen de los procesos terminados:
\n{kills_summary}", "diagnosis_http_nginx_conf_not_up_to_date_details": "Para arreglar este asunto, estudia las diferencias mediante el comando yunohost tools regen-conf nginx --dry-run --with-diff y si te parecen bien aplica los cambios mediante yunohost tools regen-conf nginx --force.", "diagnosis_http_nginx_conf_not_up_to_date": "Parece que la configuración nginx de este dominio haya sido modificada manualmente, esto no deja que YunoHost pueda diagnosticar si es accesible mediante HTTP.", @@ -587,4 +568,4 @@ "app_config_unable_to_read": "No se pudieron leer los valores del panel configuración.", "backup_create_size_estimation": "El archivo contendrá aproximadamente {size} de datos.", "config_cant_set_value_on_section": "No puede establecer un único valor en una sección de configuración completa." -} +} \ No newline at end of file diff --git a/locales/eu.json b/locales/eu.json index 1f69866bb..91d744a7f 100644 --- a/locales/eu.json +++ b/locales/eu.json @@ -368,7 +368,6 @@ "log_app_change_url": "'{}' aplikazioaren URLa aldatu", "log_app_config_set": "Ezarri '{}' aplikazioko konfigurazioa", "downloading": "Deskargatzen…", - "dyndns_could_not_check_provide": "Ezinezkoa izan da {provider}(e)k {domain} eskaini dezakeen egiaztatzea.", "log_available_on_yunopaste": "Erregistroa {url} estekan ikus daiteke", "log_dyndns_update": "Eguneratu YunoHosten '{}' domeinuari lotutako IP helbidea", "log_letsencrypt_cert_install": "Instalatu Let's Encrypt ziurtagiria '{}' domeinurako", @@ -488,7 +487,6 @@ "unexpected_error": "Ezusteko zerbaitek huts egin du: {error}", "updating_apt_cache": "Sistemaren paketeen eguneraketak eskuratzen…", "mail_forward_remove_failed": "Ezinezkoa izan da '{mail}' posta elektronikoko birbidalketa ezabatzea", - "migration_description_0020_ssh_sftp_permissions": "Gehitu SSH eta SFTP baimenak", "migration_ldap_migration_failed_trying_to_rollback": "Ezinezkoa izan da migratzea… sistema lehengoratzen saiatzen.", "migrations_exclusive_options": "'--auto', '--skip', eta '--force-rerun' aukerek batak bestea baztertzen du.", "migrations_running_forward": "{id} migrazioa exekutatzen…", @@ -503,7 +501,6 @@ "user_import_partial_failed": "Erabiltzaileak inportatzeko eragiketak erdizka huts egin du", "user_import_success": "Erabiltzaileak arazorik gabe inportatu dira", "yunohost_already_installed": "YunoHost instalatuta dago dagoeneko", - "migration_0015_not_stretch": "Debianen oraingo bertsioa ez da Stretch!", "migrations_success_forward": "{id} migrazioak amaitu du", "migrations_to_be_ran_manually": "{id} migrazioa eskuz abiarazi behar da. Mesedez, joan Erramintak → Migrazioak atalera administrazio-atarian edo bestela exekutatu 'yunohost tools migrations run'.", "permission_currently_allowed_for_all_users": "Baimen hau erabiltzaile guztiei esleitzen zaie eta baita beste talde batzuei ere. Litekeena da 'all users' baimena edo esleituta duten taldeei baimena kendu nahi izatea.", @@ -518,7 +515,6 @@ "tools_upgrade_regular_packages": "Orain pakete \"arruntak\" (YunoHostekin zerikusia ez dutenak) eguneratzen…", "tools_upgrade_special_packages": "Orain pakete \"bereziak\" (YunoHostekin zerikusia dutenak) eguneratzen…", "regenconf_would_be_updated": "'{category}' atalerako konfigurazioa eguneratu izango litzatekeen", - "migration_description_0018_xtable_to_nftable": "Migratu internet trafiko arau zaharrak nftaula sistema berrira", "migrations_dependencies_not_satisfied": "Exekutatu honako migrazioak: '{dependencies_id}', {id} migratu baino lehen.", "permission_created": "'{permission}' baimena sortu da", "regenconf_now_managed_by_yunohost": "'{conf}' konfigurazio fitxategia YunoHostek kudeatzen du orain ({category} atala).", @@ -528,8 +524,6 @@ "service_restarted": "'{service}' zerbitzua berrabiarazi da", "service_start_failed": "Ezin izan da '{service}' zerbitzua abiarazi\n\nZerbitzuen azken erregistroak: {logs}", "ssowat_conf_updated": "SSOwat ezarpenak eguneratu dira", - "tools_upgrade_at_least_one": "Mesedez, zehaztu '--apps' edo '--system'", - "tools_upgrade_cant_both": "Ezin dira sistema eta aplikazioak une berean eguneratu", "update_apt_cache_failed": "Ezin da APT Debian-en pakete kudeatzailearen cachea eguneratu. Hemen dituzu sources.list fitxategiaren lerroak, arazoa identifikatzeko baliagarria izan dezakezuna:\n{sourceslist}", "update_apt_cache_warning": "Zerbaitek huts egin du APT Debian-en pakete kudeatzailearen cachea eguneratzean. Hemen dituzu sources.list fitxategiaren lerroak, arazoa identifikatzeko baliagarria izan dezakezuna:\n{sourceslist}", "user_created": "Erabiltzailea sortu da", @@ -558,11 +552,6 @@ "regenconf_pending_applying": "'{category}' atalerako konfigurazioa ezartzen…", "user_import_nothing_to_do": "Ez dago erabiltzaileak inportatu beharrik", "mailbox_used_space_dovecot_down": "Dovecot mailbox zerbitzua martxan egon behar da postak erabilitako espazioa ezagutzeko", - "migration_0015_cleaning_up": "Beharrezkoak ez diren cache eta paketeak kentzen…", - "migration_0015_modified_files": "Mesedez, kontuan hartu ondorengo fitxategiak eskuz aldatu direla eta sistema eguneratzean euren gainean idatziko dela: {manually_modified_files}", - "migration_0015_not_enough_free_space": "/var/ fitxategi-sisteman oso espazio gutxi geratzen da! Gutxienez GB bat izan behar da migrazioa abiarazteko.", - "migration_0015_weak_certs": "Sinadura-algoritmo ahulak darabiltzaten ziurtagiriak aurkitu dira eta eguneratu behar dira nginx-en hurrengo bertsioarekin bateragarriak izateko: {certs}", - "migration_description_0017_postgresql_9p6_to_11": "Migratu datubaseak PostgreSQL 9.6-tik 11-ra", "other_available_options": "… eta erakusten ez diren beste {n} aukera daude", "permission_cannot_remove_main": "Ezin da baimen nagusi bat kendu", "service_not_reloading_because_conf_broken": "Ez da '{name}' zerbitzua birkargatu/berrabiarazi konfigurazioa kaltetuta dagoelako: {errors}", @@ -577,16 +566,9 @@ "upnp_disabled": "UPnP itzalita dago", "main_domain_change_failed": "Ezinezkoa izan da domeinu nagusia aldatzea", "regenconf_failed": "Ezinezkoa izan da ondorengo atal(ar)en konfigurazioa berregitea: {categories}", - "migration_0015_start": "Buster-erako migrazioa abiarazten", - "migration_0015_patching_sources_list": "sources.lists petatxatzen…", - "migration_0015_yunohost_upgrade": "YunoHosten muinaren eguneraketa abiarazten…", - "migration_0017_postgresql_96_not_installed": "Ez da PostgreSQL instalatu. Ez dago egitekorik.", "pattern_email_forward": "Helbide elektroniko baliagarri bat izan behar da, '+' karakterea onartzen da (adibidez: izena+urtea@domeinua.eus)", - "migrating_legacy_permission_settings": "Zaharkitutako baimenen ezarpenak migratzen…", - "migration_0019_add_new_attributes_in_ldap": "Gehitu LDAP datubasean baimenetarako atributu berriak", "regenconf_file_manually_removed": "'{conf}' konfigurazio fitxategia eskuz ezabatu da eta ez da berriro sortuko", "regenconf_up_to_date": "Konfigurazioa egunean dago dagoeneko '{category}' atalerako", - "service_regen_conf_is_deprecated": "'yunohost service regen-conf' zaharkitua dago! Mesedez, erabili 'yunohost tools regen-conf' haren ordez.", "migrations_no_such_migration": "Ez dago '{id}' izeneko migraziorik", "migrations_not_pending_cant_skip": "Migrazio hauek ez daude exekutatzeke eta, beraz, ezin dira saihestu: {ids}", "regex_with_only_domain": "Ezin duzu regex domeinuetarako erabili; bideetarako bakarrik", @@ -599,7 +581,6 @@ "service_enable_failed": "Ezin izan da '{service}' zerbitzua sistema abiaraztearekin batera exekutatzea lortu.\n\nZerbitzuen erregistro berrienak: {logs}", "system_username_exists": "Erabiltzaile izena existitzen da dagoeneko sistemaren erabiltzaileen zerrendan", "user_already_exists": "'{user}' erabiltzailea existitzen da dagoeneko", - "migration_0018_failed_to_migrate_iptables_rules": "Zaharkitutako iptaulak nftauletara eguneratzeak huts egin du: {error}", "mail_domain_unknown": "Ezinezkoa da posta elektroniko hori '{domain}' domeinurako erabiltzea. Mesedez, erabili zerbitzari honek kudeatzen duen domeinu bat.", "migrations_list_conflict_pending_done": "Ezin dituzu '--previous' eta '--done' aldi berean erabili.", "migrations_loading_migration": "{id} migrazioa kargatzen…", @@ -627,20 +608,11 @@ "user_update_failed": "Ezin izan da {user} erabiltzailea eguneratu: {error}", "user_updated": "Erabiltzailearen informazioa aldatu da", "yunohost_configured": "YunoHost konfiguratuta dago", - "migration_0015_system_not_fully_up_to_date": "Sistema ez dago guztiz eguneratuta. Mesedez, exekutatu eguneraketa orokorra Buster-erako migrazioa abiarazi baino lehen.", - "migration_description_0015_migrate_to_buster": "Eguneratu sistema Debian Buster eta YunoHost 4.x-ra", "service_description_yunomdns": "Sare lokalean zerbitzarira 'yunohost.local' erabiliz konektatzea ahalbidetzen du", "mail_alias_remove_failed": "Ezin izan da '{mail}' e-mail ezizena ezabatu", "mail_unavailable": "Helbide elektroniko hau lehenengo erabiltzailearentzat gorde da eta hari ezarri zaio automatikoki", - "migration_description_0016_php70_to_php73_pools": "Migratu php7.0-fpm 'pool' fitxategiak php7.3-ra", - "migration_description_0019_extend_permissions_features": "Hedatu aplikazioen baimenen kudeaketa sistema", - "migration_0015_main_upgrade": "Eguneraketa orokorra abiarazten…", "migration_ldap_backup_before_migration": "Sortu LDAP datubase eta aplikazioen ezarpenen babeskopia migrazioa abiarazi baino lehen.", "migration_ldap_can_not_backup_before_migration": "Sistemaren babeskopiak ez du amaitu migrazioak huts egin baino lehen. Errorea: {error}", - "migration_0015_problematic_apps_warning": "Mesedez, kontuan izan arazoak sor ditzaketen aplikazioak aurkitu direla. Badirudi ez zirela YunoHosten aplikazioen katalogotik instalatu, edo 'ez dabiltza' etiketa dute. Beraz, ezin da bermatu eguneratu eta gero funtzionatuko dutenik: {problematic_apps}", - "migration_0017_not_enough_space": "Espazio gehiago behar da {path}-n migrazioa exekutatzeko.", - "migration_0017_postgresql_11_not_installed": "PostgreSQL 9.6 instalatuta egon arren postgresql 11 ez‽ Zerbait arraroa gertatu da zure sisteman :(…", - "migration_0018_failed_to_reset_legacy_rules": "Ezinezkoa izan da zaharkitutako iptaulak berrezartzea: {error}", "migrations_migration_has_failed": "{id} migrazioak ez du amaitu, geldiarazten. Errorea: {exception}", "migrations_need_to_accept_disclaimer": "{id} migrazioa abiarazteko, ondorengo baldintzak onartu behar dituzu:\n---\n{disclaimer}\n---\nMigrazioa onartzen baduzu, mesedez berrabiarazi prozesua komandoan '--accept-disclaimer' aukera gehituz.", "not_enough_disk_space": "Ez dago nahikoa espazio librerik '{path}'-n", @@ -652,8 +624,6 @@ "pattern_port_or_range": "Ataka zenbaki (0-65535) edo errenkada (100:200) baliagarri bat izan behar da", "permission_already_disallowed": "'{group}' taldeak desgaituta dauka dagoeneko '{permission} baimena", "permission_already_up_to_date": "Baimena ez da eguneratu egindako eskaria egungo egoerarekin bat datorrelako.", - "migration_0015_still_on_stretch_after_main_upgrade": "Zerbaitek huts egin du eguneraketa orokorrean; badirudi sistemak oraindik darabilela Debian Stretch", - "migration_update_LDAP_schema": "LDAP eskema eguneratzen…", "permission_protected": "'{permission}' baimena babestuta dago. Ezin duzu bisitarien taldea baimen honetara gehitu / baimen honetatik kendu.", "permission_update_failed": "Ezinezkoa izan da '{permission}' baimena aldatzea: {error}", "port_already_opened": "{port}. ataka dagoeneko irekita dago {ip_version} konexioetarako", @@ -661,11 +631,8 @@ "user_unknown": "Erabiltzaile ezezaguna: {user}", "yunohost_postinstall_end_tip": "Instalazio ondorengo prozesua amaitu da! Sistemaren konfigurazioa bukatzeko:\n- gehitu erabiltzaile bat administrazio-atariko 'Erabiltzaileak' atalean (edo 'yunohost user create ' komandoa erabiliz);\n- erabili 'Diagnostikoak' atala ohiko arazoei aurre hartzeko. Administrazio-atarian abiarazi edo 'yunohost diagnosis run' exekutatu;\n- irakurri 'Finalizing your setup' eta 'Getting to know YunoHost' atalak. Dokumentazioan aurki ditzakezu: https://yunohost.org/admindoc.", "yunohost_not_installed": "YunoHost ez da zuzen instalatu. Mesedez, exekutatu 'yunohost tools postinstall'", - "migration_0019_slapd_config_will_be_overwritten": "Badirudi eskuz moldatu duzula slapd konfigurazioa. Migrazio garrantzitsu honetarako, YunoHostek slapd ezarpenak eguneratu behar ditu. Oraingo fitxategiak {conf_backup_folder}-n kopiatuko dira.", "unlimit": "Mugarik ez", "restore_already_installed_apps": "Ondorengo aplikazioak ezin dira lehengoratu dagoeneko instalatuta daudelako: {apps}", - "migration_0015_general_warning": "Mesedez, uler ezazu migrazio hau eragiketa zaila dela. YunoHosten kideek ahalik eta hoberen egin dute prozesua egiaztatzeko, baina hala ere sistemaren atalak edo aplikazioak kaltetu litezke.\n\nHorregatik gomendagarria da:\n- Informazio edo aplikazio garrantzitsuen babeskopia egitea. Argibide gehiagorako: https://yunohost.org/backup;\n- Pazientzia izatea migrazioa abiarazterakoan: zure internet konexioaren eta hardwarearen arabera litekeena da ordu batzuk behar izatea eguneraketa amaitu arte.", - "migration_0015_specific_upgrade": "Aparte eguneratu behar diren sistemaren paketeen eguneraketa abiarazten…", "password_too_simple_4": "Pasahitzak 12 karaktere izan behar ditu gutxienez eta zenbakiren bat, hizki larriren bat, txikiren bat eta karaktere bereziren bat izan behar ditu", "pattern_email": "Helbide elektroniko baliagarri bat izan behar da, '+' karaktererik gabe (adibidez: izena@domeinua.eus)", "pattern_username": "Txikiz idatzitako karaktere alfanumerikoak eta azpiko marra soilik eduki ditzake", @@ -700,9 +667,8 @@ "service_description_metronome": "Bat-bateko XMPP mezularitza kontuak kudeatzen ditu", "service_description_mysql": "Aplikazioen datuak gordetzen ditu (SQL datubasea)", "service_description_nginx": "Zerbitzariak ostatazen dituen webguneak ikusgai egiten ditu", - "service_description_php7.3-fpm": "PHP aplikazioak exekutatzen ditu NGINXi esker", "service_description_redis-server": "Datuak bizkor atzitzeko, zereginak lerratzeko eta programen arteko komunikaziorako datubase berezi bat da", "service_description_rspamd": "Spama bahetu eta posta elektronikoarekin zerikusia duten bestelako futzioen ardura dauka", "service_description_slapd": "Erabiltzaileak, domeinuak eta hauei lotutako informazioa gordetzen du", "service_description_yunohost-api": "YunoHosten web-atariaren eta sistemaren arteko hartuemana kudeatzen du" -} +} \ No newline at end of file diff --git a/locales/fa.json b/locales/fa.json index f566fed90..ce2ba91bd 100644 --- a/locales/fa.json +++ b/locales/fa.json @@ -183,7 +183,6 @@ "app_manifest_install_ask_password": "گذرواژه مدیریتی را برای این برنامه انتخاب کنید", "app_manifest_install_ask_path": "مسیر URL (بعد از دامنه) را انتخاب کنید که این برنامه باید در آن نصب شود", "app_manifest_install_ask_domain": "دامنه ای را انتخاب کنید که این برنامه باید در آن نصب شود", - "app_manifest_invalid": "مشکلی در مانیفست برنامه وجود دارد: {error}", "app_location_unavailable": "این نشانی وب یا در دسترس نیست یا با برنامه (هایی) که قبلاً نصب شده در تعارض است:\n{apps}", "app_label_deprecated": "این دستور منسوخ شده است! لطفاً برای مدیریت برچسب برنامه از فرمان جدید'yunohost به روز رسانی مجوز کاربر' استفاده کنید.", "app_make_default_location_already_used": "نمی توان '{app}' را برنامه پیش فرض در دامنه قرار داد ، '{domain}' قبلاً توسط '{other_app}' استفاده می شود", @@ -199,7 +198,6 @@ "diagnosis_http_connection_error": "خطای اتصال: ارتباط با دامنه درخواست شده امکان پذیر نیست، به احتمال زیاد غیرقابل دسترسی است.", "diagnosis_http_timeout": "زمان تلاش برای تماس با سرور از خارج به پایان رسید. به نظر می رسد غیرقابل دسترسی است.
1. شایع ترین علت برای این مشکل ، پورت 80 است (و 443) به درستی به سرور شما ارسال نمی شوند.
2. همچنین باید مطمئن شوید که سرویس nginx در حال اجرا است
3. در تنظیمات پیچیده تر: مطمئن شوید که هیچ فایروال یا پروکسی معکوسی تداخل نداشته باشد.", "diagnosis_http_ok": "دامنه {domain} از طریق HTTP از خارج از شبکه محلی قابل دسترسی است.", - "diagnosis_http_localdomain": "انتظار نمی رود که دامنه {domain} ، با TLD محلی. از خارج از شبکه محلی به آن دسترسی پیدا کند.", "diagnosis_http_could_not_diagnose_details": "خطا: {error}", "diagnosis_http_could_not_diagnose": "نمی توان تشخیص داد که در IPv{ipversion} دامنه ها از خارج قابل دسترسی هستند یا خیر.", "diagnosis_http_hairpinning_issue_details": "این احتمالاً به دلیل جعبه / روتر ISP شما است. در نتیجه ، افراد خارج از شبکه محلی شما می توانند به سرور شما مطابق انتظار دسترسی پیدا کنند ، اما افراد داخل شبکه محلی (احتمالاً مثل شما؟) هنگام استفاده از نام دامنه یا IP جهانی. ممکن است بتوانید وضعیت را بهبود بخشید با نگاهی به https://yunohost.org/dns_local_network", @@ -348,13 +346,11 @@ "dyndns_ip_updated": "IP خود را در DynDNS به روز کرد", "dyndns_ip_update_failed": "آدرس IP را به DynDNS به روز نکرد", "dyndns_could_not_check_available": "بررسی نشد که آیا {domain} در {provider} در دسترس است یا خیر.", - "dyndns_could_not_check_provide": "بررسی نشد که آیا {provider} می تواند {domain} را ارائه دهد یا خیر.", "dpkg_lock_not_available": "این دستور در حال حاضر قابل اجرا نیست زیرا به نظر می رسد برنامه دیگری از قفل dpkg (مدیر بسته سیستم) استفاده می کند", "dpkg_is_broken": "شما نمی توانید این کار را در حال حاضر انجام دهید زیرا dpkg/APT (اداره کنندگان سیستم بسته ها) به نظر می رسد در وضعیت خرابی است… می توانید با اتصال از طریق SSH و اجرا این فرمان `sudo apt install --fix-broken` and/or `sudo dpkg --configure -a` مشکل را حل کنید.", "downloading": "در حال بارگیری...", "done": "انجام شد", "domains_available": "دامنه های موجود:", - "domain_name_unknown": "دامنه '{domain}' ناشناخته است", "domain_uninstall_app_first": "این برنامه ها هنوز روی دامنه شما نصب هستند:\n{apps}\n\nلطفاً قبل از اقدام به حذف دامنه ، آنها را با استفاده از 'برنامه yunohost remove the_app_id' حذف کرده یا با استفاده از 'yunohost app change-url the_app_id' به دامنه دیگری منتقل کنید", "domain_remove_confirm_apps_removal": "حذف این دامنه برنامه های زیر را حذف می کند:\n{apps}\n\nآیا طمئن هستید که میخواهید انجام دهید؟ [{answers}]", "domain_hostname_failed": "نام میزبان جدید قابل تنظیم نیست. این ممکن است بعداً مشکلی ایجاد کند (ممکن هم هست خوب باشد).", @@ -413,39 +409,10 @@ "migrations_dependencies_not_satisfied": "این مهاجرت ها را اجرا کنید: '{dependencies_id}' ، قبل از مهاجرت {id}.", "migrations_cant_reach_migration_file": "دسترسی به پرونده های مهاجرت در مسیر '٪ s' امکان پذیر نیست", "migrations_already_ran": "این مهاجرت ها قبلاً انجام شده است: {ids}", - "migration_0019_slapd_config_will_be_overwritten": "به نظر می رسد که شما پیکربندی slapd را به صورت دستی ویرایش کرده اید. برای این مهاجرت بحرانی ، YunoHost باید به روز رسانی پیکربندی slapd را مجبور کند. فایلهای اصلی در {conf_backup_folder} پشتیبان گیری می شوند.", - "migration_0019_add_new_attributes_in_ldap": "اضافه کردن ویژگی های جدید برای مجوزها در پایگاه داده LDAP", - "migration_0018_failed_to_reset_legacy_rules": "تنظیم مجدد قوانین iptables قدیمی انجام نشد: {error}", - "migration_0018_failed_to_migrate_iptables_rules": "انتقال قوانین قدیمی iptables به nftables انجام نشد: {error}", - "migration_0017_not_enough_space": "فضای کافی در {path} برای اجرای مهاجرت در دسترس قرار دهید.", - "migration_0017_postgresql_11_not_installed": "PostgreSQL 9.6 نصب شده است ، اما postgresql 11 نه؟ ممکن است اتفاق عجیبی در سیستم شما رخ داده باشد:(...", - "migration_0017_postgresql_96_not_installed": "PostgreSQL روی سیستم شما نصب نشده است. کاری برای انجام دادن نیست.", - "migration_0015_weak_certs": "گواهینامه های زیر هنوز از الگوریتم های امضای ضعیف استفاده می کنند و برای سازگاری با نسخه بعدی nginx باید ارتقاء یابند: {certs}", - "migration_0015_cleaning_up": "پاک کردن حافظه پنهان و بسته ها دیگر مفید نیست...", - "migration_0015_specific_upgrade": "شروع به روزرسانی بسته های سیستم که باید به طور مستقل ارتقا یابد...", - "migration_0015_modified_files": "لطفاً توجه داشته باشید که فایل های زیر به صورت دستی اصلاح شده اند و ممکن است پس از ارتقاء رونویسی شوند: {manually_modified_files}", - "migration_0015_problematic_apps_warning": "لطفاً توجه داشته باشید که احتمالاً برنامه های نصب شده مشکل ساز تشخیص داده شده. به نظر می رسد که آنها از فهرست برنامه YunoHost نصب نشده اند یا به عنوان 'working' علامت گذاری نشده اند. در نتیجه ، نمی توان تضمین کرد که پس از ارتقاء همچنان کار خواهند کرد: {problematic_apps}", - "migration_0015_general_warning": "لطفاً توجه داشته باشید که این مهاجرت یک عملیات ظریف است. تیم YunoHost تمام تلاش خود را برای بررسی و آزمایش آن انجام داد ، اما مهاجرت ممکن است بخشهایی از سیستم یا برنامه های آن را خراب کند.\n\nبنابراین ، توصیه می شود:\n- پشتیبان گیری از هرگونه داده یا برنامه حیاتی را انجام دهید. اطلاعات بیشتر در https://yunohost.org/backup ؛\n- پس از راه اندازی مهاجرت صبور باشید: بسته به اتصال به اینترنت و سخت افزار شما ، ممکن است چند ساعت طول بکشد تا همه چیز ارتقا یابد.", - "migration_0015_system_not_fully_up_to_date": "سیستم شما کاملاً به روز نیست. لطفاً قبل از اجرای مهاجرت به Buster ، یک ارتقاء منظم انجام دهید.", - "migration_0015_not_enough_free_space": "فضای آزاد در /var /بسیار کم است! برای اجرای این مهاجرت باید حداقل 1 گیگابایت فضای آزاد داشته باشید.", - "migration_0015_not_stretch": "توزیع دبیان فعلی استرچ نیست!", - "migration_0015_yunohost_upgrade": "شروع به روز رسانی اصلی YunoHost...", - "migration_0015_still_on_stretch_after_main_upgrade": "هنگام ارتقاء اصلی مشکلی پیش آمد ، به نظر می رسد سیستم هنوز در Debian Stretch است", - "migration_0015_main_upgrade": "شروع به روزرسانی اصلی...", - "migration_0015_patching_sources_list": "وصله منابع. لیست ها...", - "migration_0015_start": "شروع مهاجرت به باستر", - "migration_update_LDAP_schema": "در حال به روزرسانی طرح وشمای LDAP...", "migration_ldap_rollback_success": "سیستم برگردانده شد.", "migration_ldap_migration_failed_trying_to_rollback": "نمی توان مهاجرت کرد... تلاش برای بازگرداندن سیستم.", "migration_ldap_can_not_backup_before_migration": "نمی توان پشتیبان گیری سیستم را قبل از شکست مهاجرت تکمیل کرد. خطا: {error}", "migration_ldap_backup_before_migration": "ایجاد پشتیبان از پایگاه داده LDAP و تنظیمات برنامه ها قبل از مهاجرت واقعی.", - "migration_description_0020_ssh_sftp_permissions": "پشتیبانی مجوزهای SSH و SFTP را اضافه کنید", - "migration_description_0019_extend_permissions_features": "سیستم مدیریت مجوز برنامه را تمدید / دوباره کار بندازید", - "migration_description_0018_xtable_to_nftable": "مهاجرت از قوانین قدیمی ترافیک شبکه به سیستم جدید nftable", - "migration_description_0017_postgresql_9p6_to_11": "مهاجرت پایگاه های داده از PostgreSQL 9.6 به 11", - "migration_description_0016_php70_to_php73_pools": "انتقال فایلهای conf php7.0-fpm 'pool' به php7.3", - "migration_description_0015_migrate_to_buster": "سیستم را به Debian Buster و YunoHost 4.x ارتقا دهید", - "migrating_legacy_permission_settings": "در حال انتقال تنظیمات مجوز قدیمی...", "main_domain_changed": "دامنه اصلی تغییر کرده است", "main_domain_change_failed": "تغییر دامنه اصلی امکان پذیر نیست", "mail_unavailable": "این آدرس ایمیل محفوظ است و باید به طور خودکار به اولین کاربر اختصاص داده شود", @@ -538,8 +505,6 @@ "tools_upgrade_regular_packages": "در حال ارتقاء بسته های 'regular' (غیر مرتبط با yunohost)...", "tools_upgrade_cant_unhold_critical_packages": "بسته های مهم و حیاتی را نمی توان نگه نداشت...", "tools_upgrade_cant_hold_critical_packages": "بسته های مهم و حیاتی را نمی توان نگه داشت...", - "tools_upgrade_cant_both": "نمی توان سیستم و برنامه ها را به طور همزمان ارتقا داد", - "tools_upgrade_at_least_one": "لطفاً مشخص کنید 'apps' ، یا 'system'", "this_action_broke_dpkg": "این اقدام dpkg/APT (مدیران بسته های سیستم) را خراب کرد... می توانید با اتصال از طریق SSH و اجرای فرمان `sudo apt install --fix -break` و/یا` sudo dpkg --configure -a` این مشکل را حل کنید.", "system_username_exists": "نام کاربری قبلاً در لیست کاربران سیستم وجود دارد", "system_upgraded": "سیستم ارتقا یافت", @@ -560,7 +525,6 @@ "service_reload_failed": "سرویس '{service}' بارگیری نشد\n\nگزارشات اخیر سرویس: {logs}", "service_removed": "سرویس '{service}' حذف شد", "service_remove_failed": "سرویس '{service}' حذف نشد", - "service_regen_conf_is_deprecated": "فرمان 'yunohost service regen-conf' منسوخ شده است! لطفاً به جای آن از 'yunohost tools regen-conf' استفاده کنید.", "service_enabled": "سرویس '{service}' اکنون بطور خودکار در هنگام بوت شدن سیستم راه اندازی می شود.", "service_enable_failed": "انجام سرویس '{service}' به طور خودکار در هنگام راه اندازی امکان پذیر نیست.\n\nگزارشات اخیر سرویس: {logs}", "service_disabled": "هنگام راه اندازی سیستم ، سرویس '{service}' دیگر راه اندازی نمی شود.", @@ -572,7 +536,6 @@ "service_description_rspamd": "هرزنامه ها و سایر ویژگی های مربوط به ایمیل را فیلتر می کند", "service_description_redis-server": "یک پایگاه داده تخصصی برای دسترسی سریع به داده ها ، صف وظیفه و ارتباط بین برنامه ها استفاده می شود", "service_description_postfix": "برای ارسال و دریافت ایمیل استفاده می شود", - "service_description_php7.3-fpm": "برنامه های نوشته شده با PHP را با NGINX اجرا می کند", "service_description_nginx": "به همه وب سایت هایی که روی سرور شما میزبانی شده اند سرویس می دهد یا دسترسی به آنها را فراهم می کند", "service_description_mysql": "ذخیره داده های برنامه (پایگاه داده SQL)", "service_description_metronome": "مدیریت حساب های پیام رسانی فوری XMPP", diff --git a/locales/fr.json b/locales/fr.json index 5b23b7a11..c9609a307 100644 --- a/locales/fr.json +++ b/locales/fr.json @@ -10,7 +10,6 @@ "app_extraction_failed": "Impossible d'extraire les fichiers d'installation", "app_id_invalid": "Identifiant d'application invalide", "app_install_files_invalid": "Fichiers d'installation incorrects", - "app_manifest_invalid": "Manifeste d'application incorrect : {error}", "app_not_correctly_installed": "{app} semble être mal installé", "app_not_installed": "Nous n'avons pas trouvé {app} dans la liste des applications installées : {all_apps}", "app_not_properly_removed": "{app} n'a pas été supprimé correctement", @@ -223,7 +222,6 @@ "server_reboot": "Le serveur va redémarrer", "server_reboot_confirm": "Le serveur va redémarrer immédiatement, le voulez-vous vraiment ? [{answers}]", "app_upgrade_some_app_failed": "Certaines applications n'ont pas été mises à jour", - "dyndns_could_not_check_provide": "Impossible de vérifier si {provider} peut fournir {domain}.", "dyndns_domain_not_provided": "Le fournisseur DynDNS {provider} ne peut pas fournir le domaine {domain}.", "app_make_default_location_already_used": "Impossible de configurer l'application '{app}' par défaut pour le domaine '{domain}' car il est déjà utilisé par l'application '{other_app}'", "app_upgrade_app_name": "Mise à jour de {app}...", @@ -340,9 +338,6 @@ "regenconf_dry_pending_applying": "Vérification de la configuration en attente qui aurait été appliquée pour la catégorie '{category}'...", "regenconf_failed": "Impossible de régénérer la configuration pour la ou les catégorie(s) : '{categories}'", "regenconf_pending_applying": "Applique la configuration en attente pour la catégorie '{category}'...", - "service_regen_conf_is_deprecated": "'yunohost service regen-conf' est obsolète ! Veuillez plutôt utiliser 'yunohost tools regen-conf' à la place.", - "tools_upgrade_at_least_one": "Veuillez spécifier '--apps' ou '--system'", - "tools_upgrade_cant_both": "Impossible de mettre à niveau le système et les applications en même temps", "tools_upgrade_cant_hold_critical_packages": "Impossibilité d'ajouter le drapeau 'hold' pour les paquets critiques...", "tools_upgrade_regular_packages": "Mise à jour des paquets du système (non liés a YunoHost)...", "tools_upgrade_regular_packages_failed": "Impossible de mettre à jour les paquets suivants : {packages_list}", @@ -549,33 +544,9 @@ "diagnosis_swap_tip": "Merci d'être prudent et conscient que si vous hébergez une partition SWAP sur une carte SD ou un disque SSD, cela risque de réduire drastiquement l'espérance de vie du périphérique.", "restore_already_installed_apps": "Les applications suivantes ne peuvent pas être restaurées car elles sont déjà installées : {apps}", "regenconf_need_to_explicitly_specify_ssh": "La configuration de ssh a été modifiée manuellement. Vous devez explicitement indiquer la mention --force à \"ssh\" pour appliquer les changements.", - "migration_0015_cleaning_up": "Nettoyage du cache et des paquets qui ne sont plus nécessaires ...", - "migration_0015_specific_upgrade": "Démarrage de la mise à jour des paquets du système qui doivent être mis à jour séparément...", - "migration_0015_modified_files": "Veuillez noter que les fichiers suivants ont été modifiés manuellement et pourraient être écrasés à la suite de la mise à niveau : {manually_modified_files}", - "migration_0015_problematic_apps_warning": "Veuillez noter que des applications qui peuvent poser problèmes ont été détectées. Il semble qu'elles n'aient pas été installées à partir du catalogue d'applications YunoHost, ou bien qu'elles ne soient pas signalées comme \"fonctionnelles\". Par conséquent, il n'est pas possible de garantir que les applications suivantes fonctionneront encore après la mise à niveau : {problematic_apps}", - "migration_0015_general_warning": "Veuillez noter que cette migration est une opération délicate. L'équipe YunoHost a fait de son mieux pour la revérifier et la tester, mais la migration pourrait quand même casser des éléments du système ou de ses applications.\n\nIl est donc recommandé :\n...- de faire une sauvegarde de toute donnée ou application critique. Plus d'informations ici https://yunohost.org/backup ;\n...- d'être patient après le lancement de la migration. Selon votre connexion internet et votre matériel, la mise à niveau peut prendre jusqu'à quelques heures.", - "migration_0015_system_not_fully_up_to_date": "Votre système n'est pas entièrement à jour. Veuillez effectuer une mise à jour normale avant de lancer la migration vers Buster.", - "migration_0015_not_enough_free_space": "L'espace libre est très faible dans /var/ ! Vous devriez avoir au moins 1 Go de libre pour effectuer cette migration.", - "migration_0015_not_stretch": "La distribution Debian actuelle n'est pas Stretch !", - "migration_0015_yunohost_upgrade": "Démarrage de la mise à jour de YunoHost ...", - "migration_0015_still_on_stretch_after_main_upgrade": "Quelque chose s'est mal passé lors de la mise à niveau, le système semble toujours être sous Debian Stretch", - "migration_0015_main_upgrade": "Démarrage de la mise à niveau générale...", - "migration_0015_patching_sources_list": "Mise à jour du fichier sources.lists...", - "migration_0015_start": "Démarrage de la migration vers Buster", - "migration_description_0015_migrate_to_buster": "Mise à niveau du système vers Debian Buster et YunoHost 4.x", "diagnosis_dns_try_dyndns_update_force": "La configuration DNS de ce domaine devrait être automatiquement gérée par YunoHost. Si ce n'est pas le cas, vous pouvez essayer de forcer une mise à jour en utilisant yunohost dyndns update --force.", "app_packaging_format_not_supported": "Cette application ne peut pas être installée car son format n'est pas pris en charge par votre version de YunoHost. Vous devriez probablement envisager de mettre à jour votre système.", - "migration_0015_weak_certs": "Il a été constaté que les certificats suivants utilisent encore des algorithmes de signature peu robustes et doivent être mis à jour pour être compatibles avec la prochaine version de NGINX : {certs}", "global_settings_setting_backup_compress_tar_archives": "Lors de la création de nouvelles sauvegardes, compresser automatiquement les archives (.tar.gz) au lieu des archives non compressées (.tar). N.B. : activer cette option permet de créer des archives plus légères, mais la procédure de sauvegarde initiale sera significativement plus longues et plus gourmandes en CPU.", - "migration_description_0018_xtable_to_nftable": "Migrer les anciennes règles de trafic réseau vers le nouveau système basé sur nftables", - "service_description_php7.4-fpm": "Exécute les applications écrites en PHP avec NGINX", - "migration_0018_failed_to_reset_legacy_rules": "La réinitialisation des règles iptable par défaut a échoué : {error}", - "migration_0018_failed_to_migrate_iptables_rules": "Échec de la migration des anciennes règles iptables vers nftables : {error}", - "migration_0017_not_enough_space": "Laissez suffisamment d'espace disponible dans {path} avant de lancer la migration.", - "migration_0017_postgresql_11_not_installed": "PostgreSQL 9.6 est installé mais pas posgreSQL 11 ? Il s'est sans doute passé quelque chose d'étrange sur votre système :(...", - "migration_0017_postgresql_96_not_installed": "PostgreSQL n'a pas été installé sur votre système. Aucune opération à effectuer.", - "migration_description_0017_postgresql_9p6_to_11": "Migrer les bases de données de PostgreSQL 9.6 vers 11", - "migration_description_0016_php70_to_php73_pools": "Migrer les configurations php7.0 vers php7.3", "diagnosis_processes_killed_by_oom_reaper": "Certains processus ont été arrêtés récemment par le système car il manquait de mémoire. Cela apparaît généralement quand le système manque de mémoire ou qu'un processus consomme trop de mémoire. Liste des processus tués :\n{kills_summary}", "ask_user_domain": "Domaine à utiliser pour l'adresse email de l'utilisateur et le compte XMPP", "app_manifest_install_ask_is_public": "Cette application devrait-elle être visible par les visiteurs anonymes ?", @@ -598,15 +569,10 @@ "regex_with_only_domain": "Vous ne pouvez pas utiliser une expression régulière pour le domaine, uniquement pour le chemin", "regex_incompatible_with_tile": "/!\\ Packagers ! La permission '{permission}' a 'show_tile' définie sur 'true' et vous ne pouvez donc pas définir une URL regex comme URL principale", "permission_protected": "L'autorisation {permission} est protégée. Vous ne pouvez pas ajouter ou supprimer le groupe visiteurs à/de cette autorisation.", - "migration_0019_slapd_config_will_be_overwritten": "Il semble que vous ayez modifié manuellement la configuration de slapd. Pour cette migration critique, YunoHost doit forcer la mise à jour de la configuration slapd. Les fichiers originaux seront sauvegardés dans {conf_backup_folder}.", - "migration_0019_add_new_attributes_in_ldap": "Ajouter de nouveaux attributs pour les autorisations dans la base de données LDAP", - "migrating_legacy_permission_settings": "Migration des anciens paramètres d'autorisation...", "invalid_regex": "Regex non valide : '{regex}'", - "domain_name_unknown": "Domaine '{domain}' inconnu", "app_label_deprecated": "Cette commande est obsolète ! Veuillez utiliser la nouvelle commande 'yunohost user permission update' pour gérer l'étiquette de l'application.", "additional_urls_already_removed": "URL supplémentaire '{url}' déjà supprimées pour la permission '{permission}'", "invalid_number": "Doit être un nombre", - "migration_description_0019_extend_permissions_features": "Étendre et retravailler le système de gestion des permissions applicatives", "diagnosis_basesystem_hardware_model": "Le modèle/architecture du serveur est {model}", "diagnosis_backports_in_sources_list": "Il semble qu'apt (le gestionnaire de paquets) soit configuré pour utiliser le dépôt des rétroportages (backports). A moins que vous ne sachiez vraiment ce que vous faites, nous vous déconseillons fortement d'installer des paquets provenant des rétroportages, car cela risque de créer des instabilités ou des conflits sur votre système.", "postinstall_low_rootfsspace": "Le système de fichiers a une taille totale inférieure à 10 Go, ce qui est préoccupant et devrait attirer votre attention ! Vous allez certainement arriver à court d'espace disque (très) rapidement ! Il est recommandé d'avoir au moins 16 Go à la racine pour ce système de fichiers. Si vous voulez installer YunoHost malgré cet avertissement, relancez la post-installation avec --force-diskspace", @@ -615,7 +581,6 @@ "diagnosis_rootfstotalspace_warning": "Le système de fichiers racine n'est que de {space}. Cela peut suffire, mais faites attention car vous risquez de les remplir rapidement... Il est recommandé d'avoir au moins 16 GB pour ce système de fichiers.", "app_restore_script_failed": "Une erreur s'est produite dans le script de restauration de l'application", "restore_backup_too_old": "Cette sauvegarde ne peut pas être restaurée car elle provient d'une version trop ancienne de YunoHost.", - "migration_update_LDAP_schema": "Mise à jour du schéma LDAP...", "log_backup_create": "Créer une archive de sauvegarde", "global_settings_setting_ssowat_panel_overlay_enabled": "Activer la superposition de la vignette SSOwat", "migration_ldap_rollback_success": "Système rétabli dans son état initial.", @@ -623,7 +588,6 @@ "migration_ldap_migration_failed_trying_to_rollback": "Impossible de migrer... tentative de restauration du système.", "migration_ldap_can_not_backup_before_migration": "La sauvegarde du système n'a pas pu être terminée avant l'échec de la migration. Erreur : {error }", "migration_ldap_backup_before_migration": "Création d'une sauvegarde de la base de données LDAP et des paramètres des applications avant la migration proprement dite.", - "migration_description_0020_ssh_sftp_permissions": "Ajouter la prise en charge des autorisations SSH et SFTP", "global_settings_setting_security_ssh_port": "Port SSH", "diagnosis_sshd_config_inconsistent_details": "Veuillez exécuter yunohost settings set security.ssh.port -v VOTRE_PORT_SSH pour définir le port SSH, et vérifiez yunohost tools regen-conf ssh --dry-run --with-diff et yunohost tools regen-conf ssh --force pour réinitialiser votre configuration aux recommandations YunoHost.", "diagnosis_sshd_config_inconsistent": "Il semble que le port SSH a été modifié manuellement dans /etc/ssh/sshd_config. Depuis YunoHost 4.2, un nouveau paramètre global 'security.ssh.port' est disponible pour éviter de modifier manuellement la configuration.", @@ -631,7 +595,6 @@ "backup_create_size_estimation": "L'archive contiendra environ {size} de données.", "global_settings_setting_security_webadmin_allowlist": "Adresses IP autorisées à accéder à la webadmin. Elles doivent être séparées par une virgule.", "global_settings_setting_security_webadmin_allowlist_enabled": "Autoriser seulement certaines IP à accéder à la webadmin.", - "diagnosis_http_localdomain": "Le domaine {domain}, avec un TLD .local, ne devrait pas être exposé en dehors du réseau local.", "diagnosis_dns_specialusedomain": "Le domaine {domain} est basé sur un domaine de premier niveau (TLD) à usage spécial comme .local ou .test et ne devrait donc pas avoir d'enregistrements DNS réels.", "invalid_password": "Mot de passe incorrect", "ldap_server_is_down_restart_it": "Le service LDAP est en panne, essayez de le redémarrer...", @@ -669,13 +632,10 @@ "config_validate_url": "Doit être une URL Web valide", "config_version_not_supported": "Les versions du panneau de configuration '{version}' ne sont pas prises en charge.", "danger": "Danger :", - "file_extension_not_accepted": "Le fichier '{path}' est refusé car son extension ne fait pas partie des extensions acceptées : {accept}", "invalid_number_min": "Doit être supérieur à {min}", "invalid_number_max": "Doit être inférieur à {max}", "log_app_config_set": "Appliquer la configuration à l'application '{}'", "service_not_reloading_because_conf_broken": "Le service '{name}' n'a pas été rechargé/redémarré car sa configuration est cassée : {errors}", - "app_argument_password_help_keep": "Tapez sur Entrée pour conserver la valeur actuelle", - "app_argument_password_help_optional": "Tapez un espace pour vider le mot de passe", "domain_registrar_is_not_configured": "Le registrar n'est pas encore configuré pour le domaine {domain}.", "domain_dns_push_not_applicable": "La fonction de configuration DNS automatique n'est pas applicable au domaine {domain}. Vous devez configurer manuellement vos enregistrements DNS en suivant la documentation sur https://yunohost.org/dns_config.", "domain_dns_registrar_yunohost": "Ce domaine est de type nohost.me / nohost.st / ynh.fr et sa configuration DNS est donc automatiquement gérée par YunoHost sans qu'il n'y ait d'autre configuration à faire. (voir la commande 'yunohost dyndns update')", @@ -711,4 +671,4 @@ "other_available_options": "... et {n} autres options disponibles non affichées", "domain_config_auth_consumer_key": "Consumer key", "domain_unknown": "Domaine '{domain}' inconnu" -} +} \ No newline at end of file diff --git a/locales/gl.json b/locales/gl.json index 0d7d1afee..14351b388 100644 --- a/locales/gl.json +++ b/locales/gl.json @@ -76,7 +76,6 @@ "app_manifest_install_ask_password": "Elixe un contrasinal de administración para esta app", "app_manifest_install_ask_path": "Elixe a ruta URL (após o dominio) onde será instalada esta app", "app_manifest_install_ask_domain": "Elixe o dominio onde queres instalar esta app", - "app_manifest_invalid": "Hai algún erro no manifesto da app: {error}", "app_location_unavailable": "Este URL ou ben non está dispoñible ou entra en conflito cunha app(s) xa instalada:\n{apps}", "app_label_deprecated": "Este comando está anticuado! Utiliza o novo comando 'yunohost user permission update' para xestionar a etiqueta da app.", "app_make_default_location_already_used": "Non se puido establecer a '{app}' como app por defecto no dominio, '{domain}' xa está utilizado por '{other_app}'", @@ -288,13 +287,11 @@ "dyndns_ip_updated": "Actualizouse o IP en DynDNS", "dyndns_ip_update_failed": "Non se actualizou o enderezo IP en DynDNS", "dyndns_could_not_check_available": "Non se comprobou se {domain} está dispoñible en {provider}.", - "dyndns_could_not_check_provide": "Non se comprobou se {provider} pode proporcionar {domain}.", "dpkg_lock_not_available": "Non se pode executar agora mesmo este comando porque semella que outro programa está a utilizar dpkg (o xestos de paquetes do sistema)", "dpkg_is_broken": "Non podes facer isto agora mesmo porque dpkg/APT (o xestor de paquetes do sistema) semella que non está a funcionar... Podes intentar solucionalo conectándote a través de SSH e executando `sudo apt install --fix-broken`e/ou `sudo dpkg --configure -a`.", "downloading": "Descargando...", "done": "Feito", "domains_available": "Dominios dispoñibles:", - "domain_name_unknown": "Dominio '{domain}' descoñecido", "domain_uninstall_app_first": "Aínda están instaladas estas aplicacións no teu dominio:\n{apps}\n\nPrimeiro desinstalaas utilizando 'yunohost app remove id_da_app' ou móveas a outro dominio con 'yunohost app change-url id_da_app' antes de eliminar o dominio", "domain_remove_confirm_apps_removal": "Ao eliminar o dominio tamén vas eliminar estas aplicacións:\n{apps}\n\nTes a certeza de querer facelo? [{answers}]", "domain_hostname_failed": "Non se puido establecer o novo nome de servidor. Esto pode causar problemas máis tarde (tamén podería ser correcto).", @@ -394,19 +391,10 @@ "log_does_exists": "Non hai rexistro de operación co nome '{log}', usa 'yunohost log list' para ver tódolos rexistros de operacións dispoñibles", "log_help_to_get_failed_log": "A operación '{desc}' non se completou. Comparte o rexistro completo da operación utilizando o comando 'yunohost log share {name}' para obter axuda", "log_link_to_failed_log": "Non se completou a operación '{desc}'. Por favor envía o rexistro completo desta operación premendo aquí para obter axuda", - "migration_0015_start": "Comezando a migración a Buster", - "migration_update_LDAP_schema": "Actualizando esquema LDAP...", "migration_ldap_rollback_success": "Sistema restablecido.", "migration_ldap_migration_failed_trying_to_rollback": "Non se puido migrar... intentando volver á versión anterior do sistema.", "migration_ldap_can_not_backup_before_migration": "O sistema de copia de apoio do sistema non se completou antes de que fallase a migración. Erro: {error}", "migration_ldap_backup_before_migration": "Crear copia de apoio da base de datos LDAP e axustes de apps antes de realizar a migración.", - "migration_description_0020_ssh_sftp_permissions": "Engadir soporte para permisos SSH e SFTP", - "migration_description_0019_extend_permissions_features": "Extender/recrear o sistema de xestión de permisos de apps", - "migration_description_0018_xtable_to_nftable": "Migrar as regras de tráfico de rede antigas ao novo sistema nftable", - "migration_description_0017_postgresql_9p6_to_11": "Migrar bases de datos desde PostgreSQL 9.6 a 11", - "migration_description_0016_php70_to_php73_pools": "Migrar o ficheiros de configuración 'pool' de php7.0-fpm a php7.3", - "migration_description_0015_migrate_to_buster": "Actualizar o sistema a Debian Buster e YunoHost 4.x", - "migrating_legacy_permission_settings": "Migrando os axustes dos permisos anteriores...", "main_domain_changed": "Foi cambiado o dominio principal", "main_domain_change_failed": "Non se pode cambiar o dominio principal", "mail_unavailable": "Este enderezo de email está reservado e debería adxudicarse automáticamente á primeira usuaria", @@ -433,28 +421,7 @@ "log_letsencrypt_cert_renew": "Anovar certificado Let's Encrypt para '{}'", "log_selfsigned_cert_install": "Instalar certificado auto-asinado para o dominio '{}'", "log_permission_url": "Actualizar URL relativo ao permiso '{}'", - "migration_0015_general_warning": "Ten en conta que a migración é unha operación delicada. O equipo YunoHost esforzouse revisando e comprobandoa, aínda así algo podería fallar en partes do teu sistema ou as súas apps.\n\nPor tanto, é recomendable:\n- realiza unha copia de apoio de tódolos datos ou apps importantes. Máis info en https://yunohost.org/backup;\n - ten paciencia tras iniciar o proceso: dependendo da túa conexión de internet e hardware podería demorar varias horas a actualización de tódolos compoñentes.", - "migration_0015_system_not_fully_up_to_date": "O teu sistema non está ao día. Realiza unha actualización común antes de realizar a migración a Buster.", - "migration_0015_not_enough_free_space": "Queda moi pouco espazo en /var/! Deberías ter polo menos 1GB libre para realizar a migración.", - "migration_0015_not_stretch": "A distribución Debian actual non é Stretch!", - "migration_0015_yunohost_upgrade": "Iniciando a actualización do núcleo YunoHost...", - "migration_0015_still_on_stretch_after_main_upgrade": "Algo foi mal durante a actualiza ión principal, o sistema semella que aínda está en Debian Stretch", - "migration_0015_main_upgrade": "Iniciando a actualización principal...", - "migration_0015_patching_sources_list": "Correxindo os sources.lists...", "migrations_already_ran": "Xa se realizaron estas migracións: {ids}", - "migration_0019_slapd_config_will_be_overwritten": "Semella que editaches manualmente a configuración slapd. Para esta migración crítica YunoHost precisa forzar a actualización da configuración slapd. Os ficheiros orixinais van ser copiados en {conf_backup_folder}.", - "migration_0019_add_new_attributes_in_ldap": "Engadir novos atributos para os permisos na base de datos LDAP", - "migration_0018_failed_to_reset_legacy_rules": "Fallou o restablecemento das regras antigas de iptables: {error}", - "migration_0018_failed_to_migrate_iptables_rules": "Fallou a migración das regras antigas de iptables a nftables: {error}", - "migration_0017_not_enough_space": "Crea espazo suficiente en {path} para executar a migración.", - "migration_0017_postgresql_11_not_installed": "PostgreSQL 9.6 está instado, pero non postgresql 11? Algo raro debeu acontecer no teu sistema :(...", - "migration_0017_postgresql_96_not_installed": "PostgreSQL non está instalado no teu sistema. Nada que facer.", - "migration_0015_weak_certs": "Os seguintes certificados están a utilizar algoritmos de sinatura débiles e teñen que ser actualizados para ser compatibles coa seguinte versión de nginx: {certs}", - "migration_0015_cleaning_up": "Limpando a caché e paquetes que xa non son útiles...", - "migration_0015_specific_upgrade": "Iniciando a actualización dos paquetes do sistema que precisan ser actualizados de xeito independente...", - "migration_0015_modified_files": "Ten en conta que os seguintes ficheiros semella que foron modificados manualmente e poderían ser sobrescritos na actualización: {manually_modified_files}", - "migration_0015_problematic_apps_warning": "Ten en conta que se detectaron as seguintes apps que poderían ser problemáticas. Semella que non foron instaladas usando o catálogo de YunoHost, ou non están marcadas como 'funcionais'. En consecuencia, non se pode garantir que seguirán funcionando após a actualización: {problematic_apps}", - "diagnosis_http_localdomain": "O dominio {domain}, cun TLD .local, non é de agardar que esté exposto ao exterior da rede local.", "diagnosis_dns_specialusedomain": "O dominio {domain} baséase un dominio de nivel alto e uso especial (TLD) como .local ou .test polo que non é de agardar que realmente teña rexistros DNS.", "upnp_enabled": "UPnP activado", "upnp_disabled": "UPnP desactivado", @@ -549,7 +516,6 @@ "service_description_rspamd": "Filtra spam e outras características relacionadas co email", "service_description_redis-server": "Unha base de datos especial utilizada para o acceso rápido a datos, cola de tarefas e comunicación entre programas", "service_description_postfix": "Utilizado para enviar e recibir emails", - "service_description_php7.3-fpm": "Executa aplicacións escritas en PHP con NGINX", "service_description_nginx": "Serve ou proporciona acceso a tódolos sitios web hospedados no teu servidor", "service_description_mysql": "Almacena datos da app (base de datos SQL)", "service_description_metronome": "Xestiona as contas de mensaxería instantánea XMPP", @@ -613,8 +579,6 @@ "tools_upgrade_regular_packages": "Actualizando os paquetes 'regular' (non-yunohost-related)...", "tools_upgrade_cant_unhold_critical_packages": "Non se desbloquearon os paquetes críticos...", "tools_upgrade_cant_hold_critical_packages": "Non se puideron bloquear os paquetes críticos...", - "tools_upgrade_cant_both": "Non se pode actualizar o sistema e as apps ao mesmo tempo", - "tools_upgrade_at_least_one": "Por favor indica 'apps', ou 'system'", "this_action_broke_dpkg": "Esta acción rachou dpkg/APT (xestores de paquetes do sistema)... Podes intentar resolver o problema conectando a través de SSH e executando `sudo apt install --fix-broken`e/ou `sudo dpkg --configure -a`.", "system_username_exists": "Xa existe este nome de usuaria na lista de usuarias do sistema", "system_upgraded": "Sistema actualizado", @@ -635,7 +599,6 @@ "service_reload_failed": "Non se recargou o servizo '{service}'\n\nRexistros recentes do servizo: {logs}", "service_removed": "Eliminado o servizo '{service}'", "service_remove_failed": "Non se eliminou o servizo '{service}'", - "service_regen_conf_is_deprecated": "'yunohost service regen-conf' xa non se utiliza! Executa 'yunohost tools regen-conf' no seu lugar.", "service_enabled": "O servizo '{service}' vai ser iniciado automáticamente no inicio do sistema.", "diagnosis_apps_allgood": "Tódalas apps instaladas respectan as prácticas básicas de empaquetado", "diagnosis_apps_bad_quality": "Esta aplicación está actualmente marcada como estragada no catálogo de aplicacións de YunoHost. Podería ser un problema temporal mentras as mantedoras intentan arranxar o problema. Ata ese momento a actualización desta app está desactivada.", @@ -655,13 +618,11 @@ "diagnosis_apps_broken": "Actualmente esta aplicación está marcada como estragada no catálogo de aplicacións de YunoHost. Podería tratarse dun problema temporal mentras as mantedoras intentan arraxala. Entanto así a actualización da app está desactivada.", "diagnosis_apps_issue": "Atopouse un problema na app {app}", "diagnosis_apps_not_in_app_catalog": "Esta aplicación non está no catálgo de aplicacións de YunoHost. Se estivo no pasado e foi eliminada, deberías considerar desinstalala porque non recibirá actualizacións, e podería comprometer a integridade e seguridade do teu sistema.", - "app_argument_password_help_optional": "Escribe un espazo para limpar o contrasinal", "config_validate_date": "Debe ser unha data válida co formato YYYY-MM-DD", "config_validate_email": "Debe ser un email válido", "config_validate_time": "Debe ser unha hora válida tal que HH:MM", "config_validate_url": "Debe ser un URL válido", "danger": "Perigo:", - "app_argument_password_help_keep": "Preme Enter para manter o valor actual", "app_config_unable_to_read": "Fallou a lectura dos valores de configuración.", "config_apply_failed": "Fallou a aplicación da nova configuración: {error}", "config_forbidden_keyword": "O palabra chave '{keyword}' está reservada, non podes crear ou usar un panel de configuración cunha pregunta con este id.", @@ -673,7 +634,6 @@ "app_config_unable_to_apply": "Fallou a aplicación dos valores de configuración.", "config_cant_set_value_on_section": "Non podes establecer un valor único na sección completa de configuración.", "config_version_not_supported": "A versión do panel de configuración '{version}' non está soportada.", - "file_extension_not_accepted": "Rexeitouse o ficheiro '{path}' porque a súa extensión non está entre as aceptadas: {accept}", "invalid_number_max": "Ten que ser menor de {max}", "service_not_reloading_because_conf_broken": "Non se recargou/reiniciou o servizo '{name}' porque a súa configuración está estragada: {errors}", "diagnosis_http_special_use_tld": "O dominio {domain} baséase nun dominio de alto-nivel (TLD) especial como .local ou .test e por isto non é de agardar que esté exposto fóra da rede local.", @@ -711,4 +671,4 @@ "ldap_attribute_already_exists": "Xa existe o atributo LDAP '{attribute}' con valor '{value}'", "log_domain_config_set": "Actualizar configuración para o dominio '{}'", "domain_unknown": "Dominio '{domain}' descoñecido" -} +} \ No newline at end of file diff --git a/locales/hi.json b/locales/hi.json index 5f521b1dc..1eed9faa4 100644 --- a/locales/hi.json +++ b/locales/hi.json @@ -10,7 +10,6 @@ "app_extraction_failed": "इन्सटाल्ड फ़ाइलों को निकालने में असमर्थ", "app_id_invalid": "अवैध एप्लिकेशन id", "app_install_files_invalid": "फाइलों की अमान्य स्थापना", - "app_manifest_invalid": "एप्लीकेशन का मैनिफेस्ट अमान्य", "app_not_correctly_installed": "{app} ठीक ढंग से इनस्टॉल नहीं हुई", "app_not_installed": "{app} इनस्टॉल नहीं हुई", "app_not_properly_removed": "{app} ठीक ढंग से नहीं अनइन्सटॉल की गई", diff --git a/locales/id.json b/locales/id.json index 1f28ae7e5..c9778dd5f 100644 --- a/locales/id.json +++ b/locales/id.json @@ -43,4 +43,4 @@ "app_start_remove": "Menghapus {app}...", "app_manifest_install_ask_password": "Pilih kata sandi administrasi untuk aplikasi ini", "app_upgrade_several_apps": "Aplikasi-aplikasi berikut akan diperbarui: {apps}" -} +} \ No newline at end of file diff --git a/locales/it.json b/locales/it.json index bd1dba8bd..bb2e7af6c 100644 --- a/locales/it.json +++ b/locales/it.json @@ -26,7 +26,6 @@ "admin_password_change_failed": "Impossibile cambiare la password", "admin_password_changed": "La password d'amministrazione è stata cambiata", "app_install_files_invalid": "Questi file non possono essere installati", - "app_manifest_invalid": "C'è qualcosa di scorretto nel manifesto dell'applicazione: {error}", "app_not_correctly_installed": "{app} sembra di non essere installata correttamente", "app_not_properly_removed": "{app} non è stata correttamente rimossa", "action_invalid": "L'azione '{action}' non è valida", @@ -223,7 +222,6 @@ "dpkg_is_broken": "Non puoi eseguire questo ora perchè dpkg/APT (i gestori di pacchetti del sistema) sembrano essere in stato danneggiato... Puoi provare a risolvere il problema connettendoti via SSH ed eseguire `sudo apt install --fix-broken` e/o `sudo dpkg --configure -a`.", "domain_cannot_remove_main": "Non puoi rimuovere '{domain}' essendo il dominio principale, prima devi impostare un nuovo dominio principale con il comando 'yunohost domain main-domain -n '; ecco la lista dei domini candidati: {other_domains}", "domain_dns_conf_is_just_a_recommendation": "Questo comando ti mostra la configurazione *raccomandata*. Non ti imposta la configurazione DNS al tuo posto. È tua responsabilità configurare la tua zona DNS nel tuo registrar in accordo con queste raccomandazioni.", - "dyndns_could_not_check_provide": "Impossibile controllare se {provider} possano fornire {domain}.", "dyndns_could_not_check_available": "Impossibile controllare se {domain} è disponibile su {provider}.", "dyndns_domain_not_provided": "Il fornitore DynDNS {provider} non può fornire il dominio {domain}.", "experimental_feature": "Attenzione: Questa funzionalità è sperimentale e non è considerata stabile, non dovresti utilizzarla a meno che tu non sappia cosa stai facendo.", @@ -400,8 +398,6 @@ "tools_upgrade_regular_packages": "Adesso aggiorno i pacchetti 'normali' (non correlati a yunohost)...", "tools_upgrade_cant_unhold_critical_packages": "Impossibile annullare il blocco dei pacchetti critici/importanti...", "tools_upgrade_cant_hold_critical_packages": "Impossibile bloccare i pacchetti critici/importanti...", - "tools_upgrade_cant_both": "Impossibile aggiornare sia il sistema e le app nello stesso momento", - "tools_upgrade_at_least_one": "Specifica 'apps', o 'system'", "show_tile_cant_be_enabled_for_regex": "Non puoi abilitare 'show_tile' in questo momento, perché l'URL del permesso '{permission}' è una regex", "show_tile_cant_be_enabled_for_url_not_defined": "Non puoi abilitare 'show_tile' in questo momento, devi prima definire un URL per il permesso '{permission}'", "service_reloaded_or_restarted": "Il servizio '{service}' è stato ricaricato o riavviato", @@ -410,7 +406,6 @@ "service_restart_failed": "Impossibile riavviare il servizio '{service}'\n\nUltimi registri del servizio: {logs}", "service_reloaded": "Servizio '{service}' ricaricato", "service_reload_failed": "Impossibile ricaricare il servizio '{service}'\n\nUltimi registri del servizio: {logs}", - "service_regen_conf_is_deprecated": "'yunohost service regen-conf' è obsoleto! Per favore usa 'yunohost tools regen-conf' al suo posto.", "service_description_yunohost-firewall": "Gestisce l'apertura e la chiusura delle porte ai servizi", "service_description_yunohost-api": "Gestisce l'interazione tra l'interfaccia web YunoHost ed il sistema", "service_description_ssh": "Ti consente di accedere da remoto al tuo server attraverso il terminale (protocollo SSH)", @@ -418,7 +413,6 @@ "service_description_rspamd": "Filtra SPAM, e altre funzionalità legate alle mail", "service_description_redis-server": "Un database specializzato usato per un veloce accesso ai dati, task queue, e comunicazioni tra programmi", "service_description_postfix": "Usato per inviare e ricevere email", - "service_description_php7.4-fpm": "Esegue app scritte in PHP con NGINX", "service_description_nginx": "Serve o permette l'accesso a tutti i siti pubblicati sul tuo server", "service_description_mysql": "Memorizza i dati delle app (database SQL)", "service_description_metronome": "Gestisce gli account di messaggistica instantanea XMPP", @@ -492,33 +486,6 @@ "migrations_dependencies_not_satisfied": "Esegui queste migrazioni: '{dependencies_id}', prima di {id}.", "migrations_cant_reach_migration_file": "Impossibile accedere ai file di migrazione nel path '%s'", "migrations_already_ran": "Migrazioni già effettuate: {ids}", - "migration_0019_slapd_config_will_be_overwritten": "Sembra che tu abbia modificato manualmente la configurazione slapd. Per questa importante migrazione, YunoHost deve forzare l'aggiornamento della configurazione slapd. I file originali verranno back-uppati in {conf_backup_folder}.", - "migration_0019_add_new_attributes_in_ldap": "Aggiungi nuovi attributi ai permessi nel database LDAP", - "migration_0018_failed_to_reset_legacy_rules": "Impossibile resettare le regole iptables legacy: {error}", - "migration_0018_failed_to_migrate_iptables_rules": "Migrazione fallita delle iptables legacy a nftables: {error}", - "migration_0017_not_enough_space": "Libera abbastanza spazio in {path} per eseguire la migrazione.", - "migration_0017_postgresql_11_not_installed": "PostgreSQL 9.6 è installato, ma non PostgreSQL 11 ?! Qualcosa di strano potrebbe esser successo al tuo sistema :'( ...", - "migration_0017_postgresql_96_not_installed": "PostgreSQL non è stato installato sul tuo sistema. Nulla da fare.", - "migration_0015_weak_certs": "I seguenti certificati utilizzano ancora un algoritmo di firma debole e dovrebbero essere aggiornati per essere compatibili con la prossima versione di nginx: {certs}", - "migration_0015_cleaning_up": "Sto pulendo la cache e i pacchetti non più utili...", - "migration_0015_specific_upgrade": "Inizio l'aggiornamento dei pacchetti di sistema che necessitano di essere aggiornati da soli...", - "migration_0015_modified_files": "Attenzioni, i seguenti file sembrano esser stati modificati manualmente, e potrebbero essere sovrascritti dopo l'aggiornamento: {manually_modified_files}", - "migration_0015_problematic_apps_warning": "Alcune applicazioni potenzialmente problematiche sono state rilevate nel sistema. Sembra che non siano state installate attraverso il catalogo app YunoHost, o non erano flaggate come 'working'/'funzionanti'. Di conseguenza, non è possibile garantire che funzioneranno ancora dopo l'aggiornamento: {problematic_apps}", - "migration_0015_general_warning": "Attenzione, sappi che questa migrazione è un'operazione delicata. Il team YunoHost ha fatto del suo meglio nel controllarla e testarla, ma le probabilità che il sistema e/o qualche app si danneggi non sono nulle.\n\nPerciò, ti raccomandiamo di:\n\t- Effettuare un backup di tutti i dati e app importanti. Maggiori informazioni su https://yunohost.org/backup;\n\t- Sii paziente dopo aver lanciato l'operazione: in base alla tua connessione internet e al tuo hardware, potrebbero volerci alcune ore per aggiornare tutto.", - "migration_0015_system_not_fully_up_to_date": "Il tuo sistema non è completamente aggiornato. Esegui un aggiornamento classico prima di lanciare la migrazione a Buster.", - "migration_0015_not_enough_free_space": "Poco spazio libero disponibile in /var/! Dovresti avere almeno 1GB libero per effettuare questa migrazione.", - "migration_0015_not_stretch": "La distribuzione Debian corrente non è Stretch!", - "migration_0015_yunohost_upgrade": "Inizio l'aggiornamento del core di YunoHost...", - "migration_0015_still_on_stretch_after_main_upgrade": "Qualcosa è andato storto durante l'aggiornamento principale, il sistema sembra essere ancora su Debian Stretch", - "migration_0015_main_upgrade": "Inizio l'aggiornamento principale...", - "migration_0015_patching_sources_list": "Applico le patch a sources.lists...", - "migration_0015_start": "Inizio migrazione a Buster", - "migration_description_0019_extend_permissions_features": "Estendi il sistema di gestione dei permessi app", - "migration_description_0018_xtable_to_nftable": "Migra le vecchie regole di traffico network sul nuovo sistema nftable", - "migration_description_0017_postgresql_9p6_to_11": "Migra i database da PostgreSQL 9.6 a 11", - "migration_description_0016_php70_to_php73_pools": "MIgra i file di configurazione 'pool' di php7.0-fpm su php7.3", - "migration_description_0015_migrate_to_buster": "Aggiorna il sistema a Debian Buster e YunoHost 4.X", - "migrating_legacy_permission_settings": "Impostando le impostazioni legacy dei permessi..", "mailbox_disabled": "E-mail disabilitate per l'utente {user}", "log_user_permission_reset": "Resetta il permesso '{}'", "log_user_permission_update": "Aggiorna gli accessi del permesso '{}'", @@ -558,7 +525,6 @@ "global_settings_setting_pop3_enabled": "Abilita il protocollo POP3 per il server mail", "dyndns_provider_unreachable": "Incapace di raggiungere il provider DynDNS {provider}: o il tuo YunoHost non è connesso ad internet o il server dynette è down.", "dpkg_lock_not_available": "Impossibile eseguire il comando in questo momento perché un altro programma sta bloccando dpkg (il package manager di sistema)", - "domain_name_unknown": "Dominio '{domain}' sconosciuto", "domain_cannot_remove_main_add_new_one": "Non puoi rimuovere '{domain}' visto che è il dominio principale nonché il tuo unico dominio, devi prima aggiungere un altro dominio eseguendo 'yunohost domain add ', impostarlo come dominio principale con 'yunohost domain main-domain n ', e solo allora potrai rimuovere il dominio '{domain}' eseguendo 'yunohost domain remove {domain}'.'", "domain_cannot_add_xmpp_upload": "Non puoi aggiungere domini che iniziano per 'xmpp-upload.'. Questo tipo di nome è riservato per la funzionalità di upload XMPP integrata in YunoHost.", "diagnosis_processes_killed_by_oom_reaper": "Alcuni processi sono stati terminati dal sistema che era a corto di memoria. Questo è un sintomo di insufficienza di memoria nel sistema o di un processo che richiede troppa memoria. Lista dei processi terminati:\n{kills_summary}", @@ -612,12 +578,10 @@ "diagnosis_rootfstotalspace_warning": "La radice del filesystem ha un totale di solo {space}. Potrebbe non essere un problema, ma stai attento perché potresti consumare tutta la memoria velocemente... Raccomandiamo di avere almeno 16 GB per la radice del filesystem.", "restore_backup_too_old": "Questo archivio backup non può essere ripristinato perché è stato generato da una versione troppo vecchia di YunoHost.", "permission_cant_add_to_all_users": "Il permesso {permission} non può essere aggiunto a tutto gli utenti.", - "migration_update_LDAP_schema": "Aggiorno lo schema LDAP...", "migration_ldap_rollback_success": "Sistema ripristinato allo stato precedente.", "migration_ldap_migration_failed_trying_to_rollback": "Impossibile migrare... provo a ripristinare il sistema.", "migration_ldap_can_not_backup_before_migration": "Il backup del sistema non è stato completato prima che la migrazione fallisse. Errore: {error}", "migration_ldap_backup_before_migration": "Sto generando il backup del database LDAP e delle impostazioni delle app prima di effettuare la migrazione.", - "migration_description_0020_ssh_sftp_permissions": "Aggiungi il supporto ai permessi SSH e SFTP", "log_backup_create": "Crea un archivio backup", "global_settings_setting_ssowat_panel_overlay_enabled": "Abilita il pannello sovrapposto SSOwat", "global_settings_setting_security_ssh_port": "Porta SSH", @@ -706,4 +670,4 @@ "config_validate_url": "È necessario inserire un URL web valido", "ldap_server_down": "Impossibile raggiungere il server LDAP", "ldap_server_is_down_restart_it": "Il servizio LDAP è down, prova a riavviarlo…" -} +} \ No newline at end of file diff --git a/locales/nb_NO.json b/locales/nb_NO.json index dc217d74e..e81d3af05 100644 --- a/locales/nb_NO.json +++ b/locales/nb_NO.json @@ -30,7 +30,6 @@ "domains_available": "Tilgjengelige domener:", "done": "Ferdig", "downloading": "Laster ned…", - "dyndns_could_not_check_provide": "Kunne ikke sjekke om {provider} kan tilby {domain}.", "dyndns_could_not_check_available": "Kunne ikke sjekke om {domain} er tilgjengelig på {provider}.", "mail_domain_unknown": "Ukjent e-postadresse for domenet '{domain}'", "log_remove_on_failed_restore": "Fjern '{}' etter mislykket gjenoppretting fra sikkerhetskopiarkiv", diff --git a/locales/nl.json b/locales/nl.json index 5e612fc77..f5923fa9a 100644 --- a/locales/nl.json +++ b/locales/nl.json @@ -8,7 +8,6 @@ "app_extraction_failed": "Kan installatiebestanden niet uitpakken", "app_id_invalid": "Ongeldige app-id", "app_install_files_invalid": "Deze bestanden kunnen niet worden geïnstalleerd", - "app_manifest_invalid": "Ongeldig app-manifest", "app_not_installed": "{app} is niet geïnstalleerd", "app_removed": "{app} succesvol verwijderd", "app_sources_fetch_failed": "Kan bronbestanden niet ophalen, klopt de URL?", diff --git a/locales/oc.json b/locales/oc.json index a794f5e04..d9ec19b09 100644 --- a/locales/oc.json +++ b/locales/oc.json @@ -33,7 +33,6 @@ "app_change_url_identical_domains": "L’ancian e lo novèl coble domeni/camin son identics per {domain}{path}, pas res a far.", "app_change_url_success": "L’URL de l’aplicacion {app} es ara {domain}{path}", "app_extraction_failed": "Extraccion dels fichièrs d’installacion impossibla", - "app_manifest_invalid": "I a quicòm que truca amb lo manifest de l’aplicacion : {error}", "app_requirements_checking": "Verificacion dels paquets requesits per {app}...", "app_sources_fetch_failed": "Recuperacion dels fichièrs fonts impossibla, l’URL es corrècta ?", "app_unsupported_remote_type": "Lo tipe alonhat utilizat per l’aplicacion es pas suportat", @@ -110,7 +109,6 @@ "domains_available": "Domenis disponibles :", "done": "Acabat", "downloading": "Telecargament…", - "dyndns_could_not_check_provide": "Impossible de verificar se {provider} pòt provesir {domain}.", "dyndns_ip_update_failed": "Impossible d’actualizar l’adreça IP sul domeni DynDNS", "dyndns_ip_updated": "Vòstra adreça IP actualizada pel domeni DynDNS", "dyndns_key_generating": "La clau DNS es a se generar… pòt trigar una estona.", @@ -332,18 +330,15 @@ "regenconf_dry_pending_applying": "Verificacion de la configuracion que seriá estada aplicada a la categoria « {category} »…", "regenconf_failed": "Regeneracion impossibla de la configuracion per la(s) categoria(s) : {categories}", "regenconf_pending_applying": "Aplicacion de la configuracion en espèra per la categoria « {category} »…", - "tools_upgrade_cant_both": "Actualizacion impossibla del sistèma e de las aplicacions a l’encòp", "tools_upgrade_cant_hold_critical_packages": "Manteniment impossible dels paquets critiques…", "global_settings_setting_security_nginx_compatibility": "Solucion de compromés entre compatibilitat e seguretat pel servidor web NGINX Afècta los criptografs (e d’autres aspèctes ligats amb la seguretat)", "global_settings_setting_security_ssh_compatibility": "Solucion de compromés entre compatibilitat e seguretat pel servidor SSH. Afècta los criptografs (e d’autres aspèctes ligats amb la seguretat)", "global_settings_setting_security_postfix_compatibility": "Solucion de compromés entre compatibilitat e seguretat pel servidor Postfix. Afècta los criptografs (e d’autres aspèctes ligats amb la seguretat)", - "service_regen_conf_is_deprecated": "« yunohost service regen-conf » es despreciat ! Utilizatz « yunohost tools regen-conf » allòc.", "service_reload_failed": "Impossible de recargar lo servici « {service} »\n\nJornal d’audit recent : {logs}", "service_restart_failed": "Impossible de reaviar lo servici « {service} »\n\nJornal d’audit recent : {logs}", "service_reload_or_restart_failed": "Impossible de recargar o reaviar lo servici « {service} »\n\nJornal d’audit recent : {logs}", "regenconf_file_kept_back": "S’espèra que lo fichièr de configuracion « {conf} » siá suprimit per regen-conf (categoria {category} mas es estat mantengut.", "this_action_broke_dpkg": "Aquesta accion a copat dpkg/apt (los gestionaris de paquets del sistèma)… Podètz ensajar de resòlver aqueste problèma en vos connectant amb SSH e executant « sudo dpkg --configure -a ».", - "tools_upgrade_at_least_one": "Especificatz --apps O --system", "tools_upgrade_cant_unhold_critical_packages": "Se pòt pas quitar de manténer los paquets critics…", "tools_upgrade_regular_packages": "Actualizacion dels paquets « normals » (pas ligats a YunoHost)…", "tools_upgrade_special_packages": "Actualizacion dels paquets « especials » (ligats a YunoHost)…", @@ -480,7 +475,6 @@ "diagnosis_basesystem_hardware": "L’arquitectura del servidor es {virt} {arch}", "backup_archive_corrupted": "Sembla que l’archiu de la salvagarda « {archive} » es corromput : {error}", "diagnosis_domain_expires_in": "{domain} expiraà d’aquí {days} jorns.", - "migration_0015_cleaning_up": "Netejatge de la memòria cache e dels paquets pas mai necessaris…", "restore_already_installed_apps": "Restauracion impossibla de las aplicacions seguentas que son ja installadas : {apps}", "diagnosis_package_installed_from_sury": "D’unes paquets sistèma devon èsser meses a nivèl", "ask_user_domain": "Domeni d’utilizar per l’adreça de corrièl de l’utilizaire e lo compte XMPP", @@ -493,14 +487,6 @@ "app_label_deprecated": "Aquesta comanda es estada renduda obsolèta. Mercés d'utilizar lo nòva \"yunohost user permission update\" per gerir letiquetada de l'aplication", "additional_urls_already_removed": "URL addicionala {url} es ja estada elimida per la permission «#permission:s»", "additional_urls_already_added": "URL addicionadal «{url}'» es ja estada aponduda per la permission «{permission}»", - "migration_0015_yunohost_upgrade": "Aviada de la mesa a jorn de YunoHost...", - "migration_0015_main_upgrade": "Aviada de la mesa a nivèl generala...", - "migration_0015_patching_sources_list": "Mesa a jorn del fichièr sources.lists...", - "migration_0015_start": "Aviar la migracion cap a Buster", - "migration_description_0017_postgresql_9p6_to_11": "Migrar las basas de donadas de PostgreSQL 9.6 cap a 11", - "migration_description_0016_php70_to_php73_pools": "Migrar los fichièrs de configuracion php7.0 cap a php7.3", - "migration_description_0015_migrate_to_buster": "Mesa a nivèl dels sistèmas Debian Buster e YunoHost 4.x", - "migrating_legacy_permission_settings": "Migracion dels paramètres de permission ancians...", "log_app_action_run": "Executar l’accion de l’aplicacion « {} »", "diagnosis_basesystem_hardware_model": "Lo modèl del servidor es {model}", "backup_archive_cant_retrieve_info_json": "Obtencion impossibla de las informacions de l’archiu « {archive} »... Se pòt pas recuperar lo fichièr info.json (o es pas un fichièr json valid).", @@ -513,4 +499,4 @@ "diagnosis_domain_expiration_not_found": "Impossible de verificar la data d’expiracion d’unes domenis", "backup_create_size_estimation": "L’archiu contendrà apr’aquí {size} de donadas.", "app_restore_script_failed": "Una error s’es producha a l’interior del script de restauracion de l’aplicacion" -} +} \ No newline at end of file diff --git a/locales/pt.json b/locales/pt.json index d285948be..154ab700f 100644 --- a/locales/pt.json +++ b/locales/pt.json @@ -7,7 +7,6 @@ "app_extraction_failed": "Não foi possível extrair os arquivos para instalação", "app_id_invalid": "App ID invaĺido", "app_install_files_invalid": "Esses arquivos não podem ser instalados", - "app_manifest_invalid": "Manifesto da aplicação inválido: {error}", "app_not_installed": "Não foi possível encontrar {app} na lista de aplicações instaladas: {all_apps}", "app_removed": "{app} desinstalada", "app_sources_fetch_failed": "Não foi possível carregar os arquivos de código fonte, a URL está correta?", @@ -255,4 +254,4 @@ "diagnosis_backports_in_sources_list": "Parece que o apt (o gerenciador de pacotes) está configurado para usar o repositório backport. A não ser que você saiba o que você esteá fazendo, desencorajamos fortemente a instalação de pacotes de backports porque é provável que crie instabilidades ou conflitos no seu sistema.", "certmanager_cert_renew_success": "Certificado Let's Encrypt renovado para o domínio '{domain}'", "certmanager_warning_subdomain_dns_record": "O subdomínio '{subdomain}' não resolve para o mesmo IP que '{domain}'. Algumas funcionalidades não estarão disponíveis até que você conserte isto e regenere o certificado." -} +} \ No newline at end of file diff --git a/locales/ru.json b/locales/ru.json index 5c9a39322..58bd1846d 100644 --- a/locales/ru.json +++ b/locales/ru.json @@ -16,7 +16,6 @@ "app_id_invalid": "Неправильный ID приложения", "app_install_files_invalid": "Эти файлы не могут быть установлены", "app_location_unavailable": "Этот URL отсутствует или конфликтует с уже установленным приложением или приложениями:\n{apps}", - "app_manifest_invalid": "Недопустимый манифест приложения: {error}", "app_not_correctly_installed": "{app} , кажется, установлены неправильно", "app_not_installed": "{app} не найдено в списке установленных приложений: {all_apps}", "app_not_properly_removed": "{app} удалены неправильно", @@ -75,4 +74,4 @@ "yunohost_already_installed": "YunoHost уже установлен", "yunohost_configured": "Теперь YunoHost настроен", "upgrading_packages": "Обновление пакетов..." -} +} \ No newline at end of file diff --git a/locales/sl.json b/locales/sl.json index 0967ef424..9e26dfeeb 100644 --- a/locales/sl.json +++ b/locales/sl.json @@ -1 +1 @@ -{} +{} \ No newline at end of file diff --git a/locales/uk.json b/locales/uk.json index 4baf6d20f..00df81891 100644 --- a/locales/uk.json +++ b/locales/uk.json @@ -1,6 +1,5 @@ { "app_manifest_install_ask_domain": "Оберіть домен, в якому треба встановити цей застосунок", - "app_manifest_invalid": "Щось не так з маніфестом застосунку: {error}", "app_location_unavailable": "Ця URL-адреса або недоступна, або конфліктує з уже встановленим застосунком (застосунками):\n{apps}", "app_label_deprecated": "Ця команда застаріла! Будь ласка, використовуйте нову команду 'yunohost user permission update' для управління заголовком застосунку.", "app_make_default_location_already_used": "Неможливо зробити '{app}' типовим застосунком на домені, '{domain}' вже використовується '{other_app}'", @@ -40,7 +39,6 @@ "service_reload_failed": "Не вдалося перезавантажити службу '{service}'\n\nОстанні журнали служби: {logs}", "service_removed": "Служба '{service}' вилучена", "service_remove_failed": "Не вдалося видалити службу '{service}'", - "service_regen_conf_is_deprecated": "'yunohost service regen-conf' застарів! Будь ласка, використовуйте 'yunohost tools regen-conf' замість цього.", "service_enabled": "Служба '{service}' тепер буде автоматично запускатися під час завантаження системи.", "service_enable_failed": "Неможливо змусити службу '{service}' автоматично запускатися під час завантаження.\n\nНедавні журнали служби: {logs}", "service_disabled": "Служба '{service}' більше не буде запускатися під час завантаження системи.", @@ -52,7 +50,6 @@ "service_description_rspamd": "Фільтри спаму і інші функції, пов'язані з е-поштою", "service_description_redis-server": "Спеціалізована база даних, яка використовується для швидкого доступу до даних, черги завдань і зв'язку між програмами", "service_description_postfix": "Використовується для надсилання та отримання е-пошти", - "service_description_php7.3-fpm": "Запускає застосунки, написані мовою програмування PHP за допомогою NGINX", "service_description_nginx": "Обслуговує або надає доступ до всіх вебсайтів, розміщених на вашому сервері", "service_description_mysql": "Зберігає дані застосунків (база даних SQL)", "service_description_metronome": "Управління обліковими записами миттєвих повідомлень XMPP", @@ -162,39 +159,10 @@ "migrations_dependencies_not_satisfied": "Запустіть ці міграції: '{dependencies_id}', перед міграцією {id}.", "migrations_cant_reach_migration_file": "Не вдалося отримати доступ до файлів міграцій за шляхом '%s'", "migrations_already_ran": "Наступні міграції вже виконано: {ids}", - "migration_0019_slapd_config_will_be_overwritten": "Схоже, що ви вручну відредагували конфігурацію slapd. Для цього критичного переходу YunoHost повинен примусово оновити конфігурацію slapd. Оригінальні файли будуть збережені в {conf_backup_folder}.", - "migration_0019_add_new_attributes_in_ldap": "Додавання нових атрибутів для дозволів у базі даних LDAP", - "migration_0018_failed_to_reset_legacy_rules": "Не вдалося скинути спадкові правила iptables: {error}", - "migration_0018_failed_to_migrate_iptables_rules": "Не вдалося перенести спадкові правила iptables в nftables: {error}", - "migration_0017_not_enough_space": "Звільніть достатньо місця в {path} для запуску міграції.", - "migration_0017_postgresql_11_not_installed": "PostgreSQL 9.6 встановлено, але не PostgreSQL 11‽ Можливо, у вашій системі відбулося щось дивне :(...", - "migration_0017_postgresql_96_not_installed": "PostgreSQL не встановлено у вашій системі. Нічого не потрібно робити.", - "migration_0015_weak_certs": "Було виявлено, що такі сертифікати все ще використовують слабкі алгоритми підпису і повинні бути оновлені для сумісності з наступною версією nginx: {certs}", - "migration_0015_cleaning_up": "Очищення кеш-пам'яті і пакетів, які більше не потрібні...", - "migration_0015_specific_upgrade": "Початок оновлення системних пакетів, які повинні бути оновлені незалежно...", - "migration_0015_modified_files": "Зверніть увагу, що такі файли були змінені вручну і можуть бути перезаписані після оновлення: {manually_modified_files}", - "migration_0015_problematic_apps_warning": "Зверніть увагу, що були виявлені наступні, можливо, проблемні встановлені застосунки. Схоже, що вони не були встановлені з каталогу застосунків YunoHost або не зазначені як «робочі». Отже, не можна гарантувати, що вони будуть працювати після оновлення: {problematic_apps}", - "migration_0015_general_warning": "Будь ласка, зверніть увагу, що ця міграція є делікатною операцією. Команда YunoHost зробила все можливе, щоб перевірити і протестувати її, але міграція все ще може порушити частина системи або її застосунків.\n\nТому рекомендовано:\n - Виконати резервне копіювання всіх важливих даних або застосунків. Подробиці на сайті https://yunohost.org/backup; \n - Наберіться терпіння після запуску міграції: В залежності від вашого з'єднання з Інтернетом і апаратного забезпечення, оновлення може зайняти до декількох годин.", - "migration_0015_system_not_fully_up_to_date": "Ваша система не повністю оновлена. Будь ласка, виконайте регулярне оновлення перед запуском міграції на Buster.", - "migration_0015_not_enough_free_space": "Вільного місця в /var/ досить мало! У вас повинно бути не менше 1 ГБ вільного місця, щоб запустити цю міграцію.", - "migration_0015_not_stretch": "Поточний дистрибутив Debian не є Stretch!", - "migration_0015_yunohost_upgrade": "Початок оновлення ядра YunoHost...", - "migration_0015_still_on_stretch_after_main_upgrade": "Щось пішло не так під час основного оновлення, система, схоже, все ще знаходиться на Debian Stretch", - "migration_0015_main_upgrade": "Початок основного оновлення...", - "migration_0015_patching_sources_list": "Виправлення sources.lists...", - "migration_0015_start": "Початок міграції на Buster", - "migration_update_LDAP_schema": "Оновлення схеми LDAP...", "migration_ldap_rollback_success": "Система відкотилася.", "migration_ldap_migration_failed_trying_to_rollback": "Не вдалося виконати міграцію... Пробуємо відкотити систему.", "migration_ldap_can_not_backup_before_migration": "Не вдалося завершити резервне копіювання системи перед невдалою міграцією. Помилка: {error}", "migration_ldap_backup_before_migration": "Створення резервної копії бази даних LDAP і налаштування застосунків перед фактичною міграцією.", - "migration_description_0020_ssh_sftp_permissions": "Додавання підтримки дозволів SSH і SFTP", - "migration_description_0019_extend_permissions_features": "Розширення/переробка системи управління дозволами застосунків", - "migration_description_0018_xtable_to_nftable": "Перенесення старих правил мережевого трафіку в нову систему nftable", - "migration_description_0017_postgresql_9p6_to_11": "Перенесення баз даних з PostgreSQL 9.6 на 11", - "migration_description_0016_php70_to_php73_pools": "Перенесення php7.0-fpm 'pool' conf файлів на php7.3", - "migration_description_0015_migrate_to_buster": "Оновлення системи до Debian Buster і YunoHost 4.x", - "migrating_legacy_permission_settings": "Перенесення спадкових налаштувань дозволів...", "main_domain_changed": "Основний домен було змінено", "main_domain_change_failed": "Неможливо змінити основний домен", "mail_unavailable": "Ця е-пошта зарезервована і буде автоматично виділена найпершому користувачеві", @@ -318,13 +286,11 @@ "dyndns_ip_updated": "Вашу IP-адресу в DynDNS оновлено", "dyndns_ip_update_failed": "Не вдалося оновити IP-адресу в DynDNS", "dyndns_could_not_check_available": "Не вдалося перевірити, чи {domain} доступний у {provider}.", - "dyndns_could_not_check_provide": "Не вдалося перевірити, чи може {provider} надати {domain}.", "dpkg_lock_not_available": "Ця команда не може бути виконана прямо зараз, тому що інша програма, схоже, використовує блокування dpkg (системного менеджера пакетів)", "dpkg_is_broken": "Ви не можете зробити це прямо зараз, тому що dpkg/APT (системні менеджери пакетів), схоже, знаходяться в зламаному стані... Ви можете спробувати вирішити цю проблему, під'єднавшись через SSH і виконавши `sudo apt install --fix-broken` та/або `sudo dpkg --configure -a`.", "downloading": "Завантаження…", "done": "Готово", "domains_available": "Доступні домени:", - "domain_name_unknown": "Домен '{domain}' невідомий", "domain_uninstall_app_first": "Ці застосунки все ще встановлені на вашому домені:\n{apps}\n\nВидаліть їх за допомогою 'yunohost app remove the_app_id' або перемістіть їх на інший домен за допомогою 'yunohost app change-url the_app_id', перш ніж приступити до вилучення домену", "domain_remove_confirm_apps_removal": "Вилучення цього домену призведе до вилучення таких застосунків:\n{apps}\n\nВи впевнені, що хочете це зробити? [{answers}]", "domain_hostname_failed": "Неможливо встановити нову назву хоста. Це може викликати проблеми в подальшому (можливо, все буде в порядку).", @@ -356,7 +322,6 @@ "diagnosis_http_connection_error": "Помилка з'єднання: не вдалося з'єднатися із запитуваним доменом, швидше за все, він недоступний.", "diagnosis_http_timeout": "При спробі зв'язатися з вашим сервером ззовні стався тайм-аут. Він здається недоступним.
1. Найбільш поширеною причиною цієї проблеми є те, що порт 80 (і 443) неправильно перенаправлено на ваш сервер .
2. Ви також повинні переконатися, що служба nginx запущена
3.На більш складних установках: переконайтеся, що немає фаєрвола або зворотного проксі.", "diagnosis_http_ok": "Домен {domain} доступний по HTTP поза локальною мережею.", - "diagnosis_http_localdomain": "Домен {domain} з .local TLD не може бути доступний ззовні локальної мережі.", "diagnosis_http_could_not_diagnose_details": "Помилка: {error}", "diagnosis_http_could_not_diagnose": "Не вдалося діагностувати досяжність доменів ззовні в IPv{ipversion}.", "diagnosis_http_hairpinning_issue_details": "Можливо, це пов'язано з коробкою/маршрутизатором вашого інтернет-провайдера. В результаті, люди ззовні вашої локальної мережі зможуть отримати доступ до вашого сервера, як і очікувалося, але не люди зсередини локальної мережі (як ви, ймовірно?) При використанні доменного імені або глобального IP. Можливо, ви зможете поліпшити ситуацію, глянувши https://yunohost.org/dns_local_network ", @@ -446,8 +411,6 @@ "tools_upgrade_regular_packages": "Тепер оновлюємо 'звичайні' (не пов'язані з yunohost) пакети…", "tools_upgrade_cant_unhold_critical_packages": "Не вдалося розтримати критичні пакети…", "tools_upgrade_cant_hold_critical_packages": "Не вдалося утримати критичні пакети…", - "tools_upgrade_cant_both": "Неможливо оновити систему і застосунки одночасно", - "tools_upgrade_at_least_one": "Будь ласка, вкажіть 'apps', або 'system'", "this_action_broke_dpkg": "Ця дія порушила dpkg/APT (системні менеджери пакетів)... Ви можете спробувати вирішити цю проблему, під'єднавшись по SSH і запустивши `sudo apt install --fix-broken` та/або `sudo dpkg --configure -a`.", "system_username_exists": "Ім'я користувача вже існує в списку користувачів системи", "system_upgraded": "Систему оновлено", @@ -669,13 +632,10 @@ "config_validate_url": "Вебадреса має бути дійсною", "config_version_not_supported": "Версії конфігураційної панелі '{version}' не підтримуються.", "danger": "Небезпека:", - "file_extension_not_accepted": "Файл '{path}' відхиляється, бо його розширення не входить в число прийнятих розширень: {accept}", "invalid_number_min": "Має бути більшим за {min}", "invalid_number_max": "Має бути меншим за {max}", "log_app_config_set": "Застосувати конфігурацію до застосунку '{}'", "service_not_reloading_because_conf_broken": "Неможливо перезавантажити/перезапустити службу '{name}', тому що її конфігурацію порушено: {errors}", - "app_argument_password_help_optional": "Введіть один пробіл, щоб очистити пароль", - "app_argument_password_help_keep": "Натисніть Enter, щоб зберегти поточне значення", "domain_registrar_is_not_configured": "Реєстратор ще не конфігуровано для домену {domain}.", "domain_dns_push_not_applicable": "Функція автоматичної конфігурації DNS не застосовується до домену {domain}. Вам слід вручну конфігурувати записи DNS відповідно до документації за адресою https://yunohost.org/dns_config.", "domain_dns_registrar_not_supported": "YunoHost не зміг автоматично виявити реєстратора, який обробляє цей домен. Вам слід вручну конфігурувати записи DNS відповідно до документації за адресою https://yunohost.org/dns.", @@ -711,4 +671,4 @@ "ldap_attribute_already_exists": "Атрибут LDAP '{attribute}' вже існує зі значенням '{value}'", "domain_dns_push_already_up_to_date": "Записи вже оновлені, нічого не потрібно робити.", "domain_unknown": "Домен '{domain}' є невідомим" -} +} \ No newline at end of file diff --git a/locales/zh_Hans.json b/locales/zh_Hans.json index fa3b7bb03..4b3067909 100644 --- a/locales/zh_Hans.json +++ b/locales/zh_Hans.json @@ -137,7 +137,6 @@ "additional_urls_already_removed": "权限'{permission}'的其他URL中已经删除了附加URL'{url}'", "app_manifest_install_ask_path": "选择安装此应用的路径", "app_manifest_install_ask_domain": "选择应安装此应用程序的域", - "app_manifest_invalid": "应用清单错误: {error}", "app_location_unavailable": "该URL不可用,或与已安装的应用冲突:\n{apps}", "app_label_deprecated": "不推荐使用此命令!请使用新命令 'yunohost user permission update'来管理应用标签。", "app_make_default_location_already_used": "无法将'{app}' 设置为域上的默认应用,'{other_app}'已在使用'{domain}'", @@ -218,7 +217,6 @@ "service_description_rspamd": "过滤垃圾邮件和其他与电子邮件相关的功能", "service_description_redis-server": "用于快速数据访问,任务队列和程序之间通信的专用数据库", "service_description_postfix": "用于发送和接收电子邮件", - "service_description_php7.3-fpm": "使用NGINX运行用PHP编写的应用程序", "service_description_nginx": "为你的服务器上托管的所有网站提供服务或访问", "service_description_mysql": "存储应用程序数据(SQL数据库)", "service_description_metronome": "管理XMPP即时消息传递帐户", @@ -235,7 +233,6 @@ "service_reload_failed": "无法重新加载服务'{service}'\n\n最近的服务日志:{logs}", "service_removed": "服务 '{service}' 已删除", "service_remove_failed": "无法删除服务'{service}'", - "service_regen_conf_is_deprecated": "不建议使用'yunohost service regen-conf' ! 请改用'yunohost tools regen-conf'。", "service_enabled": "现在,服务'{service}' 将在系统引导过程中自动启动。", "service_enable_failed": "无法使服务 '{service}'在启动时自动启动。\n\n最近的服务日志:{logs}", "service_disabled": "系统启动时,服务 '{service}' 将不再启动。", @@ -243,8 +240,6 @@ "tools_upgrade_regular_packages": "现在正在升级 'regular' (与yunohost无关)的软件包…", "tools_upgrade_cant_unhold_critical_packages": "无法解压关键软件包…", "tools_upgrade_cant_hold_critical_packages": "无法保存重要软件包…", - "tools_upgrade_cant_both": "无法同时升级系统和应用程序", - "tools_upgrade_at_least_one": "请指定'apps', 或 'system'", "this_action_broke_dpkg": "此操作破坏了dpkg / APT(系统软件包管理器)...您可以尝试通过SSH连接并运行`sudo apt install --fix-broken`和/或`sudo dpkg --configure -a`来解决此问题。", "system_username_exists": "用户名已存在于系统用户列表中", "system_upgraded": "系统升级", @@ -353,13 +348,11 @@ "dyndns_ip_updated": "在DynDNS上更新了您的IP", "dyndns_ip_update_failed": "无法将IP地址更新到DynDNS", "dyndns_could_not_check_available": "无法检查{provider}上是否可用 {domain}。", - "dyndns_could_not_check_provide": "无法检查{provider}是否可以提供 {domain}.", "dpkg_lock_not_available": "该命令现在无法运行,因为另一个程序似乎正在使用dpkg锁(系统软件包管理器)", "dpkg_is_broken": "您现在不能执行此操作,因为dpkg / APT(系统软件包管理器)似乎处于损坏状态……您可以尝试通过SSH连接并运行sudo apt install --fix-broken和/或 sudo dpkg --configure-a 来解决此问题.", "downloading": "下载中…", "done": "完成", "domains_available": "可用域:", - "domain_name_unknown": "域'{domain}'未知", "domain_uninstall_app_first": "这些应用程序仍安装在您的域中:\n{apps}\n\n请先使用 'yunohost app remove the_app_id' 将其卸载,或使用 'yunohost app change-url the_app_id'将其移至另一个域,然后再继续删除域", "domain_remove_confirm_apps_removal": "删除该域将删除这些应用程序:\n{apps}\n\n您确定要这样做吗? [{answers}]", "domain_hostname_failed": "无法设置新的主机名。稍后可能会引起问题(可能没问题)。", @@ -571,39 +564,10 @@ "migrations_dependencies_not_satisfied": "在迁移{id}之前运行以下迁移: '{dependencies_id}'。", "migrations_cant_reach_migration_file": "无法访问路径'%s'处的迁移文件", "migrations_already_ran": "这些迁移已经完成: {ids}", - "migration_0019_slapd_config_will_be_overwritten": "好像您手动编辑了slapd配置。对于此关键迁移,YunoHost需要强制更新slapd配置。原始文件将备份在{conf_backup_folder}中。", - "migration_0019_add_new_attributes_in_ldap": "在LDAP数据库中添加权限的新属性", - "migration_0018_failed_to_reset_legacy_rules": "无法重置旧版iptables规则: {error}", - "migration_0018_failed_to_migrate_iptables_rules": "无法将旧的iptables规则迁移到nftables: {error}", - "migration_0017_not_enough_space": "在{path}中提供足够的空间来运行迁移。", - "migration_0017_postgresql_11_not_installed": "已安装PostgreSQL 9.6,但未安装PostgreSQL11?您的系统上可能发生了一些奇怪的事情:(...", - "migration_0017_postgresql_96_not_installed": "PostgreSQL未安装在您的系统上。无事可做。", - "migration_0015_weak_certs": "发现以下证书仍然使用弱签名算法,并且必须升级以与下一版本的nginx兼容: {certs}", - "migration_0015_cleaning_up": "清理不再有用的缓存和软件包...", - "migration_0015_specific_upgrade": "开始升级需要独立升级的系统软件包...", - "migration_0015_modified_files": "请注意,发现以下文件是手动修改的,并且在升级后可能会被覆盖: {manually_modified_files}", - "migration_0015_problematic_apps_warning": "请注意,已检测到以下可能有问题的已安装应用程序。看起来好像那些不是从YunoHost应用程序目录中安装的,或者没有标记为“正在运行”。因此,不能保证它们在升级后仍然可以使用: {problematic_apps}", - "migration_0015_general_warning": "请注意,此迁移是一项微妙的操作。YunoHost团队竭尽全力对其进行检查和测试,但迁移仍可能会破坏系统或其应用程序的某些部分。\n\n因此,建议:\n -对任何关键数据或应用程序执行备份。有关更多信息,请访问https://yunohost.org/backup;\n -启动迁移后要耐心:根据您的Internet连接和硬件,升级所有内容最多可能需要几个小时。", - "migration_0015_system_not_fully_up_to_date": "您的系统不是最新的。请先执行常规升级,然后再运行向Buster的迁移。", - "migration_0015_not_enough_free_space": "/var/中的可用空间非常低!您应该至少有1GB的可用空间来运行此迁移。", - "migration_0015_not_stretch": "当前的Debian发行版不是Stretch!", - "migration_0015_yunohost_upgrade": "正在启动YunoHost核心升级...", - "migration_0015_still_on_stretch_after_main_upgrade": "在主要升级期间出了点问题,系统似乎仍在Debian Stretch上", - "migration_0015_main_upgrade": "正在开始主要升级...", - "migration_0015_patching_sources_list": "修补sources.lists ...", - "migration_0015_start": "开始迁移至Buster", - "migration_update_LDAP_schema": "正在更新LDAP模式...", "migration_ldap_rollback_success": "系统回滚。", "migration_ldap_migration_failed_trying_to_rollback": "无法迁移...试图回滚系统。", "migration_ldap_can_not_backup_before_migration": "迁移失败之前,无法完成系统的备份。错误: {error}", "migration_ldap_backup_before_migration": "在实际迁移之前,请创建LDAP数据库和应用程序设置的备份。", - "migration_description_0020_ssh_sftp_permissions": "添加SSH和SFTP权限支持", - "migration_description_0019_extend_permissions_features": "扩展/修改应用程序的权限管理系统", - "migration_description_0018_xtable_to_nftable": "将旧的网络流量规则迁移到新的nftable系统", - "migration_description_0017_postgresql_9p6_to_11": "将数据库从PostgreSQL 9.6迁移到11", - "migration_description_0016_php70_to_php73_pools": "将php7.0-fpm'pool'conf文件迁移到php7.3", - "migration_description_0015_migrate_to_buster": "将系统升级到Debian Buster和YunoHost 4.x", - "migrating_legacy_permission_settings": "正在迁移旧版权限设置...", "main_domain_changed": "主域已更改", "main_domain_change_failed": "无法更改主域", "mail_unavailable": "该电子邮件地址是保留的,并且将自动分配给第一个用户", @@ -627,7 +591,7 @@ "log_user_delete": "删除用户'{}'", "log_user_create": "添加用户'{}'", "domain_registrar_is_not_configured": "尚未为域 {domain} 配置注册商。", - "domain_dns_push_not_applicable": "的自动DNS配置的特征是不适用域{域}。您应该按照 https://yunohost.org/dns_config 上的文档手动配置DNS 记录。", + "domain_dns_push_not_applicable": "的自动DNS配置的特征是不适用域{domain}。您应该按照 https://yunohost.org/dns_config 上的文档手动配置DNS 记录。", "disk_space_not_sufficient_update": "没有足够的磁盘空间来更新此应用程序", "diagnosis_high_number_auth_failures": "最近出现了大量可疑的失败身份验证。您的fail2ban正在运行且配置正确,或使用自定义端口的SSH作为https://yunohost.org/解释的安全性。", "diagnosis_apps_not_in_app_catalog": "此应用程序不在 YunoHost 的应用程序目录中。如果它过去有被删除过,您应该考虑卸载此应用程,因为它不会更新,并且可能会损害您系统的完整和安全性。", @@ -638,7 +602,7 @@ "config_unknown_filter_key": "该过滤器钥匙“{filter_key}”有误。", "diagnosis_apps_outdated_ynh_requirement": "此应用程序的安装 版本只需要 yunohost >= 2.x,这往往表明它与推荐的打包实践和帮助程序不是最新的。你真的应该考虑更新它。", "disk_space_not_sufficient_install": "没有足够的磁盘空间来安装此应用程序", - "config_apply_failed": "应用新配置 失败:{错误}", + "config_apply_failed": "应用新配置 失败:{error}", "config_cant_set_value_on_section": "无法在整个配置部分设置单个值 。", "config_validate_color": "是有效的 RGB 十六进制颜色", "config_validate_date": "有效日期格式为YYYY-MM-DD", @@ -651,4 +615,4 @@ "diagnosis_apps_deprecated_practices": "此应用程序的安装 版本仍然使用一些超旧的弃用打包原则。推荐您升级它。", "diagnosis_apps_issue": "发现应用{ app } 存在问题", "diagnosis_description_apps": "应用" -} +} \ No newline at end of file diff --git a/maintenance/autofix_locale_format.py b/maintenance/autofix_locale_format.py new file mode 100644 index 000000000..400704ddb --- /dev/null +++ b/maintenance/autofix_locale_format.py @@ -0,0 +1,169 @@ +import os +import re +import json +import glob +from collections import OrderedDict + +ROOT = os.path.dirname(__file__) + "/../" +LOCALE_FOLDER = ROOT + "/locales/" + +# List all locale files (except en.json being the ref) +TRANSLATION_FILES = glob.glob(LOCALE_FOLDER + "*.json") +TRANSLATION_FILES = [filename.split("/")[-1] for filename in TRANSLATION_FILES] +print(LOCALE_FOLDER) +TRANSLATION_FILES.remove("en.json") + +REFERENCE_FILE = LOCALE_FOLDER + "en.json" + + +def autofix_i18n_placeholders(): + def _autofix_i18n_placeholders(locale_file): + """ + This tries for magically fix mismatch between en.json format and other.json format + e.g. an i18n string with: + source: "Lorem ipsum {some_var}" + fr: "Lorem ipsum {une_variable}" + (ie the keyword in {} was translated but shouldnt have been) + """ + + this_locale = json.loads(open(LOCALE_FOLDER + locale_file).read()) + fixed_stuff = False + reference = json.loads(open(REFERENCE_FILE).read()) + + # We iterate over all keys/string in en.json + for key, string in reference.items(): + + # Ignore check if there's no translation yet for this key + if key not in this_locale: + continue + + # Then we check that every "{stuff}" (for python's .format()) + # should also be in the translated string, otherwise the .format + # will trigger an exception! + subkeys_in_ref = [k[0] for k in re.findall(r"{(\w+)(:\w)?}", string)] + subkeys_in_this_locale = [ + k[0] for k in re.findall(r"{(\w+)(:\w)?}", this_locale[key]) + ] + + if set(subkeys_in_ref) != set(subkeys_in_this_locale) and ( + len(subkeys_in_ref) == len(subkeys_in_this_locale) + ): + for i, subkey in enumerate(subkeys_in_ref): + this_locale[key] = this_locale[key].replace( + "{%s}" % subkeys_in_this_locale[i], "{%s}" % subkey + ) + fixed_stuff = True + + # Validate that now it's okay ? + subkeys_in_ref = [k[0] for k in re.findall(r"{(\w+)(:\w)?}", string)] + subkeys_in_this_locale = [ + k[0] for k in re.findall(r"{(\w+)(:\w)?}", this_locale[key]) + ] + if any(k not in subkeys_in_ref for k in subkeys_in_this_locale): + raise Exception("""\n +========================== +Format inconsistency for string {key} in {locale_file}:" +en.json -> {string} +{locale_file} -> {translated_string} +Please fix it manually ! + """.format( + key=key, + string=string.encode("utf-8"), + locale_file=locale_file, + translated_string=this_locale[key].encode("utf-8"), + )) + + if fixed_stuff: + json.dump( + this_locale, + open(LOCALE_FOLDER + locale_file, "w"), + indent=4, + ensure_ascii=False, + ) + + for locale_file in TRANSLATION_FILES: + _autofix_i18n_placeholders(locale_file) + + +def autofix_orthotypography_and_standardized_words(): + + def reformat(lang, transformations): + + locale = open(f"../locales/{lang}.json").read() + for pattern, replace in transformations.items(): + locale = re.compile(pattern).sub(replace, locale) + + open(f"../locales/{lang}.json", "w").write(locale) + + ###################################################### + + godamn_spaces_of_hell = [ + "\u00a0", + "\u2000", + "\u2001", + "\u2002", + "\u2003", + "\u2004", + "\u2005", + "\u2006", + "\u2007", + "\u2008", + "\u2009", + "\u200A", + "\u202f", + "\u202F", + "\u3000", + ] + + transformations = {s: " " for s in godamn_spaces_of_hell} + transformations.update( + { + "…": "...", + } + ) + + reformat("en", transformations) + + ###################################################### + + transformations.update( + { + "courriel": "email", + "e-mail": "email", + "Courriel": "Email", + "E-mail": "Email", + "« ": "'", + "«": "'", + " »": "'", + "»": "'", + "’": "'", + # r"$(\w{1,2})'|( \w{1,2})'": r"\1\2’", + } + ) + + reformat("fr", transformations) + + +def remove_stale_translated_strings(): + + reference = json.loads(open(LOCALE_FOLDER + "en.json").read()) + + for locale_file in TRANSLATION_FILES: + + print(locale_file) + this_locale = json.loads( + open(LOCALE_FOLDER + locale_file).read(), object_pairs_hook=OrderedDict + ) + this_locale_fixed = {k: v for k, v in this_locale.items() if k in reference} + + json.dump( + this_locale_fixed, + open(LOCALE_FOLDER + locale_file, "w"), + indent=4, + ensure_ascii=False, + ) + + +autofix_orthotypography_and_standardized_words() +remove_stale_translated_strings() +autofix_i18n_placeholders() diff --git a/maintenance/make_changelog.sh b/maintenance/make_changelog.sh new file mode 100644 index 000000000..038d4741d --- /dev/null +++ b/maintenance/make_changelog.sh @@ -0,0 +1,36 @@ +VERSION="?" +RELEASE="testing" +REPO=$(basename $(git rev-parse --show-toplevel)) +REPO_URL=$(git remote get-url origin) +ME=$(git config --global --get user.name) +EMAIL=$(git config --global --get user.email) + +LAST_RELEASE=$(git tag --list | grep debian | tail -n 1) + +echo "$REPO ($VERSION) $RELEASE; urgency=low" +echo "" + +git log $LAST_RELEASE.. -n 10000 --first-parent --pretty=tformat:' - %b%s (%h)' \ +| sed -E "s@Merge .*#([0-9]+).*\$@ \([#\1]\($REPO_URL/pull/\1\)\)@g" \ +| grep -v "Update from Weblate" \ +| tac + +TRANSLATIONS=$(git log $LAST_RELEASE... -n 10000 --pretty=format:"%s" \ + | grep "Translated using Weblate" \ + | sed -E "s/Translated using Weblate \((.*)\)/\1/g" \ + | sort | uniq | tr '\n' ', ' | sed -e 's/,$//g' -e 's/,/, /g') +[[ -z "$TRANSLATIONS" ]] || echo " - [i18n] Translations updated for $TRANSLATIONS" + +echo "" +CONTRIBUTORS=$(git logc $LAST_RELEASE... -n 10000 --pretty=format:"%an" \ + | sort | uniq | grep -v "$ME" \ + | tr '\n' ', ' | sed -e 's/,$//g' -e 's/,/, /g') +[[ -z "$CONTRIBUTORS" ]] || echo " Thanks to all contributors <3 ! ($CONTRIBUTORS)" +echo "" +echo " -- $ME <$EMAIL> $(date -R)" +echo "" + + + +# PR links can be converted to regular texts using : sed -E 's@\[(#[0-9]*)\]\([^ )]*\)@\1@g' +# Or readded with sed -E 's@#([0-9]*)@[YunoHost#\1](https://github.com/yunohost/yunohost/pull/\1)@g' | sed -E 's@\((\w+)\)@([YunoHost/\1](https://github.com/yunohost/yunohost/commit/\1))@g' diff --git a/tests/test_i18n_keys.py b/maintenance/missing_i18n_keys.py similarity index 71% rename from tests/test_i18n_keys.py rename to maintenance/missing_i18n_keys.py index ec582ba72..3dbca8027 100644 --- a/tests/test_i18n_keys.py +++ b/maintenance/missing_i18n_keys.py @@ -1,12 +1,17 @@ # -*- coding: utf-8 -*- +import toml import os import re import glob import json import yaml import subprocess -import toml +import sys + +ROOT = os.path.dirname(__file__) + "/../" +LOCALE_FOLDER = ROOT + "/locales/" +REFERENCE_FILE = LOCALE_FOLDER + "en.json" ############################################################################### # Find used keys in python code # @@ -25,12 +30,12 @@ def find_expected_string_keys(): p3 = re.compile(r"YunohostValidationError\(\n*\s*[\'\"](\w+)[\'\"]") p4 = re.compile(r"# i18n: [\'\"]?(\w+)[\'\"]?") - python_files = glob.glob("src/*.py") - python_files.extend(glob.glob("src/utils/*.py")) - python_files.extend(glob.glob("src/migrations/*.py")) - python_files.extend(glob.glob("src/authenticators/*.py")) - python_files.extend(glob.glob("src/diagnosers/*.py")) - python_files.append("bin/yunohost") + python_files = glob.glob(ROOT + "src/*.py") + python_files.extend(glob.glob(ROOT + "src/utils/*.py")) + python_files.extend(glob.glob(ROOT + "src/migrations/*.py")) + python_files.extend(glob.glob(ROOT + "src/authenticators/*.py")) + python_files.extend(glob.glob(ROOT + "src/diagnosers/*.py")) + python_files.append(ROOT + "bin/yunohost") for python_file in python_files: content = open(python_file).read() @@ -52,7 +57,9 @@ def find_expected_string_keys(): # For each diagnosis, try to find strings like "diagnosis_stuff_foo" (c.f. diagnosis summaries) # Also we expect to have "diagnosis_description_" for each diagnosis p3 = re.compile(r"[\"\'](diagnosis_[a-z]+_\w+)[\"\']") - for python_file in glob.glob("src/diagnosers/*.py"): + for python_file in glob.glob(ROOT + "src/diagnosers/*.py"): + if "__init__.py" in python_file: + continue content = open(python_file).read() for m in p3.findall(content): if m.endswith("_"): @@ -64,14 +71,14 @@ def find_expected_string_keys(): ] # For each migration, expect to find "migration_description_" - for path in glob.glob("src/migrations/*.py"): + for path in glob.glob(ROOT + "src/migrations/*.py"): if "__init__" in path: continue yield "migration_description_" + os.path.basename(path)[:-3] # For each default service, expect to find "service_description_" for service, info in yaml.safe_load( - open("conf/yunohost/services.yml") + open(ROOT + "conf/yunohost/services.yml") ).items(): if info is None: continue @@ -80,7 +87,7 @@ def find_expected_string_keys(): # For all unit operations, expect to find "log_" # A unit operation is created either using the @is_unit_operation decorator # or using OperationLogger( - cmd = "grep -hr '@is_unit_operation' src/ -A3 2>/dev/null | grep '^def' | sed -E 's@^def (\\w+)\\(.*@\\1@g'" + cmd = f"grep -hr '@is_unit_operation' {ROOT}/src/ -A3 2>/dev/null | grep '^def' | sed -E 's@^def (\\w+)\\(.*@\\1@g'" for funcname in ( subprocess.check_output(cmd, shell=True).decode("utf-8").strip().split("\n") ): @@ -95,14 +102,14 @@ def find_expected_string_keys(): # Global settings descriptions # Will be on a line like : ("service.ssh.allow_deprecated_dsa_hostkey", {"type": "bool", ... p5 = re.compile(r" \(\n*\s*[\"\'](\w[\w\.]+)[\"\'],") - content = open("src/settings.py").read() + content = open(ROOT + "src/settings.py").read() for m in ( "global_settings_setting_" + s.replace(".", "_") for s in p5.findall(content) ): yield m # Keys for the actionmap ... - for category in yaml.safe_load(open("share/actionsmap.yml")).values(): + for category in yaml.safe_load(open(ROOT + "share/actionsmap.yml")).values(): if "actions" not in category.keys(): continue for action in category["actions"].values(): @@ -130,13 +137,13 @@ def find_expected_string_keys(): yield "backup_applying_method_%s" % method yield "backup_method_%s_finished" % method - registrars = toml.load(open("share/registrar_list.toml")) + registrars = toml.load(open(ROOT + "share/registrar_list.toml")) supported_registrars = ["ovh", "gandi", "godaddy"] for registrar in supported_registrars: for key in registrars[registrar].keys(): yield f"domain_config_{key}" - domain_config = toml.load(open("share/config_domain.toml")) + domain_config = toml.load(open(ROOT + "share/config_domain.toml")) for panel in domain_config.values(): if not isinstance(panel, dict): continue @@ -149,41 +156,53 @@ def find_expected_string_keys(): yield f"domain_config_{key}" -############################################################################### -# Load en locale json keys # -############################################################################### - - -def keys_defined_for_en(): - return json.loads(open("locales/en.json").read()).keys() - - ############################################################################### # Compare keys used and keys defined # ############################################################################### +if len(sys.argv) <= 1 or sys.argv[1] not in ["--check", "--fix"]: + print("Please specify --check or --fix") + sys.exit(1) expected_string_keys = set(find_expected_string_keys()) -keys_defined = set(keys_defined_for_en()) +keys_defined_for_en = json.loads(open(REFERENCE_FILE).read()).keys() +keys_defined = set(keys_defined_for_en) +unused_keys = keys_defined.difference(expected_string_keys) +unused_keys = sorted(unused_keys) -def test_undefined_i18n_keys(): - undefined_keys = expected_string_keys.difference(keys_defined) - undefined_keys = sorted(undefined_keys) +undefined_keys = expected_string_keys.difference(keys_defined) +undefined_keys = sorted(undefined_keys) + +mode = sys.argv[1].strip("-") +if mode == "check": + + # Unused keys are not too problematic, will be automatically + # removed by the other autoreformat script, + # but still informative to display them + if unused_keys: + print( + "Those i18n keys appears unused:\n" " - " + "\n - ".join(unused_keys) + ) if undefined_keys: - raise Exception( + print( "Those i18n keys should be defined in en.json:\n" " - " + "\n - ".join(undefined_keys) ) + sys.exit(1) +elif mode == "fix": + j = json.loads(open(REFERENCE_FILE).read()) + for key in undefined_keys: + j[key] = "FIXME" + for key in unused_keys: + del j[key] -def test_unused_i18n_keys(): - - unused_keys = keys_defined.difference(expected_string_keys) - unused_keys = sorted(unused_keys) - - if unused_keys: - raise Exception( - "Those i18n keys appears unused:\n" " - " + "\n - ".join(unused_keys) - ) + json.dump( + j, + open(REFERENCE_FILE, "w"), + indent=4, + ensure_ascii=False, + sort_keys=True, + ) diff --git a/tests/add_missing_keys.py b/tests/add_missing_keys.py deleted file mode 100644 index ebee80a1b..000000000 --- a/tests/add_missing_keys.py +++ /dev/null @@ -1,193 +0,0 @@ -# -*- coding: utf-8 -*- - -import os -import re -import glob -import json -import yaml -import subprocess - -############################################################################### -# Find used keys in python code # -############################################################################### - - -def find_expected_string_keys(): - - # Try to find : - # m18n.n( "foo" - # YunohostError("foo" - # YunohostValidationError("foo" - # # i18n: foo - p1 = re.compile(r"m18n\.n\(\n*\s*[\"\'](\w+)[\"\']") - p2 = re.compile(r"YunohostError\(\n*\s*[\'\"](\w+)[\'\"]") - p3 = re.compile(r"YunohostValidationError\(\n*\s*[\'\"](\w+)[\'\"]") - p4 = re.compile(r"# i18n: [\'\"]?(\w+)[\'\"]?") - - python_files = glob.glob("src/*.py") - python_files.extend(glob.glob("src/utils/*.py")) - python_files.extend(glob.glob("src/migrations/*.py")) - python_files.extend(glob.glob("src/authenticators/*.py")) - python_files.extend(glob.glob("src/diagnosers/*.py")) - python_files.append("bin/yunohost") - - for python_file in python_files: - content = open(python_file).read() - for m in p1.findall(content): - if m.endswith("_"): - continue - yield m - for m in p2.findall(content): - if m.endswith("_"): - continue - yield m - for m in p3.findall(content): - if m.endswith("_"): - continue - yield m - for m in p4.findall(content): - yield m - - # For each diagnosis, try to find strings like "diagnosis_stuff_foo" (c.f. diagnosis summaries) - # Also we expect to have "diagnosis_description_" for each diagnosis - p3 = re.compile(r"[\"\'](diagnosis_[a-z]+_\w+)[\"\']") - for python_file in glob.glob("src/diagnosers/*.py"): - content = open(python_file).read() - for m in p3.findall(content): - if m.endswith("_"): - # Ignore some name fragments which are actually concatenated with other stuff.. - continue - yield m - yield "diagnosis_description_" + os.path.basename(python_file)[:-3].split("-")[ - -1 - ] - - # For each migration, expect to find "migration_description_" - for path in glob.glob("src/migrations/*.py"): - if "__init__" in path: - continue - yield "migration_description_" + os.path.basename(path)[:-3] - - # For each default service, expect to find "service_description_" - for service, info in yaml.safe_load( - open("conf/yunohost/services.yml") - ).items(): - if info is None: - continue - yield "service_description_" + service - - # For all unit operations, expect to find "log_" - # A unit operation is created either using the @is_unit_operation decorator - # or using OperationLogger( - cmd = "grep -hr '@is_unit_operation' src/ -A3 2>/dev/null | grep '^def' | sed -E 's@^def (\\w+)\\(.*@\\1@g'" - for funcname in ( - subprocess.check_output(cmd, shell=True).decode("utf-8").strip().split("\n") - ): - yield "log_" + funcname - - p4 = re.compile(r"OperationLogger\(\n*\s*[\"\'](\w+)[\"\']") - for python_file in python_files: - content = open(python_file).read() - for m in ("log_" + match for match in p4.findall(content)): - yield m - - # Global settings descriptions - # Will be on a line like : ("service.ssh.allow_deprecated_dsa_hostkey", {"type": "bool", ... - p5 = re.compile(r" \(\n*\s*[\"\'](\w[\w\.]+)[\"\'],") - content = open("src/settings.py").read() - for m in ( - "global_settings_setting_" + s.replace(".", "_") for s in p5.findall(content) - ): - yield m - - # Keys for the actionmap ... - for category in yaml.safe_load(open("share/actionsmap.yml")).values(): - if "actions" not in category.keys(): - continue - for action in category["actions"].values(): - if "arguments" not in action.keys(): - continue - for argument in action["arguments"].values(): - extra = argument.get("extra") - if not extra: - continue - if "password" in extra: - yield extra["password"] - if "ask" in extra: - yield extra["ask"] - if "comment" in extra: - yield extra["comment"] - if "pattern" in extra: - yield extra["pattern"][1] - if "help" in extra: - yield extra["help"] - - # Hardcoded expected keys ... - yield "admin_password" # Not sure that's actually used nowadays... - - for method in ["tar", "copy", "custom"]: - yield "backup_applying_method_%s" % method - yield "backup_method_%s_finished" % method - - for level in ["danger", "thirdparty", "warning"]: - yield "confirm_app_install_%s" % level - - for errortype in ["not_found", "error", "warning", "success", "not_found_details"]: - yield "diagnosis_domain_expiration_%s" % errortype - yield "diagnosis_domain_not_found_details" - - for errortype in ["bad_status_code", "connection_error", "timeout"]: - yield "diagnosis_http_%s" % errortype - - yield "password_listed" - for i in [1, 2, 3, 4]: - yield "password_too_simple_%s" % i - - checks = [ - "outgoing_port_25_ok", - "ehlo_ok", - "fcrdns_ok", - "blacklist_ok", - "queue_ok", - "ehlo_bad_answer", - "ehlo_unreachable", - "ehlo_bad_answer_details", - "ehlo_unreachable_details", - ] - for check in checks: - yield "diagnosis_mail_%s" % check - - -############################################################################### -# Load en locale json keys # -############################################################################### - - -def keys_defined_for_en(): - return json.loads(open("locales/en.json").read()).keys() - - -############################################################################### -# Compare keys used and keys defined # -############################################################################### - - -expected_string_keys = set(find_expected_string_keys()) -keys_defined = set(keys_defined_for_en()) - - -undefined_keys = expected_string_keys.difference(keys_defined) -undefined_keys = sorted(undefined_keys) - - -j = json.loads(open("locales/en.json").read()) -for key in undefined_keys: - j[key] = "FIXME" - -json.dump( - j, - open("locales/en.json", "w"), - indent=4, - ensure_ascii=False, - sort_keys=True, -) diff --git a/tests/autofix_locale_format.py b/tests/autofix_locale_format.py deleted file mode 100644 index f3825bd30..000000000 --- a/tests/autofix_locale_format.py +++ /dev/null @@ -1,53 +0,0 @@ -import re -import json -import glob - -# List all locale files (except en.json being the ref) -locale_folder = "../locales/" -locale_files = glob.glob(locale_folder + "*.json") -locale_files = [filename.split("/")[-1] for filename in locale_files] -locale_files.remove("en.json") - -reference = json.loads(open(locale_folder + "en.json").read()) - - -def fix_locale(locale_file): - - this_locale = json.loads(open(locale_folder + locale_file).read()) - fixed_stuff = False - - # We iterate over all keys/string in en.json - for key, string in reference.items(): - - # Ignore check if there's no translation yet for this key - if key not in this_locale: - continue - - # Then we check that every "{stuff}" (for python's .format()) - # should also be in the translated string, otherwise the .format - # will trigger an exception! - subkeys_in_ref = [k[0] for k in re.findall(r"{(\w+)(:\w)?}", string)] - subkeys_in_this_locale = [ - k[0] for k in re.findall(r"{(\w+)(:\w)?}", this_locale[key]) - ] - - if set(subkeys_in_ref) != set(subkeys_in_this_locale) and ( - len(subkeys_in_ref) == len(subkeys_in_this_locale) - ): - for i, subkey in enumerate(subkeys_in_ref): - this_locale[key] = this_locale[key].replace( - "{%s}" % subkeys_in_this_locale[i], "{%s}" % subkey - ) - fixed_stuff = True - - if fixed_stuff: - json.dump( - this_locale, - open(locale_folder + locale_file, "w"), - indent=4, - ensure_ascii=False, - ) - - -for locale_file in locale_files: - fix_locale(locale_file) diff --git a/tests/reformat_locales.py b/tests/reformat_locales.py deleted file mode 100644 index 86c2664d7..000000000 --- a/tests/reformat_locales.py +++ /dev/null @@ -1,60 +0,0 @@ -import re - - -def reformat(lang, transformations): - - locale = open(f"../locales/{lang}.json").read() - for pattern, replace in transformations.items(): - locale = re.compile(pattern).sub(replace, locale) - - open(f"../locales/{lang}.json", "w").write(locale) - - -###################################################### - -godamn_spaces_of_hell = [ - "\u00a0", - "\u2000", - "\u2001", - "\u2002", - "\u2003", - "\u2004", - "\u2005", - "\u2006", - "\u2007", - "\u2008", - "\u2009", - "\u200A", - "\u202f", - "\u202F", - "\u3000", -] - -transformations = {s: " " for s in godamn_spaces_of_hell} -transformations.update( - { - "…": "...", - } -) - - -reformat("en", transformations) - -###################################################### - -transformations.update( - { - "courriel": "email", - "e-mail": "email", - "Courriel": "Email", - "E-mail": "Email", - "« ": "'", - "«": "'", - " »": "'", - "»": "'", - "’": "'", - # r"$(\w{1,2})'|( \w{1,2})'": r"\1\2’", - } -) - -reformat("fr", transformations) diff --git a/tests/remove_stale_translated_strings.py b/tests/remove_stale_translated_strings.py deleted file mode 100644 index 48f2180e4..000000000 --- a/tests/remove_stale_translated_strings.py +++ /dev/null @@ -1,25 +0,0 @@ -import json -import glob -from collections import OrderedDict - -locale_folder = "../locales/" -locale_files = glob.glob(locale_folder + "*.json") -locale_files = [filename.split("/")[-1] for filename in locale_files] -locale_files.remove("en.json") - -reference = json.loads(open(locale_folder + "en.json").read()) - -for locale_file in locale_files: - - print(locale_file) - this_locale = json.loads( - open(locale_folder + locale_file).read(), object_pairs_hook=OrderedDict - ) - this_locale_fixed = {k: v for k, v in this_locale.items() if k in reference} - - json.dump( - this_locale_fixed, - open(locale_folder + locale_file, "w"), - indent=4, - ensure_ascii=False, - ) diff --git a/tests/test_translation_format_consistency.py b/tests/test_translation_format_consistency.py deleted file mode 100644 index 86d1c3279..000000000 --- a/tests/test_translation_format_consistency.py +++ /dev/null @@ -1,52 +0,0 @@ -import re -import json -import glob -import pytest - -# List all locale files (except en.json being the ref) -locale_folder = "locales/" -locale_files = glob.glob(locale_folder + "*.json") -locale_files = [filename.split("/")[-1] for filename in locale_files] -locale_files.remove("en.json") - -reference = json.loads(open(locale_folder + "en.json").read()) - - -def find_inconsistencies(locale_file): - - this_locale = json.loads(open(locale_folder + locale_file).read()) - - # We iterate over all keys/string in en.json - for key, string in reference.items(): - - # Ignore check if there's no translation yet for this key - if key not in this_locale: - continue - - # Then we check that every "{stuff}" (for python's .format()) - # should also be in the translated string, otherwise the .format - # will trigger an exception! - subkeys_in_ref = set(k[0] for k in re.findall(r"{(\w+)(:\w)?}", string)) - subkeys_in_this_locale = set( - k[0] for k in re.findall(r"{(\w+)(:\w)?}", this_locale[key]) - ) - - if any(k not in subkeys_in_ref for k in subkeys_in_this_locale): - yield """\n -========================== -Format inconsistency for string {key} in {locale_file}:" -en.json -> {string} -{locale_file} -> {translated_string} -""".format( - key=key, - string=string.encode("utf-8"), - locale_file=locale_file, - translated_string=this_locale[key].encode("utf-8"), - ) - - -@pytest.mark.parametrize("locale_file", locale_files) -def test_translation_format_consistency(locale_file): - inconsistencies = list(find_inconsistencies(locale_file)) - if inconsistencies: - raise Exception("".join(inconsistencies)) From d831ccef4c5ea561d82cd09c19be183b080647de Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Sun, 28 Nov 2021 16:24:13 +0100 Subject: [PATCH 174/619] ci: Try to fix mypy --- src/diagnosers/00-basesystem.py | 3 ++- src/diagnosers/10-ip.py | 3 ++- src/diagnosers/12-dnsrecords.py | 5 +++-- src/diagnosers/14-ports.py | 3 ++- src/diagnosers/21-web.py | 3 ++- src/diagnosers/24-mail.py | 3 ++- src/diagnosers/30-services.py | 3 ++- src/diagnosers/50-systemresources.py | 3 ++- src/diagnosers/70-regenconf.py | 3 ++- src/diagnosers/80-apps.py | 3 ++- 10 files changed, 21 insertions(+), 11 deletions(-) diff --git a/src/diagnosers/00-basesystem.py b/src/diagnosers/00-basesystem.py index 0ef1a5197..104fa698e 100644 --- a/src/diagnosers/00-basesystem.py +++ b/src/diagnosers/00-basesystem.py @@ -3,6 +3,7 @@ import os import json import subprocess +from typing import List from moulinette.utils import log from moulinette.utils.process import check_output @@ -17,7 +18,7 @@ class MyDiagnoser(Diagnoser): id_ = os.path.splitext(os.path.basename(__file__))[0].split("-")[1] cache_duration = 600 - dependencies = [] + dependencies: List[str] = [] def run(self): diff --git a/src/diagnosers/10-ip.py b/src/diagnosers/10-ip.py index 4ad4cfbfc..d495e3277 100644 --- a/src/diagnosers/10-ip.py +++ b/src/diagnosers/10-ip.py @@ -3,6 +3,7 @@ import re import os import random +from typing import List from moulinette.utils import log from moulinette.utils.network import download_text @@ -19,7 +20,7 @@ class MyDiagnoser(Diagnoser): id_ = os.path.splitext(os.path.basename(__file__))[0].split("-")[1] cache_duration = 600 - dependencies = [] + dependencies: List[str] = [] def run(self): diff --git a/src/diagnosers/12-dnsrecords.py b/src/diagnosers/12-dnsrecords.py index 305fda79b..85f70ca44 100644 --- a/src/diagnosers/12-dnsrecords.py +++ b/src/diagnosers/12-dnsrecords.py @@ -2,7 +2,7 @@ import os import re - +from typing import List from datetime import datetime, timedelta from publicsuffix2 import PublicSuffixList @@ -21,11 +21,12 @@ from yunohost.dns import _build_dns_conf, _get_dns_zone_for_domain logger = log.getActionLogger("yunohost.diagnosis") + class MyDiagnoser(Diagnoser): id_ = os.path.splitext(os.path.basename(__file__))[0].split("-")[1] cache_duration = 600 - dependencies = ["ip"] + dependencies: List[str] = ["ip"] def run(self): diff --git a/src/diagnosers/14-ports.py b/src/diagnosers/14-ports.py index e339a946c..be172e524 100644 --- a/src/diagnosers/14-ports.py +++ b/src/diagnosers/14-ports.py @@ -1,6 +1,7 @@ #!/usr/bin/env python import os +from typing import List from yunohost.diagnosis import Diagnoser from yunohost.service import _get_services @@ -10,7 +11,7 @@ class MyDiagnoser(Diagnoser): id_ = os.path.splitext(os.path.basename(__file__))[0].split("-")[1] cache_duration = 600 - dependencies = ["ip"] + dependencies: List[str] = ["ip"] def run(self): diff --git a/src/diagnosers/21-web.py b/src/diagnosers/21-web.py index 3d9fb9f73..584505ad1 100644 --- a/src/diagnosers/21-web.py +++ b/src/diagnosers/21-web.py @@ -3,6 +3,7 @@ import os import random import requests +from typing import List from moulinette.utils.filesystem import read_file @@ -17,7 +18,7 @@ class MyDiagnoser(Diagnoser): id_ = os.path.splitext(os.path.basename(__file__))[0].split("-")[1] cache_duration = 600 - dependencies = ["ip"] + dependencies: List[str] = ["ip"] def run(self): diff --git a/src/diagnosers/24-mail.py b/src/diagnosers/24-mail.py index c4df3ca54..7fe7a08db 100644 --- a/src/diagnosers/24-mail.py +++ b/src/diagnosers/24-mail.py @@ -3,6 +3,7 @@ import os import dns.resolver import re +from typing import List from subprocess import CalledProcessError @@ -24,7 +25,7 @@ class MyDiagnoser(Diagnoser): id_ = os.path.splitext(os.path.basename(__file__))[0].split("-")[1] cache_duration = 600 - dependencies = ["ip"] + dependencies: List[str] = ["ip"] def run(self): diff --git a/src/diagnosers/30-services.py b/src/diagnosers/30-services.py index daf86ab1e..f09688911 100644 --- a/src/diagnosers/30-services.py +++ b/src/diagnosers/30-services.py @@ -1,6 +1,7 @@ #!/usr/bin/env python import os +from typing import List from yunohost.diagnosis import Diagnoser from yunohost.service import service_status @@ -10,7 +11,7 @@ class MyDiagnoser(Diagnoser): id_ = os.path.splitext(os.path.basename(__file__))[0].split("-")[1] cache_duration = 300 - dependencies = [] + dependencies: List[str] = [] def run(self): diff --git a/src/diagnosers/50-systemresources.py b/src/diagnosers/50-systemresources.py index 265e62acb..d259e7713 100644 --- a/src/diagnosers/50-systemresources.py +++ b/src/diagnosers/50-systemresources.py @@ -3,6 +3,7 @@ import os import psutil import datetime import re +from typing import List from moulinette.utils.process import check_output @@ -13,7 +14,7 @@ class MyDiagnoser(Diagnoser): id_ = os.path.splitext(os.path.basename(__file__))[0].split("-")[1] cache_duration = 300 - dependencies = [] + dependencies: List[str] = [] def run(self): diff --git a/src/diagnosers/70-regenconf.py b/src/diagnosers/70-regenconf.py index 63f6f2b32..591f883a4 100644 --- a/src/diagnosers/70-regenconf.py +++ b/src/diagnosers/70-regenconf.py @@ -2,6 +2,7 @@ import os import re +from typing import List from yunohost.settings import settings_get from yunohost.diagnosis import Diagnoser @@ -13,7 +14,7 @@ class MyDiagnoser(Diagnoser): id_ = os.path.splitext(os.path.basename(__file__))[0].split("-")[1] cache_duration = 300 - dependencies = [] + dependencies: List[str] = [] def run(self): diff --git a/src/diagnosers/80-apps.py b/src/diagnosers/80-apps.py index e62acaa1f..56e45f831 100644 --- a/src/diagnosers/80-apps.py +++ b/src/diagnosers/80-apps.py @@ -1,6 +1,7 @@ #!/usr/bin/env python import os +from typing import List from yunohost.app import app_list @@ -11,7 +12,7 @@ class MyDiagnoser(Diagnoser): id_ = os.path.splitext(os.path.basename(__file__))[0].split("-")[1] cache_duration = 300 - dependencies = [] + dependencies: List[str] = [] def run(self): From c6df391a9af7dcc7f79a6c44d7c6b1a001054e30 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Sun, 28 Nov 2021 16:29:45 +0100 Subject: [PATCH 175/619] ci: Oopsies --- .gitlab/ci/translation.gitlab-ci.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitlab/ci/translation.gitlab-ci.yml b/.gitlab/ci/translation.gitlab-ci.yml index 159dc7aa0..8daa4f473 100644 --- a/.gitlab/ci/translation.gitlab-ci.yml +++ b/.gitlab/ci/translation.gitlab-ci.yml @@ -2,6 +2,7 @@ # TRANSLATION ######################################## test-i18n-keys: + stage: translation script: - python3 maintenance/missing_i18n_keys --check only: From 2bd1df0659588e096a2936f429c53d8dce6e74a0 Mon Sep 17 00:00:00 2001 From: Kayou Date: Tue, 30 Nov 2021 13:10:20 +0100 Subject: [PATCH 176/619] [fix] hook restore multimedia --- data/hooks/restore/18-data_multimedia | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/data/hooks/restore/18-data_multimedia b/data/hooks/restore/18-data_multimedia index eb8ef2608..c3c349e7d 100644 --- a/data/hooks/restore/18-data_multimedia +++ b/data/hooks/restore/18-data_multimedia @@ -6,4 +6,6 @@ set -eu # Source YNH helpers source /usr/share/yunohost/helpers -ynh_restore_file --origin_path="/home/yunohost.multimedia" --not_mandatory +backup_dir="data/multimedia" + +ynh_restore_file --origin_path="${backup_dir}" --dest_path="/home/yunohost.multimedia" --not_mandatory From 73da37f152e545744fbb52ad7efb905833d05339 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Tue, 30 Nov 2021 20:46:43 +0100 Subject: [PATCH 177/619] Attempt to fix the weird selfsigned certificate generation error --- hooks/conf_regen/02-ssl | 17 ++++++----------- src/certificate.py | 2 +- 2 files changed, 7 insertions(+), 12 deletions(-) diff --git a/hooks/conf_regen/02-ssl b/hooks/conf_regen/02-ssl index a824c91f8..eded92854 100755 --- a/hooks/conf_regen/02-ssl +++ b/hooks/conf_regen/02-ssl @@ -6,7 +6,7 @@ ssl_dir="/usr/share/yunohost/ssl" ynh_ca="/etc/yunohost/certs/yunohost.org/ca.pem" ynh_crt="/etc/yunohost/certs/yunohost.org/crt.pem" ynh_key="/etc/yunohost/certs/yunohost.org/key.pem" -openssl_conf="/usr/share/yunohost/conf/ssl/openssl.cnf" +template_dir="/usr/share/yunohost/conf/ssl/" regen_local_ca() { @@ -26,7 +26,7 @@ regen_local_ca() { RANDFILE=.rnd openssl rand -hex 19 >serial rm -f index.txt touch index.txt - cp /usr/share/yunohost/conf/ssl/openssl.cnf openssl.ca.cnf + cp ${template_dir}/openssl.cnf openssl.ca.cnf sed -i "s/yunohost.org/${domain}/g" openssl.ca.cnf openssl req -x509 \ -new \ @@ -57,7 +57,7 @@ do_init_regen() { # Make sure this conf exists mkdir -p ${ssl_dir} - cp /usr/share/yunohost/conf/ssl/openssl.cnf ${ssl_dir}/openssl.ca.cnf + install -D -m 644 ${template_dir}/openssl.cnf "${ssl_dir}/openssl.cnf" # create default certificates if [[ ! -f "$ynh_ca" ]]; then @@ -68,14 +68,13 @@ do_init_regen() { echo -e "\n# Creating initial key and certificate \n" >>$LOGFILE openssl req -new \ - -config "$openssl_conf" \ - -days 730 \ + -config "${ssl_dir}/openssl.cnf" \ -out "${ssl_dir}/certs/yunohost_csr.pem" \ -keyout "${ssl_dir}/certs/yunohost_key.pem" \ -nodes -batch &>>$LOGFILE openssl ca \ - -config "$openssl_conf" \ + -config "${ssl_dir}/openssl.cnf" \ -days 730 \ -in "${ssl_dir}/certs/yunohost_csr.pem" \ -out "${ssl_dir}/certs/yunohost_crt.pem" \ @@ -92,16 +91,12 @@ do_init_regen() { chown -R root:ssl-cert /etc/yunohost/certs/yunohost.org/ chmod o-rwx /etc/yunohost/certs/yunohost.org/ - - install -D -m 644 $openssl_conf "${ssl_dir}/openssl.cnf" } do_pre_regen() { pending_dir=$1 - cd /usr/share/yunohost/conf/ssl - - install -D -m 644 openssl.cnf "${pending_dir}/${ssl_dir}/openssl.cnf" + install -D -m 644 $template_dir/openssl.cnf "${pending_dir}/${ssl_dir}/openssl.cnf" } do_post_regen() { diff --git a/src/certificate.py b/src/certificate.py index 46aa9c818..724d9b62e 100644 --- a/src/certificate.py +++ b/src/certificate.py @@ -181,7 +181,7 @@ def _certificate_install_selfsigned(domain_list, force=False): # Use OpenSSL command line to create a certificate signing request, # and self-sign the cert commands = [ - "openssl req -new -config %s -days 3650 -out %s -keyout %s -nodes -batch" + "openssl req -new -config %s -out %s -keyout %s -nodes -batch" % (conf_file, csr_file, key_file), "openssl ca -config %s -days 3650 -in %s -out %s -batch" % (conf_file, csr_file, crt_file), From 76075909c9164e316a64bbd130223f78cb43520f Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Tue, 30 Nov 2021 21:29:11 +0100 Subject: [PATCH 178/619] Moar attempt to fix ssl cert generation + automigrate legacy + enforce sensible permissions --- hooks/conf_regen/01-yunohost | 2 -- hooks/conf_regen/02-ssl | 22 ++++++++++++++++++---- 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/hooks/conf_regen/01-yunohost b/hooks/conf_regen/01-yunohost index e2924bd6d..d30d77ace 100755 --- a/hooks/conf_regen/01-yunohost +++ b/hooks/conf_regen/01-yunohost @@ -184,8 +184,6 @@ do_post_regen() { find /etc/cron.d/yunohost-* -type f -exec chmod 644 {} \; find /etc/cron.*/yunohost-* -type f -exec chown root:root {} \; - chmod 750 /usr/share/yunohost/ssl - chown root:root /var/cache/yunohost chmod 700 /var/cache/yunohost diff --git a/hooks/conf_regen/02-ssl b/hooks/conf_regen/02-ssl index eded92854..a50e51187 100755 --- a/hooks/conf_regen/02-ssl +++ b/hooks/conf_regen/02-ssl @@ -3,10 +3,10 @@ set -e ssl_dir="/usr/share/yunohost/ssl" +template_dir="/usr/share/yunohost/conf/ssl/" ynh_ca="/etc/yunohost/certs/yunohost.org/ca.pem" ynh_crt="/etc/yunohost/certs/yunohost.org/crt.pem" ynh_key="/etc/yunohost/certs/yunohost.org/key.pem" -template_dir="/usr/share/yunohost/conf/ssl/" regen_local_ca() { @@ -56,7 +56,7 @@ do_init_regen() { chmod 640 $LOGFILE # Make sure this conf exists - mkdir -p ${ssl_dir} + mkdir -p ${ssl_dir}/{ca,certs,crl,newcerts} install -D -m 644 ${template_dir}/openssl.cnf "${ssl_dir}/openssl.cnf" # create default certificates @@ -104,12 +104,26 @@ do_post_regen() { current_local_ca_domain=$(openssl x509 -in $ynh_ca -text | tr ',' '\n' | grep Issuer | awk '{print $4}') main_domain=$(cat /etc/yunohost/current_host) + + # Automigrate legacy folder + if [ -e /usr/share/yunohost/yunohost-config/ssl/yunoCA ] + then + mv /usr/share/yunohost/yunohost-config/ssl/yunoCA/* ${ssl_dir} + rm -rf /usr/share/yunohost/yunohost-config + fi + + mkdir -p ${ssl_dir}/{ca,certs,crl,newcerts} + chown root:root ${ssl_dir} + chmod 750 ${ssl_dir} + chmod -R o-rwx ${ssl_dir} + chmod o+x ${ssl_dir}/certs + chmod o+r ${ssl_dir}/certs/yunohost_crt.pem if [[ "$current_local_ca_domain" != "$main_domain" ]]; then regen_local_ca $main_domain # Idk how useful this is, but this was in the previous python code (domain.main_domain()) - ln -sf /etc/yunohost/certs/$domain/crt.pem /etc/ssl/certs/yunohost_crt.pem - ln -sf /etc/yunohost/certs/$domain/key.pem /etc/ssl/private/yunohost_key.pem + ln -sf /etc/yunohost/certs/$main_domain/crt.pem /etc/ssl/certs/yunohost_crt.pem + ln -sf /etc/yunohost/certs/$main_domain/key.pem /etc/ssl/private/yunohost_key.pem fi } From 34b7e667a774376a888f57867b20c2ee84ad596c Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Tue, 30 Nov 2021 23:25:25 +0100 Subject: [PATCH 179/619] Aaaaand try again to fix certificate generation --- hooks/conf_regen/02-ssl | 3 +++ src/certificate.py | 12 +++--------- 2 files changed, 6 insertions(+), 9 deletions(-) diff --git a/hooks/conf_regen/02-ssl b/hooks/conf_regen/02-ssl index a50e51187..e98c70c6e 100755 --- a/hooks/conf_regen/02-ssl +++ b/hooks/conf_regen/02-ssl @@ -110,6 +110,9 @@ do_post_regen() { then mv /usr/share/yunohost/yunohost-config/ssl/yunoCA/* ${ssl_dir} rm -rf /usr/share/yunohost/yunohost-config + # Overwrite openssl.cnf because it may still contain references to the old yunoCA dir + rm -f ${ssl_dir}/openssl.ca.cnf + install -D -m 644 ${template_dir}/openssl.cnf "${ssl_dir}/openssl.cnf" fi mkdir -p ${ssl_dir}/{ca,certs,crl,newcerts} diff --git a/src/certificate.py b/src/certificate.py index 724d9b62e..86a63a996 100644 --- a/src/certificate.py +++ b/src/certificate.py @@ -143,11 +143,7 @@ def _certificate_install_selfsigned(domain_list, force=False): # Paths of files and folder we'll need date_tag = datetime.utcnow().strftime("%Y%m%d.%H%M%S") - new_cert_folder = "%s/%s-history/%s-selfsigned" % ( - CERT_FOLDER, - domain, - date_tag, - ) + new_cert_folder = f"{CERT_FOLDER}/{domain}-history/{date_tag}-selfsigned" conf_template = os.path.join(SSL_DIR, "openssl.cnf") @@ -181,10 +177,8 @@ def _certificate_install_selfsigned(domain_list, force=False): # Use OpenSSL command line to create a certificate signing request, # and self-sign the cert commands = [ - "openssl req -new -config %s -out %s -keyout %s -nodes -batch" - % (conf_file, csr_file, key_file), - "openssl ca -config %s -days 3650 -in %s -out %s -batch" - % (conf_file, csr_file, crt_file), + f"openssl req -new -config {conf_file} -out {csr_file} -keyout {key_file} -nodes -batch", + f"openssl ca -config {conf_file} -days 3650 -in {csr_file} -out {crt_file} -batch", ] for command in commands: From 9488b419c3facda0dddd9c00a6d6960420a7fa90 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Wed, 1 Dec 2021 00:24:31 +0100 Subject: [PATCH 180/619] Having an openssl.ca.cnf is needed to create domains --- hooks/conf_regen/02-ssl | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/hooks/conf_regen/02-ssl b/hooks/conf_regen/02-ssl index e98c70c6e..1aaab59d1 100755 --- a/hooks/conf_regen/02-ssl +++ b/hooks/conf_regen/02-ssl @@ -111,8 +111,9 @@ do_post_regen() { mv /usr/share/yunohost/yunohost-config/ssl/yunoCA/* ${ssl_dir} rm -rf /usr/share/yunohost/yunohost-config # Overwrite openssl.cnf because it may still contain references to the old yunoCA dir - rm -f ${ssl_dir}/openssl.ca.cnf install -D -m 644 ${template_dir}/openssl.cnf "${ssl_dir}/openssl.cnf" + install -D -m 644 ${template_dir}/openssl.cnf "${ssl_dir}/openssl.ca.cnf" + sed -i "s/yunohost.org/${main_domain}/g" openssl.ca.cnf fi mkdir -p ${ssl_dir}/{ca,certs,crl,newcerts} From 8feb63be0c93ffd881d9863764d7cee417792672 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Wed, 1 Dec 2021 18:37:59 +0100 Subject: [PATCH 181/619] Tweak definition of self-signed cert to cover cases where issuer is not the current main domain anymore --- src/certificate.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/certificate.py b/src/certificate.py index 86a63a996..c89d2e312 100644 --- a/src/certificate.py +++ b/src/certificate.py @@ -664,6 +664,8 @@ def _prepare_certificate_signing_request(domain, key_file, output_folder): def _get_status(domain): + import yunohost.domain + cert_file = os.path.join(CERT_FOLDER, domain, "crt.pem") if not os.path.isfile(cert_file): @@ -692,7 +694,7 @@ def _get_status(domain): ) days_remaining = (valid_up_to - datetime.utcnow()).days - if cert_issuer == "yunohost.org" or cert_issuer == _name_self_CA(): + if cert_issuer in ["yunohost.org"] + yunohost.domain.domain_list()["domains"]: CA_type = { "code": "self-signed", "verbose": "Self-signed", From 6622a9f2647ec9f3a5f30a2fc2cbb1cd3769d3a4 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Wed, 1 Dec 2021 19:08:16 +0100 Subject: [PATCH 182/619] Typo in conf/yunohost/services.yml ? --- conf/yunohost/services.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/yunohost/services.yml b/conf/yunohost/services.yml index ed92ac47c..45621876e 100644 --- a/conf/yunohost/services.yml +++ b/conf/yunohost/services.yml @@ -75,6 +75,6 @@ spamassassin: null rmilter: null php5-fpm: null php7.0-fpm: null -php7.3-fpm: +php7.3-fpm: null nslcd: null avahi-daemon: null From 55937a933e0854f043527c7b35b28a3004525ae8 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Wed, 1 Dec 2021 19:44:42 +0100 Subject: [PATCH 183/619] Typo --- src/yunohost/tools.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/yunohost/tools.py b/src/yunohost/tools.py index ef84d98bd..32e02413b 100644 --- a/src/yunohost/tools.py +++ b/src/yunohost/tools.py @@ -534,7 +534,7 @@ def tools_upgrade( # Prepare dist-upgrade command dist_upgrade = "DEBIAN_FRONTEND=noninteractive" if Moulinette.interface.type == "api": - dist_upgrade += "YUNOHOST_API_RESTART_WILL_BE_HANDLED_BY_YUNOHOST=yes" + dist_upgrade += " YUNOHOST_API_RESTART_WILL_BE_HANDLED_BY_YUNOHOST=yes" dist_upgrade += " APT_LISTCHANGES_FRONTEND=none" dist_upgrade += " apt-get" dist_upgrade += ( From 94ac15e4de00aa9450e4cab08c9fc1d68adf304c Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Wed, 1 Dec 2021 19:53:28 +0100 Subject: [PATCH 184/619] Update changelog for 11.0.1~alpha / bullseye alpha --- debian/changelog | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/debian/changelog b/debian/changelog index b90838102..78023c71e 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,6 +1,26 @@ -yunohost (11.0.0~alpha) unstable; urgency=low +yunohost (11.0.1~alpha) unstable; urgency=low - - Placeholder for 11.0 + - [mod] Various tweaks for Python 3.9, PHP 7.4, and other changes related to Buster->Bullseye ecosystem + - [mod] quality: Rework repository code architecture ([#1377](https://github.com/YunoHost/yunohost/pull/1377)) + - [mod] quality: Rework where yunohost files are deployed (yunohost now a proper python lib with files in /usr/lib/python3/dist-packages/yunohost/, and other files are in /usr/share/yunohost) ([#1377](https://github.com/YunoHost/yunohost/pull/1377)) + - [mod] debian: Moved mysql, php, and metronome from Depends to Recommends ([#1369](https://github.com/YunoHost/yunohost/pull/1369)) + - [mod] apt: Add sury by default ([#1369](https://github.com/YunoHost/yunohost/pull/1369)) + - [enh] regenconf/helpers: Better integration for postgresql ([#1369](https://github.com/YunoHost/yunohost/pull/1369)) + - [enh] mysql: Drop super old mysql config, now rely on Debian default's one ([44c972f...144126f](https://github.com/YunoHost/yunohost/compare/44c972f2dd65...144126f56a3d)) + - [enh] upgrade: Try to implement a smarter self-upgrade mechanism to prevent/limit API downtime and related UX issues ([#1374](https://github.com/YunoHost/yunohost/pull/1374)) + - [mod] app: During app scripts (and all stuff run in hook_exec), do not inject the HOME variable if it exists. This aims to prevent inconsistencies between CLI (where HOME usually is defined) and API (where HOME doesnt exists) (f43e567b) + - [mod] quality: Cleanup legacy stuff + - Drop `--other_vars` options in ynh_add_fail2ban_config and systemd_config helpers + - Drop deprecated/superold `ynh_bind_or_cp`, `ynh_mkdir_tmp`, `ynh_get_plain_key` helpers + - Drop obsolete `yunohost-reset-ldap-password` command + - Drop obsolete `yunohost dyndns installcron` and `removecron` commands + - Drop deprecated `yunohost service regen-conf` command (see `tools regen-conf` instead) + - Drop deprecated `yunohost app fetchlist` command + - Drop obsolete `yunohost app add/remove/clearaccess` commands + - Drop depcreated `--list` and `--filter` options in `yunohost app list` + - Drop deprecated `--apps` and `--system` options in `yunohost tools update/upgrade` (no double dashes anymore) + - Drop deprecated `--status` and `--log_type` options in `yunohost service add` + - Drop deprecated `--mail` option in `yunohost user create` -- Alexandre Aubin Fri, 05 Feb 2021 00:02:38 +0100 From bc71e18cba713164dc6b2b6c59033f21cb2ecda1 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Wed, 1 Dec 2021 20:33:48 +0100 Subject: [PATCH 185/619] Aleks broke everything again /o\ --- debian/rules | 6 ------ 1 file changed, 6 deletions(-) diff --git a/debian/rules b/debian/rules index 8c9bc5976..5527d8703 100755 --- a/debian/rules +++ b/debian/rules @@ -12,9 +12,3 @@ override_dh_auto_build: override_dh_installinit: dh_installinit -pyunohost --name=yunohost-api --noscripts dh_installinit -pyunohost --name=yunohost-firewall --noscripts - -override_dh_systemd_enable: - dh_systemd_enable --name=yunohost-api \ - yunohost-api.service - dh_systemd_enable --name=yunohost-firewall --no-enable \ - yunohost-firewall.service From 613fc67bd1a1d1feb2133cd172c2df41590f7836 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Wed, 1 Dec 2021 20:35:51 +0100 Subject: [PATCH 186/619] Fix i18n strings --- locales/en.json | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/locales/en.json b/locales/en.json index f720af34e..fc4e4283a 100644 --- a/locales/en.json +++ b/locales/en.json @@ -648,13 +648,8 @@ "system_upgraded": "System upgraded", "system_username_exists": "Username already exists in the list of system users", "this_action_broke_dpkg": "This action broke dpkg/APT (the system package managers)... You can try to solve this issue by connecting through SSH and running `sudo apt install --fix-broken` and/or `sudo dpkg --configure -a`.", - "tools_upgrade_cant_hold_critical_packages": "Could not hold critical packages...", - "tools_upgrade_cant_unhold_critical_packages": "Could not unhold critical packages...", - "tools_upgrade_regular_packages": "Now upgrading 'regular' (non-yunohost-related) packages...", - "tools_upgrade_regular_packages_failed": "Could not upgrade packages: {packages_list}", - "tools_upgrade_special_packages": "Now upgrading 'special' (yunohost-related) packages...", - "tools_upgrade_special_packages_completed": "YunoHost package upgrade completed.\nPress [Enter] to get the command line back", - "tools_upgrade_special_packages_explanation": "The special upgrade will continue in the background. Please don't start any other actions on your server for the next ~10 minutes (depending on hardware speed). After this, you may have to re-log in to the webadmin. The upgrade log will be available in Tools → Log (in the webadmin) or using 'yunohost log list' (from the command-line).", + "tools_upgrade": "Upgrading system packages", + "tools_upgrade_failed": "Could not upgrade packages: {packages_list}", "unbackup_app": "{app} will not be saved", "unexpected_error": "Something unexpected went wrong: {error}", "unknown_main_domain_path": "Unknown domain or path for '{app}'. You need to specify a domain and a path to be able to specify a URL for permission.", @@ -690,4 +685,4 @@ "yunohost_installing": "Installing YunoHost...", "yunohost_not_installed": "YunoHost is not correctly installed. Please run 'yunohost tools postinstall'", "yunohost_postinstall_end_tip": "The post-install completed! To finalize your setup, please consider:\n - adding a first user through the 'Users' section of the webadmin (or 'yunohost user create ' in command-line);\n - diagnose potential issues through the 'Diagnosis' section of the webadmin (or 'yunohost diagnosis run' in command-line);\n - reading the 'Finalizing your setup' and 'Getting to know YunoHost' parts in the admin documentation: https://yunohost.org/admindoc." -} \ No newline at end of file +} From 8eaa7012309d4a9a58bbadf17274b0dca5ce050f Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Wed, 1 Dec 2021 21:06:53 +0100 Subject: [PATCH 187/619] Fuckit I don't understand how to properly manage systemctl service with debian files while having flexibility on when the api restart happens, let's manage everything with the regen conf --- {debian => conf/yunohost}/yunohost-api.service | 4 +--- .../yunohost}/yunohost-firewall.service | 0 debian/rules | 4 ---- debian/yunohost-api.default | 4 ---- hooks/conf_regen/01-yunohost | 14 ++++++++++++++ 5 files changed, 15 insertions(+), 11 deletions(-) rename {debian => conf/yunohost}/yunohost-api.service (59%) rename {debian => conf/yunohost}/yunohost-firewall.service (100%) delete mode 100644 debian/yunohost-api.default diff --git a/debian/yunohost-api.service b/conf/yunohost/yunohost-api.service similarity index 59% rename from debian/yunohost-api.service rename to conf/yunohost/yunohost-api.service index 850255127..aa429ec7a 100644 --- a/debian/yunohost-api.service +++ b/conf/yunohost/yunohost-api.service @@ -4,9 +4,7 @@ After=network.target [Service] Type=simple -Environment=DAEMON_OPTS= -EnvironmentFile=-/etc/default/yunohost-api -ExecStart=/usr/bin/yunohost-api $DAEMON_OPTS +ExecStart=/usr/bin/yunohost-api Restart=always RestartSec=5 TimeoutStopSec=30 diff --git a/debian/yunohost-firewall.service b/conf/yunohost/yunohost-firewall.service similarity index 100% rename from debian/yunohost-firewall.service rename to conf/yunohost/yunohost-firewall.service diff --git a/debian/rules b/debian/rules index 5527d8703..5cf1d9bee 100755 --- a/debian/rules +++ b/debian/rules @@ -8,7 +8,3 @@ override_dh_auto_build: # Generate bash completion file python3 doc/generate_bash_completion.py python3 doc/generate_manpages.py --gzip --output doc/yunohost.8.gz - -override_dh_installinit: - dh_installinit -pyunohost --name=yunohost-api --noscripts - dh_installinit -pyunohost --name=yunohost-firewall --noscripts diff --git a/debian/yunohost-api.default b/debian/yunohost-api.default deleted file mode 100644 index b6a9e5a99..000000000 --- a/debian/yunohost-api.default +++ /dev/null @@ -1,4 +0,0 @@ -# Override yunohost-api options. -# Example to log debug: DAEMON_OPTS="--debug" -# -#DAEMON_OPTS="" diff --git a/hooks/conf_regen/01-yunohost b/hooks/conf_regen/01-yunohost index d30d77ace..22929db33 100755 --- a/hooks/conf_regen/01-yunohost +++ b/hooks/conf_regen/01-yunohost @@ -56,7 +56,16 @@ do_init_regen() { chown root:root /var/cache/yunohost chmod 700 /var/cache/yunohost + cp yunohost-api.service /etc/systemd/system/yunohost-api.service + cp yunohost-firewall.service /etc/systemd/system/yunohost-firewall.service cp yunoprompt.service /etc/systemd/system/yunoprompt.service + + systemctl daemon-reload + + systemctl enable yunohost-api.service + systemctl start yunohost-api.service + # Yunohost-firewall is enabled only during postinstall, not init, not 100% sure why + cp dpkg-origins /etc/dpkg/origins/yunohost # Change dpkg vendor @@ -142,6 +151,8 @@ HandleLidSwitchDocked=ignore HandleLidSwitchExternalPower=ignore EOF + cp yunohost-api.service ${pending_dir}/etc/systemd/system/yunohost-api.service + cp yunohost-firewall.service ${pending_dir}/etc/systemd/system/yunohost-firewall.service cp yunoprompt.service ${pending_dir}/etc/systemd/system/yunoprompt.service if [[ "$(yunohost settings get 'security.experimental.enabled')" == "True" ]]; then @@ -219,6 +230,9 @@ do_post_regen() { } [[ ! "$regen_conf_files" =~ "nftables.service.d/ynh-override.conf" ]] || systemctl daemon-reload [[ ! "$regen_conf_files" =~ "login.conf.d/ynh-override.conf" ]] || systemctl daemon-reload + [[ ! "$regen_conf_files" =~ "yunohost-firewall.service" ]] || systemctl daemon-reload + [[ ! "$regen_conf_files" =~ "yunohost-api.service" ]] || systemctl daemon-reload + if [[ "$regen_conf_files" =~ "yunoprompt.service" ]]; then systemctl daemon-reload action=$([[ -e /etc/systemd/system/yunoprompt.service ]] && echo 'enable' || echo 'disable') From 47f3c00d0c1ef3ce65cd7768b38526cb2b02a9b6 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Fri, 3 Dec 2021 01:00:19 +0100 Subject: [PATCH 188/619] helpers apt/php: fix typo spotted by tituspijean --- data/helpers.d/apt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/helpers.d/apt b/data/helpers.d/apt index 2e56e3788..281e17f70 100644 --- a/data/helpers.d/apt +++ b/data/helpers.d/apt @@ -325,7 +325,7 @@ EOF ynh_app_setting_set --app=$app --key=phpversion --value=$specific_php_version # Integrate new php-fpm service in yunohost - yunohost service add php${specific_php_version}-fpm --log "/var/log/php${phpversion}-fpm.log" + yunohost service add php${specific_php_version}-fpm --log "/var/log/php${specific_php_version}-fpm.log" elif grep --quiet 'php' <<< "$dependencies"; then # Store phpversion into the config of this app ynh_app_setting_set --app=$app --key=phpversion --value=$YNH_DEFAULT_PHP_VERSION From 00d535a620ac8c4e5a7dbd7bfbcdb4f7338318cd Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Mon, 6 Dec 2021 18:38:49 +0100 Subject: [PATCH 189/619] Stop using /home/yunohost.conf for regenconf / confbackup, /var/cache is fine, prevent confusing /home/yunohost.* folder --- helpers/backup | 6 +++--- hooks/conf_regen/01-yunohost | 7 ++----- src/regenconf.py | 2 +- 3 files changed, 6 insertions(+), 9 deletions(-) diff --git a/helpers/backup b/helpers/backup index e4828a10d..01b51d5a1 100644 --- a/helpers/backup +++ b/helpers/backup @@ -226,7 +226,7 @@ with open(sys.argv[1], 'r') as backup_file: # ynh_restore_file -o "conf/nginx.conf" # # If `DEST_PATH` already exists and is lighter than 500 Mo, a backup will be made in -# `/home/yunohost.conf/backup/`. Otherwise, the existing file is removed. +# `/var/cache/yunohost/appconfbackup/`. Otherwise, the existing file is removed. # # if `apps/$app/etc/nginx/conf.d/$domain.d/$app.conf` exists, restore it into # `/etc/nginx/conf.d/$domain.d/$app.conf` @@ -263,7 +263,7 @@ ynh_restore_file() { if [[ -e "${dest_path}" ]]; then # Check if the file/dir size is less than 500 Mo if [[ $(du --summarize --bytes ${dest_path} | cut --delimiter="/" --fields=1) -le "500000000" ]]; then - local backup_file="/home/yunohost.conf/backup/${dest_path}.backup.$(date '+%Y%m%d.%H%M%S')" + local backup_file="/var/cache/yunohost/appconfbackup/${dest_path}.backup.$(date '+%Y%m%d.%H%M%S')" mkdir --parents "$(dirname "$backup_file")" mv "${dest_path}" "$backup_file" # Move the current file or directory else @@ -353,7 +353,7 @@ ynh_backup_if_checksum_is_different() { backup_file_checksum="" if [ -n "$checksum_value" ]; then # Proceed only if a value was stored into the app settings if [ -e $file ] && ! echo "$checksum_value $file" | md5sum --check --status; then # If the checksum is now different - backup_file_checksum="/home/yunohost.conf/backup/$file.backup.$(date '+%Y%m%d.%H%M%S')" + backup_file_checksum="/var/cache/yunohost/appconfbackup/$file.backup.$(date '+%Y%m%d.%H%M%S')" mkdir --parents "$(dirname "$backup_file_checksum")" cp --archive "$file" "$backup_file_checksum" # Backup the current file ynh_print_warn "File $file has been manually modified since the installation or last upgrade. So it has been duplicated in $backup_file_checksum" diff --git a/hooks/conf_regen/01-yunohost b/hooks/conf_regen/01-yunohost index 22929db33..14840e2f1 100755 --- a/hooks/conf_regen/01-yunohost +++ b/hooks/conf_regen/01-yunohost @@ -174,12 +174,12 @@ do_post_regen() { ###################### chmod 750 /home/admin - chmod 750 /home/yunohost.conf chmod 750 /home/yunohost.backup chmod 750 /home/yunohost.backup/archives - chown root:root /home/yunohost.conf + chmod 700 /var/cache/yunohost chown admin:root /home/yunohost.backup chown admin:root /home/yunohost.backup/archives + chown root:root /var/cache/yunohost # NB: x permission for 'others' is important for ssl-cert (and maybe mdns), otherwise slapd will fail to start because can't access the certs chmod 755 /etc/yunohost @@ -195,9 +195,6 @@ do_post_regen() { find /etc/cron.d/yunohost-* -type f -exec chmod 644 {} \; find /etc/cron.*/yunohost-* -type f -exec chown root:root {} \; - chown root:root /var/cache/yunohost - chmod 700 /var/cache/yunohost - setfacl -m g:all_users:--- /var/www setfacl -m g:all_users:--- /var/log/nginx setfacl -m g:all_users:--- /etc/yunohost diff --git a/src/regenconf.py b/src/regenconf.py index afcfb4360..1be62a96f 100644 --- a/src/regenconf.py +++ b/src/regenconf.py @@ -35,7 +35,7 @@ from yunohost.utils.error import YunohostError from yunohost.log import is_unit_operation from yunohost.hook import hook_callback, hook_list -BASE_CONF_PATH = "/home/yunohost.conf" +BASE_CONF_PATH = "/var/cache/yunohost/regenconf" BACKUP_CONF_DIR = os.path.join(BASE_CONF_PATH, "backup") PENDING_CONF_DIR = os.path.join(BASE_CONF_PATH, "pending") REGEN_CONF_FILE = "/etc/yunohost/regenconf.yml" From 4106ed669e5a53652b46d9e7804dbdfa14d699fc Mon Sep 17 00:00:00 2001 From: ljf Date: Mon, 6 Dec 2021 23:01:06 +0100 Subject: [PATCH 190/619] [enh] Manage SSH PasswordAuthentication setting --- data/hooks/conf_regen/03-ssh | 1 + data/templates/ssh/sshd_config | 10 ++++++++-- src/yunohost/settings.py | 5 +++++ 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/data/hooks/conf_regen/03-ssh b/data/hooks/conf_regen/03-ssh index f10dbb653..3f04acd0c 100755 --- a/data/hooks/conf_regen/03-ssh +++ b/data/hooks/conf_regen/03-ssh @@ -26,6 +26,7 @@ do_pre_regen() { # Support different strategy for security configurations export compatibility="$(yunohost settings get 'security.ssh.compatibility')" export port="$(yunohost settings get 'security.ssh.port')" + export password_authentication="$(yunohost settings get 'security.ssh.password_authentication')" export ssh_keys export ipv6_enabled ynh_render_template "sshd_config" "${pending_dir}/etc/ssh/sshd_config" diff --git a/data/templates/ssh/sshd_config b/data/templates/ssh/sshd_config index 1c2854f73..22f0697d9 100644 --- a/data/templates/ssh/sshd_config +++ b/data/templates/ssh/sshd_config @@ -2,6 +2,8 @@ # by YunoHost Protocol 2 +# PLEASE: to change ssh port properly in YunoHost, use this command +# yunohost settings set security.ssh.port -v Port {{ port }} {% if ipv6_enabled == "true" %}ListenAddress ::{% endif %} @@ -53,9 +55,13 @@ PermitEmptyPasswords no ChallengeResponseAuthentication no UsePAM yes -# Change to no to disable tunnelled clear text passwords -# (i.e. everybody will need to authenticate using ssh keys) +# PLEASE: to force everybody to authenticate using ssh keys, run this command: +# yunohost settings set security.ssh.password_authentication -v no +{% if password_authentication == "True" %} #PasswordAuthentication yes +{% else %} +PasswordAuthentication no +{% endif %} # Post-login stuff Banner /etc/issue.net diff --git a/src/yunohost/settings.py b/src/yunohost/settings.py index d59b41a58..26b8c48b2 100644 --- a/src/yunohost/settings.py +++ b/src/yunohost/settings.py @@ -81,6 +81,10 @@ DEFAULTS = OrderedDict( "security.ssh.port", {"type": "int", "default": 22}, ), + ( + "security.ssh.password_authentication", + {"type": "bool", "default": True}, + ), ( "security.nginx.redirect_to_https", { @@ -420,6 +424,7 @@ def reconfigure_nginx_and_yunohost(setting_name, old_value, new_value): @post_change_hook("security.ssh.compatibility") +@post_change_hook("security.ssh.password_authentication") def reconfigure_ssh(setting_name, old_value, new_value): if old_value != new_value: regen_conf(names=["ssh"]) From 1b198e12f69badf99791cd88a037d96dca9ff039 Mon Sep 17 00:00:00 2001 From: ljf Date: Tue, 7 Dec 2021 00:14:15 +0100 Subject: [PATCH 191/619] [fix] Missing locale key --- locales/en.json | 1 + 1 file changed, 1 insertion(+) diff --git a/locales/en.json b/locales/en.json index 81e75eb32..66f42df58 100644 --- a/locales/en.json +++ b/locales/en.json @@ -382,6 +382,7 @@ "global_settings_setting_security_password_user_strength": "User password strength", "global_settings_setting_security_postfix_compatibility": "Compatibility vs. security tradeoff for the Postfix server. Affects the ciphers (and other security-related aspects)", "global_settings_setting_security_ssh_compatibility": "Compatibility vs. security tradeoff for the SSH server. Affects the ciphers (and other security-related aspects)", + "global_settings_setting_security_ssh_password_authentication": "Password authentication allowed", "global_settings_setting_security_ssh_port": "SSH port", "global_settings_setting_security_webadmin_allowlist": "IP adresses allowed to access the webadmin. Comma-separated.", "global_settings_setting_security_webadmin_allowlist_enabled": "Allow only some IPs to access the webadmin.", From d1ab1f674eb25f0970ded4698a89aee18f202cec Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Tue, 7 Dec 2021 12:23:22 +0100 Subject: [PATCH 192/619] Update n to 8.0.1 --- data/helpers.d/nodejs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/data/helpers.d/nodejs b/data/helpers.d/nodejs index e7e61b0c6..962ac2a70 100644 --- a/data/helpers.d/nodejs +++ b/data/helpers.d/nodejs @@ -1,6 +1,6 @@ #!/bin/bash -n_version=8.0.0 +n_version=8.0.1 n_install_dir="/opt/node_n" node_version_path="$n_install_dir/n/versions/node" # N_PREFIX is the directory of n, it needs to be loaded as a environment variable. @@ -16,7 +16,7 @@ export N_PREFIX="$n_install_dir" ynh_install_n() { # Build an app.src for n echo "SOURCE_URL=https://github.com/tj/n/archive/v${n_version}.tar.gz -SOURCE_SUM=9e8879dc4f1c4c0fe4e08a108ed6c23046419b6865fe922ca5176ff7998ae6ff" >"$YNH_APP_BASEDIR/conf/n.src" +SOURCE_SUM=8703ae88fd06ce7f2d0f4018d68bfbab7b26859ed86a86ce4b8f25d2110aee2f" >"$YNH_APP_BASEDIR/conf/n.src" # Download and extract n ynh_setup_source --dest_dir="$n_install_dir/git" --source_id=n # Install n From 71a08c09ea5099d7951d8d7badf0ed3bc0a02cf2 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Wed, 8 Dec 2021 22:06:46 +0100 Subject: [PATCH 193/619] Update changelog for 4.3.4.2 --- debian/changelog | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/debian/changelog b/debian/changelog index f53b259b6..001ab678a 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,14 @@ +yunohost (4.3.4.2) stable; urgency=low + + - [fix] yunomdns: Ignore ipv4 link-local addresses (6854f23c) + - [fix] backup: Fix path for multimedia restore ([#1386](https://github.com/YunoHost/yunohost/pull/1386)) + - [fix] helpers apt/php: typo in extra php-fpm yunohost service integration (47f3c00d) + - [enh] helpers: Update n to 8.0.1 (d1ab1f67) + + Thanks to all contributors <3 ! (ericgaspar, Kayou) + + -- Alexandre Aubin Wed, 08 Dec 2021 22:04:04 +0100 + yunohost (4.3.4.1) stable; urgency=low - [fix] regenconf: Force permission on /etc/resolv.dnsmasq.conf to fix an issue on some setup with umask=027 (5881938c) From b617c799d05fa95e8fb3af85442b59053412f03f Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Wed, 8 Dec 2021 22:11:02 +0100 Subject: [PATCH 194/619] migrate_to_bullseye: move /home/yunohost.conf to /var/cache/yunohost/regenconf --- src/yunohost/data_migrations/0021_migrate_to_bullseye.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/yunohost/data_migrations/0021_migrate_to_bullseye.py b/src/yunohost/data_migrations/0021_migrate_to_bullseye.py index aee3bc2d6..b39ef09e8 100644 --- a/src/yunohost/data_migrations/0021_migrate_to_bullseye.py +++ b/src/yunohost/data_migrations/0021_migrate_to_bullseye.py @@ -84,6 +84,13 @@ class MyMigration(Migration): os.system("mv /usr/share/yunohost/yunohost-config/ssl/yunoCA /usr/share/yunohost/ssl") rm("/usr/share/yunohost/yunohost-config", recursive=True, force=True) + # + # /home/yunohost.conf -> /var/cache/yunohost/regenconf + # + if os.path.exists("/home/yunohost.conf"): + os.system("mv /home/yunohost.conf /var/cache/yunohost/regenconf") + rm("/home/yunohost.conf", recursive=True, force=True) + # # Main upgrade # From 83f7721fdd515bd5d3acdd9f5f584c3ee0891a8e Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Thu, 9 Dec 2021 16:24:12 +0100 Subject: [PATCH 195/619] [fix] services: small issue when parsing installed php-fpm versions during buster->bullseye migration (or more generally, there could be no php-fpm installed) --- src/service.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/service.py b/src/service.py index b723df407..fb1e15c5f 100644 --- a/src/service.py +++ b/src/service.py @@ -705,7 +705,7 @@ def _get_services(): if os.system(f"dpkg --list | grep -q 'ii *{package}'") != 0: del services[name] - php_fpm_versions = check_output(r"dpkg --list | grep -P 'ii php\d.\d-fpm' | awk '{print $2}' | grep -o -P '\d.\d'") + php_fpm_versions = check_output(r"dpkg --list | grep -P 'ii php\d.\d-fpm' | awk '{print $2}' | grep -o -P '\d.\d' || true") php_fpm_versions = [v for v in php_fpm_versions.split('\n') if v.strip()] for version in php_fpm_versions: services[f"php{version}-fpm"] = { From 107bd854eb338617741847e07a085981140249b7 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Thu, 9 Dec 2021 16:47:57 +0100 Subject: [PATCH 196/619] migrate_to_bullseye: fix PHP dependencies issues --- .../data_migrations/0021_migrate_to_bullseye.py | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/yunohost/data_migrations/0021_migrate_to_bullseye.py b/src/yunohost/data_migrations/0021_migrate_to_bullseye.py index b39ef09e8..6ce963625 100644 --- a/src/yunohost/data_migrations/0021_migrate_to_bullseye.py +++ b/src/yunohost/data_migrations/0021_migrate_to_bullseye.py @@ -108,6 +108,22 @@ class MyMigration(Migration): os.system("apt autoremove --assume-yes") os.system("apt clean --assume-yes") + # Force add sury if it's not there yet + # This is to solve some weird issue with php-common breaking php7.3-common, + # hence breaking many php7.3-deps + # hence triggering some dependency conflict (or foobar-ynh-deps uninstall) + # Adding it there shouldnt be a big deal - Yunohost 11.x does add it + # through its regen conf anyway. + if not os.path.exists("/etc/apt/sources.list.d/extra_php_version.list"): + open("/etc/apt/sources.list.d/extra_php_version.list", "w").write("deb https://packages.sury.org/php/ bullseye main") + os.system('wget --timeout 900 --quiet "https://packages.sury.org/php/apt.gpg" --output-document=- | gpg --dearmor >"/etc/apt/trusted.gpg.d/extra_php_version.gpg"') + + os.system("apt update") + + # Force explicit install of php7.4-fpm to make sure it's ll be there + # during 0022_php73_to_php74_pools migration + self.apt_install("php7.4-fpm -o Dpkg::Options::='--force-confmiss'") + # # Yunohost upgrade # From c4732b776e7420c5b19658d61dc36c787f5cf6c5 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Thu, 9 Dec 2021 17:13:06 +0100 Subject: [PATCH 197/619] migrate_to_bullseye: Remove legacy postgresql service record added by helpers, will now be dynamically handled by the core in bullseye --- src/yunohost/data_migrations/0021_migrate_to_bullseye.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/yunohost/data_migrations/0021_migrate_to_bullseye.py b/src/yunohost/data_migrations/0021_migrate_to_bullseye.py index 6ce963625..de53ba8be 100644 --- a/src/yunohost/data_migrations/0021_migrate_to_bullseye.py +++ b/src/yunohost/data_migrations/0021_migrate_to_bullseye.py @@ -15,6 +15,7 @@ from yunohost.utils.packages import ( get_ynh_package_version, _list_upgradable_apt_packages, ) +from yunohost.services import _get_services, _save_services logger = getActionLogger("yunohost.migration") @@ -124,6 +125,13 @@ class MyMigration(Migration): # during 0022_php73_to_php74_pools migration self.apt_install("php7.4-fpm -o Dpkg::Options::='--force-confmiss'") + # Remove legacy postgresql service record added by helpers, + # will now be dynamically handled by the core in bullseye + services = _get_services() + if "postgresql" in services: + del services["postgresql"] + _save_services(services) + # # Yunohost upgrade # From 8abd843fdde7fcec9cc2ae79fbe2f9417ec30725 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Thu, 9 Dec 2021 17:31:07 +0100 Subject: [PATCH 198/619] Aaaand typo T_T --- src/yunohost/data_migrations/0021_migrate_to_bullseye.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/yunohost/data_migrations/0021_migrate_to_bullseye.py b/src/yunohost/data_migrations/0021_migrate_to_bullseye.py index de53ba8be..36e816db1 100644 --- a/src/yunohost/data_migrations/0021_migrate_to_bullseye.py +++ b/src/yunohost/data_migrations/0021_migrate_to_bullseye.py @@ -15,7 +15,7 @@ from yunohost.utils.packages import ( get_ynh_package_version, _list_upgradable_apt_packages, ) -from yunohost.services import _get_services, _save_services +from yunohost.service import _get_services, _save_services logger = getActionLogger("yunohost.migration") From 6cc7978b4a285496371e47d9e0cff8d6ed0b7600 Mon Sep 17 00:00:00 2001 From: yunohost-bot Date: Thu, 9 Dec 2021 19:18:07 +0000 Subject: [PATCH 199/619] [CI] Format code with Black --- .../0021_migrate_to_bullseye.py | 26 +++++++++++++------ 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/src/yunohost/data_migrations/0021_migrate_to_bullseye.py b/src/yunohost/data_migrations/0021_migrate_to_bullseye.py index 36e816db1..f97ab16da 100644 --- a/src/yunohost/data_migrations/0021_migrate_to_bullseye.py +++ b/src/yunohost/data_migrations/0021_migrate_to_bullseye.py @@ -25,6 +25,7 @@ N_CURRENT_YUNOHOST = 4 N_NEXT_DEBAN = 11 N_NEXT_YUNOHOST = 11 + class MyMigration(Migration): "Upgrade the system to Debian Bullseye and Yunohost 11.x" @@ -76,13 +77,17 @@ class MyMigration(Migration): _force_clear_hashes(["/etc/mysql/my.cnf"]) rm("/etc/mysql/mariadb.cnf", force=True) rm("/etc/mysql/my.cnf", force=True) - self.apt_install("mariadb-common --reinstall -o Dpkg::Options::='--force-confmiss'") + self.apt_install( + "mariadb-common --reinstall -o Dpkg::Options::='--force-confmiss'" + ) # # /usr/share/yunohost/yunohost-config/ssl/yunoCA -> /usr/share/yunohost/ssl # if os.path.exists("/usr/share/yunohost/yunohost-config/ssl/yunoCA"): - os.system("mv /usr/share/yunohost/yunohost-config/ssl/yunoCA /usr/share/yunohost/ssl") + os.system( + "mv /usr/share/yunohost/yunohost-config/ssl/yunoCA /usr/share/yunohost/ssl" + ) rm("/usr/share/yunohost/yunohost-config", recursive=True, force=True) # @@ -116,8 +121,12 @@ class MyMigration(Migration): # Adding it there shouldnt be a big deal - Yunohost 11.x does add it # through its regen conf anyway. if not os.path.exists("/etc/apt/sources.list.d/extra_php_version.list"): - open("/etc/apt/sources.list.d/extra_php_version.list", "w").write("deb https://packages.sury.org/php/ bullseye main") - os.system('wget --timeout 900 --quiet "https://packages.sury.org/php/apt.gpg" --output-document=- | gpg --dearmor >"/etc/apt/trusted.gpg.d/extra_php_version.gpg"') + open("/etc/apt/sources.list.d/extra_php_version.list", "w").write( + "deb https://packages.sury.org/php/ bullseye main" + ) + os.system( + 'wget --timeout 900 --quiet "https://packages.sury.org/php/apt.gpg" --output-document=- | gpg --dearmor >"/etc/apt/trusted.gpg.d/extra_php_version.gpg"' + ) os.system("apt update") @@ -205,10 +214,10 @@ class MyMigration(Migration): message = m18n.n("migration_0021_general_warning") # FIXME: re-enable this message with updated topic link once we release the migration as stable - #message = ( + # message = ( # "N.B.: This migration has been tested by the community over the last few months but has only been declared stable recently. If your server hosts critical services and if you are not too confident with debugging possible issues, we recommend you to wait a little bit more while we gather more feedback and polish things up. If on the other hand you are relatively confident with debugging small issues that may arise, you are encouraged to run this migration ;)! You can read about remaining known issues and feedback from the community here: https://forum.yunohost.org/t/12195\n\n" # + message - #) + # ) if problematic_apps: message += "\n\n" + m18n.n( @@ -285,7 +294,6 @@ class MyMigration(Migration): call_async_output(cmd, callbacks, shell=True) - def patch_yunohost_conflicts(self): # # This is a super dirty hack to remove the conflicts from yunohost's debian/control file @@ -305,6 +313,8 @@ class MyMigration(Migration): # We want to keep conflicting with apache/bind9 tho new_conflicts = "Conflicts: apache2, bind9" - command = f"sed -i /var/lib/dpkg/status -e 's@{conflicts}@{new_conflicts}@g'" + command = ( + f"sed -i /var/lib/dpkg/status -e 's@{conflicts}@{new_conflicts}@g'" + ) logger.debug(f"Running: {command}") os.system(command) From 0fc209acfbc6dbcb4d56ceb7618153ee34f1aac6 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Mon, 13 Dec 2021 18:19:32 +0100 Subject: [PATCH 200/619] [fix] helpers logrorate: remove permission tweak .. code was not working as expected. To be re-addressed some day ... --- data/helpers.d/logrotate | 5 ----- 1 file changed, 5 deletions(-) diff --git a/data/helpers.d/logrotate b/data/helpers.d/logrotate index 80b761711..6f9726beb 100644 --- a/data/helpers.d/logrotate +++ b/data/helpers.d/logrotate @@ -90,11 +90,6 @@ $logfile { EOF mkdir --parents $(dirname "$logfile") # Create the log directory, if not exist cat ${app}-logrotate | $customtee /etc/logrotate.d/$app >/dev/null # Append this config to the existing config file, or replace the whole config file (depending on $customtee) - - if ynh_user_exists --username="$app"; then - chown $app:$app "$logfile" - chmod o-rwx "$logfile" - fi } # Remove the app's logrotate config. From cc1230c5de25aa3c70cdb364bdad2278c2b6ef74 Mon Sep 17 00:00:00 2001 From: liimee Date: Mon, 15 Nov 2021 10:40:19 +0000 Subject: [PATCH 201/619] Translated using Weblate (Indonesian) Currently translated at 7.9% (56 of 705 strings) Translation: YunoHost/core Translate-URL: https://translate.yunohost.org/projects/yunohost/core/id/ --- locales/id.json | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/locales/id.json b/locales/id.json index c9778dd5f..08e09fe8b 100644 --- a/locales/id.json +++ b/locales/id.json @@ -42,5 +42,17 @@ "app_start_install": "Memasang {app}...", "app_start_remove": "Menghapus {app}...", "app_manifest_install_ask_password": "Pilih kata sandi administrasi untuk aplikasi ini", - "app_upgrade_several_apps": "Aplikasi-aplikasi berikut akan diperbarui: {apps}" -} \ No newline at end of file + "app_upgrade_several_apps": "Aplikasi-aplikasi berikut akan diperbarui: {apps}", + "backup_app_failed": "Tidak dapat mencadangkan {app}", + "backup_archive_name_exists": "Arsip cadangan dengan nama ini sudah ada.", + "backup_created": "Cadangan dibuat", + "backup_creation_failed": "Tidak dapat membuat arsip cadangan", + "backup_delete_error": "Tidak dapat menghapus '{path}'", + "backup_deleted": "Cadangan dihapus", + "diagnosis_apps_issue": "Sebuah masalah ditemukan pada aplikasi {app}", + "backup_applying_method_tar": "Membuat arsip TAR cadangan...", + "backup_method_tar_finished": "Arsip TAR cadanagan dibuat", + "backup_nothings_done": "Tak ada yang harus disimpan", + "certmanager_cert_install_success": "Sertifikat Let's Encrypt sekarang sudah terpasang pada domain '{domain}'", + "backup_mount_archive_for_restore": "Menyiapkan arsip untuk pemulihan..." +} From fbf85fa0ba486262e107ac982684b1a7d3e4afba Mon Sep 17 00:00:00 2001 From: Ilya Date: Wed, 17 Nov 2021 20:03:22 +0000 Subject: [PATCH 202/619] Translated using Weblate (Russian) Currently translated at 14.4% (102 of 705 strings) Translation: YunoHost/core Translate-URL: https://translate.yunohost.org/projects/yunohost/core/ru/ --- locales/ru.json | 31 +++++++++++++++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) diff --git a/locales/ru.json b/locales/ru.json index 58bd1846d..f38f703fc 100644 --- a/locales/ru.json +++ b/locales/ru.json @@ -73,5 +73,32 @@ "user_unknown": "Неизвестный пользователь: {user}", "yunohost_already_installed": "YunoHost уже установлен", "yunohost_configured": "Теперь YunoHost настроен", - "upgrading_packages": "Обновление пакетов..." -} \ No newline at end of file + "upgrading_packages": "Обновление пакетов...", + "app_requirements_unmeet": "Необходимые требования для {app} не выполнены, пакет {pkgname} ({version}) должен быть {spec}", + "app_make_default_location_already_used": "Невозможно сделать '{app}' приложением по умолчанию на домене, '{domain}' уже используется '{other_app}'", + "app_config_unable_to_apply": "Не удалось применить значения панели конфигурации.", + "app_config_unable_to_read": "Не удалось прочитать значения панели конфигурации.", + "app_install_failed": "Невозможно установить {app}: {error}", + "apps_catalog_init_success": "Система каталога приложений инициализирована!", + "backup_abstract_method": "Этот метод резервного копирования еще не реализован", + "backup_actually_backuping": "Создание резервного архива из собранных файлов...", + "backup_applying_method_custom": "Вызов пользовательского метода резервного копирования {method}'...", + "backup_archive_app_not_found": "Не удалось найти {app} в резервной копии", + "backup_applying_method_tar": "Создание резервной копии в TAR-архиве...", + "backup_archive_broken_link": "Не удалось получить доступ к резервной копии (неправильная ссылка {path})", + "apps_catalog_failed_to_download": "Невозможно загрузить каталог приложений {apps_catalog}: {error}", + "apps_catalog_obsolete_cache": "Кэш каталога приложений пуст или устарел.", + "backup_archive_cant_retrieve_info_json": "Не удалось загрузить информацию об архиве '{archive}'... info.json не может быть получен (или не является корректным json).", + "app_packaging_format_not_supported": "Это приложение не может быть установлено, поскольку его формат не поддерживается вашей версией YunoHost. Возможно, вам следует обновить систему.", + "app_restore_failed": "Не удалось восстановить {app}: {error}", + "app_restore_script_failed": "Произошла ошибка внутри сценария восстановления приложения", + "ask_user_domain": "Домен, используемый для адреса электронной почты пользователя и учетной записи XMPP", + "app_not_upgraded": "Не удалось обновить приложение '{failed_app}', и, как следствие, обновление следующих приложений было отменено: {apps}", + "app_start_backup": "Сбор файлов для резервного копирования {app}...", + "app_start_install": "Устанавливается {app}...", + "backup_app_failed": "Не удалось создать резервную копию {app}", + "backup_archive_name_exists": "Резервная копия с таким именем уже существует.", + "backup_archive_name_unknown": "Неизвестный локальный архив резервного копирования с именем '{name}'", + "backup_archive_open_failed": "Не удалось открыть архив резервной копии", + "backup_archive_corrupted": "Похоже, что архив резервной копии '{archive}' поврежден : {error}" +} From 59c27886211229f39d7991ef7e551a40cf0982e5 Mon Sep 17 00:00:00 2001 From: Ilya Date: Thu, 18 Nov 2021 19:32:14 +0000 Subject: [PATCH 203/619] Translated using Weblate (Russian) Currently translated at 24.1% (170 of 705 strings) Translation: YunoHost/core Translate-URL: https://translate.yunohost.org/projects/yunohost/core/ru/ --- locales/ru.json | 74 +++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 71 insertions(+), 3 deletions(-) diff --git a/locales/ru.json b/locales/ru.json index f38f703fc..deb64c70a 100644 --- a/locales/ru.json +++ b/locales/ru.json @@ -35,7 +35,7 @@ "domain_dns_conf_is_just_a_recommendation": "Эта страница показывает вам *рекомендуемую* конфигурацию. Она *не* создаёт для вас конфигурацию DNS. Вы должны сами конфигурировать зону вашего DNS у вашего регистратора в соответствии с этой рекомендацией.", "good_practices_about_user_password": "Выберите пароль пользователя длиной не менее 8 символов, хотя рекомендуется использовать более длинные (например, парольную фразу) и / или использовать символы различного типа (прописные, строчные буквы, цифры и специальные символы).", "password_too_simple_3": "Пароль должен содержать не менее 8 символов и содержать цифры, заглавные и строчные буквы и специальные символы", - "upnp_enabled": "UPnP включён", + "upnp_enabled": "UPnP включен", "user_deleted": "Пользователь удалён", "ask_lastname": "Фамилия", "app_action_broke_system": "Это действие, по-видимому, нарушило эти важные службы: {services}", @@ -51,7 +51,7 @@ "ask_password": "Пароль", "app_remove_after_failed_install": "Удаление приложения после сбоя установки...", "app_upgrade_script_failed": "Внутри скрипта обновления приложения произошла ошибка", - "upnp_disabled": "UPnP отключён", + "upnp_disabled": "UPnP отключен", "app_manifest_install_ask_domain": "Выберите домен, в котором должно быть установлено это приложение", "app_manifest_install_ask_path": "Выберите URL путь (часть после домена), по которому должно быть установлено это приложение", "app_manifest_install_ask_admin": "Выберите пользователя администратора для этого приложения", @@ -100,5 +100,73 @@ "backup_archive_name_exists": "Резервная копия с таким именем уже существует.", "backup_archive_name_unknown": "Неизвестный локальный архив резервного копирования с именем '{name}'", "backup_archive_open_failed": "Не удалось открыть архив резервной копии", - "backup_archive_corrupted": "Похоже, что архив резервной копии '{archive}' поврежден : {error}" + "backup_archive_corrupted": "Похоже, что архив резервной копии '{archive}' поврежден : {error}", + "certmanager_cert_install_success_selfsigned": "Самоподписанный сертификат для домена '{domain}' установлен", + "backup_created": "Создана резервная копия", + "config_unknown_filter_key": "Ключ фильтра '{filter_key}' неверен.", + "config_validate_date": "Должна быть правильная дата в формате YYYY-MM-DD", + "config_validate_email": "Должен быть правильный email", + "config_validate_time": "Должно быть правильное время формата HH:MM", + "backup_ask_for_copying_if_needed": "Хотите ли вы временно выполнить резервное копирование с использованием {size}MB? (Этот способ используется, поскольку некоторые файлы не могут быть подготовлены более эффективным методом.)", + "backup_permission": "Разрешить резервное копирование для {app}", + "certmanager_domain_dns_ip_differs_from_public_ip": "DNS-записи для домена '{domain}' отличаются от IP этого сервера. Пожалуйста, проверьте категорию 'DNS-записи' (основные) в диагностике для получения дополнительной информации. Если вы недавно изменили свою A-запись, пожалуйста, подождите, пока она распространится (некоторые программы проверки распространения DNS доступны в интернете). (Если вы знаете, что делаете, используйте '--no-checks', чтобы отключить эти проверки.)", + "certmanager_domain_not_diagnosed_yet": "Для домена {domain} еще нет результатов диагностики. Пожалуйста, перезапустите диагностику для категорий 'DNS-записи' и 'Web', чтобы проверить, готов ли домен к Let's Encrypt. (Или, если вы знаете, что делаете, используйте '--no-checks', чтобы отключить эти проверки.)", + "config_validate_url": "Должна быть правильная ссылка", + "config_version_not_supported": "Версии конфигурационной панели '{version}' не поддерживаются.", + "confirm_app_install_danger": "ОПАСНО! Это приложение все еще является экспериментальным (если не сказать, что оно явно не работает)! Вам не следует устанавливать его, если вы не знаете, что делаете. Если это приложение не будет работать или сломает вашу систему, мы не будем оказывать техническую поддержку... Если вы все равно готовы рискнуть, введите '{answers}'", + "confirm_app_install_thirdparty": "ВАЖНО! Это приложение не входит в каталог приложений YunoHost. Установка сторонних приложений может нарушить целостность и безопасность вашей системы. Вам не следует устанавливать его, если вы не знаете, что делаете. ТЕХНИЧЕСКОЙ ПОДДЕРЖКИ НЕ БУДЕТ, если это приложение не будет работать или сломает вашу систему... Если вы все равно готовы рискнуть, введите '{answers}'", + "config_apply_failed": "Не удалось применить новую конфигурацию: {error}", + "config_cant_set_value_on_section": "Вы не можете установить одно значение на весь раздел конфигурации.", + "config_forbidden_keyword": "Ключевое слово '{keyword}' зарезервировано, вы не можете создать или использовать панель конфигурации с вопросом с таким id.", + "config_no_panel": "Панель конфигурации не найдена.", + "danger": "Опасно:", + "certmanager_warning_subdomain_dns_record": "Субдомен '{subdomain}' не соответствует IP-адресу основного домена '{domain}'. Некоторые функции будут недоступны, пока вы не исправите это и не перегенерируете сертификат.", + "app_argument_password_no_default": "Ошибка при парсинге аргумента пароля '{name}': аргумент пароля не может иметь значение по умолчанию по причинам безопасности", + "custom_app_url_required": "Вы должны указать URL для обновления вашего пользовательского приложения {app}", + "backup_creation_failed": "Не удалось создать резервную копию", + "backup_csv_addition_failed": "Не удалось добавить файлы для резервного копирования в CSV-файл", + "backup_csv_creation_failed": "Не удалось создать CSV-файл, необходимый для восстановления", + "backup_deleted": "Резервная копия удалена", + "backup_delete_error": "Не удалось удалить '{path}'", + "backup_method_copy_finished": "Создание копии бэкапа завершено", + "backup_method_tar_finished": "Создан резервный TAR-архив", + "backup_mount_archive_for_restore": "Подготовка архива для восстановления...", + "backup_method_custom_finished": "Пользовательский метод резервного копирования '{method}' завершен", + "backup_nothings_done": "Нечего сохранять", + "backup_output_directory_required": "Вы должны выбрать каталог для сохранения резервной копии", + "backup_system_part_failed": "Не удалось создать резервную копию системной части '{part}'", + "certmanager_cert_renew_success": "Обновлен сертификат Let's Encrypt для домена '{domain}'", + "certmanager_cert_signing_failed": "Не удалось подписать новый сертификат", + "diagnosis_apps_bad_quality": "В настоящее время это приложение отмечено как неработающее в каталоге приложений YunoHost. Это может быть временной проблемой, пока мэинтейнеры пытаются исправить проблему. Пока что обновление этого приложения отключено.", + "diagnosis_apps_broken": "В настоящее время это приложение отмечено как неработающее в каталоге приложений YunoHost. Это может быть временной проблемой, пока мэинтейнеры пытаются исправить проблему. Пока что обновления для этого приложения отключены.", + "diagnosis_apps_allgood": "Все установленные приложения соблюдают основные правила упаковки", + "diagnosis_apps_issue": "Обнаружена проблема для приложения {app}", + "diagnosis_apps_not_in_app_catalog": "Этого приложения нет в каталоге приложений YunoHost. Если оно было там раньше, а теперь удалено, вам стоит подумать об удалении этого приложения, так как оно больше не получит обновлений и может нарушить целостность и безопасность вашей системы.", + "diagnosis_apps_deprecated_practices": "Установленная версия этого приложения все еще использует некоторые устаревшие пакеты. Вам стоит подумать об обновлении.", + "additional_urls_already_added": "Этот URL '{url}' уже добавлен в дополнительный URL для разрешения '{permission}'", + "additional_urls_already_removed": "Этот URL '{url}' уже удален из дополнительных URL для разрешения '{permission}'", + "app_action_cannot_be_ran_because_required_services_down": "Для выполнения этого действия должны быть запущены следующие службы: {services}. Попробуйте перезапустить их, чтобы продолжить (и, возможно, выяснить, почему они не работают).", + "app_unsupported_remote_type": "Неподдерживаемый удаленный тип, используемый для приложения", + "backup_archive_system_part_not_available": "Системная часть '{часть}' недоступна в этой резервной копии", + "backup_output_directory_not_empty": "Вы должны выбрать пустой каталог для сохранения", + "backup_archive_writing_error": "Не удалось добавить файлы '{source}' (названные в архиве '{dest}') для резервного копирования в архив '{archive}'", + "backup_cant_mount_uncompress_archive": "Не удалось смонтировать несжатый архив как защищенный от записи", + "backup_copying_to_organize_the_archive": "Копирование {size}MB для создания архива", + "backup_couldnt_bind": "Не удалось связать {src} с {dest}.", + "backup_output_directory_forbidden": "Выберите другой каталог для сохранения. Резервные копии не могут быть созданы в подкаталогах /bin, /boot, /dev, /etc, /lib, /root, /run, /sbin, /sys, /usr, /var или /home/yunohost.backup/archives", + "backup_with_no_backup_script_for_app": "Приложение '{app}' не имеет сценария резервного копирования. Оно будет проигнорировано.", + "certmanager_attempt_to_renew_nonLE_cert": "Сертификат для домена '{domain}' не выпущен Let's Encrypt. Невозможно продлить его автоматически!", + "certmanager_attempt_to_renew_valid_cert": "Срок действия сертификата для домена '{domain}' НЕ истекает! (Вы можете использовать --force, если знаете, что делаете)", + "certmanager_cannot_read_cert": "При попытке открыть текущий сертификат для домена {домен} произошло что-то неправильное (файл: {file}), причина: {reason}", + "certmanager_cert_install_success": "Сертификат Let's Encrypt для домена '{domain}' установлен", + "certmanager_domain_cert_not_selfsigned": "Сертификат для домена {domain} не самоподписанный. Вы уверены, что хотите заменить его? (Для этого используйте '--force'.)", + "certmanager_certificate_fetching_or_enabling_failed": "Попытка использовать новый сертификат для {domain} не сработала...", + "certmanager_domain_http_not_working": "Похоже, домен {domain} не доступен через HTTP. Пожалуйста, проверьте категорию 'Web' в диагностике для получения дополнительной информации. (Если вы знаете, что делаете, используйте '--no-checks', чтобы отключить эти проверки.)", + "certmanager_hit_rate_limit": "Для этого набора доменов {domain} в последнее время было выпущено слишком много сертификатов. Пожалуйста, повторите попытку позже. См. https://letsencrypt.org/docs/rate-limits/ для получения более подробной информации", + "certmanager_no_cert_file": "Не удалось прочитать файл сертификата для домена {domain} (файл: {file})", + "confirm_app_install_warning": "Предупреждение: Это приложение может работать, но пока еще недостаточно интегрировано в YunoHost. Некоторые функции, такие как единая регистрация и резервное копирование/восстановление, могут быть недоступны. Все равно устанавливать? [{answers}] ", + "yunohost_not_installed": "YunoHost установлен неправильно. Пожалуйста, запустите 'yunohost tools postinstall'", + "backup_cleaning_failed": "Не удалось очистить временную папку резервного копирования", + "certmanager_attempt_to_replace_valid_cert": "Вы пытаетесь перезаписать хороший и действительный сертификат для домена {domain}! (Используйте --force для обхода)", + "backup_create_size_estimation": "Архив будет содержать около {размер} данных." } From c27f13230c7e340f1db238e5784506694f3c4658 Mon Sep 17 00:00:00 2001 From: Christian Wehrli Date: Fri, 19 Nov 2021 13:08:44 +0000 Subject: [PATCH 204/619] Translated using Weblate (German) Currently translated at 91.0% (642 of 705 strings) Translation: YunoHost/core Translate-URL: https://translate.yunohost.org/projects/yunohost/core/de/ --- locales/de.json | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/locales/de.json b/locales/de.json index e491c5ac2..4129e7e72 100644 --- a/locales/de.json +++ b/locales/de.json @@ -638,5 +638,16 @@ "diagnosis_apps_issue": "Ein Problem für die App {app} ist aufgetreten", "config_validate_time": "Sollte eine zulässige Zeit wie HH:MM sein", "config_validate_url": "Sollte eine zulässige web URL sein", - "config_version_not_supported": "Konfigurationspanel Versionen '{version}' sind nicht unterstützt." -} \ No newline at end of file + "config_version_not_supported": "Konfigurationspanel Versionen '{version}' sind nicht unterstützt.", + "diagnosis_apps_allgood": "Alle installierten Apps berücksichtigen die grundlegenden Paketierungspraktiken", + "diagnosis_apps_broken": "Diese App ist im YunoHost-Applikationskatalog momentan als defekt gekennzeichnet. Es könnte sich dabei um einen vorübergehendes Problem handeln. Während der Betreuer versucht das Problem zu beheben, ist die Upgrade-Funktion für diese App gesperrt.", + "diagnosis_apps_not_in_app_catalog": "Diese App fehlt im Applikationskatalog von YunoHost oder wird in diesem nicht mehr angezeigt. Sie müssen im Betracht ziehen, sie zu deinstallieren, weil sie keine Aktualisierungen mehr erhält und die Integrität und die Sicherheit Ihres Systems kompromittieren könnte.", + "diagnosis_apps_outdated_ynh_requirement": "Die installierte Version dieser App erfordert nur YunoHost >=2.x, was darauf hinweist, dass die App nicht mehr auf dem Stand der guten Paketierungspraktiken und der empfohlenen Helper ist. Sie sollten wirklich in Betracht ziehen, sie zu aktualisieren.", + "diagnosis_description_apps": "Applikationen", + "config_cant_set_value_on_section": "Sie können nicht einen einzelnen Wert auf einen gesamten Konfigurationsbereich anwenden.", + "diagnosis_apps_deprecated_practices": "Die installierte Version dieser App verwendet immer noch gewisse veraltete Paketierungspraktiken. Sie sollten die App wirklich aktualisieren.", + "app_config_unable_to_apply": "Konnte die Werte des Konfigurations-Panels nicht anwenden.", + "app_config_unable_to_read": "Konnte die Werte des Konfigurations-Panels nicht auslesen.", + "config_unknown_filter_key": "Der Filterschlüssel '{filter_key}' ist inkorrekt.", + "diagnosis_dns_specialusedomain": "Die Domäne {domain} basiert auf einer Top-Level-Domain (TLD) für spezielle Zwecke wie .local oder .test und deshalb wird von ihr nicht erwartet, dass sie echte DNS-Einträge besitzt." +} From da1b0aa041de4c5d43fc280dbf0c594902df4bb8 Mon Sep 17 00:00:00 2001 From: Ilya Date: Fri, 19 Nov 2021 19:47:40 +0000 Subject: [PATCH 205/619] Translated using Weblate (Russian) Currently translated at 26.9% (190 of 705 strings) Translation: YunoHost/core Translate-URL: https://translate.yunohost.org/projects/yunohost/core/ru/ --- locales/ru.json | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/locales/ru.json b/locales/ru.json index deb64c70a..8fbc3f91b 100644 --- a/locales/ru.json +++ b/locales/ru.json @@ -168,5 +168,25 @@ "yunohost_not_installed": "YunoHost установлен неправильно. Пожалуйста, запустите 'yunohost tools postinstall'", "backup_cleaning_failed": "Не удалось очистить временную папку резервного копирования", "certmanager_attempt_to_replace_valid_cert": "Вы пытаетесь перезаписать хороший и действительный сертификат для домена {domain}! (Используйте --force для обхода)", - "backup_create_size_estimation": "Архив будет содержать около {размер} данных." + "backup_create_size_estimation": "Архив будет содержать около {размер} данных.", + "diagnosis_description_regenconf": "Конфигурации системы", + "diagnosis_description_services": "Проверка статусов сервисов", + "config_validate_color": "Должен быть правильный hex цвета RGB", + "diagnosis_basesystem_hardware": "Аппаратная архитектура сервера – {virt} {arch}", + "certmanager_acme_not_configured_for_domain": "Задача ACME не может быть запущена для {domain} прямо сейчас, потому что в его nginx conf отсутствует соответствующий фрагмент кода... Пожалуйста, убедитесь, что конфигурация вашего nginx обновлена, используя `yunohost tools regen-conf nginx --dry-run --with-diff`.", + "diagnosis_basesystem_ynh_single_version": "{package} версия: {version} ({repo})", + "diagnosis_description_mail": "Email", + "diagnosis_basesystem_kernel": "Версия ядра Linux на сервере {kernel_version}", + "diagnosis_description_apps": "Приложения", + "diagnosis_diskusage_low": "В хранилище {mountpoint} (на устройстве {device}) осталось {free} ({free_percent}%) места (из {total}). Будьте осторожны.", + "diagnosis_description_dnsrecords": "DNS записи", + "diagnosis_description_ip": "Интернет-соединение", + "diagnosis_description_basesystem": "Основная система", + "diagnosis_description_web": "Web", + "diagnosis_basesystem_host": "На сервере запущен Debian {debian_version}", + "diagnosis_dns_bad_conf": "Некоторые записи DNS для домена {domain} (категория {category}) отсутствуют или неверны", + "diagnosis_description_systemresources": "Системные ресурсы", + "backup_with_no_restore_script_for_app": "{app} не имеет сценария восстановления, вы не сможете автоматически восстановить это приложение из резервной копии.", + "diagnosis_description_ports": "Открытые порты", + "diagnosis_basesystem_hardware_model": "Модель сервера {model}" } From 10699e5de04a1ef1dde71939a8f105421474e69e Mon Sep 17 00:00:00 2001 From: Boudewijn Date: Wed, 24 Nov 2021 12:48:07 +0000 Subject: [PATCH 206/619] Translated using Weblate (Dutch) Currently translated at 11.4% (81 of 705 strings) Translation: YunoHost/core Translate-URL: https://translate.yunohost.org/projects/yunohost/core/nl/ --- locales/nl.json | 48 +++++++++++++++++++++++++++++++++--------------- 1 file changed, 33 insertions(+), 15 deletions(-) diff --git a/locales/nl.json b/locales/nl.json index f5923fa9a..038d18283 100644 --- a/locales/nl.json +++ b/locales/nl.json @@ -1,19 +1,19 @@ { "action_invalid": "Ongeldige actie '{action}'", "admin_password": "Administrator wachtwoord", - "admin_password_changed": "Het administratie wachtwoord werd gewijzigd", + "admin_password_changed": "Het administratie wachtwoord is gewijzigd", "app_already_installed": "{app} is al geïnstalleerd", "app_argument_invalid": "Kies een geldige waarde voor '{name}': {error}", "app_argument_required": "Het '{name}' moet ingevuld worden", - "app_extraction_failed": "Kan installatiebestanden niet uitpakken", + "app_extraction_failed": "Het lukt niet om de installatiebestanden uit te pakken", "app_id_invalid": "Ongeldige app-id", "app_install_files_invalid": "Deze bestanden kunnen niet worden geïnstalleerd", - "app_not_installed": "{app} is niet geïnstalleerd", - "app_removed": "{app} succesvol verwijderd", - "app_sources_fetch_failed": "Kan bronbestanden niet ophalen, klopt de URL?", + "app_not_installed": "Het lukte niet om {app} te vinden in de lijst met geïnstalleerde apps: {all_apps}", + "app_removed": "{app} is verwijderd", + "app_sources_fetch_failed": "Het is niet gelukt bronbestanden op te halen, klopt de URL?", "app_unknown": "Onbekende app", - "app_upgrade_failed": "Kan app {app} niet updaten", - "app_upgraded": "{app} succesvol geüpgraded", + "app_upgrade_failed": "Het is niet gelukt app {app} bij te werken: {error}", + "app_upgraded": "{app} is bijgewerkt", "ask_firstname": "Voornaam", "ask_lastname": "Achternaam", "ask_new_admin_password": "Nieuw administratorwachtwoord", @@ -69,8 +69,8 @@ "user_unknown": "Gebruikersnaam {user} is onbekend", "user_update_failed": "Kan gebruiker niet bijwerken", "yunohost_configured": "YunoHost configuratie is OK", - "admin_password_change_failed": "Wachtwoord kan niet veranderd worden", - "app_argument_choice_invalid": "Ongeldige keuze voor argument '{name}'. Het moet een van de volgende keuzes zijn {choices}", + "admin_password_change_failed": "Wachtwoord wijzigen is niet gelukt", + "app_argument_choice_invalid": "Kiel een geldige waarde voor argument '{name}'; {value}' komt niet voor in de keuzelijst {choices}", "app_not_correctly_installed": "{app} schijnt niet juist geïnstalleerd te zijn", "app_not_properly_removed": "{app} werd niet volledig verwijderd", "app_requirements_checking": "Noodzakelijke pakketten voor {app} aan het controleren...", @@ -98,18 +98,36 @@ "app_install_failed": "Kan {app} niet installeren: {error}", "app_remove_after_failed_install": "Bezig de app te verwijderen na gefaalde installatie...", "app_manifest_install_ask_domain": "Kies het domein waar deze app op geïnstalleerd moet worden", - "app_manifest_install_ask_path": "Kies het pad waar deze app geïnstalleerd moet worden", + "app_manifest_install_ask_path": "Kies het URL-pad (achter het domein) waar deze app geïnstalleerd moet worden", "app_manifest_install_ask_admin": "Kies een administrator voor deze app", "app_change_url_success": "{app} URL is nu {domain}{path}", - "app_full_domain_unavailable": "Sorry, deze app moet op haar eigen domein geïnstalleerd worden, maar andere apps zijn al geïnstalleerd op het domein '{domain}'. U kunt wel een subdomein aan deze app toewijden.", + "app_full_domain_unavailable": "Sorry, deze app moet op haar eigen domein geïnstalleerd worden, maar andere apps zijn al geïnstalleerd op het domein '{domain}'. Een mogelijke oplossing is om een nieuw subdomein toe te voegen, speciaal voor deze app.", "app_install_script_failed": "Er is een fout opgetreden in het installatiescript van de app", "app_location_unavailable": "Deze URL is niet beschikbaar of is in conflict met de al geïnstalleerde app(s):\n{apps}", "app_manifest_install_ask_password": "Kies een administratiewachtwoord voor deze app", "app_manifest_install_ask_is_public": "Moet deze app zichtbaar zijn voor anomieme bezoekers?", "app_not_upgraded": "De app '{failed_app}' kon niet upgraden en daardoor zijn de upgrades van de volgende apps geannuleerd: {apps}", - "app_start_install": "{app} installeren...", - "app_start_remove": "{app} verwijderen...", + "app_start_install": "Bezig met installeren van {app}...", + "app_start_remove": "Bezig met verwijderen van {app}...", "app_start_backup": "Bestanden aan het verzamelen voor de backup van {app}...", "app_start_restore": "{app} herstellen...", - "app_upgrade_several_apps": "De volgende apps zullen worden geüpgraded: {apps}" -} \ No newline at end of file + "app_upgrade_several_apps": "De volgende apps zullen worden geüpgraded: {apps}", + "app_upgrade_script_failed": "Er is een fout opgetreden in het upgradescript van de app", + "apps_already_up_to_date": "Alle apps zijn al bijgewerkt met de nieuwste versie", + "app_restore_script_failed": "Er ging iets mis in het helstelscript van de app", + "app_change_url_identical_domains": "De oude en nieuwe domeinnaam/url_path zijn identiek ('{domain}{path}'), er is niets te doen.", + "app_already_up_to_date": "{app} is al de meest actuele versie", + "app_action_broke_system": "Deze actie lijkt de volgende belangrijke services te hebben kapotgemaakt: {services}", + "app_config_unable_to_apply": "De waarden in het configuratiescherm konden niet toegepast worden.", + "app_config_unable_to_read": "Het is niet gelukt de waarden van het configuratiescherm te lezen.", + "app_argument_password_no_default": "Foutmelding tijdens het lezen van wachtwoordargument '{name}': het wachtwoordargument mag om veiligheidsredenen geen standaardwaarde hebben.", + "app_already_installed_cant_change_url": "Deze app is al geïnstalleerd. De URL kan niet veranderd worden met deze functie. Probeer of dat lukt via `app changeurl`.", + "apps_catalog_init_success": "De app-catalogus is succesvol geinitieerd!", + "apps_catalog_failed_to_download": "Het is niet gelukt de {apps_catalog} app-catalogus te downloaden: {error}", + "app_packaging_format_not_supported": "Deze app kon niet geinstalleerd worden, omdat het pakketformaat niet ondersteund wordt door je Yunohost. Probeer of je Yunohost bijgewerkt kan worden.", + "additional_urls_already_added": "Extra URL '{url:s}' is al toegevoegd in de extra URL voor privilege '{permission:s}'", + "additional_urls_already_removed": "Extra URL '{url}' is al verwijderd in de extra URL voor privilege '{permission}'", + "app_label_deprecated": "Dit commando is vervallen. Gebruik alsjeblieft het nieuwe commando 'yunohost user permission update' om het label van de app te beheren.", + "app_change_url_no_script": "De app '{app_name}' ondersteunt nog geen URL-aanpassingen. Misschien wel na een upgrade.", + "app_upgrade_some_app_failed": "Sommige apps konden niet worden bijgewerkt" +} From 4d8ca7aaad63520ed604d0bd4889287945a6fb20 Mon Sep 17 00:00:00 2001 From: Tymofii Lytvynenko Date: Thu, 25 Nov 2021 00:51:47 +0000 Subject: [PATCH 207/619] Translated using Weblate (Ukrainian) Currently translated at 100.0% (705 of 705 strings) Translation: YunoHost/core Translate-URL: https://translate.yunohost.org/projects/yunohost/core/uk/ --- locales/uk.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/locales/uk.json b/locales/uk.json index ae59b0274..f45ad8c66 100644 --- a/locales/uk.json +++ b/locales/uk.json @@ -376,7 +376,7 @@ "diagnosis_security_vulnerable_to_meltdown": "Схоже, що ви вразливі до критичної вразливості безпеки Meltdown", "diagnosis_rootfstotalspace_critical": "Коренева файлова система має тільки {space}, що дуже тривожно! Скоріше за все, дисковий простір закінчиться дуже скоро! Рекомендовано мати не менше 16 ГБ для кореневої файлової системи.", "diagnosis_rootfstotalspace_warning": "Коренева файлова система має тільки {space}. Можливо це нормально, але будьте обережні, тому що в кінцевому підсумку дисковий простір може швидко закінчитися... Рекомендовано мати не менше 16 ГБ для кореневої файлової системи.", - "diagnosis_regenconf_manually_modified_details": "Можливо це нормально, якщо ви знаєте, що робите! YunoHost перестане оновлювати цей файл автоматично... Але врахуйте, що оновлення YunoHost можуть містити важливі рекомендовані зміни. Якщо ви хочете, ви можете перевірити відмінності за допомогою команди yunohost tools regen-conf {category} --dry-run --with-diff і примусово повернути рекомендовану конфігурацію за допомогою команди yunohost tools regen-conf {category} --force", + "diagnosis_regenconf_manually_modified_details": "Можливо це нормально, якщо ви знаєте, що робите! YunoHost перестане оновлювати цей файл автоматично. Але врахуйте, що оновлення YunoHost можуть містити важливі рекомендовані зміни. Якщо хочете, ви можете перевірити відмінності за допомогою команди yunohost tools regen-conf {category} --dry-run --with-diff і примусово повернути рекомендовану конфігурацію за допомогою команди yunohost tools regen-conf {category} --force", "diagnosis_regenconf_manually_modified": "Конфігураційний файл {file}, схоже, було змінено вручну.", "diagnosis_regenconf_allgood": "Усі конфігураційні файли відповідають рекомендованій конфігурації!", "diagnosis_mail_queue_too_big": "Занадто багато відкладених листів у поштовій черзі (листів: {nb_pending})", @@ -704,4 +704,4 @@ "ldap_attribute_already_exists": "Атрибут LDAP '{attribute}' вже існує зі значенням '{value}'", "domain_dns_push_already_up_to_date": "Записи вже оновлені, нічого не потрібно робити.", "domain_unknown": "Домен '{domain}' є невідомим" -} \ No newline at end of file +} From 77d74eba06f1f0f65c3321db2dbd5d2238600569 Mon Sep 17 00:00:00 2001 From: Valentin von Guttenberg Date: Mon, 29 Nov 2021 15:02:06 +0000 Subject: [PATCH 208/619] Translated using Weblate (German) Currently translated at 100.0% (705 of 705 strings) Translation: YunoHost/core Translate-URL: https://translate.yunohost.org/projects/yunohost/core/de/ --- locales/de.json | 82 ++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 68 insertions(+), 14 deletions(-) diff --git a/locales/de.json b/locales/de.json index 4129e7e72..d94161151 100644 --- a/locales/de.json +++ b/locales/de.json @@ -4,7 +4,7 @@ "admin_password_change_failed": "Ändern des Passworts nicht möglich", "admin_password_changed": "Das Administrator-Kennwort wurde geändert", "app_already_installed": "{app} ist schon installiert", - "app_argument_choice_invalid": "Wähle einen der folgenden Werte '{choices}' für das Argument '{name}'", + "app_argument_choice_invalid": "Wähle einen gültigen Wert für das Argument '{name}': '{value}' ist nicht unter den verfügbaren Auswahlmöglichkeiten ({choices})", "app_argument_invalid": "Wähle einen gültigen Wert für das Argument '{name}': {error}", "app_argument_required": "Argument '{name}' wird benötigt", "app_extraction_failed": "Installationsdateien konnten nicht entpackt werden", @@ -127,7 +127,7 @@ "user_creation_failed": "Benutzer:in konnte nicht erstellt werden {user}: {error}", "user_deleted": "Benutzer:in gelöscht", "user_deletion_failed": "Benutzer:in konnte nicht gelöscht werden {user}: {error}", - "user_home_creation_failed": "Persönlicher Ordner des Benutzers konnte nicht erstellt werden", + "user_home_creation_failed": "Persönlicher Ordner '{home}' des/der Benutzers:in konnte nicht erstellt werden", "user_unknown": "Unbekannte:r Benutzer:in : {user}", "user_update_failed": "Benutzer:in konnte nicht aktualisiert werden {user}: {error}", "user_updated": "Benutzerinformationen wurden aktualisiert", @@ -279,7 +279,7 @@ "apps_catalog_obsolete_cache": "Der Cache des App-Katalogs ist leer oder veraltet.", "apps_catalog_update_success": "Der Apps-Katalog wurde aktualisiert!", "password_too_simple_1": "Das Passwort muss mindestens 8 Zeichen lang sein", - "diagnosis_everything_ok": "Alles schaut gut aus für {category}!", + "diagnosis_everything_ok": "Alles sieht OK aus für {category}!", "diagnosis_failed": "Kann Diagnose-Ergebnis für die Kategorie '{category}' nicht abrufen: {error}", "diagnosis_ip_connected_ipv4": "Der Server ist mit dem Internet über IPv4 verbunden!", "diagnosis_no_cache": "Kein Diagnose Cache aktuell für die Kategorie '{category}'", @@ -288,7 +288,7 @@ "diagnosis_ip_no_ipv6": "Der Server hat kein funktionierendes IPv6.", "diagnosis_ip_not_connected_at_all": "Der Server scheint überhaupt nicht mit dem Internet verbunden zu sein!?", "diagnosis_failed_for_category": "Diagnose fehlgeschlagen für die Kategorie '{category}': {error}", - "diagnosis_cache_still_valid": "(Der Cache für die Diagnose {category} ist immer noch gültig. Es wird momentan keine neue Diagnose durchgeführt!)", + "diagnosis_cache_still_valid": "(Cache noch gültig für {category} Diagnose. Es wird keine neue Diagnose durchgeführt!)", "diagnosis_cant_run_because_of_dep": "Kann Diagnose für {category} nicht ausführen während wichtige Probleme zu {dep} noch nicht behoben sind.", "diagnosis_found_errors_and_warnings": "Habe {errors} erhebliche(s) Problem(e) (und {warnings} Warnung(en)) in Verbindung mit {category} gefunden!", "diagnosis_ip_broken_dnsresolution": "Domänen-Namens-Auflösung scheint aus einem bestimmten Grund nicht zu funktionieren... Blockiert eine Firewall die DNS Anfragen?", @@ -317,7 +317,7 @@ "diagnosis_domain_expiration_success": "Ihre Domänen sind registriert und werden in nächster Zeit nicht ablaufen.", "diagnosis_domain_not_found_details": "Die Domäne {domain} existiert nicht in der WHOIS-Datenbank oder sie ist abgelaufen!", "diagnosis_domain_expiration_not_found": "Das Ablaufdatum einiger Domains kann nicht überprüft werden", - "diagnosis_dns_try_dyndns_update_force": "Die DNS Konfiguration der Domäne sollte von Yunohost kontrolliert werden. Andernfalls, kannst du mit yunohost dyndns update --force ein Update erzwingen.", + "diagnosis_dns_try_dyndns_update_force": "Die DNS-Konfiguration dieser Domäne sollte automatisch von YunoHost verwaltet werden. Andernfalls könntest Du mittels yunohost dyndns update --force ein Update erzwingen.", "diagnosis_dns_point_to_doc": "Bitte schaue in die Dokumentation unter https://yunohost.org/dns_config wenn du hilfe bei der Konfiguration der DNS Einträge brauchst.", "diagnosis_dns_discrepancy": "Der folgende DNS Eintrag scheint nicht den empfohlenen Einstellungen zu entsprechen:
Typ: {type}
Name: {name}
Aktueller Wert: {current}
Erwarteter Wert: {value}", "diagnosis_dns_missing_record": "Gemäß der empfohlenen DNS-Konfiguration sollten Sie einen DNS-Eintrag mit den folgenden Informationen hinzufügen.
Typ: {type}
Name: {name}
Wert: {value}", @@ -349,7 +349,7 @@ "diagnosis_diskusage_low": "Der Speicher {mountpoint} (auf Gerät {device}) hat nur noch {free} ({free_percent}%) freien Speicherplatz (von insgesamt {total}). Seien Sie vorsichtig.", "diagnosis_ram_low": "Das System hat nur {available} ({available_percent}%) RAM zur Verfügung! (von insgesamt {total}). Seien Sie vorsichtig.", "service_reload_or_restart_failed": "Der Dienst '{service}' konnte nicht erneut geladen oder gestartet werden.\n\nKürzlich erstellte Logs des Dienstes: {logs}", - "diagnosis_domain_expiration_not_found_details": "Die WHOIS Informationen für die Domäne {domain} scheinen keine Informationen über das Ablaufdatum zu enthalten.", + "diagnosis_domain_expiration_not_found_details": "Die WHOIS-Informationen für die Domäne {domain} scheinen keine Informationen über das Ablaufdatum zu enthalten. Stimmt das?", "diagnosis_domain_expiration_warning": "Einige Domänen werden bald ablaufen.", "diagnosis_diskusage_ok": "Der Speicher {mountpoint} (auf Gerät {device}) hat immer noch {free} ({free_percent}%) freien Speicherplatz übrig(von insgesamt {total})!", "diagnosis_ram_ok": "Das System hat immer noch {available} ({available_percent}%) RAM zu Verfügung von {total}.", @@ -375,7 +375,7 @@ "ask_user_domain": "Domäne, welche für die E-Mail-Adresse und den XMPP-Account des Benutzers verwendet werden soll", "app_manifest_install_ask_is_public": "Soll diese Applikation für anonyme Benutzer:innen sichtbar sein?", "app_manifest_install_ask_admin": "Wählen Sie einen Administrator für diese Applikation", - "app_manifest_install_ask_path": "Wählen Sie den Pfad, in welchem die Applikation installiert werden soll", + "app_manifest_install_ask_path": "Wählen Sie den URL-Pfad (nach der Domäne), unter dem die Applikation installiert werden soll", "diagnosis_mail_blacklist_listed_by": "Ihre IP-Adresse oder Domäne {item} ist auf der Blacklist auf {blacklist_name}", "diagnosis_mail_blacklist_ok": "Die IP-Adressen und die Domänen, welche von diesem Server verwendet werden, scheinen nicht auf einer Blacklist zu sein", "diagnosis_mail_fcrdns_different_from_ehlo_domain_details": "Aktueller Reverse-DNS-Eintrag: {rdns_domain}
Erwarteter Wert: {ehlo_domain}", @@ -428,7 +428,7 @@ "app_label_deprecated": "Dieser Befehl ist veraltet! Bitte nutzen Sie den neuen Befehl 'yunohost user permission update' um das Applabel zu verwalten.", "diagnosis_http_hairpinning_issue_details": "Das ist wahrscheinlich aufgrund Ihrer ISP Box / Router. Als Konsequenz können Personen von ausserhalb Ihres Netzwerkes aber nicht von innerhalb Ihres lokalen Netzwerkes (wie wahrscheinlich Sie selber?) wie gewohnt auf Ihren Server zugreifen, wenn Sie ihre Domäne oder Ihre öffentliche IP verwenden. Sie können die Situation wahrscheinlich verbessern, indem Sie ein einen Blick in https://yunohost.org/dns_local_network werfen", "diagnosis_http_nginx_conf_not_up_to_date": "Jemand hat anscheinend die Konfiguration von Nginx manuell geändert. Diese Änderung verhindert, dass YunoHost eine Diagnose durchführen kann, wenn er via HTTP erreichbar ist.", - "diagnosis_http_bad_status_code": "Anscheinend beantwortet ein anderes Gerät als Ihr Server die Anfrage (Vielleicht ihr Internetrouter).
1. Die häufigste Ursache ist, dass Port 80 (und 443) nicht richtig auf Ihren Server weitergeleitet wird.
2. Bei komplexeren Setups: Vergewissern Sie sich, dass keine Firewall und keine Reverse-Proxy interferieren.", + "diagnosis_http_bad_status_code": "Es sieht so aus als ob ein anderes Gerät (vielleicht dein Router/Modem) anstelle deines Servers antwortet.
1. Der häufigste Grund hierfür ist, dass Port 80 (und 443) nicht korrekt zu deinem Server weiterleiten.
2. Bei komplexeren Setups: prüfe ob deine Firewall oder Reverse-Proxy die Verbindung stören.", "diagnosis_never_ran_yet": "Sie haben kürzlich einen neuen YunoHost-Server installiert aber es gibt davon noch keinen Diagnosereport. Sie sollten eine Diagnose anstossen. Sie können das entweder vom Webadmin aus oder in der Kommandozeile machen. In der Kommandozeile verwenden Sie dafür den Befehl 'yunohost diagnosis run'.", "diagnosis_http_nginx_conf_not_up_to_date_details": "Um dieses Problem zu beheben, geben Sie in der Kommandozeile yunohost tools regen-conf nginx --dry-run --with-diff ein. Dieses Tool zeigt ihnen den Unterschied an. Wenn Sie damit einverstanden sind, können Sie mit yunohost tools regen-conf nginx --force die Änderungen übernehmen.", "diagnosis_backports_in_sources_list": "Sie haben anscheinend apt (den Paketmanager) für das Backports-Repository konfiguriert. Wir raten strikte davon ab, Pakete aus dem Backports-Repository zu installieren. Diese würden wahrscheinlich zu Instabilitäten und Konflikten führen. Es sei denn, Sie wissen was Sie tun.", @@ -606,7 +606,7 @@ "server_shutdown_confirm": "Der Server wird sofort heruntergefahren, sind Sie sicher? [{answers}]", "server_shutdown": "Der Server wird heruntergefahren", "root_password_replaced_by_admin_password": "Ihr Root Passwort wurde durch Ihr Admin Passwort ersetzt.", - "show_tile_cant_be_enabled_for_regex": "Momentan können Sie 'show_tile' nicht aktivieren, weil die URL für die Berechtigung '{permission}' ein regulärer Ausdruck ist", + "show_tile_cant_be_enabled_for_regex": "Du kannst 'show_tile' momentan nicht aktivieren, weil die URL für die Berechtigung '{permission}' ein regulärer Ausdruck ist", "show_tile_cant_be_enabled_for_url_not_defined": "Momentan können Sie 'show_tile' nicht aktivieren, weil Sie zuerst eine URL für die Berechtigung '{permission}' definieren müssen", "tools_upgrade_regular_packages_failed": "Konnte für die folgenden Pakete das Upgrade nicht durchführen: {packages_list}", "tools_upgrade_regular_packages": "Momentan werden Upgrades für das System (YunoHost-unabhängige) Pakete durchgeführt...", @@ -628,11 +628,11 @@ "disk_space_not_sufficient_update": "Es ist nicht genügend Speicherplatz frei, um diese Applikation zu aktuallisieren", "disk_space_not_sufficient_install": "Es ist nicht genügend Speicherplatz frei, um diese Applikation zu installieren", "danger": "Warnung:", - "diagnosis_apps_bad_quality": "Diese App ist im YunoHost App Katalog momentan als kaputt gekennzeichnet. Dies mag ein temporäres Problem darstellen, das von den Maintainern versucht wird zu beheben. In der Zwischenzeit ist das Upgrade dieser App nicht möglich.", - "config_apply_failed": "Die neue Konfiguration umzusetzen ist fehlgeschlagen: {error}", + "diagnosis_apps_bad_quality": "Diese App ist im YunoHost-Applikationskatalog momentan als defekt gekennzeichnet. Es könnte sich dabei um einen vorübergehendes Problem handeln. Während der/die Betreuer:in versucht das Problem zu beheben, ist die Upgrade-Funktion für diese App gesperrt.", + "config_apply_failed": "Anwenden der neuen Konfiguration fehlgeschlagen: {error}", "config_validate_date": "Sollte ein zulässiges Datum in folgendem Format sein: YYYY-MM-DD", "config_validate_email": "Sollte eine zulässige eMail sein", - "config_forbidden_keyword": "Das Keyword '{keyword}' ist reserviert. Mit dieser id kannst du keine Konfigurationspanel erstellen", + "config_forbidden_keyword": "Das Schlüsselwort '{keyword}' ist reserviert. Du kannst kein Konfigurationspanel mit einer Frage erstellen, die diese ID verwendet.", "config_no_panel": "Kein Konfigurationspanel gefunden.", "config_validate_color": "Sollte eine zulässige RGB hexadezimal Farbe sein", "diagnosis_apps_issue": "Ein Problem für die App {app} ist aufgetreten", @@ -640,7 +640,7 @@ "config_validate_url": "Sollte eine zulässige web URL sein", "config_version_not_supported": "Konfigurationspanel Versionen '{version}' sind nicht unterstützt.", "diagnosis_apps_allgood": "Alle installierten Apps berücksichtigen die grundlegenden Paketierungspraktiken", - "diagnosis_apps_broken": "Diese App ist im YunoHost-Applikationskatalog momentan als defekt gekennzeichnet. Es könnte sich dabei um einen vorübergehendes Problem handeln. Während der Betreuer versucht das Problem zu beheben, ist die Upgrade-Funktion für diese App gesperrt.", + "diagnosis_apps_broken": "Diese App ist im YunoHost-Applikationskatalog momentan als defekt gekennzeichnet. Es könnte sich dabei um einen vorübergehendes Problem handeln. Während der/die Betreuer:in versucht das Problem zu beheben, ist die Upgrade-Funktion für diese App gesperrt.", "diagnosis_apps_not_in_app_catalog": "Diese App fehlt im Applikationskatalog von YunoHost oder wird in diesem nicht mehr angezeigt. Sie müssen im Betracht ziehen, sie zu deinstallieren, weil sie keine Aktualisierungen mehr erhält und die Integrität und die Sicherheit Ihres Systems kompromittieren könnte.", "diagnosis_apps_outdated_ynh_requirement": "Die installierte Version dieser App erfordert nur YunoHost >=2.x, was darauf hinweist, dass die App nicht mehr auf dem Stand der guten Paketierungspraktiken und der empfohlenen Helper ist. Sie sollten wirklich in Betracht ziehen, sie zu aktualisieren.", "diagnosis_description_apps": "Applikationen", @@ -649,5 +649,59 @@ "app_config_unable_to_apply": "Konnte die Werte des Konfigurations-Panels nicht anwenden.", "app_config_unable_to_read": "Konnte die Werte des Konfigurations-Panels nicht auslesen.", "config_unknown_filter_key": "Der Filterschlüssel '{filter_key}' ist inkorrekt.", - "diagnosis_dns_specialusedomain": "Die Domäne {domain} basiert auf einer Top-Level-Domain (TLD) für spezielle Zwecke wie .local oder .test und deshalb wird von ihr nicht erwartet, dass sie echte DNS-Einträge besitzt." + "diagnosis_dns_specialusedomain": "Die Domäne {domain} basiert auf einer Top-Level-Domain (TLD) für spezielle Zwecke wie .local oder .test und deshalb wird von ihr nicht erwartet, dass sie echte DNS-Einträge besitzt.", + "ldap_server_down": "LDAP-Server kann nicht erreicht werden", + "diagnosis_http_special_use_tld": "Die Domäne {domain} basiert auf einer Top-Level-Domäne (TLD) für besondere Zwecke wie .local oder .test und wird daher voraussichtlich nicht außerhalb des lokalen Netzwerks zugänglich sein.", + "domain_dns_push_managed_in_parent_domain": "Die automatische DNS-Konfiguration wird von der übergeordneten Domäne {parent_domain} verwaltet.", + "domain_dns_push_already_up_to_date": "Die Einträge sind auf dem neuesten Stand, es gibt nichts zu tun.", + "domain_config_auth_token": "Authentifizierungstoken", + "domain_config_auth_key": "Authentifizierungsschlüssel", + "domain_config_auth_secret": "Authentifizierungsgeheimnis", + "domain_config_api_protocol": "API-Protokoll", + "domain_unknown": "Domäne '{domain}' unbekannt", + "ldap_server_is_down_restart_it": "Der LDAP-Dienst ist nicht erreichbar, versuche ihn neu zu starten...", + "user_import_bad_file": "Deine CSV-Datei ist nicht korrekt formatiert und wird daher ignoriert, um einen möglichen Datenverlust zu vermeiden", + "global_settings_setting_security_experimental_enabled": "Aktiviere experimentelle Sicherheitsfunktionen (nur aktivieren, wenn Du weißt was Du tust!)", + "global_settings_setting_security_nginx_redirect_to_https": "HTTP-Anfragen standardmäßig auf HTTPs umleiten (NICHT AUSSCHALTEN, sofern Du nicht weißt was Du tust!)", + "user_import_missing_columns": "Die folgenden Spalten fehlen: {columns}", + "user_import_nothing_to_do": "Es muss kein:e Benutzer:in importiert werden", + "user_import_partial_failed": "Der Import von Benutzer:innen ist teilweise fehlgeschlagen", + "user_import_bad_line": "Ungültige Zeile {line}: {details}", + "other_available_options": "… und {n} weitere verfügbare Optionen, die nicht angezeigt werden", + "domain_dns_conf_special_use_tld": "Diese Domäne basiert auf einer Top-Level-Domäne (TLD) für besondere Zwecke wie .local oder .test und wird daher vermutlich keine eigenen DNS-Einträge haben.", + "domain_dns_registrar_managed_in_parent_domain": "Diese Domäne ist eine Unterdomäne von {parent_domain_link}. Die Konfiguration des DNS-Registrars sollte auf der Konfigurationsseite von {parent_domain} verwaltet werden.", + "domain_dns_registrar_not_supported": "YunoHost konnte den Registrar, der diese Domäne verwaltet, nicht automatisch erkennen. Du solltest die DNS-Einträge, wie unter https://yunohost.org/dns beschrieben, manuell konfigurieren.", + "domain_dns_registrar_supported": "YunoHost hat automatisch erkannt, dass diese Domäne von dem Registrar **{registrar}** verwaltet wird. Wenn Du möchtest, konfiguriert YunoHost diese DNS-Zone automatisch, wenn Du die entsprechenden API-Zugangsdaten zur Verfügung stellst. Auf dieser Seite erfährst Du, wie Du deine API-Anmeldeinformationen erhältst: https://yunohost.org/registar_api_{registrar}. (Du kannst deine DNS-Einträge auch, wie unter https://yunohost.org/dns beschrieben, manuell konfigurieren)", + "service_not_reloading_because_conf_broken": "Der Dienst '{Name}' wird nicht neu geladen/gestartet, da seine Konfiguration fehlerhaft ist: {Fehler}", + "user_import_failed": "Der Import von Benutzer:innen ist komplett fehlgeschlagen", + "domain_dns_push_failed_to_list": "Auflistung der aktuellen Einträge über die API des Registrars fehlgeschlagen: {error}", + "domain_dns_pushing": "DNS-Einträge übertragen…", + "domain_dns_push_record_failed": "{action} für Eintrag {type}/{name} fehlgeschlagen: {error}", + "domain_dns_push_success": "DNS-Einträge aktualisiert!", + "domain_dns_push_failed": "Die Aktualisierung der DNS-Einträge ist leider gescheitert.", + "domain_dns_push_partial_failure": "DNS-Einträge teilweise aktualisiert: einige Warnungen/Fehler wurden gemeldet.", + "domain_config_features_disclaimer": "Bisher hat das Aktivieren/Deaktivieren von Mail- oder XMPP-Funktionen nur Auswirkungen auf die empfohlene und automatische DNS-Konfiguration, nicht auf die Systemkonfigurationen!", + "domain_config_mail_in": "Eingehende E-Mails", + "domain_config_mail_out": "Ausgehende E-Mails", + "domain_config_xmpp": "Instant Messaging (XMPP)", + "log_app_config_set": "Konfiguration auf die Applikation '{}' anwenden", + "log_user_import": "Benutzer:innen importieren", + "diagnosis_high_number_auth_failures": "In letzter Zeit gab es eine verdächtig hohe Anzahl von Authentifizierungsfehlern. Stelle sicher, dass fail2ban läuft und korrekt konfiguriert ist, oder verwende einen benutzerdefinierten Port für SSH, wie unter https://yunohost.org/security beschrieben.", + "domain_dns_registrar_yunohost": "Dies ist eine nohost.me / nohost.st / ynh.fr Domäne, ihre DNS-Konfiguration wird daher automatisch von YunoHost ohne weitere Konfiguration übernommen. (siehe Befehl 'yunohost dyndns update')", + "domain_config_auth_entrypoint": "API-Einstiegspunkt", + "domain_config_auth_application_key": "Anwendungsschlüssel", + "domain_config_auth_application_secret": "Geheimer Anwendungsschlüssel", + "domain_config_auth_consumer_key": "Consumer-Schlüssel", + "invalid_number_min": "Muss größer sein als {min}", + "invalid_number_max": "Muss kleiner sein als {max}", + "invalid_password": "Ungültiges Passwort", + "ldap_attribute_already_exists": "LDAP-Attribut '{attribute}' existiert bereits mit dem Wert '{value}'", + "user_import_success": "Benutzer:innen erfolgreich importiert", + "domain_registrar_is_not_configured": "Der DNS-Registrar ist noch nicht für die Domäne '{domain}' konfiguriert.", + "domain_dns_push_not_applicable": "Die automatische DNS-Konfiguration ist nicht auf die Domäne {domain} anwendbar. Konfiguriere die DNS-Einträge manuell, wie unter https://yunohost.org/dns_config beschrieben.", + "domain_dns_registrar_experimental": "Bislang wurde die Schnittstelle zur API von **{registrar}** noch nicht außreichend von der YunoHost-Community getestet und geprüft. Der Support ist **sehr experimentell** – sei vorsichtig!", + "domain_dns_push_failed_to_authenticate": "Die Authentifizierung bei der API des Registrars für die Domäne '{domain}' ist fehlgeschlagen. Wahrscheinlich sind die Anmeldedaten falsch? (Fehler: {error})", + "log_domain_config_set": "Konfiguration für die Domäne '{}' aktualisieren", + "log_domain_dns_push": "DNS-Einträge für die Domäne '{}' übertragen", + "service_description_yunomdns": "Ermöglicht es dir, deinen Server über 'yunohost.local' in deinem lokalen Netzwerk zu erreichen" } From b6250c0094aba4aac8f1a51a517f9314b6cd8519 Mon Sep 17 00:00:00 2001 From: Colin Wawrik Date: Mon, 29 Nov 2021 18:25:18 +0000 Subject: [PATCH 209/619] Translated using Weblate (German) Currently translated at 100.0% (705 of 705 strings) Translation: YunoHost/core Translate-URL: https://translate.yunohost.org/projects/yunohost/core/de/ --- locales/de.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/locales/de.json b/locales/de.json index d94161151..f1b7ec2cc 100644 --- a/locales/de.json +++ b/locales/de.json @@ -427,7 +427,7 @@ "additional_urls_already_removed": "Zusätzliche URL '{url}' bereits entfernt in der zusätzlichen URL für Berechtigung '{permission}'", "app_label_deprecated": "Dieser Befehl ist veraltet! Bitte nutzen Sie den neuen Befehl 'yunohost user permission update' um das Applabel zu verwalten.", "diagnosis_http_hairpinning_issue_details": "Das ist wahrscheinlich aufgrund Ihrer ISP Box / Router. Als Konsequenz können Personen von ausserhalb Ihres Netzwerkes aber nicht von innerhalb Ihres lokalen Netzwerkes (wie wahrscheinlich Sie selber?) wie gewohnt auf Ihren Server zugreifen, wenn Sie ihre Domäne oder Ihre öffentliche IP verwenden. Sie können die Situation wahrscheinlich verbessern, indem Sie ein einen Blick in https://yunohost.org/dns_local_network werfen", - "diagnosis_http_nginx_conf_not_up_to_date": "Jemand hat anscheinend die Konfiguration von Nginx manuell geändert. Diese Änderung verhindert, dass YunoHost eine Diagnose durchführen kann, wenn er via HTTP erreichbar ist.", + "diagnosis_http_nginx_conf_not_up_to_date": "Die Konfiguration von Nginx scheint manuell geändert worden zu sein. Dies hindert YunoHost daran festzustellen, ob es über HTTP erreichbar ist.", "diagnosis_http_bad_status_code": "Es sieht so aus als ob ein anderes Gerät (vielleicht dein Router/Modem) anstelle deines Servers antwortet.
1. Der häufigste Grund hierfür ist, dass Port 80 (und 443) nicht korrekt zu deinem Server weiterleiten.
2. Bei komplexeren Setups: prüfe ob deine Firewall oder Reverse-Proxy die Verbindung stören.", "diagnosis_never_ran_yet": "Sie haben kürzlich einen neuen YunoHost-Server installiert aber es gibt davon noch keinen Diagnosereport. Sie sollten eine Diagnose anstossen. Sie können das entweder vom Webadmin aus oder in der Kommandozeile machen. In der Kommandozeile verwenden Sie dafür den Befehl 'yunohost diagnosis run'.", "diagnosis_http_nginx_conf_not_up_to_date_details": "Um dieses Problem zu beheben, geben Sie in der Kommandozeile yunohost tools regen-conf nginx --dry-run --with-diff ein. Dieses Tool zeigt ihnen den Unterschied an. Wenn Sie damit einverstanden sind, können Sie mit yunohost tools regen-conf nginx --force die Änderungen übernehmen.", From c3ef8ad3c7b6aab121b80a5726c643ea6b9c2532 Mon Sep 17 00:00:00 2001 From: Valentin von Guttenberg Date: Mon, 29 Nov 2021 18:26:05 +0000 Subject: [PATCH 210/619] Translated using Weblate (German) Currently translated at 100.0% (705 of 705 strings) Translation: YunoHost/core Translate-URL: https://translate.yunohost.org/projects/yunohost/core/de/ --- locales/de.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/locales/de.json b/locales/de.json index f1b7ec2cc..aa0413ba8 100644 --- a/locales/de.json +++ b/locales/de.json @@ -427,7 +427,7 @@ "additional_urls_already_removed": "Zusätzliche URL '{url}' bereits entfernt in der zusätzlichen URL für Berechtigung '{permission}'", "app_label_deprecated": "Dieser Befehl ist veraltet! Bitte nutzen Sie den neuen Befehl 'yunohost user permission update' um das Applabel zu verwalten.", "diagnosis_http_hairpinning_issue_details": "Das ist wahrscheinlich aufgrund Ihrer ISP Box / Router. Als Konsequenz können Personen von ausserhalb Ihres Netzwerkes aber nicht von innerhalb Ihres lokalen Netzwerkes (wie wahrscheinlich Sie selber?) wie gewohnt auf Ihren Server zugreifen, wenn Sie ihre Domäne oder Ihre öffentliche IP verwenden. Sie können die Situation wahrscheinlich verbessern, indem Sie ein einen Blick in https://yunohost.org/dns_local_network werfen", - "diagnosis_http_nginx_conf_not_up_to_date": "Die Konfiguration von Nginx scheint manuell geändert worden zu sein. Dies hindert YunoHost daran festzustellen, ob es über HTTP erreichbar ist.", + "diagnosis_http_nginx_conf_not_up_to_date": "Die Konfiguration von Nginx scheint für diese Domäne manuell geändert worden zu sein. Dies hindert YunoHost daran festzustellen, ob es über HTTP erreichbar ist.", "diagnosis_http_bad_status_code": "Es sieht so aus als ob ein anderes Gerät (vielleicht dein Router/Modem) anstelle deines Servers antwortet.
1. Der häufigste Grund hierfür ist, dass Port 80 (und 443) nicht korrekt zu deinem Server weiterleiten.
2. Bei komplexeren Setups: prüfe ob deine Firewall oder Reverse-Proxy die Verbindung stören.", "diagnosis_never_ran_yet": "Sie haben kürzlich einen neuen YunoHost-Server installiert aber es gibt davon noch keinen Diagnosereport. Sie sollten eine Diagnose anstossen. Sie können das entweder vom Webadmin aus oder in der Kommandozeile machen. In der Kommandozeile verwenden Sie dafür den Befehl 'yunohost diagnosis run'.", "diagnosis_http_nginx_conf_not_up_to_date_details": "Um dieses Problem zu beheben, geben Sie in der Kommandozeile yunohost tools regen-conf nginx --dry-run --with-diff ein. Dieses Tool zeigt ihnen den Unterschied an. Wenn Sie damit einverstanden sind, können Sie mit yunohost tools regen-conf nginx --force die Änderungen übernehmen.", From 7c8ded3275e4702d97f2c30f78c47eddfb11d050 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Gaspar?= Date: Fri, 10 Dec 2021 11:16:05 +0000 Subject: [PATCH 211/619] Translated using Weblate (French) Currently translated at 100.0% (719 of 719 strings) Translation: YunoHost/core Translate-URL: https://translate.yunohost.org/projects/yunohost/core/fr/ --- locales/fr.json | 28 +++++++++++++++++++++------- 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/locales/fr.json b/locales/fr.json index 07bdcfad3..e6827df56 100644 --- a/locales/fr.json +++ b/locales/fr.json @@ -416,7 +416,7 @@ "diagnosis_ip_weird_resolvconf": "La résolution DNS semble fonctionner, mais il semble que vous utilisez un /etc/resolv.conf personnalisé.", "diagnosis_ip_weird_resolvconf_details": "Le fichier /etc/resolv.conf doit être un lien symbolique vers /etc/resolvconf/run/resolv.conf lui-même pointant vers 127.0.0.1 (dnsmasq). Si vous souhaitez configurer manuellement les résolveurs DNS, veuillez modifier /etc/resolv.dnsmasq.conf.", "diagnosis_dns_missing_record": "Selon la configuration DNS recommandée, vous devez ajouter un enregistrement DNS
Type : {type}
Nom : {name}
Valeur : {value}", - "diagnosis_diskusage_ok": "L'espace de stockage {mountpoint} (sur le périphérique {device}) a encore {free} ({free_percent}%) espace restant (sur {total}) !", + "diagnosis_diskusage_ok": "L'espace de stockage {mountpoint} (sur le périphérique {device}) a encore {free} ({free_percent}%) d'espace restant (sur {total}) !", "diagnosis_ram_ok": "Le système dispose encore de {available} ({available_percent}%) de RAM sur {total}.", "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", @@ -442,9 +442,9 @@ "diagnosis_dns_bad_conf": "Certains enregistrements DNS sont manquants ou incorrects pour le domaine {domain} (catégorie {category})", "diagnosis_dns_discrepancy": "Cet enregistrement DNS ne semble pas correspondre à la configuration recommandée :
Type : {type}
Nom : {name}
La valeur actuelle est : {current}
La valeur attendue est : {value}", "diagnosis_services_bad_status": "Le service {service} est {status} :-(", - "diagnosis_diskusage_verylow": "L'espace de stockage {mountpoint} (sur l'appareil {device}) ne dispose que de {free} ({free_percent}%) espace restant (sur {total}). Vous devriez vraiment envisager de nettoyer de l'espace !", - "diagnosis_diskusage_low": "L'espace de stockage {mountpoint} (sur l'appareil {device}) ne dispose que de {free} ({free_percent}%) espace restant (sur {total}). Faites attention.", - "diagnosis_ram_verylow": "Le système ne dispose plus que de {available} ({available_percent}%)! (sur {total})", + "diagnosis_diskusage_verylow": "L'espace de stockage {mountpoint} (sur l'appareil {device}) ne dispose que de {free} ({free_percent}%) d'espace restant (sur {total}). Vous devriez vraiment envisager de nettoyer de l'espace !", + "diagnosis_diskusage_low": "L'espace de stockage {mountpoint} (sur l'appareil {device}) ne dispose que de {free} ({free_percent}%) d'espace restant (sur {total}). Faites attention.", + "diagnosis_ram_verylow": "Le système ne dispose plus que de {available} ({available_percent}%) de RAM ! (sur {total})", "diagnosis_ram_low": "Le système n'a plus de {available} ({available_percent}%) RAM sur {total}. Faites attention.", "diagnosis_swap_none": "Le système n'a aucun espace de swap. Vous devriez envisager d'ajouter au moins {recommended} 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} de swap. Vous devez envisager d'avoir au moins {recommended} pour éviter les situations où le système manque de mémoire.", @@ -547,7 +547,7 @@ "diagnosis_swap_tip": "Merci d'être prudent et conscient que si vous hébergez une partition SWAP sur une carte SD ou un disque SSD, cela risque de réduire drastiquement l'espérance de vie du périphérique.", "restore_already_installed_apps": "Les applications suivantes ne peuvent pas être restaurées car elles sont déjà installées : {apps}", "regenconf_need_to_explicitly_specify_ssh": "La configuration de ssh a été modifiée manuellement. Vous devez explicitement indiquer la mention --force à \"ssh\" pour appliquer les changements.", - "migration_0015_cleaning_up": "Nettoyage du cache et des paquets qui ne sont plus nécessaires ...", + "migration_0015_cleaning_up": "Nettoyage du cache et des paquets qui ne sont plus nécessaires...", "migration_0015_specific_upgrade": "Démarrage de la mise à jour des paquets du système qui doivent être mis à jour séparément...", "migration_0015_modified_files": "Veuillez noter que les fichiers suivants ont été modifiés manuellement et pourraient être écrasés à la suite de la mise à niveau : {manually_modified_files}", "migration_0015_problematic_apps_warning": "Veuillez noter que des applications qui peuvent poser problèmes ont été détectées. Il semble qu'elles n'aient pas été installées à partir du catalogue d'applications YunoHost, ou bien qu'elles ne soient pas signalées comme \"fonctionnelles\". Par conséquent, il n'est pas possible de garantir que les applications suivantes fonctionneront encore après la mise à niveau : {problematic_apps}", @@ -703,5 +703,19 @@ "domain_dns_conf_special_use_tld": "Ce domaine est basé sur un domaine de premier niveau (TLD) à usage spécial tel que .local ou .test et ne devrait donc pas avoir d'enregistrements DNS réels.", "other_available_options": "... et {n} autres options disponibles non affichées", "domain_config_auth_consumer_key": "Consumer key", - "domain_unknown": "Domaine '{domain}' inconnu" -} \ No newline at end of file + "domain_unknown": "Domaine '{domain}' inconnu", + "migration_0021_start": "Démarrage de la migration vers Bullseye", + "migration_0021_patching_sources_list": "Mise à jour du fichier sources.lists...", + "migration_0021_main_upgrade": "Démarrage de la mise à niveau générale...", + "migration_0021_still_on_buster_after_main_upgrade": "Quelque chose s'est mal passé lors de la mise à niveau, le système semble toujours être sous Debian Buster", + "migration_0021_yunohost_upgrade": "Démarrage de la mise à jour du noyau YunoHost...", + "migration_0021_not_enough_free_space": "L'espace libre est très faible dans /var/ ! Vous devriez avoir au moins 1 Go de libre pour effectuer cette migration.", + "migration_0021_system_not_fully_up_to_date": "Votre système n'est pas entièrement à jour. Veuillez effectuer une mise à jour normale avant de lancer la migration vers Bullseye.", + "migration_0021_general_warning": "Veuillez noter que cette migration est une opération délicate. L'équipe YunoHost a fait de son mieux pour la revérifier et la tester, mais la migration pourrait quand même casser des éléments du système ou de ses applications.\n\nIl est donc recommandé :\n - de faire une sauvegarde de toute donnée ou application critique. Plus d'informations ici https://yunohost.org/backup ;\n - d'être patient après le lancement de la migration. Selon votre connexion internet et votre matériel, la mise à niveau peut prendre jusqu'à quelques heures.", + "migration_0021_problematic_apps_warning": "Veuillez noter que des applications qui peuvent poser problèmes ont été détectées. Il semble qu'elles n'aient pas été installées à partir du catalogue d'applications YunoHost, ou bien qu'elles ne soient pas signalées comme \\\"fonctionnelles\\\". Par conséquent, il n'est pas possible de garantir que les applications suivantes fonctionneront encore après la mise à niveau : {problematic_apps}", + "migration_0021_modified_files": "Veuillez noter que les fichiers suivants ont été modifiés manuellement et pourraient être écrasés à la suite de la mise à niveau : {manually_modified_files}", + "migration_0021_cleaning_up": "Nettoyage du cache et des paquets qui ne sont plus nécessaires...", + "migration_0021_patch_yunohost_conflicts": "Application du correctif pour contourner le problème de conflit...", + "migration_0021_not_buster": "La distribution Debian actuelle n'est pas Buster !", + "migration_description_0021_migrate_to_bullseye": "Mise à niveau du système vers Debian Bullseye et YunoHost 11.x" +} From 05c69ed9fac93d285e8313c83b89347dae4b90bc Mon Sep 17 00:00:00 2001 From: Tymofii-Lytvynenko Date: Fri, 10 Dec 2021 23:55:58 +0000 Subject: [PATCH 212/619] Translated using Weblate (Ukrainian) Currently translated at 100.0% (719 of 719 strings) Translation: YunoHost/core Translate-URL: https://translate.yunohost.org/projects/yunohost/core/uk/ --- locales/uk.json | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/locales/uk.json b/locales/uk.json index f45ad8c66..25fa1d551 100644 --- a/locales/uk.json +++ b/locales/uk.json @@ -703,5 +703,19 @@ "domain_dns_pushing": "Передання записів DNS...", "ldap_attribute_already_exists": "Атрибут LDAP '{attribute}' вже існує зі значенням '{value}'", "domain_dns_push_already_up_to_date": "Записи вже оновлені, нічого не потрібно робити.", - "domain_unknown": "Домен '{domain}' є невідомим" + "domain_unknown": "Домен '{domain}' є невідомим", + "migration_0021_start": "Початок міграції на Bullseye", + "migration_0021_patching_sources_list": "Виправлення sources.lists...", + "migration_0021_main_upgrade": "Початок основного оновлення...", + "migration_0021_yunohost_upgrade": "Початок оновлення ядра YunoHost...", + "migration_0021_not_buster": "Поточний дистрибутив Debian не є Buster!", + "migration_0021_problematic_apps_warning": "Зверніть увагу, що були виявлені наступні, ймовірно проблемні встановлені застосунки. Схоже, що вони не були встановлені з каталогу застосунків YunoHost або не зазначені як «робочі». Отже, не можна гарантувати, що вони будуть працювати після оновлення: {problematic_apps}", + "migration_0021_modified_files": "Зверніть увагу, що такі файли були змінені вручну і можуть бути перезаписані після оновлення: {manually_modified_files}", + "migration_0021_cleaning_up": "Очищення кеш-пам'яті і пакетів, які більше не потрібні...", + "migration_0021_patch_yunohost_conflicts": "Застосування виправлення для вирішення проблеми конфлікту...", + "migration_0021_still_on_buster_after_main_upgrade": "Щось пішло не так під час основного оновлення, здається, що система все ще працює на Debian Buster", + "migration_0021_not_enough_free_space": "Вільного місця в /var/ досить мало! У вас повинно бути не менше 1 ГБ вільного місця, щоб запустити цю міграцію.", + "migration_0021_system_not_fully_up_to_date": "Ваша система не повністю оновлена. Будь ласка, виконайте регулярне оновлення перед запуском міграції на Bullseye.", + "migration_0021_general_warning": "Будь ласка, зверніть увагу, що ця міграція є делікатною операцією. Команда YunoHost зробила все можливе, щоб перевірити і протестувати її, але міграція все ще може порушити частину системи або її застосунків.\n\nТому рекомендовано:\n - Виконати резервне копіювання всіх важливих даних або застосунків. Подробиці на сайті https://yunohost.org/backup; \n - Наберіться терпіння після запуску міграції: В залежності від вашого з'єднання з Інтернетом і апаратного забезпечення, оновлення може зайняти до декількох годин.", + "migration_description_0021_migrate_to_bullseye": "Оновлення системи до Debian Bullseye і YunoHost 11.x" } From e84bd3a1c11d2cca3ba3d65f3580d25a83d6a29e Mon Sep 17 00:00:00 2001 From: Moutonjr Geoff Date: Fri, 17 Dec 2021 11:23:00 +0100 Subject: [PATCH 213/619] Message stays compliant in each locale with --apps deprecation --- locales/de.json | 2 +- locales/eo.json | 2 +- locales/es.json | 2 +- locales/eu.json | 2 +- locales/fr.json | 4 ++-- locales/oc.json | 2 +- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/locales/de.json b/locales/de.json index e491c5ac2..49e312a08 100644 --- a/locales/de.json +++ b/locales/de.json @@ -613,7 +613,7 @@ "tools_upgrade_cant_unhold_critical_packages": "Konnte für die kritischen Pakete das Flag 'hold' nicht aufheben...", "tools_upgrade_cant_hold_critical_packages": "Konnte für die kritischen Pakete das Flag 'hold' nicht setzen...", "tools_upgrade_cant_both": "Kann das Upgrade für das System und die Applikation nicht gleichzeitig durchführen", - "tools_upgrade_at_least_one": "Bitte geben Sie '--apps' oder '--system' an", + "tools_upgrade_at_least_one": "Bitte geben Sie 'apps' oder 'system' an", "this_action_broke_dpkg": "Diese Aktion hat unkonfigurierte Pakete verursacht, welche durch dpkg/apt (die Paketverwaltungen dieses Systems) zurückgelassen wurden... Sie können versuchen dieses Problem zu lösen, indem Sie 'sudo apt install --fix-broken' und/oder 'sudo dpkg --configure -a' ausführen.", "update_apt_cache_failed": "Kann den Cache von APT (Debians Paketmanager) nicht aktualisieren. Hier ist ein Auszug aus den sources.list-Zeilen, die helfen könnten, das Problem zu identifizieren:\n{sourceslist}", "tools_upgrade_special_packages_completed": "YunoHost-Paketupdate beendet.\nDrücke [Enter], um zurück zur Kommandoziele zu kommen", diff --git a/locales/eo.json b/locales/eo.json index 49040b768..5139ec98d 100644 --- a/locales/eo.json +++ b/locales/eo.json @@ -234,7 +234,7 @@ "service_stop_failed": "Ne povis maldaŭrigi la servon '{service}'\n\nLastatempaj servaj protokoloj: {logs}", "unbackup_app": "App '{app}' ne konserviĝos", "updating_apt_cache": "Akirante haveblajn ĝisdatigojn por sistemaj pakoj…", - "tools_upgrade_at_least_one": "Bonvolu specifi '--apps' aŭ '--system'", + "tools_upgrade_at_least_one": "Bonvolu specifi 'apps' aŭ 'system'", "service_already_stopped": "La servo '{service}' jam ĉesis", "tools_upgrade_cant_both": "Ne eblas ĝisdatigi ambaŭ sistemon kaj programojn samtempe", "restore_extracting": "Eltirante bezonatajn dosierojn el la ar theivo…", diff --git a/locales/es.json b/locales/es.json index d6382c262..8e64fbcec 100644 --- a/locales/es.json +++ b/locales/es.json @@ -211,7 +211,7 @@ "tools_upgrade_cant_unhold_critical_packages": "No se pudo liberar los paquetes críticos…", "tools_upgrade_cant_hold_critical_packages": "No se pudieron retener los paquetes críticos…", "tools_upgrade_cant_both": "No se puede actualizar el sistema y las aplicaciones al mismo tiempo", - "tools_upgrade_at_least_one": "Especifique «--apps», o «--system»", + "tools_upgrade_at_least_one": "Especifique «apps», o «system»", "this_action_broke_dpkg": "Esta acción rompió dpkg/APT(los gestores de paquetes del sistema)… Puede tratar de solucionar este problema conectando mediante SSH y ejecutando `sudo dpkg --configure -a`.", "service_reloaded_or_restarted": "El servicio '{service}' fue recargado o reiniciado", "service_reload_or_restart_failed": "No se pudo recargar o reiniciar el servicio «{service}»\n\nRegistro de servicios recientes:{logs}", diff --git a/locales/eu.json b/locales/eu.json index 21c23260c..b5e880ce4 100644 --- a/locales/eu.json +++ b/locales/eu.json @@ -527,7 +527,7 @@ "service_restarted": "'{service}' zerbitzua berrabiarazi da", "service_start_failed": "Ezin izan da '{service}' zerbitzua abiarazi\n\nZerbitzuen azken erregistroak: {logs}", "ssowat_conf_updated": "SSOwat ezarpenak eguneratu dira", - "tools_upgrade_at_least_one": "Mesedez, zehaztu '--apps' edo '--system'", + "tools_upgrade_at_least_one": "Mesedez, zehaztu 'apps' edo 'system'", "tools_upgrade_cant_both": "Ezin dira sistema eta aplikazioak une berean eguneratu", "update_apt_cache_failed": "Ezin da APT Debian-en pakete kudeatzailearen cachea eguneratu. Hemen dituzu sources.list fitxategiaren lerroak, arazoa identifikatzeko baliagarria izan dezakezuna:\n{sourceslist}", "update_apt_cache_warning": "Zerbaitek huts egin du APT Debian-en pakete kudeatzailearen cachea eguneratzean. Hemen dituzu sources.list fitxategiaren lerroak, arazoa identifikatzeko baliagarria izan dezakezuna:\n{sourceslist}", diff --git a/locales/fr.json b/locales/fr.json index 07bdcfad3..c3cae1342 100644 --- a/locales/fr.json +++ b/locales/fr.json @@ -339,7 +339,7 @@ "regenconf_failed": "Impossible de régénérer la configuration pour la ou les catégorie(s) : '{categories}'", "regenconf_pending_applying": "Applique la configuration en attente pour la catégorie '{category}'...", "service_regen_conf_is_deprecated": "'yunohost service regen-conf' est obsolète ! Veuillez plutôt utiliser 'yunohost tools regen-conf' à la place.", - "tools_upgrade_at_least_one": "Veuillez spécifier '--apps' ou '--system'", + "tools_upgrade_at_least_one": "Veuillez spécifier 'apps' ou 'system'", "tools_upgrade_cant_both": "Impossible de mettre à niveau le système et les applications en même temps", "tools_upgrade_cant_hold_critical_packages": "Impossibilité d'ajouter le drapeau 'hold' pour les paquets critiques...", "tools_upgrade_regular_packages": "Mise à jour des paquets du système (non liés a YunoHost)...", @@ -704,4 +704,4 @@ "other_available_options": "... et {n} autres options disponibles non affichées", "domain_config_auth_consumer_key": "Consumer key", "domain_unknown": "Domaine '{domain}' inconnu" -} \ No newline at end of file +} diff --git a/locales/oc.json b/locales/oc.json index 9de7944c5..a90298f18 100644 --- a/locales/oc.json +++ b/locales/oc.json @@ -341,7 +341,7 @@ "service_reload_or_restart_failed": "Impossible de recargar o reaviar lo servici « {service} »\n\nJornal d’audit recent : {logs}", "regenconf_file_kept_back": "S’espèra que lo fichièr de configuracion « {conf} » siá suprimit per regen-conf (categoria {category} mas es estat mantengut.", "this_action_broke_dpkg": "Aquesta accion a copat dpkg/apt (los gestionaris de paquets del sistèma)… Podètz ensajar de resòlver aqueste problèma en vos connectant amb SSH e executant « sudo dpkg --configure -a ».", - "tools_upgrade_at_least_one": "Especificatz --apps O --system", + "tools_upgrade_at_least_one": "Especificatz apps O system", "tools_upgrade_cant_unhold_critical_packages": "Se pòt pas quitar de manténer los paquets critics…", "tools_upgrade_regular_packages": "Actualizacion dels paquets « normals » (pas ligats a YunoHost)…", "tools_upgrade_special_packages": "Actualizacion dels paquets « especials » (ligats a YunoHost)…", From 4315045e4aae87966d6dd64343ca47e98b257361 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20M?= Date: Fri, 17 Dec 2021 13:41:53 +0000 Subject: [PATCH 214/619] Translated using Weblate (Galician) Currently translated at 100.0% (719 of 719 strings) Translation: YunoHost/core Translate-URL: https://translate.yunohost.org/projects/yunohost/core/gl/ --- locales/gl.json | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/locales/gl.json b/locales/gl.json index ac41200a6..308cba961 100644 --- a/locales/gl.json +++ b/locales/gl.json @@ -703,5 +703,19 @@ "domain_dns_push_managed_in_parent_domain": "A función de rexistro DNS automático está xestionada polo dominio nai {parent_domain}.", "ldap_attribute_already_exists": "Xa existe o atributo LDAP '{attribute}' con valor '{value}'", "log_domain_config_set": "Actualizar configuración para o dominio '{}'", - "domain_unknown": "Dominio '{domain}' descoñecido" -} \ No newline at end of file + "domain_unknown": "Dominio '{domain}' descoñecido", + "migration_0021_start": "Comezando a migración a Bullseye", + "migration_0021_patching_sources_list": "Actualizando sources.list...", + "migration_0021_main_upgrade": "Iniciando a actualización principal...", + "migration_0021_still_on_buster_after_main_upgrade": "Algo fallou durante a actualización principal, o sistema semlla que aínda está en Debian Buster", + "migration_0021_yunohost_upgrade": "Iniciando actualización compoñente core de YunoHost...", + "migration_0021_not_buster": "A distribución Debian actual non é Buster!", + "migration_0021_not_enough_free_space": "Queda pouco espazo en /var/! Deberías ter polo menos 1GB libre para facer a migración.", + "migration_0021_problematic_apps_warning": "Detectamos que están instaladas estas app que poderían ser problemáticas. Semella que non foron instaladas desde o catálogo YunoHost, ou non están marcadas como que 'funcionan'. Así, non podemos garantir que seguiran funcionando ben tras a migración: {problematic_apps}", + "migration_0021_modified_files": "Ten en conta que os seguintes ficheiros semella que foron editados manualmente e poderían ser sobrescritos durante a migración: {manually_modified_files}", + "migration_0021_cleaning_up": "Limpando a caché e os paquetes que xa non son precisos...", + "migration_0021_patch_yunohost_conflicts": "Solucionando os problemas e conflitos...", + "migration_description_0021_migrate_to_bullseye": "Actualizar o sistema a Debian Bullseye e YunoHost 11.x", + "migration_0021_system_not_fully_up_to_date": "O teu sistema non está completamente actualizado. Fai unha actualización normal antes de executar a migración a Bullseye.", + "migration_0021_general_warning": "Ten en conta que a migración é unha operación delicada. O equipo de YunoHost fixo todo o que puido para revisalo e probalo, pero aínda así poderían acontecer fallos no sistema ou apps.\n\nAsí as cousas, é recomendable:\n - Facer unha copia de apoio dos datos e apps importantes. Máis info en https://yunohost.org/backup;\n - Ter paciencia unha vez inicias a migración: dependendo da túa conexión a internet e hardware, podería levarlle varias horas completar o proceso." +} From 4decdfc07c64818519df8228ad7b578f9e2d636d Mon Sep 17 00:00:00 2001 From: tituspijean Date: Tue, 21 Dec 2021 10:32:19 +0100 Subject: [PATCH 215/619] Fix typo in deleting superfluous question keys Co-authored-by: jacen05 --- src/yunohost/app.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/yunohost/app.py b/src/yunohost/app.py index f6d940da8..ece44f172 100644 --- a/src/yunohost/app.py +++ b/src/yunohost/app.py @@ -1997,7 +1997,7 @@ def _set_default_ask_questions(arguments): if "example" in arg: del arg["example"] if "default" in arg: - del arg["domain"] + del arg["default"] return arguments From f49f03d11e4e297920e084bb00f3c7934fdce6ad Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Wed, 22 Dec 2021 19:07:19 +0100 Subject: [PATCH 216/619] api: Move cookie session management logic to the authenticator for more flexibility --- share/actionsmap.yml | 1 - src/authenticators/ldap_admin.py | 60 +++++++++++++++++++++++++++++++- src/utils/error.py | 8 ++++- 3 files changed, 66 insertions(+), 3 deletions(-) diff --git a/share/actionsmap.yml b/share/actionsmap.yml index cad0212b2..9eee48716 100644 --- a/share/actionsmap.yml +++ b/share/actionsmap.yml @@ -34,7 +34,6 @@ ############################# _global: namespace: yunohost - cookie_name: yunohost.admin authentication: api: ldap_admin cli: null diff --git a/src/authenticators/ldap_admin.py b/src/authenticators/ldap_admin.py index 94d68a8db..26843c2c1 100644 --- a/src/authenticators/ldap_admin.py +++ b/src/authenticators/ldap_admin.py @@ -8,10 +8,14 @@ import time from moulinette import m18n from moulinette.authentication import BaseAuthenticator -from yunohost.utils.error import YunohostError +from moulinette.utils.text import random_ascii + +from yunohost.utils.error import YunohostError, YunohostAuthenticationError logger = logging.getLogger("yunohost.authenticators.ldap_admin") +session_secret = random_ascii() + class Authenticator(BaseAuthenticator): @@ -66,3 +70,57 @@ class Authenticator(BaseAuthenticator): # Free the connection, we don't really need it to keep it open as the point is only to check authentication... if con: con.unbind_s() + + def set_session_cookie(self, infos): + + from bottle import response + + assert isinstance(infos, dict) + + # This allows to generate a new session id or keep the existing one + current_infos = self.get_session_cookie(raise_if_no_session_exists=False) + new_infos = {"id": current_infos["id"]} + new_infos.update(infos) + + response.set_cookie( + "yunohost.admin", + new_infos, + secure=True, + secret=session_secret, + httponly=True, + # samesite="strict", # Bottle 0.12 doesn't support samesite, to be added in next versions + ) + + def get_session_cookie(self, raise_if_no_session_exists=True): + + from bottle import request + + try: + # N.B. : here we implicitly reauthenticate the cookie + # because it's signed via the session_secret + # If no session exists (or if session is invalid?) + # it's gonna return the default empty dict, + # which we interpret as an authentication failure + infos = request.get_cookie( + "yunohost.admin", secret=session_secret, default={} + ) + except Exception: + if not raise_if_no_session_exists: + return {"id": random_ascii()} + raise YunohostAuthenticationError("unable_authenticate") + + if "id" not in infos: + infos["id"] = random_ascii() + + # FIXME: Here, maybe we want to re-authenticate the session via the authenticator + # For example to check that the username authenticated is still in the admin group... + + return infos + + @staticmethod + def delete_session_cookie(self): + + from bottle import response + + response.set_cookie("yunohost.admin", "", max_age=-1) + response.delete_cookie("yunohost.admin") diff --git a/src/utils/error.py b/src/utils/error.py index 8405830e7..aa76ba67e 100644 --- a/src/utils/error.py +++ b/src/utils/error.py @@ -19,7 +19,7 @@ """ -from moulinette.core import MoulinetteError +from moulinette.core import MoulinetteError, MoulinetteAuthenticationError from moulinette import m18n @@ -60,3 +60,9 @@ class YunohostValidationError(YunohostError): def content(self): return {"error": self.strerror, "error_key": self.key, **self.kwargs} + + +class YunohostAuthenticationError(MoulinetteAuthenticationError): + + pass + From 4fc6db6317a6126d51f8eb34a706f538a6195c1c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juan=20Alberto=20Gonz=C3=A1lez?= Date: Wed, 22 Dec 2021 19:52:53 +0000 Subject: [PATCH 217/619] Translated using Weblate (Spanish) Currently translated at 83.0% (597 of 719 strings) Translation: YunoHost/core Translate-URL: https://translate.yunohost.org/projects/yunohost/core/es/ --- locales/es.json | 92 +++++++++++++++++++++++++++++++++---------------- 1 file changed, 62 insertions(+), 30 deletions(-) diff --git a/locales/es.json b/locales/es.json index 8e64fbcec..4afa56996 100644 --- a/locales/es.json +++ b/locales/es.json @@ -51,7 +51,7 @@ "domain_dyndns_already_subscribed": "Ya se ha suscrito a un dominio de DynDNS", "domain_dyndns_root_unknown": "Dominio raíz de DynDNS desconocido", "domain_exists": "El dominio ya existe", - "domain_uninstall_app_first": "Estas aplicaciones están todavía instaladas en tu dominio:\n{apps}\n\nPor favor desinstálalas utilizando yunohost app remove the_app_id o cambialas a otro dominio usando yunohost app change-url the_app_id antes de continuar con el borrado del dominio.", + "domain_uninstall_app_first": "Estas aplicaciones siguen instaladas en tu dominio:\n{apps}\n\nPor favor desinstálalas con el comando 'yunohost app remove the_app_id' o cámbialas a otro dominio usando /etc/resolv.conf no apunta a 127.0.0.1.", "diagnosis_dns_missing_record": "Según la configuración DNS recomendada, deberías añadir un registro DNS\ntipo: {type}\nnombre: {name}\nvalor: {value}", - "diagnosis_diskusage_low": "El almacenamiento {mountpoint} (en dispositivo {device}) solo tiene {free} ({free_percent}%) de espacio disponible. Ten cuidado.", - "diagnosis_services_bad_status_tip": "Puedes intentar reiniciar el servicio, y si no funciona, echar un vistazo a los logs del servicio usando 'yunohost service log {service}' o a través de la sección 'Servicios' en webadmin.", + "diagnosis_diskusage_low": "El almacenamiento {mountpoint} (en el dispositivo {device}) solo tiene {free} ({free_percent}%) de espacio disponible (de {total}). Ten cuidado.", + "diagnosis_services_bad_status_tip": "Puedes intentar reiniciar el servicio, y si no funciona, echar un vistazo a los logs del serviciode la administración web (desde la línea de comandos puedes hacerlo con yunohost service restart {service} y yunohost service log {service}).", "diagnosis_ip_connected_ipv6": "¡El servidor está conectado a internet a través de IPv6!", "diagnosis_ip_no_ipv6": "El servidor no cuenta con IPv6 funcional.", "diagnosis_ip_dnsresolution_working": "¡DNS no está funcionando!", @@ -441,8 +441,8 @@ "diagnosis_dns_bad_conf": "Algunos registros DNS faltan o están mal cofigurados para el dominio {domain} (categoría {category})", "diagnosis_dns_discrepancy": "El siguiente registro DNS parace que no sigue la configuración recomendada
Tipo: {type}
Nombre: {name}
Valor Actual: {current}
Valor esperado: {value}", "diagnosis_services_bad_status": "El servicio {service} está {status} :(", - "diagnosis_diskusage_verylow": "El almacenamiento {mountpoint} (en el dispositivo {device}) sólo tiene {free} ({free_percent}%) de espacio disponible. Deberías considerar la posibilidad de limpiar algo de espacio.", - "diagnosis_diskusage_ok": "¡El almacenamiento {mountpoint} (en el dispositivo {device}) todavía tiene {free} ({free_percent}%) de espacio libre!", + "diagnosis_diskusage_verylow": "El almacenamiento {mountpoint}(en el dispositivo {device}) sólo tiene {free} ({free_percent}%) de espacio disponible(de {total}). ¡Deberías limpiar algo de espacio!", + "diagnosis_diskusage_ok": "¡El almacenamiento {mountpoint} (en el dispositivo {device}) todavía tiene {free} ({free_percent}%) de espacio libre (de {total})!", "diagnosis_services_conf_broken": "¡Mala configuración para el servicio {service}!", "diagnosis_services_running": "¡El servicio {service} está en ejecución!", "diagnosis_failed": "Error al obtener el resultado del diagnóstico para la categoría '{category}': {error}", @@ -455,7 +455,7 @@ "diagnosis_swap_notsomuch": "Al sistema le queda solamente {total} de espacio de intercambio. Considera agregar al menos {recommended} para evitar que el sistema se quede sin memoria.", "diagnosis_mail_outgoing_port_25_blocked": "El puerto de salida 25 parece estar bloqueado. Intenta desbloquearlo con el panel de configuración de tu proveedor de servicios de Internet (o proveedor de halbergue). Mientras tanto, el servidor no podrá enviar correos electrónicos a otros servidores.", "diagnosis_regenconf_allgood": "Todos los archivos de configuración están en linea con la configuración recomendada!", - "diagnosis_regenconf_manually_modified": "El archivo de configuración {file} parece que ha sido modificado manualmente.", + "diagnosis_regenconf_manually_modified": "El archivo de configuración {file} parece que ha sido modificado manualmente.", "diagnosis_regenconf_manually_modified_details": "¡Esto probablemente esta BIEN si sabes lo que estás haciendo! YunoHost dejará de actualizar este fichero automáticamente... Pero ten en cuenta que las actualizaciones de YunoHost pueden contener importantes cambios que están recomendados. Si quieres puedes comprobar las diferencias mediante yunohost tools regen-conf {category} --dry-run --with-diff o puedes forzar el volver a las opciones recomendadas mediante el comando yunohost tools regen-conf {category} --force", "diagnosis_security_vulnerable_to_meltdown": "Pareces vulnerable a el colapso de vulnerabilidad critica de seguridad", "diagnosis_description_basesystem": "Sistema de base", @@ -504,11 +504,11 @@ "diagnosis_domain_expiration_not_found_details": "¿Parece que la información de WHOIS para el dominio {domain} no contiene información sobre la fecha de expiración?", "diagnosis_domain_not_found_details": "¡El dominio {domain} no existe en la base de datos WHOIS o ha expirado!", "diagnosis_domain_expiration_not_found": "No se pudo revisar la fecha de expiración para algunos dominios", - "diagnosis_dns_try_dyndns_update_force": "La configuración DNS de este dominio debería ser administrada automáticamente por Yunohost. Si no es el caso, puede intentar forzar una actualización ejecutando yunohost dyndns update --force.", + "diagnosis_dns_try_dyndns_update_force": "La configuración DNS de este dominio debería ser administrada automáticamente por YunoHost. Si no es el caso, puedes intentar forzar una actualización mediante yunohost dyndns update --force.", "diagnosis_ip_local": "IP Local: {local}", "diagnosis_ip_no_ipv6_tip": "Tener IPv6 funcionando no es obligatorio para que su servidor funcione, pero es mejor para la salud del Internet en general. IPv6 debería ser configurado automáticamente por el sistema o su proveedor si está disponible. De otra manera, es posible que tenga que configurar varias cosas manualmente, tal y como se explica en esta documentación https://yunohost.org/#/ipv6. Si no puede habilitar IPv6 o si parece demasiado técnico, puede ignorar esta advertencia con toda seguridad.", "diagnosis_display_tip": "Para ver los problemas encontrados, puede ir a la sección de diagnóstico del webadmin, o ejecutar 'yunohost diagnosis show --issues --human-readable' en la línea de comandos.", - "diagnosis_package_installed_from_sury_details": "Algunos paquetes fueron accidentalmente instalados de un repositorio de terceros llamado Sury. El equipo Yunohost ha mejorado la estrategia para manejar estos pquetes, pero es posible que algunas instalaciones con aplicaciones de PHP7.3 en Stretch puedan tener algunas inconsistencias. Para solucionar esta situación, debería intentar ejecutar el siguiente comando: {cmd_to_fix}", + "diagnosis_package_installed_from_sury_details": "Algunos paquetes fueron accidentalmente instalados de un repositorio de terceros llamado Sury. El equipo YunoHost ha mejorado la estrategia para manejar estos paquetes, pero es posible que algunas configuraciones que han instalado aplicaciones PHP7.3 al tiempo que presentes en Stretch tienen algunas inconsistencias. Para solucionar esta situación, deberías intentar ejecutar el siguiente comando: {cmd_to_fix}", "diagnosis_package_installed_from_sury": "Algunos paquetes del sistema deberían ser devueltos a una versión anterior", "certmanager_domain_not_diagnosed_yet": "Aún no hay resultado del diagnóstico para el dominio {domain}. Por favor ejecute el diagnóstico para las categorías 'Registros DNS' y 'Web' en la sección de diagnóstico para verificar si el dominio está listo para Let's Encrypt. (O si sabe lo que está haciendo, utilice '--no-checks' para deshabilitar esos chequeos.)", "backup_archive_corrupted": "Parece que el archivo de respaldo '{archive}' está corrupto : {error}", @@ -571,7 +571,7 @@ "diagnosis_mail_ehlo_bad_answer_details": "Podría ser debido a otra máquina en lugar de tu servidor.", "diagnosis_mail_ehlo_bad_answer": "Un servicio que no es SMTP respondió en el puerto 25 mediante IPv{ipversion}", "diagnosis_mail_ehlo_unreachable_details": "No pudo abrirse la conexión en el puerto 25 de tu servidor mediante IPv{ipversion}. Parece que no se puede contactar.
1. La causa más común en estos casos suele ser que el puerto 25 no está correctamente redireccionado a tu servidor.
2. También deberías asegurarte que el servicio postfix está en marcha.
3. En casos más complejos: asegurate que no estén interfiriendo ni el firewall ni el reverse-proxy.", - "diagnosis_mail_ehlo_unreachable": "El servidor de correo SMTP no puede contactarse desde el exterior mediante IPv{ipversion}. No puede recibir correos", + "diagnosis_mail_ehlo_unreachable": "El servidor de correo SMTP no puede contactarse desde el exterior mediante IPv{ipversion}. No puede recibir correos.", "diagnosis_mail_ehlo_ok": "¡El servidor de correo SMTP puede contactarse desde el exterior por lo que puede recibir correos!", "diagnosis_mail_outgoing_port_25_blocked_relay_vpn": "Algunos proveedores de internet no le permitirán desbloquear el puerto 25 porque no les importa la Neutralidad de la Red.
- Algunos proporcionan una alternativa usando un relay como servidor de correo lo que implica que el relay podrá espiar tu trafico de correo.
- Una alternativa buena para la privacidad es utilizar una VPN *con una IP pública dedicada* para evitar estas limitaciones. Mira en https://yunohost.org/#/vpn_advantage
- Otra alternativa es cambiar de proveedor de inteernet a uno más amable con la Neutralidad de la Red", "diagnosis_backports_in_sources_list": "Parece que apt (el gestor de paquetes) está configurado para usar el repositorio backports. A menos que realmente sepas lo que estás haciendo, desaconsejamos absolutamente instalar paquetes desde backports, ya que pueden provocar comportamientos intestables o conflictos en el sistema.", @@ -583,5 +583,37 @@ "app_config_unable_to_apply": "No se pudieron aplicar los valores del panel configuración.", "app_config_unable_to_read": "No se pudieron leer los valores del panel configuración.", "backup_create_size_estimation": "El archivo contendrá aproximadamente {size} de datos.", - "config_cant_set_value_on_section": "No puede establecer un único valor en una sección de configuración completa." -} \ No newline at end of file + "config_cant_set_value_on_section": "No puede establecer un único valor en una sección de configuración completa.", + "diagnosis_http_special_use_tld": "Le dominio {domain} está basado en un dominio de primer nivel (TLD) de uso especial, como un .local o .test y no debería estar expuesto fuera de la red local.", + "domain_dns_push_failed": "La actualización de las entradas DNS ha fallado.", + "domain_dns_push_partial_failure": "Entradas DNS actualizadas parcialmente: algunas advertencias/errores reportados.", + "domain_unknown": "Dominio '{domain}' desconocido", + "diagnosis_high_number_auth_failures": "Ultimamente ha habido un gran número de errores de autenticación. Asegúrate de que Fail2Ban está ejecutándose y correctamente configurado, o usa un puerto SSH personalizado como se explica en https://yunohost.org/security.", + "diagnosis_sshd_config_inconsistent": "Parece que el puerto SSH ha sido modificado manualmente en /etc/ssh/sshd_config. Desde YunoHost 4.2, hay un nuevo parámetro global 'security.ssh.port' disponible para evitar modificar manualmente la configuración.", + "diagnosis_sshd_config_inconsistent_details": "Por favor ejecuta yunohost settings set security.ssh.port -v TU_PUERTO_SSH para definir el puerto SSH, y comprueba yunohost tools regen-conf ssh --dry-run --with-diff y yunohost tools regen-conf ssh --force para resetear tu configuración a las recomendaciones de YunoHost.", + "config_forbidden_keyword": "'{keyword}' es una palabra reservada, no puedes crear ni usar un panel de configuración con una pregunta que use esta id.", + "config_no_panel": "No se ha encontrado ningún panel de configuración.", + "config_unknown_filter_key": "La clave de filtrado '{filter_key}' es incorrecta.", + "config_validate_color": "Debe ser un valor hexadecimal RGB correcto", + "danger": "Peligro:", + "diagnosis_apps_issue": "Se ha detectado un problema con la aplicación {app}", + "diagnosis_description_apps": "Aplicaciones", + "diagnosis_rootfstotalspace_critical": "¡El sistema de ficheros raíz solo tiene un total de {space}! ¡Vas a quedarte sin espacio rápidamente! Se recomienda tener al menos 16GB para ese sistema de ficheros.", + "diagnosis_rootfstotalspace_warning": "¡El sistema de ficheros raíz solo tiene un total de {space}! Podría ser suficiente, pero cuidado, puedes rellenarlo rápidamente… Se recomienda tener al menos 16GB para el sistema de ficheros raíz.", + "diagnosis_apps_allgood": "Todas las aplicaciones instaladas respetan las prácticas básicas de empaquetado", + "config_validate_date": "Debe ser una fecha válida en formato AAAA-MM-DD", + "config_validate_email": "Debe ser una dirección de correo correcta", + "config_validate_time": "Debe ser una hora valida en formato HH:MM", + "config_validate_url": "Debe ser una URL válida", + "config_version_not_supported": "Las versiones del panel de configuración '{version}' no están soportadas.", + "domain_remove_confirm_apps_removal": "La supresión de este dominio también eliminará las siguientes aplicaciones:\n{apps}\n\n¿Seguro? [{answers}]", + "domain_registrar_is_not_configured": "El registrador aún no ha configurado el dominio {domain}.", + "diagnosis_apps_not_in_app_catalog": "Esta aplicación se encuentra ausente o ya no figura en el catálogo de aplicaciones de YunoHost. Deberías considerar desinstalarla ya que no recibirá actualizaciones y podría comprometer la integridad y seguridad de tu sistema.", + "disk_space_not_sufficient_install": "No hay espacio libre suficiente para instalar esta aplicación", + "disk_space_not_sufficient_update": "No hay espacio libre suficiente para actualizar esta aplicación", + "diagnosis_dns_specialusedomain": "El dominio {domain} se basa en un dominio de primer nivel (TLD) de usos especiales como .local o .test y no debería tener entradas DNS reales.", + "diagnosis_apps_bad_quality": "Esta aplicación está etiquetada como defectuosa en el catálogo de aplicaciones YunoHost. Podría ser un problema temporal mientras las personas responsables corrigen el asunto. Mientras tanto, la actualización de esta aplicación está desactivada.", + "diagnosis_apps_broken": "Esta aplicación está etiquetada como defectuosa en el catálogo de aplicaciones YunoHost. Podría ser un problema temporal mientras las personas responsables corrigen el asunto. Mientras tanto, la actualización de esta aplicación está desactivada.", + "diagnosis_apps_deprecated_practices": "La versión instalada de esta aplicación usa aún prácticas de empaquetado obsoletas. Deberías actualizarla.", + "diagnosis_apps_outdated_ynh_requirement": "La versión instalada de esta aplicación solo necesita YunoHost >= 2.x, lo que indica que no está al día con la buena praxis de ayudas y empaquetado recomendadas. Deberías actualizarla." +} From 6aaf47493d0cc26e617fe3fc6f9fe589a98666ad Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Thu, 23 Dec 2021 16:55:12 +0100 Subject: [PATCH 218/619] Not sure when that started to happen, but bottle will return an empty dict if no valid session cookie found, this shall trigger an exception --- src/authenticators/ldap_admin.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/authenticators/ldap_admin.py b/src/authenticators/ldap_admin.py index 26843c2c1..7f96165cb 100644 --- a/src/authenticators/ldap_admin.py +++ b/src/authenticators/ldap_admin.py @@ -109,6 +109,9 @@ class Authenticator(BaseAuthenticator): return {"id": random_ascii()} raise YunohostAuthenticationError("unable_authenticate") + if not infos and raise_if_no_session_exists: + raise YunohostAuthenticationError("unable_authenticate") + if "id" not in infos: infos["id"] = random_ascii() From ad56275801bccbfa0c0b5acf2e47df999ff798b9 Mon Sep 17 00:00:00 2001 From: Laurent Peuch Date: Fri, 24 Dec 2021 01:16:41 +0100 Subject: [PATCH 219/619] [mod] run pyupgrade on source code --- data/hooks/diagnosis/00-basesystem.py | 4 +-- data/hooks/diagnosis/10-ip.py | 4 +-- data/hooks/diagnosis/50-systemresources.py | 8 ++--- doc/generate_helper_doc.py | 2 +- src/yunohost/app.py | 10 +++--- src/yunohost/app_catalog.py | 2 +- src/yunohost/backup.py | 14 ++++---- src/yunohost/certificate.py | 34 +++++++++--------- .../data_migrations/0015_migrate_to_buster.py | 8 ++--- src/yunohost/diagnosis.py | 16 ++++----- src/yunohost/dns.py | 2 +- src/yunohost/dyndns.py | 10 +++--- src/yunohost/hook.py | 6 ++-- src/yunohost/log.py | 2 +- src/yunohost/permission.py | 8 ++--- src/yunohost/regenconf.py | 2 +- src/yunohost/service.py | 8 ++--- src/yunohost/settings.py | 2 +- src/yunohost/tests/test_app_catalog.py | 2 +- src/yunohost/tests/test_app_config.py | 2 +- src/yunohost/tests/test_apps.py | 8 ++--- src/yunohost/tests/test_appurl.py | 8 ++--- src/yunohost/tests/test_backuprestore.py | 4 +-- src/yunohost/tests/test_changeurl.py | 2 +- src/yunohost/tests/test_permission.py | 20 +++++------ src/yunohost/tests/test_questions.py | 2 +- src/yunohost/tests/test_user-group.py | 2 +- src/yunohost/tools.py | 2 +- src/yunohost/user.py | 12 +++---- src/yunohost/utils/network.py | 4 +-- src/yunohost/utils/yunopaste.py | 2 +- src/yunohost/vendor/acme_tiny/acme_tiny.py | 36 +++++++++---------- tests/test_translation_format_consistency.py | 6 ++-- 33 files changed, 126 insertions(+), 128 deletions(-) diff --git a/data/hooks/diagnosis/00-basesystem.py b/data/hooks/diagnosis/00-basesystem.py index b472a2d32..8b7b888e3 100644 --- a/data/hooks/diagnosis/00-basesystem.py +++ b/data/hooks/diagnosis/00-basesystem.py @@ -42,7 +42,7 @@ class BaseSystemDiagnoser(Diagnoser): elif os.path.exists("/sys/devices/virtual/dmi/id/sys_vendor"): model = read_file("/sys/devices/virtual/dmi/id/sys_vendor").strip() if os.path.exists("/sys/devices/virtual/dmi/id/product_name"): - model = "%s %s" % ( + model = "{} {}".format( model, read_file("/sys/devices/virtual/dmi/id/product_name").strip(), ) @@ -116,7 +116,7 @@ class BaseSystemDiagnoser(Diagnoser): bad_sury_packages = list(self.bad_sury_packages()) if bad_sury_packages: cmd_to_fix = "apt install --allow-downgrades " + " ".join( - ["%s=%s" % (package, version) for package, version in bad_sury_packages] + ["{}={}".format(package, version) for package, version in bad_sury_packages] ) yield dict( meta={"test": "packages_from_sury"}, diff --git a/data/hooks/diagnosis/10-ip.py b/data/hooks/diagnosis/10-ip.py index 408019668..486e37e3e 100644 --- a/data/hooks/diagnosis/10-ip.py +++ b/data/hooks/diagnosis/10-ip.py @@ -167,7 +167,7 @@ class IPDiagnoser(Diagnoser): assert ( resolvers != [] - ), "Uhoh, need at least one IPv%s DNS resolver in %s ..." % ( + ), "Uhoh, need at least one IPv{} DNS resolver in {} ...".format( protocol, resolver_file, ) @@ -221,7 +221,7 @@ class IPDiagnoser(Diagnoser): return download_text(url, timeout=30).strip() except Exception as e: self.logger_debug( - "Could not get public IPv%s : %s" % (str(protocol), str(e)) + "Could not get public IPv{} : {}".format(str(protocol), str(e)) ) return None diff --git a/data/hooks/diagnosis/50-systemresources.py b/data/hooks/diagnosis/50-systemresources.py index a662e392e..4deb607f4 100644 --- a/data/hooks/diagnosis/50-systemresources.py +++ b/data/hooks/diagnosis/50-systemresources.py @@ -132,7 +132,7 @@ class SystemResourcesDiagnoser(Diagnoser): d for d in disk_partitions if d.mountpoint in ["/", "/var"] ] main_space = sum( - [psutil.disk_usage(d.mountpoint).total for d in main_disk_partitions] + psutil.disk_usage(d.mountpoint).total for d in main_disk_partitions ) if main_space < 10 * GB: yield dict( @@ -156,7 +156,7 @@ class SystemResourcesDiagnoser(Diagnoser): kills_count = self.recent_kills_by_oom_reaper() if kills_count: kills_summary = "\n".join( - ["%s (x%s)" % (proc, count) for proc, count in kills_count] + ["{} (x{})".format(proc, count) for proc, count in kills_count] ) yield dict( @@ -202,9 +202,9 @@ def human_size(bytes_): # Adapted from https://stackoverflow.com/a/1094933 for unit in ["", "ki", "Mi", "Gi", "Ti", "Pi", "Ei", "Zi"]: if abs(bytes_) < 1024.0: - return "%s %sB" % (round_(bytes_), unit) + return "{} {}B".format(round_(bytes_), unit) bytes_ /= 1024.0 - return "%s %sB" % (round_(bytes_), "Yi") + return "{} {}B".format(round_(bytes_), "Yi") def round_(n): diff --git a/doc/generate_helper_doc.py b/doc/generate_helper_doc.py index f2d5bf444..689904a8a 100644 --- a/doc/generate_helper_doc.py +++ b/doc/generate_helper_doc.py @@ -107,7 +107,7 @@ class Parser: else: # We're getting out of a comment bloc, we should find # the name of the function - assert len(line.split()) >= 1, "Malformed line %s in %s" % ( + assert len(line.split()) >= 1, "Malformed line {} in {}".format( i, self.filename, ) diff --git a/src/yunohost/app.py b/src/yunohost/app.py index ece44f172..f47efd9d7 100644 --- a/src/yunohost/app.py +++ b/src/yunohost/app.py @@ -122,7 +122,7 @@ def app_list(full=False, installed=False, filter=None): try: app_info_dict = app_info(app_id, full=full) except Exception as e: - logger.error("Failed to read info for %s : %s" % (app_id, e)) + logger.error("Failed to read info for {} : {}".format(app_id, e)) continue app_info_dict["id"] = app_id out.append(app_info_dict) @@ -1219,7 +1219,7 @@ def app_setting(app, key, value=None, delete=False): ) permissions = user_permission_list(full=True, apps=[app])["permissions"] - permission_name = "%s.legacy_%s_uris" % (app, key.split("_")[0]) + permission_name = "{}.legacy_{}_uris".format(app, key.split("_")[0]) permission = permissions.get(permission_name) # GET @@ -1562,7 +1562,7 @@ def app_action_run(operation_logger, app, action, args=None): shutil.rmtree(tmp_workdir_for_app) if retcode not in action_declaration.get("accepted_return_codes", [0]): - msg = "Error while executing action '%s' of app '%s': return code %s" % ( + msg = "Error while executing action '{}' of app '{}': return code {}".format( action, app, retcode, @@ -1989,7 +1989,7 @@ def _set_default_ask_questions(arguments): for question in questions_with_default ): # The key is for example "app_manifest_install_ask_domain" - key = "app_manifest_%s_ask_%s" % (script_name, arg["name"]) + key = "app_manifest_{}_ask_{}".format(script_name, arg["name"]) arg["ask"] = m18n.n(key) # Also it in fact doesn't make sense for any of those questions to have an example value nor a default value... @@ -2397,7 +2397,7 @@ def _make_environment_for_app_script( env_dict["YNH_APP_BASEDIR"] = workdir for arg_name, arg_value in args.items(): - env_dict["YNH_%s%s" % (args_prefix, arg_name.upper())] = str(arg_value) + env_dict["YNH_{}{}".format(args_prefix, arg_name.upper())] = str(arg_value) return env_dict diff --git a/src/yunohost/app_catalog.py b/src/yunohost/app_catalog.py index e4ffa1db6..96a006704 100644 --- a/src/yunohost/app_catalog.py +++ b/src/yunohost/app_catalog.py @@ -217,7 +217,7 @@ def _load_apps_catalog(): ) except Exception as e: raise YunohostError( - "Unable to read cache for apps_catalog %s : %s" % (cache_file, e), + "Unable to read cache for apps_catalog {} : {}".format(cache_file, e), raw_msg=True, ) diff --git a/src/yunohost/backup.py b/src/yunohost/backup.py index f68e59b13..03721be0c 100644 --- a/src/yunohost/backup.py +++ b/src/yunohost/backup.py @@ -2380,7 +2380,7 @@ def backup_list(with_info=False, human_readable=False): # Get local archives sorted according to last modification time # (we do a realpath() to resolve symlinks) archives = glob("%s/*.tar.gz" % ARCHIVES_PATH) + glob("%s/*.tar" % ARCHIVES_PATH) - archives = set([os.path.realpath(archive) for archive in archives]) + archives = {os.path.realpath(archive) for archive in archives} archives = sorted(archives, key=lambda x: os.path.getctime(x)) # Extract only filename without the extension @@ -2420,7 +2420,7 @@ def backup_download(name): ) return - archive_file = "%s/%s.tar" % (ARCHIVES_PATH, name) + archive_file = "{}/{}.tar".format(ARCHIVES_PATH, name) # Check file exist (even if it's a broken symlink) if not os.path.lexists(archive_file): @@ -2462,7 +2462,7 @@ def backup_info(name, with_details=False, human_readable=False): elif name.endswith(".tar"): name = name[: -len(".tar")] - archive_file = "%s/%s.tar" % (ARCHIVES_PATH, name) + archive_file = "{}/{}.tar".format(ARCHIVES_PATH, name) # Check file exist (even if it's a broken symlink) if not os.path.lexists(archive_file): @@ -2480,7 +2480,7 @@ def backup_info(name, with_details=False, human_readable=False): "backup_archive_broken_link", path=archive_file ) - info_file = "%s/%s.info.json" % (ARCHIVES_PATH, name) + info_file = "{}/{}.info.json".format(ARCHIVES_PATH, name) if not os.path.exists(info_file): tar = tarfile.open( @@ -2591,10 +2591,10 @@ def backup_delete(name): hook_callback("pre_backup_delete", args=[name]) - archive_file = "%s/%s.tar" % (ARCHIVES_PATH, name) + archive_file = "{}/{}.tar".format(ARCHIVES_PATH, name) if not os.path.exists(archive_file) and os.path.exists(archive_file + ".gz"): archive_file += ".gz" - info_file = "%s/%s.info.json" % (ARCHIVES_PATH, name) + info_file = "{}/{}.info.json".format(ARCHIVES_PATH, name) files_to_delete = [archive_file, info_file] @@ -2693,5 +2693,5 @@ def binary_to_human(n, customary=False): for s in reversed(symbols): if n >= prefix[s]: value = float(n) / prefix[s] - return "%.1f%s" % (value, s) + return "{:.1f}{}".format(value, s) return "%s" % n diff --git a/src/yunohost/certificate.py b/src/yunohost/certificate.py index 2679b2429..e4dc7d350 100644 --- a/src/yunohost/certificate.py +++ b/src/yunohost/certificate.py @@ -143,7 +143,7 @@ def _certificate_install_selfsigned(domain_list, force=False): # Paths of files and folder we'll need date_tag = datetime.utcnow().strftime("%Y%m%d.%H%M%S") - new_cert_folder = "%s/%s-history/%s-selfsigned" % ( + new_cert_folder = "{}/{}-history/{}-selfsigned".format( CERT_FOLDER, domain, date_tag, @@ -300,7 +300,7 @@ def _certificate_install_letsencrypt( try: _fetch_and_enable_new_certificate(domain, staging, no_checks=no_checks) except Exception as e: - msg = "Certificate installation for %s failed !\nException: %s" % ( + msg = "Certificate installation for {} failed !\nException: {}".format( domain, e, ) @@ -457,20 +457,20 @@ def _email_renewing_failed(domain, exception_message, stack=""): logs = _tail(50, "/var/log/yunohost/yunohost-cli.log") text = """ -An attempt for renewing the certificate for domain %s failed with the following +An attempt for renewing the certificate for domain {} failed with the following error : -%s -%s +{} +{} Here's the tail of /var/log/yunohost/yunohost-cli.log, which might help to investigate : -%s +{} -- Certificate Manager -""" % ( +""".format( domain, exception_message, stack, @@ -478,12 +478,12 @@ investigate : ) message = """\ -From: %s -To: %s -Subject: %s +From: {} +To: {} +Subject: {} -%s -""" % ( +{} +""".format( from_, to_, subject_, @@ -532,7 +532,7 @@ def _fetch_and_enable_new_certificate(domain, staging=False, no_checks=False): # Prepare certificate signing request logger.debug("Prepare key and certificate signing request (CSR) for %s...", domain) - domain_key_file = "%s/%s.pem" % (TMP_FOLDER, domain) + domain_key_file = "{}/{}.pem".format(TMP_FOLDER, domain) _generate_key(domain_key_file) _set_permissions(domain_key_file, "root", "ssl-cert", 0o640) @@ -541,7 +541,7 @@ def _fetch_and_enable_new_certificate(domain, staging=False, no_checks=False): # Sign the certificate logger.debug("Now using ACME Tiny to sign the certificate...") - domain_csr_file = "%s/%s.csr" % (TMP_FOLDER, domain) + domain_csr_file = "{}/{}.csr".format(TMP_FOLDER, domain) if staging: certification_authority = STAGING_CERTIFICATION_AUTHORITY @@ -580,7 +580,7 @@ def _fetch_and_enable_new_certificate(domain, staging=False, no_checks=False): else: folder_flag = "letsencrypt" - new_cert_folder = "%s/%s-history/%s-%s" % ( + new_cert_folder = "{}/{}-history/{}-{}".format( CERT_FOLDER, domain, date_tag, @@ -642,7 +642,7 @@ def _prepare_certificate_signing_request(domain, key_file, output_folder): csr.add_extensions( [ crypto.X509Extension( - "subjectAltName".encode("utf8"), + b"subjectAltName", False, ("DNS:" + subdomain).encode("utf8"), ) @@ -844,7 +844,7 @@ def _backup_current_cert(domain): cert_folder_domain = os.path.join(CERT_FOLDER, domain) date_tag = datetime.utcnow().strftime("%Y%m%d.%H%M%S") - backup_folder = "%s-backups/%s" % (cert_folder_domain, date_tag) + backup_folder = "{}-backups/{}".format(cert_folder_domain, date_tag) shutil.copytree(cert_folder_domain, backup_folder) diff --git a/src/yunohost/data_migrations/0015_migrate_to_buster.py b/src/yunohost/data_migrations/0015_migrate_to_buster.py index 4f2d4caf8..626dd682a 100644 --- a/src/yunohost/data_migrations/0015_migrate_to_buster.py +++ b/src/yunohost/data_migrations/0015_migrate_to_buster.py @@ -269,14 +269,14 @@ class MyMigration(Migration): % default_crt ) - os.system("mv %s %s.old" % (default_crt, default_crt)) - os.system("mv %s %s.old" % (default_key, default_key)) + os.system("mv {} {}.old".format(default_crt, default_crt)) + os.system("mv {} {}.old".format(default_key, default_key)) ret = os.system("/usr/share/yunohost/hooks/conf_regen/02-ssl init") if ret != 0 or not os.path.exists(default_crt): logger.error("Upgrading the certificate failed ... reverting") - os.system("mv %s.old %s" % (default_crt, default_crt)) - os.system("mv %s.old %s" % (default_key, default_key)) + os.system("mv {}.old {}".format(default_crt, default_crt)) + os.system("mv {}.old {}".format(default_key, default_key)) signatures = {cert: check_output(cmd % cert) for cert in active_certs} diff --git a/src/yunohost/diagnosis.py b/src/yunohost/diagnosis.py index 4ac5e2731..dfe58685e 100644 --- a/src/yunohost/diagnosis.py +++ b/src/yunohost/diagnosis.py @@ -640,7 +640,7 @@ class Diagnoser: elif ipversion == 6: socket.getaddrinfo = getaddrinfo_ipv6_only - url = "https://%s/%s" % (DIAGNOSIS_SERVER, uri) + url = "https://{}/{}".format(DIAGNOSIS_SERVER, uri) try: r = requests.post(url, json=data, timeout=timeout) finally: @@ -679,7 +679,7 @@ def _email_diagnosis_issues(): from yunohost.domain import _get_maindomain maindomain = _get_maindomain() - from_ = "diagnosis@%s (Automatic diagnosis on %s)" % (maindomain, maindomain) + from_ = "diagnosis@{} (Automatic diagnosis on {})".format(maindomain, maindomain) to_ = "root" subject_ = "Issues found by automatic diagnosis on %s" % maindomain @@ -692,16 +692,16 @@ def _email_diagnosis_issues(): content = _dump_human_readable_reports(issues) message = """\ -From: %s -To: %s -Subject: %s +From: {} +To: {} +Subject: {} -%s +{} --- -%s -""" % ( +{} +""".format( from_, to_, subject_, diff --git a/src/yunohost/dns.py b/src/yunohost/dns.py index 534ade918..23c641a35 100644 --- a/src/yunohost/dns.py +++ b/src/yunohost/dns.py @@ -762,7 +762,7 @@ def domain_dns_push(operation_logger, domain, dry_run=False, force=False, purge= changes = {"delete": [], "update": [], "create": [], "unchanged": []} type_and_names = sorted( - set([(r["type"], r["name"]) for r in current_records + wanted_records]) + {(r["type"], r["name"]) for r in current_records + wanted_records} ) comparison = { type_and_name: {"current": [], "wanted": []} for type_and_name in type_and_names diff --git a/src/yunohost/dyndns.py b/src/yunohost/dyndns.py index 4f4dc1d1f..63bb3180f 100644 --- a/src/yunohost/dyndns.py +++ b/src/yunohost/dyndns.py @@ -151,7 +151,7 @@ def dyndns_subscribe(operation_logger, domain=None, key=None): try: error = json.loads(r.text)["error"] except Exception: - error = 'Server error, code: %s. (Message: "%s")' % (r.status_code, r.text) + error = 'Server error, code: {}. (Message: "{}")'.format(r.status_code, r.text) raise YunohostError("dyndns_registration_failed", error=error) # Yunohost regen conf will add the dyndns cron job if a private key exists @@ -196,7 +196,7 @@ def dyndns_update( # If key is not given, pick the first file we find with the domain given elif key is None: - keys = glob.glob("/etc/yunohost/dyndns/K{0}.+*.private".format(domain)) + keys = glob.glob("/etc/yunohost/dyndns/K{}.+*.private".format(domain)) if not keys: raise YunohostValidationError("dyndns_key_not_found") @@ -263,14 +263,14 @@ def dyndns_update( return None raise YunohostError( - "Failed to resolve %s for %s" % (rdtype, domain), raw_msg=True + "Failed to resolve {} for {}".format(rdtype, domain), raw_msg=True ) old_ipv4 = resolve_domain(domain, "A") old_ipv6 = resolve_domain(domain, "AAAA") - logger.debug("Old IPv4/v6 are (%s, %s)" % (old_ipv4, old_ipv6)) - logger.debug("Requested IPv4/v6 are (%s, %s)" % (ipv4, ipv6)) + logger.debug("Old IPv4/v6 are ({}, {})".format(old_ipv4, old_ipv6)) + logger.debug("Requested IPv4/v6 are ({}, {})".format(ipv4, ipv6)) # no need to update if (not force and not dry_run) and (old_ipv4 == ipv4 and old_ipv6 == ipv6): diff --git a/src/yunohost/hook.py b/src/yunohost/hook.py index 98b624f12..c5ff8b0cd 100644 --- a/src/yunohost/hook.py +++ b/src/yunohost/hook.py @@ -156,7 +156,7 @@ def hook_list(action, list_by="name", show_info=False): try: d[priority].add(name) except KeyError: - d[priority] = set([name]) + d[priority] = {name} elif list_by == "name" or list_by == "folder": if show_info: @@ -197,7 +197,7 @@ def hook_list(action, list_by="name", show_info=False): or (f.startswith("__") and f.endswith("__")) ): continue - path = "%s%s/%s" % (folder, action, f) + path = "{}{}/{}".format(folder, action, f) priority, name = _extract_filename_parts(f) _append_hook(d, priority, name, path) @@ -407,7 +407,7 @@ def _hook_exec_bash(path, args, chdir, env, user, return_format, loggers): if not chdir: # use the script directory as current one chdir, cmd_script = os.path.split(path) - cmd_script = "./{0}".format(cmd_script) + cmd_script = "./{}".format(cmd_script) else: cmd_script = path diff --git a/src/yunohost/log.py b/src/yunohost/log.py index 0e534f9f8..cb11c7112 100644 --- a/src/yunohost/log.py +++ b/src/yunohost/log.py @@ -544,7 +544,7 @@ class OperationLogger(object): # We use proc.open_files() to list files opened / actively used by this proc # We only keep files matching a recent yunohost operation log active_logs = sorted( - [f.path for f in proc.open_files() if f.path in recent_operation_logs], + (f.path for f in proc.open_files() if f.path in recent_operation_logs), key=os.path.getctime, reverse=True, ) diff --git a/src/yunohost/permission.py b/src/yunohost/permission.py index 1856046d6..04c170a32 100644 --- a/src/yunohost/permission.py +++ b/src/yunohost/permission.py @@ -139,7 +139,7 @@ def user_permission_list( continue main_perm_label = permissions[main_perm_name]["label"] infos["sublabel"] = infos["label"] - infos["label"] = "%s (%s)" % (main_perm_label, infos["label"]) + infos["label"] = "{} ({})".format(main_perm_label, infos["label"]) if short: permissions = list(permissions.keys()) @@ -664,13 +664,11 @@ def permission_sync_to_user(): currently_allowed_users = set(permission_infos["corresponding_users"]) # These are the users that should be allowed because they are member of a group that is allowed for this permission ... - should_be_allowed_users = set( - [ + should_be_allowed_users = { user for group in permission_infos["allowed"] for user in groups[group]["members"] - ] - ) + } # Note that a LDAP operation with the same value that is in LDAP crash SLAP. # So we need to check before each ldap operation that we really change something in LDAP diff --git a/src/yunohost/regenconf.py b/src/yunohost/regenconf.py index 1beef8a44..224fb8bc5 100644 --- a/src/yunohost/regenconf.py +++ b/src/yunohost/regenconf.py @@ -640,7 +640,7 @@ def _process_regen_conf(system_conf, new_conf=None, save=True): if save: backup_path = os.path.join( BACKUP_CONF_DIR, - "{0}-{1}".format( + "{}-{}".format( system_conf.lstrip("/"), datetime.utcnow().strftime("%Y%m%d.%H%M%S") ), ) diff --git a/src/yunohost/service.py b/src/yunohost/service.py index f200d08c0..f47f67a3c 100644 --- a/src/yunohost/service.py +++ b/src/yunohost/service.py @@ -625,7 +625,7 @@ def _run_service_command(action, service): % (action, ", ".join(possible_actions)) ) - cmd = "systemctl %s %s" % (action, service) + cmd = "systemctl {} {}".format(action, service) need_lock = services[service].get("need_lock", False) and action in [ "start", @@ -673,7 +673,7 @@ def _give_lock(action, service, p): else: systemctl_PID_name = "ControlPID" - cmd_get_son_PID = "systemctl show %s -p %s" % (service, systemctl_PID_name) + cmd_get_son_PID = "systemctl show {} -p {}".format(service, systemctl_PID_name) son_PID = 0 # As long as we did not found the PID and that the command is still running while son_PID == 0 and p.poll() is None: @@ -687,7 +687,7 @@ def _give_lock(action, service, p): if son_PID != 0: # Append the PID to the lock file logger.debug( - "Giving a lock to PID %s for service %s !" % (str(son_PID), service) + "Giving a lock to PID {} for service {} !".format(str(son_PID), service) ) append_to_file(MOULINETTE_LOCK, "\n%s" % str(son_PID)) @@ -865,7 +865,7 @@ def _get_journalctl_logs(service, number="all"): systemd_service = services.get(service, {}).get("actual_systemd_service", service) try: return check_output( - "journalctl --no-hostname --no-pager -u {0} -n{1}".format( + "journalctl --no-hostname --no-pager -u {} -n{}".format( systemd_service, number ) ) diff --git a/src/yunohost/settings.py b/src/yunohost/settings.py index d59b41a58..77d0d2705 100644 --- a/src/yunohost/settings.py +++ b/src/yunohost/settings.py @@ -224,7 +224,7 @@ def settings_set(key, value): try: trigger_post_change_hook(key, old_value, value) except Exception as e: - logger.error("Post-change hook for setting %s failed : %s" % (key, e)) + logger.error("Post-change hook for setting {} failed : {}".format(key, e)) raise diff --git a/src/yunohost/tests/test_app_catalog.py b/src/yunohost/tests/test_app_catalog.py index 8423b868e..e9ecb1c12 100644 --- a/src/yunohost/tests/test_app_catalog.py +++ b/src/yunohost/tests/test_app_catalog.py @@ -132,7 +132,7 @@ def test_apps_catalog_update_nominal(mocker): catalog = app_catalog(with_categories=True) assert "apps" in catalog - assert set(catalog["apps"].keys()) == set(["foo", "bar"]) + assert set(catalog["apps"].keys()) == {"foo", "bar"} assert "categories" in catalog assert [c["id"] for c in catalog["categories"]] == ["yolo", "swag"] diff --git a/src/yunohost/tests/test_app_config.py b/src/yunohost/tests/test_app_config.py index 0eb813672..8de03bfd5 100644 --- a/src/yunohost/tests/test_app_config.py +++ b/src/yunohost/tests/test_app_config.py @@ -70,7 +70,7 @@ def legacy_app(request): app_install( os.path.join(get_test_apps_dir(), "legacy_app_ynh"), - args="domain=%s&path=%s&is_public=%s" % (main_domain, "/", 1), + args="domain={}&path={}&is_public={}".format(main_domain, "/", 1), force=True, ) diff --git a/src/yunohost/tests/test_apps.py b/src/yunohost/tests/test_apps.py index 22e18ec9a..2a808b5bd 100644 --- a/src/yunohost/tests/test_apps.py +++ b/src/yunohost/tests/test_apps.py @@ -111,7 +111,7 @@ def secondary_domain(request): def app_expected_files(domain, app): - yield "/etc/nginx/conf.d/%s.d/%s.conf" % (domain, app) + yield "/etc/nginx/conf.d/{}.d/{}.conf".format(domain, app) if app.startswith("legacy_app"): yield "/var/www/%s/index.html" % app yield "/etc/yunohost/apps/%s/settings.yml" % app @@ -152,7 +152,7 @@ def install_legacy_app(domain, path, public=True): app_install( os.path.join(get_test_apps_dir(), "legacy_app_ynh"), - args="domain=%s&path=%s&is_public=%s" % (domain, path, 1 if public else 0), + args="domain={}&path={}&is_public={}".format(domain, path, 1 if public else 0), force=True, ) @@ -170,7 +170,7 @@ def install_break_yo_system(domain, breakwhat): app_install( os.path.join(get_test_apps_dir(), "break_yo_system_ynh"), - args="domain=%s&breakwhat=%s" % (domain, breakwhat), + args="domain={}&breakwhat={}".format(domain, breakwhat), force=True, ) @@ -338,7 +338,7 @@ def test_legacy_app_failed_remove(mocker, secondary_domain): # The remove script runs with set -eu and attempt to remove this # file without -f, so will fail if it's not there ;) - os.remove("/etc/nginx/conf.d/%s.d/%s.conf" % (secondary_domain, "legacy_app")) + os.remove("/etc/nginx/conf.d/{}.d/{}.conf".format(secondary_domain, "legacy_app")) # TODO / FIXME : can't easily validate that 'app_not_properly_removed' # is triggered for weird reasons ... diff --git a/src/yunohost/tests/test_appurl.py b/src/yunohost/tests/test_appurl.py index 00bfe5c58..c036ae28a 100644 --- a/src/yunohost/tests/test_appurl.py +++ b/src/yunohost/tests/test_appurl.py @@ -99,7 +99,7 @@ def test_registerurl(): app_install( os.path.join(get_test_apps_dir(), "register_url_app_ynh"), - args="domain=%s&path=%s" % (maindomain, "/urlregisterapp"), + args="domain={}&path={}".format(maindomain, "/urlregisterapp"), force=True, ) @@ -109,7 +109,7 @@ def test_registerurl(): with pytest.raises(YunohostError): app_install( os.path.join(get_test_apps_dir(), "register_url_app_ynh"), - args="domain=%s&path=%s" % (maindomain, "/urlregisterapp"), + args="domain={}&path={}".format(maindomain, "/urlregisterapp"), force=True, ) @@ -119,7 +119,7 @@ def test_registerurl_baddomain(): with pytest.raises(YunohostError): app_install( os.path.join(get_test_apps_dir(), "register_url_app_ynh"), - args="domain=%s&path=%s" % ("yolo.swag", "/urlregisterapp"), + args="domain={}&path={}".format("yolo.swag", "/urlregisterapp"), force=True, ) @@ -234,7 +234,7 @@ def test_normalize_permission_path_with_unknown_domain(): def test_normalize_permission_path_conflicting_path(): app_install( os.path.join(get_test_apps_dir(), "register_url_app_ynh"), - args="domain=%s&path=%s" % (maindomain, "/url/registerapp"), + args="domain={}&path={}".format(maindomain, "/url/registerapp"), force=True, ) diff --git a/src/yunohost/tests/test_backuprestore.py b/src/yunohost/tests/test_backuprestore.py index 6e2c3b514..bfed5082a 100644 --- a/src/yunohost/tests/test_backuprestore.py +++ b/src/yunohost/tests/test_backuprestore.py @@ -139,7 +139,7 @@ def app_is_installed(app): # These are files we know should be installed by the app app_files = [] - app_files.append("/etc/nginx/conf.d/%s.d/%s.conf" % (maindomain, app)) + app_files.append("/etc/nginx/conf.d/{}.d/{}.conf".format(maindomain, app)) app_files.append("/var/www/%s/index.html" % app) app_files.append("/etc/importantfile") @@ -214,7 +214,7 @@ def install_app(app, path, additionnal_args=""): app_install( os.path.join(get_test_apps_dir(), app), - args="domain=%s&path=%s%s" % (maindomain, path, additionnal_args), + args="domain={}&path={}{}".format(maindomain, path, additionnal_args), force=True, ) diff --git a/src/yunohost/tests/test_changeurl.py b/src/yunohost/tests/test_changeurl.py index e375bd9f0..04cb4a1a9 100644 --- a/src/yunohost/tests/test_changeurl.py +++ b/src/yunohost/tests/test_changeurl.py @@ -26,7 +26,7 @@ def teardown_function(function): def install_changeurl_app(path): app_install( os.path.join(get_test_apps_dir(), "change_url_app_ynh"), - args="domain=%s&path=%s" % (maindomain, path), + args="domain={}&path={}".format(maindomain, path), force=True, ) diff --git a/src/yunohost/tests/test_permission.py b/src/yunohost/tests/test_permission.py index 00799d0fd..01b62f2a8 100644 --- a/src/yunohost/tests/test_permission.py +++ b/src/yunohost/tests/test_permission.py @@ -347,7 +347,7 @@ def check_permission_for_apps(): # {"bar", "foo"} # and compare this to the list of installed apps ... - app_perms_prefix = set(p.split(".")[0] for p in app_perms) + app_perms_prefix = {p.split(".")[0] for p in app_perms} assert set(_installed_apps()) == app_perms_prefix @@ -398,7 +398,7 @@ def test_permission_list(): assert res["wiki.main"]["allowed"] == ["all_users"] assert res["blog.main"]["allowed"] == ["alice"] assert res["blog.api"]["allowed"] == ["visitors"] - assert set(res["wiki.main"]["corresponding_users"]) == set(["alice", "bob"]) + assert set(res["wiki.main"]["corresponding_users"]) == {"alice", "bob"} assert res["blog.main"]["corresponding_users"] == ["alice"] assert res["blog.api"]["corresponding_users"] == [] assert res["wiki.main"]["url"] == "/" @@ -442,7 +442,7 @@ def test_permission_create_main(mocker): res = user_permission_list(full=True)["permissions"] assert "site.main" in res assert res["site.main"]["allowed"] == ["all_users"] - assert set(res["site.main"]["corresponding_users"]) == set(["alice", "bob"]) + assert set(res["site.main"]["corresponding_users"]) == {"alice", "bob"} assert res["site.main"]["protected"] is False @@ -630,8 +630,8 @@ def test_permission_add_group(mocker): user_permission_update("wiki.main", add="alice") res = user_permission_list(full=True)["permissions"] - assert set(res["wiki.main"]["allowed"]) == set(["all_users", "alice"]) - assert set(res["wiki.main"]["corresponding_users"]) == set(["alice", "bob"]) + assert set(res["wiki.main"]["allowed"]) == {"all_users", "alice"} + assert set(res["wiki.main"]["corresponding_users"]) == {"alice", "bob"} def test_permission_remove_group(mocker): @@ -680,7 +680,7 @@ def test_permission_reset(mocker): res = user_permission_list(full=True)["permissions"] assert res["blog.main"]["allowed"] == ["all_users"] - assert set(res["blog.main"]["corresponding_users"]) == set(["alice", "bob"]) + assert set(res["blog.main"]["corresponding_users"]) == {"alice", "bob"} def test_permission_reset_idempotency(): @@ -690,7 +690,7 @@ def test_permission_reset_idempotency(): res = user_permission_list(full=True)["permissions"] assert res["blog.main"]["allowed"] == ["all_users"] - assert set(res["blog.main"]["corresponding_users"]) == set(["alice", "bob"]) + assert set(res["blog.main"]["corresponding_users"]) == {"alice", "bob"} def test_permission_change_label(mocker): @@ -1013,9 +1013,9 @@ def test_permission_app_install(): assert res["permissions_app.dev"]["url"] == "/dev" assert res["permissions_app.main"]["allowed"] == ["all_users"] - assert set(res["permissions_app.main"]["corresponding_users"]) == set( - ["alice", "bob"] - ) + assert set(res["permissions_app.main"]["corresponding_users"]) == { + "alice", "bob" + } assert res["permissions_app.admin"]["allowed"] == ["alice"] assert res["permissions_app.admin"]["corresponding_users"] == ["alice"] diff --git a/src/yunohost/tests/test_questions.py b/src/yunohost/tests/test_questions.py index c21ff8c40..5917d32d4 100644 --- a/src/yunohost/tests/test_questions.py +++ b/src/yunohost/tests/test_questions.py @@ -1977,7 +1977,7 @@ def test_question_file_from_api(): from base64 import b64encode - b64content = b64encode("helloworld".encode()) + b64content = b64encode(b"helloworld") questions = [ { "name": "some_file", diff --git a/src/yunohost/tests/test_user-group.py b/src/yunohost/tests/test_user-group.py index d65366a9a..e561118e0 100644 --- a/src/yunohost/tests/test_user-group.py +++ b/src/yunohost/tests/test_user-group.py @@ -281,7 +281,7 @@ def test_update_group_add_user(mocker): user_group_update("dev", add=["bob"]) group_res = user_group_list()["groups"] - assert set(group_res["dev"]["members"]) == set(["alice", "bob"]) + assert set(group_res["dev"]["members"]) == {"alice", "bob"} def test_update_group_add_user_already_in(mocker): diff --git a/src/yunohost/tools.py b/src/yunohost/tools.py index fb9839814..87c962499 100644 --- a/src/yunohost/tools.py +++ b/src/yunohost/tools.py @@ -224,7 +224,7 @@ def tools_postinstall( disk_partitions = sorted(psutil.disk_partitions(), key=lambda k: k.mountpoint) main_disk_partitions = [d for d in disk_partitions if d.mountpoint in ["/", "/var"]] main_space = sum( - [psutil.disk_usage(d.mountpoint).total for d in main_disk_partitions] + psutil.disk_usage(d.mountpoint).total for d in main_disk_partitions ) GB = 1024 ** 3 if not force_diskspace and main_space < 10 * GB: diff --git a/src/yunohost/user.py b/src/yunohost/user.py index c9f70e152..6a924add3 100644 --- a/src/yunohost/user.py +++ b/src/yunohost/user.py @@ -97,7 +97,7 @@ def user_list(fields=None): and values[0].strip() == "/bin/false", } - attrs = set(["uid"]) + attrs = {"uid"} users = {} if not fields: @@ -215,7 +215,7 @@ def user_create( uid_guid_found = uid not in all_uid and uid not in all_gid # Adapt values for LDAP - fullname = "%s %s" % (firstname, lastname) + fullname = "{} {}".format(firstname, lastname) attr_dict = { "objectClass": [ @@ -333,8 +333,8 @@ def user_delete(operation_logger, username, purge=False, from_import=False): subprocess.call(["nscd", "-i", "passwd"]) if purge: - subprocess.call(["rm", "-rf", "/home/{0}".format(username)]) - subprocess.call(["rm", "-rf", "/var/mail/{0}".format(username)]) + subprocess.call(["rm", "-rf", "/home/{}".format(username)]) + subprocess.call(["rm", "-rf", "/var/mail/{}".format(username)]) hook_callback("post_user_delete", args=[username, purge]) @@ -1334,9 +1334,9 @@ def user_ssh_remove_key(username, key): def _convertSize(num, suffix=""): for unit in ["K", "M", "G", "T", "P", "E", "Z"]: if abs(num) < 1024.0: - return "%3.1f%s%s" % (num, unit, suffix) + return "{:3.1f}{}{}".format(num, unit, suffix) num /= 1024.0 - return "%.1f%s%s" % (num, "Yi", suffix) + return "{:.1f}{}{}".format(num, "Yi", suffix) def _hash_user_password(password): diff --git a/src/yunohost/utils/network.py b/src/yunohost/utils/network.py index 4474af14f..fd70e4d4b 100644 --- a/src/yunohost/utils/network.py +++ b/src/yunohost/utils/network.py @@ -44,7 +44,7 @@ def get_public_ip(protocol=4): ): ip = read_file(cache_file).strip() ip = ip if ip else None # Empty file (empty string) means there's no IP - logger.debug("Reusing IPv%s from cache: %s" % (protocol, ip)) + logger.debug("Reusing IPv{} from cache: {}".format(protocol, ip)) else: ip = get_public_ip_from_remote_server(protocol) logger.debug("IP fetched: %s" % ip) @@ -87,7 +87,7 @@ def get_public_ip_from_remote_server(protocol=4): try: return download_text(url, timeout=30).strip() except Exception as e: - logger.debug("Could not get public IPv%s : %s" % (str(protocol), str(e))) + logger.debug("Could not get public IPv{} : {}".format(str(protocol), str(e))) return None diff --git a/src/yunohost/utils/yunopaste.py b/src/yunohost/utils/yunopaste.py index 0c3e3c998..35e829991 100644 --- a/src/yunohost/utils/yunopaste.py +++ b/src/yunohost/utils/yunopaste.py @@ -49,7 +49,7 @@ def yunopaste(data): raw_msg=True, ) - return "%s/raw/%s" % (paste_server, url) + return "{}/raw/{}".format(paste_server, url) def anonymize(data): diff --git a/src/yunohost/vendor/acme_tiny/acme_tiny.py b/src/yunohost/vendor/acme_tiny/acme_tiny.py index 3c13d13ec..0d2534df9 100644 --- a/src/yunohost/vendor/acme_tiny/acme_tiny.py +++ b/src/yunohost/vendor/acme_tiny/acme_tiny.py @@ -38,7 +38,7 @@ def get_crt( ) out, err = proc.communicate(cmd_input) if proc.returncode != 0: - raise IOError("{0}\n{1}".format(err_msg, err)) + raise IOError("{}\n{}".format(err_msg, err)) return out # helper function - make request and automatically parse json response @@ -74,7 +74,7 @@ def get_crt( raise IndexError(resp_data) # allow 100 retrys for bad nonces if code not in [200, 201, 204]: raise ValueError( - "{0}:\nUrl: {1}\nData: {2}\nResponse Code: {3}\nResponse: {4}".format( + "{}:\nUrl: {}\nData: {}\nResponse Code: {}\nResponse: {}".format( err_msg, url, data, code, resp_data ) ) @@ -89,7 +89,7 @@ def get_crt( {"jwk": jwk} if acct_headers is None else {"kid": acct_headers["Location"]} ) protected64 = _b64(json.dumps(protected).encode("utf8")) - protected_input = "{0}.{1}".format(protected64, payload64).encode("utf8") + protected_input = "{}.{}".format(protected64, payload64).encode("utf8") out = _cmd( ["openssl", "dgst", "-sha256", "-sign", account_key], stdin=subprocess.PIPE, @@ -125,8 +125,8 @@ def get_crt( pub_hex, pub_exp = re.search( pub_pattern, out.decode("utf8"), re.MULTILINE | re.DOTALL ).groups() - pub_exp = "{0:x}".format(int(pub_exp)) - pub_exp = "0{0}".format(pub_exp) if len(pub_exp) % 2 else pub_exp + pub_exp = "{:x}".format(int(pub_exp)) + pub_exp = "0{}".format(pub_exp) if len(pub_exp) % 2 else pub_exp alg = "RS256" jwk = { "e": _b64(binascii.unhexlify(pub_exp.encode("utf-8"))), @@ -140,9 +140,9 @@ def get_crt( log.info("Parsing CSR...") out = _cmd( ["openssl", "req", "-in", csr, "-noout", "-text"], - err_msg="Error loading {0}".format(csr), + err_msg="Error loading {}".format(csr), ) - domains = set([]) + domains = set() common_name = re.search(r"Subject:.*? CN\s?=\s?([^\s,;/]+)", out.decode("utf8")) if common_name is not None: domains.add(common_name.group(1)) @@ -155,7 +155,7 @@ def get_crt( for san in subject_alt_names.group(1).split(", "): if san.startswith("DNS:"): domains.add(san[4:]) - log.info("Found domains: {0}".format(", ".join(domains))) + log.info("Found domains: {}".format(", ".join(domains))) # get the ACME directory of urls log.info("Getting directory...") @@ -178,7 +178,7 @@ def get_crt( {"contact": contact}, "Error updating contact details", ) - log.info("Updated contact details:\n{0}".format("\n".join(account["contact"]))) + log.info("Updated contact details:\n{}".format("\n".join(account["contact"]))) # create a new order log.info("Creating new order...") @@ -194,46 +194,46 @@ def get_crt( auth_url, None, "Error getting challenges" ) domain = authorization["identifier"]["value"] - log.info("Verifying {0}...".format(domain)) + log.info("Verifying {}...".format(domain)) # find the http-01 challenge and write the challenge file challenge = [c for c in authorization["challenges"] if c["type"] == "http-01"][ 0 ] token = re.sub(r"[^A-Za-z0-9_\-]", "_", challenge["token"]) - keyauthorization = "{0}.{1}".format(token, thumbprint) + keyauthorization = "{}.{}".format(token, thumbprint) wellknown_path = os.path.join(acme_dir, token) with open(wellknown_path, "w") as wellknown_file: wellknown_file.write(keyauthorization) # check that the file is in place try: - wellknown_url = "http://{0}/.well-known/acme-challenge/{1}".format( + wellknown_url = "http://{}/.well-known/acme-challenge/{}".format( domain, token ) assert disable_check or _do_request(wellknown_url)[0] == keyauthorization except (AssertionError, ValueError) as e: raise ValueError( - "Wrote file to {0}, but couldn't download {1}: {2}".format( + "Wrote file to {}, but couldn't download {}: {}".format( wellknown_path, wellknown_url, e ) ) # say the challenge is done _send_signed_request( - challenge["url"], {}, "Error submitting challenges: {0}".format(domain) + challenge["url"], {}, "Error submitting challenges: {}".format(domain) ) authorization = _poll_until_not( auth_url, ["pending"], - "Error checking challenge status for {0}".format(domain), + "Error checking challenge status for {}".format(domain), ) if authorization["status"] != "valid": raise ValueError( - "Challenge did not pass for {0}: {1}".format(domain, authorization) + "Challenge did not pass for {}: {}".format(domain, authorization) ) os.remove(wellknown_path) - log.info("{0} verified!".format(domain)) + log.info("{} verified!".format(domain)) # finalize the order with the csr log.info("Signing certificate...") @@ -251,7 +251,7 @@ def get_crt( "Error checking order status", ) if order["status"] != "valid": - raise ValueError("Order failed: {0}".format(order)) + raise ValueError("Order failed: {}".format(order)) # download the certificate certificate_pem, _, _ = _send_signed_request( diff --git a/tests/test_translation_format_consistency.py b/tests/test_translation_format_consistency.py index 86d1c3279..bfd0e3ae4 100644 --- a/tests/test_translation_format_consistency.py +++ b/tests/test_translation_format_consistency.py @@ -26,10 +26,10 @@ def find_inconsistencies(locale_file): # Then we check that every "{stuff}" (for python's .format()) # should also be in the translated string, otherwise the .format # will trigger an exception! - subkeys_in_ref = set(k[0] for k in re.findall(r"{(\w+)(:\w)?}", string)) - subkeys_in_this_locale = set( + subkeys_in_ref = {k[0] for k in re.findall(r"{(\w+)(:\w)?}", string)} + subkeys_in_this_locale = { k[0] for k in re.findall(r"{(\w+)(:\w)?}", this_locale[key]) - ) + } if any(k not in subkeys_in_ref for k in subkeys_in_this_locale): yield """\n From 77058ab356316809b0474ee64cff189fe2b64583 Mon Sep 17 00:00:00 2001 From: Laurent Peuch Date: Fri, 24 Dec 2021 01:16:52 +0100 Subject: [PATCH 220/619] [mod] stop using old style class --- src/yunohost/backup.py | 4 ++-- src/yunohost/log.py | 2 +- src/yunohost/tools.py | 2 +- src/yunohost/utils/config.py | 2 +- src/yunohost/utils/password.py | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/yunohost/backup.py b/src/yunohost/backup.py index 03721be0c..458d7655f 100644 --- a/src/yunohost/backup.py +++ b/src/yunohost/backup.py @@ -80,7 +80,7 @@ MB_ALLOWED_TO_ORGANIZE = 10 logger = getActionLogger("yunohost.backup") -class BackupRestoreTargetsManager(object): +class BackupRestoreTargetsManager: """ BackupRestoreTargetsManager manage the targets @@ -1570,7 +1570,7 @@ class RestoreManager: # # Backup methods # # -class BackupMethod(object): +class BackupMethod: """ BackupMethod is an abstract class that represents a way to backup and diff --git a/src/yunohost/log.py b/src/yunohost/log.py index cb11c7112..d28a35e18 100644 --- a/src/yunohost/log.py +++ b/src/yunohost/log.py @@ -469,7 +469,7 @@ class RedactingFormatter(Formatter): ) -class OperationLogger(object): +class OperationLogger: """ Instances of this class represents unit operation done on the ynh instance. diff --git a/src/yunohost/tools.py b/src/yunohost/tools.py index 87c962499..679b4d16e 100644 --- a/src/yunohost/tools.py +++ b/src/yunohost/tools.py @@ -1107,7 +1107,7 @@ def _tools_migrations_run_before_app_restore(backup_version, app_id): raise -class Migration(object): +class Migration: # Those are to be implemented by daughter classes diff --git a/src/yunohost/utils/config.py b/src/yunohost/utils/config.py index 5d1d1f9d2..e3b09f870 100644 --- a/src/yunohost/utils/config.py +++ b/src/yunohost/utils/config.py @@ -678,7 +678,7 @@ class ConfigPanel: yield (panel, section, option) -class Question(object): +class Question: hide_user_input_in_prompt = False pattern: Optional[Dict] = None diff --git a/src/yunohost/utils/password.py b/src/yunohost/utils/password.py index 188850183..9fff5ece7 100644 --- a/src/yunohost/utils/password.py +++ b/src/yunohost/utils/password.py @@ -51,7 +51,7 @@ def assert_password_is_strong_enough(profile, password): PasswordValidator(profile).validate(password) -class PasswordValidator(object): +class PasswordValidator: def __init__(self, profile): """ Initialize a password validator. From a615528c7f9f60ee7b4d2838242389455ace0b9b Mon Sep 17 00:00:00 2001 From: Kay0u Date: Sat, 25 Dec 2021 17:32:50 +0100 Subject: [PATCH 221/619] remove double quote around a variable --- data/hooks/diagnosis/12-dnsrecords.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/hooks/diagnosis/12-dnsrecords.py b/data/hooks/diagnosis/12-dnsrecords.py index 7e681484d..cedd3891e 100644 --- a/data/hooks/diagnosis/12-dnsrecords.py +++ b/data/hooks/diagnosis/12-dnsrecords.py @@ -136,7 +136,7 @@ class DNSRecordsDiagnoser(Diagnoser): # If status is okay and there's actually no expected records # (e.g. XMPP disabled) # then let's not yield any diagnosis line - if not records and "status" == "SUCCESS": + if not records and status == "SUCCESS": continue output = dict( From c4b83459b81c0bfc67882155e967ab9c645436e3 Mon Sep 17 00:00:00 2001 From: Kay0u Date: Sat, 25 Dec 2021 18:20:12 +0100 Subject: [PATCH 222/619] add lgtm/code quality badge --- .lgtm.yml | 4 ++++ README.md | 1 + 2 files changed, 5 insertions(+) create mode 100644 .lgtm.yml diff --git a/.lgtm.yml b/.lgtm.yml new file mode 100644 index 000000000..8fd57e49e --- /dev/null +++ b/.lgtm.yml @@ -0,0 +1,4 @@ +extraction: + python: + python_setup: + version: "3" \ No newline at end of file diff --git a/README.md b/README.md index df3a4bb9f..969651eee 100644 --- a/README.md +++ b/README.md @@ -9,6 +9,7 @@ ![Version](https://img.shields.io/github/v/tag/yunohost/yunohost?label=version&sort=semver) [![Build status](https://shields.io/gitlab/pipeline/yunohost/yunohost/dev)](https://gitlab.com/yunohost/yunohost/-/pipelines) ![Test coverage](https://img.shields.io/gitlab/coverage/yunohost/yunohost/dev) +[![Language grade: Python](https://img.shields.io/lgtm/grade/python/g/YunoHost/yunohost.svg?logo=lgtm&logoWidth=18)](https://lgtm.com/projects/g/YunoHost/yunohost/context:python) [![GitHub license](https://img.shields.io/github/license/YunoHost/yunohost)](https://github.com/YunoHost/yunohost/blob/dev/LICENSE) [![Mastodon Follow](https://img.shields.io/mastodon/follow/28084)](https://mastodon.social/@yunohost) From 7112deb16738dd11f5b9fa134dde5dbc178fc18e Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Mon, 27 Dec 2021 14:59:08 +0100 Subject: [PATCH 223/619] f-string all the things! --- data/hooks/diagnosis/00-basesystem.py | 8 ++- data/hooks/diagnosis/10-ip.py | 11 ++-- data/hooks/diagnosis/50-systemresources.py | 8 +-- src/yunohost/app.py | 17 +++--- src/yunohost/app_catalog.py | 2 +- src/yunohost/backup.py | 10 ++-- src/yunohost/certificate.py | 60 ++++++---------------- src/yunohost/dyndns.py | 10 ++-- src/yunohost/hook.py | 4 +- src/yunohost/permission.py | 3 +- src/yunohost/regenconf.py | 9 ++-- src/yunohost/service.py | 12 ++--- src/yunohost/settings.py | 2 +- src/yunohost/user.py | 8 +-- src/yunohost/utils/network.py | 4 +- 15 files changed, 66 insertions(+), 102 deletions(-) diff --git a/data/hooks/diagnosis/00-basesystem.py b/data/hooks/diagnosis/00-basesystem.py index 8b7b888e3..99241c55f 100644 --- a/data/hooks/diagnosis/00-basesystem.py +++ b/data/hooks/diagnosis/00-basesystem.py @@ -42,10 +42,8 @@ class BaseSystemDiagnoser(Diagnoser): elif os.path.exists("/sys/devices/virtual/dmi/id/sys_vendor"): model = read_file("/sys/devices/virtual/dmi/id/sys_vendor").strip() if os.path.exists("/sys/devices/virtual/dmi/id/product_name"): - model = "{} {}".format( - model, - read_file("/sys/devices/virtual/dmi/id/product_name").strip(), - ) + product_name = read_file("/sys/devices/virtual/dmi/id/product_name").strip() + model = f"{model} {product_name}" hardware["data"]["model"] = model hardware["details"] = ["diagnosis_basesystem_hardware_model"] @@ -116,7 +114,7 @@ class BaseSystemDiagnoser(Diagnoser): bad_sury_packages = list(self.bad_sury_packages()) if bad_sury_packages: cmd_to_fix = "apt install --allow-downgrades " + " ".join( - ["{}={}".format(package, version) for package, version in bad_sury_packages] + [f"{package}={version}" for package, version in bad_sury_packages] ) yield dict( meta={"test": "packages_from_sury"}, diff --git a/data/hooks/diagnosis/10-ip.py b/data/hooks/diagnosis/10-ip.py index 486e37e3e..1c6c5a4b3 100644 --- a/data/hooks/diagnosis/10-ip.py +++ b/data/hooks/diagnosis/10-ip.py @@ -167,10 +167,7 @@ class IPDiagnoser(Diagnoser): assert ( resolvers != [] - ), "Uhoh, need at least one IPv{} DNS resolver in {} ...".format( - protocol, - resolver_file, - ) + ), f"Uhoh, need at least one IPv{protocol} DNS resolver in {resolver_file} ..." # So let's try to ping the first 4~5 resolvers (shuffled) # If we succesfully ping any of them, we conclude that we are indeed connected @@ -220,9 +217,9 @@ class IPDiagnoser(Diagnoser): try: return download_text(url, timeout=30).strip() except Exception as e: - self.logger_debug( - "Could not get public IPv{} : {}".format(str(protocol), str(e)) - ) + protocol = str(protocol) + e = str(e) + self.logger_debug(f"Could not get public IPv{protocol} : {e}") return None diff --git a/data/hooks/diagnosis/50-systemresources.py b/data/hooks/diagnosis/50-systemresources.py index 4deb607f4..bdea0ea16 100644 --- a/data/hooks/diagnosis/50-systemresources.py +++ b/data/hooks/diagnosis/50-systemresources.py @@ -156,7 +156,7 @@ class SystemResourcesDiagnoser(Diagnoser): kills_count = self.recent_kills_by_oom_reaper() if kills_count: kills_summary = "\n".join( - ["{} (x{})".format(proc, count) for proc, count in kills_count] + [f"{proc} (x{count})" for proc, count in kills_count] ) yield dict( @@ -202,9 +202,11 @@ def human_size(bytes_): # Adapted from https://stackoverflow.com/a/1094933 for unit in ["", "ki", "Mi", "Gi", "Ti", "Pi", "Ei", "Zi"]: if abs(bytes_) < 1024.0: - return "{} {}B".format(round_(bytes_), unit) + bytes_ = round_(bytes_) + return f"{bytes_} {unit}B" bytes_ /= 1024.0 - return "{} {}B".format(round_(bytes_), "Yi") + bytes_ = round_(bytes_) + return f"{bytes_} YiB" def round_(n): diff --git a/src/yunohost/app.py b/src/yunohost/app.py index f47efd9d7..d5e57d6cf 100644 --- a/src/yunohost/app.py +++ b/src/yunohost/app.py @@ -122,7 +122,7 @@ def app_list(full=False, installed=False, filter=None): try: app_info_dict = app_info(app_id, full=full) except Exception as e: - logger.error("Failed to read info for {} : {}".format(app_id, e)) + logger.error(f"Failed to read info for {app_id} : {e}") continue app_info_dict["id"] = app_id out.append(app_info_dict) @@ -1219,7 +1219,8 @@ def app_setting(app, key, value=None, delete=False): ) permissions = user_permission_list(full=True, apps=[app])["permissions"] - permission_name = "{}.legacy_{}_uris".format(app, key.split("_")[0]) + key_ = key.split("_")[0] + permission_name = f"{app}.legacy_{key_}_uris" permission = permissions.get(permission_name) # GET @@ -1562,11 +1563,7 @@ def app_action_run(operation_logger, app, action, args=None): shutil.rmtree(tmp_workdir_for_app) if retcode not in action_declaration.get("accepted_return_codes", [0]): - msg = "Error while executing action '{}' of app '{}': return code {}".format( - action, - app, - retcode, - ) + msg = f"Error while executing action '{action}' of app '{app}': return code {retcode}" operation_logger.error(msg) raise YunohostError(msg, raw_msg=True) @@ -1989,7 +1986,8 @@ def _set_default_ask_questions(arguments): for question in questions_with_default ): # The key is for example "app_manifest_install_ask_domain" - key = "app_manifest_{}_ask_{}".format(script_name, arg["name"]) + arg_name = arg["name"] + key = f"app_manifest_{script_name}_ask_{arg_name}" arg["ask"] = m18n.n(key) # Also it in fact doesn't make sense for any of those questions to have an example value nor a default value... @@ -2397,7 +2395,8 @@ def _make_environment_for_app_script( env_dict["YNH_APP_BASEDIR"] = workdir for arg_name, arg_value in args.items(): - env_dict["YNH_{}{}".format(args_prefix, arg_name.upper())] = str(arg_value) + arg_name_upper = arg_name.upper() + env_dict[f"YNH_{args_prefix}{arg_name_upper}"] = str(arg_value) return env_dict diff --git a/src/yunohost/app_catalog.py b/src/yunohost/app_catalog.py index 96a006704..0f0e1ae46 100644 --- a/src/yunohost/app_catalog.py +++ b/src/yunohost/app_catalog.py @@ -217,7 +217,7 @@ def _load_apps_catalog(): ) except Exception as e: raise YunohostError( - "Unable to read cache for apps_catalog {} : {}".format(cache_file, e), + f"Unable to read cache for apps_catalog {cache_file} : {e}", raw_msg=True, ) diff --git a/src/yunohost/backup.py b/src/yunohost/backup.py index 458d7655f..ebfb23ab0 100644 --- a/src/yunohost/backup.py +++ b/src/yunohost/backup.py @@ -2420,7 +2420,7 @@ def backup_download(name): ) return - archive_file = "{}/{}.tar".format(ARCHIVES_PATH, name) + archive_file = f"{ARCHIVES_PATH}/{name}.tar" # Check file exist (even if it's a broken symlink) if not os.path.lexists(archive_file): @@ -2462,7 +2462,7 @@ def backup_info(name, with_details=False, human_readable=False): elif name.endswith(".tar"): name = name[: -len(".tar")] - archive_file = "{}/{}.tar".format(ARCHIVES_PATH, name) + archive_file = f"{ARCHIVES_PATH}/{name}.tar" # Check file exist (even if it's a broken symlink) if not os.path.lexists(archive_file): @@ -2480,7 +2480,7 @@ def backup_info(name, with_details=False, human_readable=False): "backup_archive_broken_link", path=archive_file ) - info_file = "{}/{}.info.json".format(ARCHIVES_PATH, name) + info_file = f"{ARCHIVES_PATH}/{name}.info.json" if not os.path.exists(info_file): tar = tarfile.open( @@ -2591,10 +2591,10 @@ def backup_delete(name): hook_callback("pre_backup_delete", args=[name]) - archive_file = "{}/{}.tar".format(ARCHIVES_PATH, name) + archive_file = f"{ARCHIVES_PATH}/{name}.tar" if not os.path.exists(archive_file) and os.path.exists(archive_file + ".gz"): archive_file += ".gz" - info_file = "{}/{}.info.json".format(ARCHIVES_PATH, name) + info_file = f"{ARCHIVES_PATH}/{name}.info.json" files_to_delete = [archive_file, info_file] diff --git a/src/yunohost/certificate.py b/src/yunohost/certificate.py index e4dc7d350..79e3ae092 100644 --- a/src/yunohost/certificate.py +++ b/src/yunohost/certificate.py @@ -143,11 +143,7 @@ def _certificate_install_selfsigned(domain_list, force=False): # Paths of files and folder we'll need date_tag = datetime.utcnow().strftime("%Y%m%d.%H%M%S") - new_cert_folder = "{}/{}-history/{}-selfsigned".format( - CERT_FOLDER, - domain, - date_tag, - ) + new_cert_folder = f"{CERT_FOLDER}/{domain}-history/{date_tag}-selfsigned" conf_template = os.path.join(SSL_DIR, "openssl.cnf") @@ -300,10 +296,7 @@ def _certificate_install_letsencrypt( try: _fetch_and_enable_new_certificate(domain, staging, no_checks=no_checks) except Exception as e: - msg = "Certificate installation for {} failed !\nException: {}".format( - domain, - e, - ) + msg = f"Certificate installation for {domain} failed !\nException: {e}" logger.error(msg) operation_logger.error(msg) if no_checks: @@ -456,39 +449,25 @@ def _email_renewing_failed(domain, exception_message, stack=""): subject_ = "Certificate renewing attempt for %s failed!" % domain logs = _tail(50, "/var/log/yunohost/yunohost-cli.log") - text = """ -An attempt for renewing the certificate for domain {} failed with the following + message = f"""\ +From: {from_} +To: {to_} +Subject: {subject_} + + +An attempt for renewing the certificate for domain {domain} failed with the following error : -{} -{} +{exception_message} +{stack} Here's the tail of /var/log/yunohost/yunohost-cli.log, which might help to investigate : -{} +{logs} -- Certificate Manager - -""".format( - domain, - exception_message, - stack, - logs, - ) - - message = """\ -From: {} -To: {} -Subject: {} - -{} -""".format( - from_, - to_, - subject_, - text, - ) +""" import smtplib @@ -532,7 +511,7 @@ def _fetch_and_enable_new_certificate(domain, staging=False, no_checks=False): # Prepare certificate signing request logger.debug("Prepare key and certificate signing request (CSR) for %s...", domain) - domain_key_file = "{}/{}.pem".format(TMP_FOLDER, domain) + domain_key_file = f"{TMP_FOLDER}/{domain}.pem" _generate_key(domain_key_file) _set_permissions(domain_key_file, "root", "ssl-cert", 0o640) @@ -541,7 +520,7 @@ def _fetch_and_enable_new_certificate(domain, staging=False, no_checks=False): # Sign the certificate logger.debug("Now using ACME Tiny to sign the certificate...") - domain_csr_file = "{}/{}.csr".format(TMP_FOLDER, domain) + domain_csr_file = f"{TMP_FOLDER}/{domain}.csr" if staging: certification_authority = STAGING_CERTIFICATION_AUTHORITY @@ -580,12 +559,7 @@ def _fetch_and_enable_new_certificate(domain, staging=False, no_checks=False): else: folder_flag = "letsencrypt" - new_cert_folder = "{}/{}-history/{}-{}".format( - CERT_FOLDER, - domain, - date_tag, - folder_flag, - ) + new_cert_folder = f"{CERT_FOLDER}/{domain}-history/{date_tag}-{folder_flag}" os.makedirs(new_cert_folder) @@ -844,7 +818,7 @@ def _backup_current_cert(domain): cert_folder_domain = os.path.join(CERT_FOLDER, domain) date_tag = datetime.utcnow().strftime("%Y%m%d.%H%M%S") - backup_folder = "{}-backups/{}".format(cert_folder_domain, date_tag) + backup_folder = f"{cert_folder_domain}-backups/{date_tag}" shutil.copytree(cert_folder_domain, backup_folder) diff --git a/src/yunohost/dyndns.py b/src/yunohost/dyndns.py index 63bb3180f..8748c1c00 100644 --- a/src/yunohost/dyndns.py +++ b/src/yunohost/dyndns.py @@ -151,7 +151,7 @@ def dyndns_subscribe(operation_logger, domain=None, key=None): try: error = json.loads(r.text)["error"] except Exception: - error = 'Server error, code: {}. (Message: "{}")'.format(r.status_code, r.text) + error = f'Server error, code: {r.status_code}. (Message: "{r.text}")' raise YunohostError("dyndns_registration_failed", error=error) # Yunohost regen conf will add the dyndns cron job if a private key exists @@ -196,7 +196,7 @@ def dyndns_update( # If key is not given, pick the first file we find with the domain given elif key is None: - keys = glob.glob("/etc/yunohost/dyndns/K{}.+*.private".format(domain)) + keys = glob.glob(f"/etc/yunohost/dyndns/K{domain}.+*.private") if not keys: raise YunohostValidationError("dyndns_key_not_found") @@ -263,14 +263,14 @@ def dyndns_update( return None raise YunohostError( - "Failed to resolve {} for {}".format(rdtype, domain), raw_msg=True + f"Failed to resolve {rdtype} for {domain}", raw_msg=True ) old_ipv4 = resolve_domain(domain, "A") old_ipv6 = resolve_domain(domain, "AAAA") - logger.debug("Old IPv4/v6 are ({}, {})".format(old_ipv4, old_ipv6)) - logger.debug("Requested IPv4/v6 are ({}, {})".format(ipv4, ipv6)) + logger.debug(f"Old IPv4/v6 are ({old_ipv4}, {old_ipv6})") + logger.debug(f"Requested IPv4/v6 are ({ipv4}, {ipv6})") # no need to update if (not force and not dry_run) and (old_ipv4 == ipv4 and old_ipv6 == ipv6): diff --git a/src/yunohost/hook.py b/src/yunohost/hook.py index c5ff8b0cd..7b03b2e9b 100644 --- a/src/yunohost/hook.py +++ b/src/yunohost/hook.py @@ -197,7 +197,7 @@ def hook_list(action, list_by="name", show_info=False): or (f.startswith("__") and f.endswith("__")) ): continue - path = "{}{}/{}".format(folder, action, f) + path = f"{folder}{action}/{f}" priority, name = _extract_filename_parts(f) _append_hook(d, priority, name, path) @@ -407,7 +407,7 @@ def _hook_exec_bash(path, args, chdir, env, user, return_format, loggers): if not chdir: # use the script directory as current one chdir, cmd_script = os.path.split(path) - cmd_script = "./{}".format(cmd_script) + cmd_script = f"./{cmd_script}" else: cmd_script = path diff --git a/src/yunohost/permission.py b/src/yunohost/permission.py index 04c170a32..9a46cad27 100644 --- a/src/yunohost/permission.py +++ b/src/yunohost/permission.py @@ -139,7 +139,8 @@ def user_permission_list( continue main_perm_label = permissions[main_perm_name]["label"] infos["sublabel"] = infos["label"] - infos["label"] = "{} ({})".format(main_perm_label, infos["label"]) + label_ = infos["label"] + infos["label"] = f"{main_perm_label} ({label_})" if short: permissions = list(permissions.keys()) diff --git a/src/yunohost/regenconf.py b/src/yunohost/regenconf.py index 224fb8bc5..adec5508d 100644 --- a/src/yunohost/regenconf.py +++ b/src/yunohost/regenconf.py @@ -638,12 +638,9 @@ def _process_regen_conf(system_conf, new_conf=None, save=True): """ if save: - backup_path = os.path.join( - BACKUP_CONF_DIR, - "{}-{}".format( - system_conf.lstrip("/"), datetime.utcnow().strftime("%Y%m%d.%H%M%S") - ), - ) + system_conf_ = system_conf.lstrip("/") + now_ = datetime.utcnow().strftime("%Y%m%d.%H%M%S") + backup_path = os.path.join(BACKUP_CONF_DIR, f"{system_conf_}-{now_}") backup_dir = os.path.dirname(backup_path) if not os.path.isdir(backup_dir): diff --git a/src/yunohost/service.py b/src/yunohost/service.py index f47f67a3c..4f453dfe9 100644 --- a/src/yunohost/service.py +++ b/src/yunohost/service.py @@ -625,7 +625,7 @@ def _run_service_command(action, service): % (action, ", ".join(possible_actions)) ) - cmd = "systemctl {} {}".format(action, service) + cmd = f"systemctl {action} {service}" need_lock = services[service].get("need_lock", False) and action in [ "start", @@ -673,7 +673,7 @@ def _give_lock(action, service, p): else: systemctl_PID_name = "ControlPID" - cmd_get_son_PID = "systemctl show {} -p {}".format(service, systemctl_PID_name) + cmd_get_son_PID = f"systemctl show {service} -p {systemctl_PID_name}" son_PID = 0 # As long as we did not found the PID and that the command is still running while son_PID == 0 and p.poll() is None: @@ -686,9 +686,7 @@ def _give_lock(action, service, p): # If we found a PID if son_PID != 0: # Append the PID to the lock file - logger.debug( - "Giving a lock to PID {} for service {} !".format(str(son_PID), service) - ) + logger.debug(f"Giving a lock to PID {son_PID} for service {service} !") append_to_file(MOULINETTE_LOCK, "\n%s" % str(son_PID)) return son_PID @@ -865,9 +863,7 @@ def _get_journalctl_logs(service, number="all"): systemd_service = services.get(service, {}).get("actual_systemd_service", service) try: return check_output( - "journalctl --no-hostname --no-pager -u {} -n{}".format( - systemd_service, number - ) + f"journalctl --no-hostname --no-pager -u {systemd_service} -n{number}" ) except Exception: import traceback diff --git a/src/yunohost/settings.py b/src/yunohost/settings.py index 77d0d2705..eddb30764 100644 --- a/src/yunohost/settings.py +++ b/src/yunohost/settings.py @@ -224,7 +224,7 @@ def settings_set(key, value): try: trigger_post_change_hook(key, old_value, value) except Exception as e: - logger.error("Post-change hook for setting {} failed : {}".format(key, e)) + logger.error(f"Post-change hook for setting {key} failed : {e}") raise diff --git a/src/yunohost/user.py b/src/yunohost/user.py index 6a924add3..78fda8d09 100644 --- a/src/yunohost/user.py +++ b/src/yunohost/user.py @@ -166,7 +166,7 @@ def user_create( # On affiche les differents domaines possibles Moulinette.display(m18n.n("domains_available")) for domain in domain_list()["domains"]: - Moulinette.display("- {}".format(domain)) + Moulinette.display(f"- {domain}") maindomain = _get_maindomain() domain = Moulinette.prompt( @@ -215,7 +215,7 @@ def user_create( uid_guid_found = uid not in all_uid and uid not in all_gid # Adapt values for LDAP - fullname = "{} {}".format(firstname, lastname) + fullname = f"{firstname} {lastname}" attr_dict = { "objectClass": [ @@ -333,8 +333,8 @@ def user_delete(operation_logger, username, purge=False, from_import=False): subprocess.call(["nscd", "-i", "passwd"]) if purge: - subprocess.call(["rm", "-rf", "/home/{}".format(username)]) - subprocess.call(["rm", "-rf", "/var/mail/{}".format(username)]) + subprocess.call(["rm", "-rf", f"/home/{username}"]) + subprocess.call(["rm", "-rf", f"/var/mail/{username}"]) hook_callback("post_user_delete", args=[username, purge]) diff --git a/src/yunohost/utils/network.py b/src/yunohost/utils/network.py index fd70e4d4b..c4dc8723e 100644 --- a/src/yunohost/utils/network.py +++ b/src/yunohost/utils/network.py @@ -44,7 +44,7 @@ def get_public_ip(protocol=4): ): ip = read_file(cache_file).strip() ip = ip if ip else None # Empty file (empty string) means there's no IP - logger.debug("Reusing IPv{} from cache: {}".format(protocol, ip)) + logger.debug(f"Reusing IPv{protocol} from cache: {ip}") else: ip = get_public_ip_from_remote_server(protocol) logger.debug("IP fetched: %s" % ip) @@ -87,7 +87,7 @@ def get_public_ip_from_remote_server(protocol=4): try: return download_text(url, timeout=30).strip() except Exception as e: - logger.debug("Could not get public IPv{} : {}".format(str(protocol), str(e))) + logger.debug(f"Could not get public IPv{protocol} : {e}")) return None From 377ccd8acf73d2a01757f66fdbedb5a97a15cbee Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Mon, 27 Dec 2021 15:19:48 +0100 Subject: [PATCH 224/619] Typo /o\ --- src/yunohost/utils/network.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/yunohost/utils/network.py b/src/yunohost/utils/network.py index c4dc8723e..28dcb204c 100644 --- a/src/yunohost/utils/network.py +++ b/src/yunohost/utils/network.py @@ -87,7 +87,7 @@ def get_public_ip_from_remote_server(protocol=4): try: return download_text(url, timeout=30).strip() except Exception as e: - logger.debug(f"Could not get public IPv{protocol} : {e}")) + logger.debug(f"Could not get public IPv{protocol} : {e}") return None From a063b63d1c86a1f30dac670cea17f2f24e9c944e Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Mon, 27 Dec 2021 15:35:02 +0100 Subject: [PATCH 225/619] ssh config : Invert the password_authentication value check to be more resilient in case something goes wrong while fetching / parsing the value --- data/templates/ssh/sshd_config | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/data/templates/ssh/sshd_config b/data/templates/ssh/sshd_config index 22f0697d9..b6d4111ee 100644 --- a/data/templates/ssh/sshd_config +++ b/data/templates/ssh/sshd_config @@ -2,7 +2,7 @@ # by YunoHost Protocol 2 -# PLEASE: to change ssh port properly in YunoHost, use this command +# PLEASE: if you wish to change the ssh port properly in YunoHost, use this command: # yunohost settings set security.ssh.port -v Port {{ port }} @@ -55,12 +55,12 @@ PermitEmptyPasswords no ChallengeResponseAuthentication no UsePAM yes -# PLEASE: to force everybody to authenticate using ssh keys, run this command: +# PLEASE: if you wish to force everybody to authenticate using ssh keys, run this command: # yunohost settings set security.ssh.password_authentication -v no -{% if password_authentication == "True" %} -#PasswordAuthentication yes -{% else %} +{% if password_authentication == "False" %} PasswordAuthentication no +{% else %} +#PasswordAuthentication yes {% endif %} # Post-login stuff From dce411e0e62193094f6613dfdca081a7ca46a04c Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Mon, 27 Dec 2021 15:36:38 +0100 Subject: [PATCH 226/619] Improve setting description --- locales/en.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/locales/en.json b/locales/en.json index 66f42df58..bfd410740 100644 --- a/locales/en.json +++ b/locales/en.json @@ -382,7 +382,7 @@ "global_settings_setting_security_password_user_strength": "User password strength", "global_settings_setting_security_postfix_compatibility": "Compatibility vs. security tradeoff for the Postfix server. Affects the ciphers (and other security-related aspects)", "global_settings_setting_security_ssh_compatibility": "Compatibility vs. security tradeoff for the SSH server. Affects the ciphers (and other security-related aspects)", - "global_settings_setting_security_ssh_password_authentication": "Password authentication allowed", + "global_settings_setting_security_ssh_password_authentication": "Allow password authentication for SSH", "global_settings_setting_security_ssh_port": "SSH port", "global_settings_setting_security_webadmin_allowlist": "IP adresses allowed to access the webadmin. Comma-separated.", "global_settings_setting_security_webadmin_allowlist_enabled": "Allow only some IPs to access the webadmin.", From bd04779e402e63cce2ffb819aee96fb8a8436bc6 Mon Sep 17 00:00:00 2001 From: yunohost-bot Date: Mon, 27 Dec 2021 15:31:00 +0000 Subject: [PATCH 227/619] [CI] Reformat / remove stale translated strings --- locales/de.json | 4 ++-- locales/es.json | 2 +- locales/fr.json | 2 +- locales/gl.json | 2 +- locales/id.json | 2 +- locales/nl.json | 2 +- locales/ru.json | 8 ++++---- locales/uk.json | 2 +- 8 files changed, 12 insertions(+), 12 deletions(-) diff --git a/locales/de.json b/locales/de.json index 85d566266..537621f99 100644 --- a/locales/de.json +++ b/locales/de.json @@ -672,7 +672,7 @@ "domain_dns_registrar_managed_in_parent_domain": "Diese Domäne ist eine Unterdomäne von {parent_domain_link}. Die Konfiguration des DNS-Registrars sollte auf der Konfigurationsseite von {parent_domain} verwaltet werden.", "domain_dns_registrar_not_supported": "YunoHost konnte den Registrar, der diese Domäne verwaltet, nicht automatisch erkennen. Du solltest die DNS-Einträge, wie unter https://yunohost.org/dns beschrieben, manuell konfigurieren.", "domain_dns_registrar_supported": "YunoHost hat automatisch erkannt, dass diese Domäne von dem Registrar **{registrar}** verwaltet wird. Wenn Du möchtest, konfiguriert YunoHost diese DNS-Zone automatisch, wenn Du die entsprechenden API-Zugangsdaten zur Verfügung stellst. Auf dieser Seite erfährst Du, wie Du deine API-Anmeldeinformationen erhältst: https://yunohost.org/registar_api_{registrar}. (Du kannst deine DNS-Einträge auch, wie unter https://yunohost.org/dns beschrieben, manuell konfigurieren)", - "service_not_reloading_because_conf_broken": "Der Dienst '{Name}' wird nicht neu geladen/gestartet, da seine Konfiguration fehlerhaft ist: {Fehler}", + "service_not_reloading_because_conf_broken": "Der Dienst '{name}' wird nicht neu geladen/gestartet, da seine Konfiguration fehlerhaft ist: {errors}", "user_import_failed": "Der Import von Benutzer:innen ist komplett fehlgeschlagen", "domain_dns_push_failed_to_list": "Auflistung der aktuellen Einträge über die API des Registrars fehlgeschlagen: {error}", "domain_dns_pushing": "DNS-Einträge übertragen…", @@ -704,4 +704,4 @@ "log_domain_config_set": "Konfiguration für die Domäne '{}' aktualisieren", "log_domain_dns_push": "DNS-Einträge für die Domäne '{}' übertragen", "service_description_yunomdns": "Ermöglicht es dir, deinen Server über 'yunohost.local' in deinem lokalen Netzwerk zu erreichen" -} +} \ No newline at end of file diff --git a/locales/es.json b/locales/es.json index 4afa56996..22493ec11 100644 --- a/locales/es.json +++ b/locales/es.json @@ -616,4 +616,4 @@ "diagnosis_apps_broken": "Esta aplicación está etiquetada como defectuosa en el catálogo de aplicaciones YunoHost. Podría ser un problema temporal mientras las personas responsables corrigen el asunto. Mientras tanto, la actualización de esta aplicación está desactivada.", "diagnosis_apps_deprecated_practices": "La versión instalada de esta aplicación usa aún prácticas de empaquetado obsoletas. Deberías actualizarla.", "diagnosis_apps_outdated_ynh_requirement": "La versión instalada de esta aplicación solo necesita YunoHost >= 2.x, lo que indica que no está al día con la buena praxis de ayudas y empaquetado recomendadas. Deberías actualizarla." -} +} \ No newline at end of file diff --git a/locales/fr.json b/locales/fr.json index 2d70f2cab..cc7088c19 100644 --- a/locales/fr.json +++ b/locales/fr.json @@ -718,4 +718,4 @@ "migration_0021_patch_yunohost_conflicts": "Application du correctif pour contourner le problème de conflit...", "migration_0021_not_buster": "La distribution Debian actuelle n'est pas Buster !", "migration_description_0021_migrate_to_bullseye": "Mise à niveau du système vers Debian Bullseye et YunoHost 11.x" -} +} \ No newline at end of file diff --git a/locales/gl.json b/locales/gl.json index 308cba961..3c577b935 100644 --- a/locales/gl.json +++ b/locales/gl.json @@ -718,4 +718,4 @@ "migration_description_0021_migrate_to_bullseye": "Actualizar o sistema a Debian Bullseye e YunoHost 11.x", "migration_0021_system_not_fully_up_to_date": "O teu sistema non está completamente actualizado. Fai unha actualización normal antes de executar a migración a Bullseye.", "migration_0021_general_warning": "Ten en conta que a migración é unha operación delicada. O equipo de YunoHost fixo todo o que puido para revisalo e probalo, pero aínda así poderían acontecer fallos no sistema ou apps.\n\nAsí as cousas, é recomendable:\n - Facer unha copia de apoio dos datos e apps importantes. Máis info en https://yunohost.org/backup;\n - Ter paciencia unha vez inicias a migración: dependendo da túa conexión a internet e hardware, podería levarlle varias horas completar o proceso." -} +} \ No newline at end of file diff --git a/locales/id.json b/locales/id.json index 08e09fe8b..47aff8b2e 100644 --- a/locales/id.json +++ b/locales/id.json @@ -55,4 +55,4 @@ "backup_nothings_done": "Tak ada yang harus disimpan", "certmanager_cert_install_success": "Sertifikat Let's Encrypt sekarang sudah terpasang pada domain '{domain}'", "backup_mount_archive_for_restore": "Menyiapkan arsip untuk pemulihan..." -} +} \ No newline at end of file diff --git a/locales/nl.json b/locales/nl.json index 038d18283..1c3e2083d 100644 --- a/locales/nl.json +++ b/locales/nl.json @@ -130,4 +130,4 @@ "app_label_deprecated": "Dit commando is vervallen. Gebruik alsjeblieft het nieuwe commando 'yunohost user permission update' om het label van de app te beheren.", "app_change_url_no_script": "De app '{app_name}' ondersteunt nog geen URL-aanpassingen. Misschien wel na een upgrade.", "app_upgrade_some_app_failed": "Sommige apps konden niet worden bijgewerkt" -} +} \ No newline at end of file diff --git a/locales/ru.json b/locales/ru.json index 8fbc3f91b..9c857f7a6 100644 --- a/locales/ru.json +++ b/locales/ru.json @@ -147,7 +147,7 @@ "additional_urls_already_removed": "Этот URL '{url}' уже удален из дополнительных URL для разрешения '{permission}'", "app_action_cannot_be_ran_because_required_services_down": "Для выполнения этого действия должны быть запущены следующие службы: {services}. Попробуйте перезапустить их, чтобы продолжить (и, возможно, выяснить, почему они не работают).", "app_unsupported_remote_type": "Неподдерживаемый удаленный тип, используемый для приложения", - "backup_archive_system_part_not_available": "Системная часть '{часть}' недоступна в этой резервной копии", + "backup_archive_system_part_not_available": "Системная часть '{part}' недоступна в этой резервной копии", "backup_output_directory_not_empty": "Вы должны выбрать пустой каталог для сохранения", "backup_archive_writing_error": "Не удалось добавить файлы '{source}' (названные в архиве '{dest}') для резервного копирования в архив '{archive}'", "backup_cant_mount_uncompress_archive": "Не удалось смонтировать несжатый архив как защищенный от записи", @@ -157,7 +157,7 @@ "backup_with_no_backup_script_for_app": "Приложение '{app}' не имеет сценария резервного копирования. Оно будет проигнорировано.", "certmanager_attempt_to_renew_nonLE_cert": "Сертификат для домена '{domain}' не выпущен Let's Encrypt. Невозможно продлить его автоматически!", "certmanager_attempt_to_renew_valid_cert": "Срок действия сертификата для домена '{domain}' НЕ истекает! (Вы можете использовать --force, если знаете, что делаете)", - "certmanager_cannot_read_cert": "При попытке открыть текущий сертификат для домена {домен} произошло что-то неправильное (файл: {file}), причина: {reason}", + "certmanager_cannot_read_cert": "При попытке открыть текущий сертификат для домена {domain} произошло что-то неправильное (файл: {file}), причина: {reason}", "certmanager_cert_install_success": "Сертификат Let's Encrypt для домена '{domain}' установлен", "certmanager_domain_cert_not_selfsigned": "Сертификат для домена {domain} не самоподписанный. Вы уверены, что хотите заменить его? (Для этого используйте '--force'.)", "certmanager_certificate_fetching_or_enabling_failed": "Попытка использовать новый сертификат для {domain} не сработала...", @@ -168,7 +168,7 @@ "yunohost_not_installed": "YunoHost установлен неправильно. Пожалуйста, запустите 'yunohost tools postinstall'", "backup_cleaning_failed": "Не удалось очистить временную папку резервного копирования", "certmanager_attempt_to_replace_valid_cert": "Вы пытаетесь перезаписать хороший и действительный сертификат для домена {domain}! (Используйте --force для обхода)", - "backup_create_size_estimation": "Архив будет содержать около {размер} данных.", + "backup_create_size_estimation": "Архив будет содержать около {size} данных.", "diagnosis_description_regenconf": "Конфигурации системы", "diagnosis_description_services": "Проверка статусов сервисов", "config_validate_color": "Должен быть правильный hex цвета RGB", @@ -189,4 +189,4 @@ "backup_with_no_restore_script_for_app": "{app} не имеет сценария восстановления, вы не сможете автоматически восстановить это приложение из резервной копии.", "diagnosis_description_ports": "Открытые порты", "diagnosis_basesystem_hardware_model": "Модель сервера {model}" -} +} \ No newline at end of file diff --git a/locales/uk.json b/locales/uk.json index 25fa1d551..e997d6bf4 100644 --- a/locales/uk.json +++ b/locales/uk.json @@ -718,4 +718,4 @@ "migration_0021_system_not_fully_up_to_date": "Ваша система не повністю оновлена. Будь ласка, виконайте регулярне оновлення перед запуском міграції на Bullseye.", "migration_0021_general_warning": "Будь ласка, зверніть увагу, що ця міграція є делікатною операцією. Команда YunoHost зробила все можливе, щоб перевірити і протестувати її, але міграція все ще може порушити частину системи або її застосунків.\n\nТому рекомендовано:\n - Виконати резервне копіювання всіх важливих даних або застосунків. Подробиці на сайті https://yunohost.org/backup; \n - Наберіться терпіння після запуску міграції: В залежності від вашого з'єднання з Інтернетом і апаратного забезпечення, оновлення може зайняти до декількох годин.", "migration_description_0021_migrate_to_bullseye": "Оновлення системи до Debian Bullseye і YunoHost 11.x" -} +} \ No newline at end of file From 76abbf03d75c20705f85157b86ea18b45dda10f7 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Wed, 29 Dec 2021 00:35:42 +0100 Subject: [PATCH 228/619] diagnosis: bump treshold for suspiciously high number of auth failure because too many people getting report about it idk --- data/hooks/diagnosis/00-basesystem.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/hooks/diagnosis/00-basesystem.py b/data/hooks/diagnosis/00-basesystem.py index b472a2d32..d003c2670 100644 --- a/data/hooks/diagnosis/00-basesystem.py +++ b/data/hooks/diagnosis/00-basesystem.py @@ -133,7 +133,7 @@ class BaseSystemDiagnoser(Diagnoser): summary="diagnosis_backports_in_sources_list", ) - if self.number_of_recent_auth_failure() > 500: + if self.number_of_recent_auth_failure() > 750: yield dict( meta={"test": "high_number_auth_failure"}, status="WARNING", From 76b9838bfd2c1e2871d74fa1bdcb307c79928c6f Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Wed, 29 Dec 2021 01:06:45 +0100 Subject: [PATCH 229/619] Tmp removal of bullseye migration for small release --- .../0021_migrate_to_bullseye.py | 320 ------------------ 1 file changed, 320 deletions(-) delete mode 100644 src/yunohost/data_migrations/0021_migrate_to_bullseye.py diff --git a/src/yunohost/data_migrations/0021_migrate_to_bullseye.py b/src/yunohost/data_migrations/0021_migrate_to_bullseye.py deleted file mode 100644 index f97ab16da..000000000 --- a/src/yunohost/data_migrations/0021_migrate_to_bullseye.py +++ /dev/null @@ -1,320 +0,0 @@ -import glob -import os - -from moulinette import m18n -from yunohost.utils.error import YunohostError -from moulinette.utils.log import getActionLogger -from moulinette.utils.process import check_output, call_async_output -from moulinette.utils.filesystem import read_file, rm - -from yunohost.tools import Migration, tools_update, tools_upgrade -from yunohost.app import unstable_apps -from yunohost.regenconf import manually_modified_files, _force_clear_hashes -from yunohost.utils.filesystem import free_space_in_directory -from yunohost.utils.packages import ( - get_ynh_package_version, - _list_upgradable_apt_packages, -) -from yunohost.service import _get_services, _save_services - -logger = getActionLogger("yunohost.migration") - -N_CURRENT_DEBIAN = 10 -N_CURRENT_YUNOHOST = 4 - -N_NEXT_DEBAN = 11 -N_NEXT_YUNOHOST = 11 - - -class MyMigration(Migration): - - "Upgrade the system to Debian Bullseye and Yunohost 11.x" - - mode = "manual" - - def run(self): - - self.check_assertions() - - logger.info(m18n.n("migration_0021_start")) - - # - # Add new apt .deb signing key - # - - new_apt_key = "https://forge.yunohost.org/yunohost_bullseye.asc" - check_output(f"wget -O- {new_apt_key} -q | apt-key add -qq -") - - # - # Patch sources.list - # - logger.info(m18n.n("migration_0021_patching_sources_list")) - self.patch_apt_sources_list() - tools_update(target="system") - - # Tell libc6 it's okay to restart system stuff during the upgrade - os.system( - "echo 'libc6 libraries/restart-without-asking boolean true' | debconf-set-selections" - ) - - # Don't send an email to root about the postgresql migration. It should be handled automatically after. - os.system( - "echo 'postgresql-common postgresql-common/obsolete-major seen true' | debconf-set-selections" - ) - - # - # Patch yunohost conflicts - # - logger.info(m18n.n("migration_0021_patch_yunohost_conflicts")) - - self.patch_yunohost_conflicts() - - # - # Specific tweaking to get rid of custom my.cnf and use debian's default one - # (my.cnf is actually a symlink to mariadb.cnf) - # - - _force_clear_hashes(["/etc/mysql/my.cnf"]) - rm("/etc/mysql/mariadb.cnf", force=True) - rm("/etc/mysql/my.cnf", force=True) - self.apt_install( - "mariadb-common --reinstall -o Dpkg::Options::='--force-confmiss'" - ) - - # - # /usr/share/yunohost/yunohost-config/ssl/yunoCA -> /usr/share/yunohost/ssl - # - if os.path.exists("/usr/share/yunohost/yunohost-config/ssl/yunoCA"): - os.system( - "mv /usr/share/yunohost/yunohost-config/ssl/yunoCA /usr/share/yunohost/ssl" - ) - rm("/usr/share/yunohost/yunohost-config", recursive=True, force=True) - - # - # /home/yunohost.conf -> /var/cache/yunohost/regenconf - # - if os.path.exists("/home/yunohost.conf"): - os.system("mv /home/yunohost.conf /var/cache/yunohost/regenconf") - rm("/home/yunohost.conf", recursive=True, force=True) - - # - # Main upgrade - # - logger.info(m18n.n("migration_0021_main_upgrade")) - - apps_packages = self.get_apps_equivs_packages() - self.hold(apps_packages) - tools_upgrade(target="system", allow_yunohost_upgrade=False) - - if self.debian_major_version() == N_CURRENT_DEBIAN: - raise YunohostError("migration_0021_still_on_buster_after_main_upgrade") - - # Clean the mess - logger.info(m18n.n("migration_0021_cleaning_up")) - os.system("apt autoremove --assume-yes") - os.system("apt clean --assume-yes") - - # Force add sury if it's not there yet - # This is to solve some weird issue with php-common breaking php7.3-common, - # hence breaking many php7.3-deps - # hence triggering some dependency conflict (or foobar-ynh-deps uninstall) - # Adding it there shouldnt be a big deal - Yunohost 11.x does add it - # through its regen conf anyway. - if not os.path.exists("/etc/apt/sources.list.d/extra_php_version.list"): - open("/etc/apt/sources.list.d/extra_php_version.list", "w").write( - "deb https://packages.sury.org/php/ bullseye main" - ) - os.system( - 'wget --timeout 900 --quiet "https://packages.sury.org/php/apt.gpg" --output-document=- | gpg --dearmor >"/etc/apt/trusted.gpg.d/extra_php_version.gpg"' - ) - - os.system("apt update") - - # Force explicit install of php7.4-fpm to make sure it's ll be there - # during 0022_php73_to_php74_pools migration - self.apt_install("php7.4-fpm -o Dpkg::Options::='--force-confmiss'") - - # Remove legacy postgresql service record added by helpers, - # will now be dynamically handled by the core in bullseye - services = _get_services() - if "postgresql" in services: - del services["postgresql"] - _save_services(services) - - # - # Yunohost upgrade - # - logger.info(m18n.n("migration_0021_yunohost_upgrade")) - self.unhold(apps_packages) - tools_upgrade(target="system") - - def debian_major_version(self): - # The python module "platform" and lsb_release are not reliable because - # on some setup, they may still return Release=9 even after upgrading to - # buster ... (Apparently this is related to OVH overriding some stuff - # with /etc/lsb-release for instance -_-) - # Instead, we rely on /etc/os-release which should be the raw info from - # the distribution... - return int( - check_output( - "grep VERSION_ID /etc/os-release | head -n 1 | tr '\"' ' ' | cut -d ' ' -f2" - ) - ) - - def yunohost_major_version(self): - return int(get_ynh_package_version("yunohost")["version"].split(".")[0]) - - def check_assertions(self): - - # Be on buster (10.x) and yunohost 4.x - # NB : we do both check to cover situations where the upgrade crashed - # in the middle and debian version could be > 9.x but yunohost package - # would still be in 3.x... - if ( - not self.debian_major_version() == N_CURRENT_DEBIAN - and not self.yunohost_major_version() == N_CURRENT_YUNOHOST - ): - raise YunohostError("migration_0021_not_buster") - - # Have > 1 Go free space on /var/ ? - if free_space_in_directory("/var/") / (1024 ** 3) < 1.0: - raise YunohostError("migration_0021_not_enough_free_space") - - # Check system is up to date - # (but we don't if 'bullseye' is already in the sources.list ... - # which means maybe a previous upgrade crashed and we're re-running it) - if " bullseye " not in read_file("/etc/apt/sources.list"): - tools_update(target="system") - upgradable_system_packages = list(_list_upgradable_apt_packages()) - if upgradable_system_packages: - raise YunohostError("migration_0021_system_not_fully_up_to_date") - - @property - def disclaimer(self): - - # Avoid having a super long disclaimer + uncessary check if we ain't - # on buster / yunohost 4.x anymore - # NB : we do both check to cover situations where the upgrade crashed - # in the middle and debian version could be >= 10.x but yunohost package - # would still be in 4.x... - if ( - not self.debian_major_version() == N_CURRENT_DEBIAN - and not self.yunohost_major_version() == N_CURRENT_YUNOHOST - ): - return None - - # Get list of problematic apps ? I.e. not official or community+working - problematic_apps = unstable_apps() - problematic_apps = "".join(["\n - " + app for app in problematic_apps]) - - # Manually modified files ? (c.f. yunohost service regen-conf) - modified_files = manually_modified_files() - modified_files = "".join(["\n - " + f for f in modified_files]) - - message = m18n.n("migration_0021_general_warning") - - # FIXME: re-enable this message with updated topic link once we release the migration as stable - # message = ( - # "N.B.: This migration has been tested by the community over the last few months but has only been declared stable recently. If your server hosts critical services and if you are not too confident with debugging possible issues, we recommend you to wait a little bit more while we gather more feedback and polish things up. If on the other hand you are relatively confident with debugging small issues that may arise, you are encouraged to run this migration ;)! You can read about remaining known issues and feedback from the community here: https://forum.yunohost.org/t/12195\n\n" - # + message - # ) - - if problematic_apps: - message += "\n\n" + m18n.n( - "migration_0021_problematic_apps_warning", - problematic_apps=problematic_apps, - ) - - if modified_files: - message += "\n\n" + m18n.n( - "migration_0021_modified_files", manually_modified_files=modified_files - ) - - return message - - def patch_apt_sources_list(self): - - sources_list = glob.glob("/etc/apt/sources.list.d/*.list") - sources_list.append("/etc/apt/sources.list") - - # This : - # - replace single 'buster' occurence by 'bulleye' - # - comments lines containing "backports" - # - replace 'buster/updates' by 'bullseye/updates' (or same with -) - # Special note about the security suite: - # https://www.debian.org/releases/bullseye/amd64/release-notes/ch-information.en.html#security-archive - for f in sources_list: - command = ( - f"sed -i {f} " - "-e 's@ buster @ bullseye @g' " - "-e '/backports/ s@^#*@#@' " - "-e 's@ buster/updates @ bullseye-security @g' " - "-e 's@ buster-@ bullseye-@g' " - ) - os.system(command) - - def get_apps_equivs_packages(self): - - command = ( - "dpkg --get-selections" - " | grep -v deinstall" - " | awk '{print $1}'" - " | { grep 'ynh-deps$' || true; }" - ) - - output = check_output(command) - - return output.split("\n") if output else [] - - def hold(self, packages): - for package in packages: - os.system("apt-mark hold {}".format(package)) - - def unhold(self, packages): - for package in packages: - os.system("apt-mark unhold {}".format(package)) - - def apt_install(self, cmd): - def is_relevant(line): - return "Reading database ..." not in line.rstrip() - - callbacks = ( - lambda l: logger.info("+ " + l.rstrip() + "\r") - if is_relevant(l) - else logger.debug(l.rstrip() + "\r"), - lambda l: logger.warning(l.rstrip()), - ) - - cmd = ( - "LC_ALL=C DEBIAN_FRONTEND=noninteractive APT_LISTCHANGES_FRONTEND=none apt install --quiet -o=Dpkg::Use-Pty=0 --fix-broken --assume-yes " - + cmd - ) - - logger.debug("Running: %s" % cmd) - - call_async_output(cmd, callbacks, shell=True) - - def patch_yunohost_conflicts(self): - # - # This is a super dirty hack to remove the conflicts from yunohost's debian/control file - # Those conflicts are there to prevent mistakenly upgrading critical packages - # such as dovecot, postfix, nginx, openssl, etc... usually related to mistakenly - # using backports etc. - # - # The hack consists in savagely removing the conflicts directly in /var/lib/dpkg/status - # - - # We only patch the conflict if we're on yunohost 4.x - if self.yunohost_major_version() != N_CURRENT_YUNOHOST: - return - - conflicts = check_output("dpkg-query -s yunohost | grep '^Conflicts:'").strip() - if conflicts: - # We want to keep conflicting with apache/bind9 tho - new_conflicts = "Conflicts: apache2, bind9" - - command = ( - f"sed -i /var/lib/dpkg/status -e 's@{conflicts}@{new_conflicts}@g'" - ) - logger.debug(f"Running: {command}") - os.system(command) From 509ba1e8a28e0be598aa0617eda06669b7b0f1d8 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Wed, 29 Dec 2021 01:07:09 +0100 Subject: [PATCH 230/619] Update changelog for 4.3.5 --- debian/changelog | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/debian/changelog b/debian/changelog index 001ab678a..49227f946 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,19 @@ +yunohost (4.3.5) stable; urgency=low + + - [fix] backup: bug in backup_delete when compress_tar_archives is True ([#1381](https://github.com/YunoHost/yunohost/pull/1381)) + - [fix] helpers logrorate: remove permission tweak .. code was not working as expected. To be re-addressed some day ... (0fc209ac) + - [fix] i18n: consistency for deprecation for --apps in 'yunohost tools update/upgrade' ([#1392](https://github.com/YunoHost/yunohost/pull/1392)) + - [fix] apps: typo when deleting superfluous question keys ([#1393](https://github.com/YunoHost/yunohost/pull/1393)) + - [fix] diagnosis: typo in dns record diagnoser (a615528c) + - [fix] diagnosis: tweak treshold for suspiciously high number of auth failure because too many people getting report about it idk (76abbf03) + - [enh] quality: apply pyupgrade ([#1395](https://github.com/YunoHost/yunohost/pull/1395)) + - [enh] quality: add lgtm/code quality badge ([#1396](https://github.com/YunoHost/yunohost/pull/1396)) + - [i18n] Translations updated for Dutch, French, Galician, German, Indonesian, Russian, Spanish, Ukrainian + + Thanks to all contributors <3 ! (Boudewijn, Bram, Christian Wehrli, Colin Wawrik, Éric Gaspar, Ilya, José M, Juan Alberto González, Kay0u, liimee, Moutonjr Geoff, tituspijean, Tymofii Lytvynenko, Valentin von Guttenberg) + + -- Alexandre Aubin Wed, 29 Dec 2021 01:01:33 +0100 + yunohost (4.3.4.2) stable; urgency=low - [fix] yunomdns: Ignore ipv4 link-local addresses (6854f23c) From 2f38639a2ed61c7b1195fc3f9cf7a1dfee84c60c Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Wed, 29 Dec 2021 01:07:34 +0100 Subject: [PATCH 231/619] Revert "Tmp removal of bullseye migration for small release" This reverts commit 76b9838bfd2c1e2871d74fa1bdcb307c79928c6f. --- .../0021_migrate_to_bullseye.py | 320 ++++++++++++++++++ 1 file changed, 320 insertions(+) create mode 100644 src/yunohost/data_migrations/0021_migrate_to_bullseye.py diff --git a/src/yunohost/data_migrations/0021_migrate_to_bullseye.py b/src/yunohost/data_migrations/0021_migrate_to_bullseye.py new file mode 100644 index 000000000..f97ab16da --- /dev/null +++ b/src/yunohost/data_migrations/0021_migrate_to_bullseye.py @@ -0,0 +1,320 @@ +import glob +import os + +from moulinette import m18n +from yunohost.utils.error import YunohostError +from moulinette.utils.log import getActionLogger +from moulinette.utils.process import check_output, call_async_output +from moulinette.utils.filesystem import read_file, rm + +from yunohost.tools import Migration, tools_update, tools_upgrade +from yunohost.app import unstable_apps +from yunohost.regenconf import manually_modified_files, _force_clear_hashes +from yunohost.utils.filesystem import free_space_in_directory +from yunohost.utils.packages import ( + get_ynh_package_version, + _list_upgradable_apt_packages, +) +from yunohost.service import _get_services, _save_services + +logger = getActionLogger("yunohost.migration") + +N_CURRENT_DEBIAN = 10 +N_CURRENT_YUNOHOST = 4 + +N_NEXT_DEBAN = 11 +N_NEXT_YUNOHOST = 11 + + +class MyMigration(Migration): + + "Upgrade the system to Debian Bullseye and Yunohost 11.x" + + mode = "manual" + + def run(self): + + self.check_assertions() + + logger.info(m18n.n("migration_0021_start")) + + # + # Add new apt .deb signing key + # + + new_apt_key = "https://forge.yunohost.org/yunohost_bullseye.asc" + check_output(f"wget -O- {new_apt_key} -q | apt-key add -qq -") + + # + # Patch sources.list + # + logger.info(m18n.n("migration_0021_patching_sources_list")) + self.patch_apt_sources_list() + tools_update(target="system") + + # Tell libc6 it's okay to restart system stuff during the upgrade + os.system( + "echo 'libc6 libraries/restart-without-asking boolean true' | debconf-set-selections" + ) + + # Don't send an email to root about the postgresql migration. It should be handled automatically after. + os.system( + "echo 'postgresql-common postgresql-common/obsolete-major seen true' | debconf-set-selections" + ) + + # + # Patch yunohost conflicts + # + logger.info(m18n.n("migration_0021_patch_yunohost_conflicts")) + + self.patch_yunohost_conflicts() + + # + # Specific tweaking to get rid of custom my.cnf and use debian's default one + # (my.cnf is actually a symlink to mariadb.cnf) + # + + _force_clear_hashes(["/etc/mysql/my.cnf"]) + rm("/etc/mysql/mariadb.cnf", force=True) + rm("/etc/mysql/my.cnf", force=True) + self.apt_install( + "mariadb-common --reinstall -o Dpkg::Options::='--force-confmiss'" + ) + + # + # /usr/share/yunohost/yunohost-config/ssl/yunoCA -> /usr/share/yunohost/ssl + # + if os.path.exists("/usr/share/yunohost/yunohost-config/ssl/yunoCA"): + os.system( + "mv /usr/share/yunohost/yunohost-config/ssl/yunoCA /usr/share/yunohost/ssl" + ) + rm("/usr/share/yunohost/yunohost-config", recursive=True, force=True) + + # + # /home/yunohost.conf -> /var/cache/yunohost/regenconf + # + if os.path.exists("/home/yunohost.conf"): + os.system("mv /home/yunohost.conf /var/cache/yunohost/regenconf") + rm("/home/yunohost.conf", recursive=True, force=True) + + # + # Main upgrade + # + logger.info(m18n.n("migration_0021_main_upgrade")) + + apps_packages = self.get_apps_equivs_packages() + self.hold(apps_packages) + tools_upgrade(target="system", allow_yunohost_upgrade=False) + + if self.debian_major_version() == N_CURRENT_DEBIAN: + raise YunohostError("migration_0021_still_on_buster_after_main_upgrade") + + # Clean the mess + logger.info(m18n.n("migration_0021_cleaning_up")) + os.system("apt autoremove --assume-yes") + os.system("apt clean --assume-yes") + + # Force add sury if it's not there yet + # This is to solve some weird issue with php-common breaking php7.3-common, + # hence breaking many php7.3-deps + # hence triggering some dependency conflict (or foobar-ynh-deps uninstall) + # Adding it there shouldnt be a big deal - Yunohost 11.x does add it + # through its regen conf anyway. + if not os.path.exists("/etc/apt/sources.list.d/extra_php_version.list"): + open("/etc/apt/sources.list.d/extra_php_version.list", "w").write( + "deb https://packages.sury.org/php/ bullseye main" + ) + os.system( + 'wget --timeout 900 --quiet "https://packages.sury.org/php/apt.gpg" --output-document=- | gpg --dearmor >"/etc/apt/trusted.gpg.d/extra_php_version.gpg"' + ) + + os.system("apt update") + + # Force explicit install of php7.4-fpm to make sure it's ll be there + # during 0022_php73_to_php74_pools migration + self.apt_install("php7.4-fpm -o Dpkg::Options::='--force-confmiss'") + + # Remove legacy postgresql service record added by helpers, + # will now be dynamically handled by the core in bullseye + services = _get_services() + if "postgresql" in services: + del services["postgresql"] + _save_services(services) + + # + # Yunohost upgrade + # + logger.info(m18n.n("migration_0021_yunohost_upgrade")) + self.unhold(apps_packages) + tools_upgrade(target="system") + + def debian_major_version(self): + # The python module "platform" and lsb_release are not reliable because + # on some setup, they may still return Release=9 even after upgrading to + # buster ... (Apparently this is related to OVH overriding some stuff + # with /etc/lsb-release for instance -_-) + # Instead, we rely on /etc/os-release which should be the raw info from + # the distribution... + return int( + check_output( + "grep VERSION_ID /etc/os-release | head -n 1 | tr '\"' ' ' | cut -d ' ' -f2" + ) + ) + + def yunohost_major_version(self): + return int(get_ynh_package_version("yunohost")["version"].split(".")[0]) + + def check_assertions(self): + + # Be on buster (10.x) and yunohost 4.x + # NB : we do both check to cover situations where the upgrade crashed + # in the middle and debian version could be > 9.x but yunohost package + # would still be in 3.x... + if ( + not self.debian_major_version() == N_CURRENT_DEBIAN + and not self.yunohost_major_version() == N_CURRENT_YUNOHOST + ): + raise YunohostError("migration_0021_not_buster") + + # Have > 1 Go free space on /var/ ? + if free_space_in_directory("/var/") / (1024 ** 3) < 1.0: + raise YunohostError("migration_0021_not_enough_free_space") + + # Check system is up to date + # (but we don't if 'bullseye' is already in the sources.list ... + # which means maybe a previous upgrade crashed and we're re-running it) + if " bullseye " not in read_file("/etc/apt/sources.list"): + tools_update(target="system") + upgradable_system_packages = list(_list_upgradable_apt_packages()) + if upgradable_system_packages: + raise YunohostError("migration_0021_system_not_fully_up_to_date") + + @property + def disclaimer(self): + + # Avoid having a super long disclaimer + uncessary check if we ain't + # on buster / yunohost 4.x anymore + # NB : we do both check to cover situations where the upgrade crashed + # in the middle and debian version could be >= 10.x but yunohost package + # would still be in 4.x... + if ( + not self.debian_major_version() == N_CURRENT_DEBIAN + and not self.yunohost_major_version() == N_CURRENT_YUNOHOST + ): + return None + + # Get list of problematic apps ? I.e. not official or community+working + problematic_apps = unstable_apps() + problematic_apps = "".join(["\n - " + app for app in problematic_apps]) + + # Manually modified files ? (c.f. yunohost service regen-conf) + modified_files = manually_modified_files() + modified_files = "".join(["\n - " + f for f in modified_files]) + + message = m18n.n("migration_0021_general_warning") + + # FIXME: re-enable this message with updated topic link once we release the migration as stable + # message = ( + # "N.B.: This migration has been tested by the community over the last few months but has only been declared stable recently. If your server hosts critical services and if you are not too confident with debugging possible issues, we recommend you to wait a little bit more while we gather more feedback and polish things up. If on the other hand you are relatively confident with debugging small issues that may arise, you are encouraged to run this migration ;)! You can read about remaining known issues and feedback from the community here: https://forum.yunohost.org/t/12195\n\n" + # + message + # ) + + if problematic_apps: + message += "\n\n" + m18n.n( + "migration_0021_problematic_apps_warning", + problematic_apps=problematic_apps, + ) + + if modified_files: + message += "\n\n" + m18n.n( + "migration_0021_modified_files", manually_modified_files=modified_files + ) + + return message + + def patch_apt_sources_list(self): + + sources_list = glob.glob("/etc/apt/sources.list.d/*.list") + sources_list.append("/etc/apt/sources.list") + + # This : + # - replace single 'buster' occurence by 'bulleye' + # - comments lines containing "backports" + # - replace 'buster/updates' by 'bullseye/updates' (or same with -) + # Special note about the security suite: + # https://www.debian.org/releases/bullseye/amd64/release-notes/ch-information.en.html#security-archive + for f in sources_list: + command = ( + f"sed -i {f} " + "-e 's@ buster @ bullseye @g' " + "-e '/backports/ s@^#*@#@' " + "-e 's@ buster/updates @ bullseye-security @g' " + "-e 's@ buster-@ bullseye-@g' " + ) + os.system(command) + + def get_apps_equivs_packages(self): + + command = ( + "dpkg --get-selections" + " | grep -v deinstall" + " | awk '{print $1}'" + " | { grep 'ynh-deps$' || true; }" + ) + + output = check_output(command) + + return output.split("\n") if output else [] + + def hold(self, packages): + for package in packages: + os.system("apt-mark hold {}".format(package)) + + def unhold(self, packages): + for package in packages: + os.system("apt-mark unhold {}".format(package)) + + def apt_install(self, cmd): + def is_relevant(line): + return "Reading database ..." not in line.rstrip() + + callbacks = ( + lambda l: logger.info("+ " + l.rstrip() + "\r") + if is_relevant(l) + else logger.debug(l.rstrip() + "\r"), + lambda l: logger.warning(l.rstrip()), + ) + + cmd = ( + "LC_ALL=C DEBIAN_FRONTEND=noninteractive APT_LISTCHANGES_FRONTEND=none apt install --quiet -o=Dpkg::Use-Pty=0 --fix-broken --assume-yes " + + cmd + ) + + logger.debug("Running: %s" % cmd) + + call_async_output(cmd, callbacks, shell=True) + + def patch_yunohost_conflicts(self): + # + # This is a super dirty hack to remove the conflicts from yunohost's debian/control file + # Those conflicts are there to prevent mistakenly upgrading critical packages + # such as dovecot, postfix, nginx, openssl, etc... usually related to mistakenly + # using backports etc. + # + # The hack consists in savagely removing the conflicts directly in /var/lib/dpkg/status + # + + # We only patch the conflict if we're on yunohost 4.x + if self.yunohost_major_version() != N_CURRENT_YUNOHOST: + return + + conflicts = check_output("dpkg-query -s yunohost | grep '^Conflicts:'").strip() + if conflicts: + # We want to keep conflicting with apache/bind9 tho + new_conflicts = "Conflicts: apache2, bind9" + + command = ( + f"sed -i /var/lib/dpkg/status -e 's@{conflicts}@{new_conflicts}@g'" + ) + logger.debug(f"Running: {command}") + os.system(command) From 94bf107838ee97fd2a544a1036c6410daa6a89e4 Mon Sep 17 00:00:00 2001 From: yunohost-bot Date: Wed, 29 Dec 2021 00:44:22 +0000 Subject: [PATCH 232/619] [CI] Format code with Black --- data/hooks/diagnosis/00-basesystem.py | 4 +++- src/yunohost/dyndns.py | 4 +--- src/yunohost/permission.py | 6 +++--- src/yunohost/tests/test_permission.py | 4 +--- 4 files changed, 8 insertions(+), 10 deletions(-) diff --git a/data/hooks/diagnosis/00-basesystem.py b/data/hooks/diagnosis/00-basesystem.py index a60070b5a..e30efc7fc 100644 --- a/data/hooks/diagnosis/00-basesystem.py +++ b/data/hooks/diagnosis/00-basesystem.py @@ -42,7 +42,9 @@ class BaseSystemDiagnoser(Diagnoser): elif os.path.exists("/sys/devices/virtual/dmi/id/sys_vendor"): model = read_file("/sys/devices/virtual/dmi/id/sys_vendor").strip() if os.path.exists("/sys/devices/virtual/dmi/id/product_name"): - product_name = read_file("/sys/devices/virtual/dmi/id/product_name").strip() + product_name = read_file( + "/sys/devices/virtual/dmi/id/product_name" + ).strip() model = f"{model} {product_name}" hardware["data"]["model"] = model hardware["details"] = ["diagnosis_basesystem_hardware_model"] diff --git a/src/yunohost/dyndns.py b/src/yunohost/dyndns.py index 8748c1c00..ebf04c008 100644 --- a/src/yunohost/dyndns.py +++ b/src/yunohost/dyndns.py @@ -262,9 +262,7 @@ def dyndns_update( else: return None - raise YunohostError( - f"Failed to resolve {rdtype} for {domain}", raw_msg=True - ) + raise YunohostError(f"Failed to resolve {rdtype} for {domain}", raw_msg=True) old_ipv4 = resolve_domain(domain, "A") old_ipv6 = resolve_domain(domain, "AAAA") diff --git a/src/yunohost/permission.py b/src/yunohost/permission.py index 9a46cad27..e87715e63 100644 --- a/src/yunohost/permission.py +++ b/src/yunohost/permission.py @@ -666,9 +666,9 @@ def permission_sync_to_user(): # These are the users that should be allowed because they are member of a group that is allowed for this permission ... should_be_allowed_users = { - user - for group in permission_infos["allowed"] - for user in groups[group]["members"] + user + for group in permission_infos["allowed"] + for user in groups[group]["members"] } # Note that a LDAP operation with the same value that is in LDAP crash SLAP. diff --git a/src/yunohost/tests/test_permission.py b/src/yunohost/tests/test_permission.py index 01b62f2a8..9c059f0e4 100644 --- a/src/yunohost/tests/test_permission.py +++ b/src/yunohost/tests/test_permission.py @@ -1013,9 +1013,7 @@ def test_permission_app_install(): assert res["permissions_app.dev"]["url"] == "/dev" assert res["permissions_app.main"]["allowed"] == ["all_users"] - assert set(res["permissions_app.main"]["corresponding_users"]) == { - "alice", "bob" - } + assert set(res["permissions_app.main"]["corresponding_users"]) == {"alice", "bob"} assert res["permissions_app.admin"]["allowed"] == ["alice"] assert res["permissions_app.admin"]["corresponding_users"] == ["alice"] From de149975d2c235fe29beba1eee4108d5c9f5532d Mon Sep 17 00:00:00 2001 From: Kay0u Date: Wed, 29 Dec 2021 22:40:54 +0100 Subject: [PATCH 233/619] Remove unused variable --- data/hooks/diagnosis/12-dnsrecords.py | 1 - 1 file changed, 1 deletion(-) diff --git a/data/hooks/diagnosis/12-dnsrecords.py b/data/hooks/diagnosis/12-dnsrecords.py index cedd3891e..554576f79 100644 --- a/data/hooks/diagnosis/12-dnsrecords.py +++ b/data/hooks/diagnosis/12-dnsrecords.py @@ -56,7 +56,6 @@ class DNSRecordsDiagnoser(Diagnoser): def check_domain(self, domain, is_main_domain): if is_special_use_tld(domain): - categories = [] yield dict( meta={"domain": domain}, data={}, From f92c88aff7abdd9812a32592e0dd7fa052937b58 Mon Sep 17 00:00:00 2001 From: Kay0u Date: Wed, 29 Dec 2021 22:41:57 +0100 Subject: [PATCH 234/619] remove unused lines --- src/yunohost/app.py | 1 - src/yunohost/dns.py | 3 +-- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/src/yunohost/app.py b/src/yunohost/app.py index d5e57d6cf..bf41f163d 100644 --- a/src/yunohost/app.py +++ b/src/yunohost/app.py @@ -1033,7 +1033,6 @@ def app_remove(operation_logger, app, purge=False): remove_script = f"{tmp_workdir_for_app}/scripts/remove" env_dict = {} - app_id, app_instance_nb = _parse_app_instance_name(app) env_dict = _make_environment_for_app_script(app, workdir=tmp_workdir_for_app) env_dict["YNH_APP_PURGE"] = str(1 if purge else 0) diff --git a/src/yunohost/dns.py b/src/yunohost/dns.py index 23c641a35..492b285c0 100644 --- a/src/yunohost/dns.py +++ b/src/yunohost/dns.py @@ -857,7 +857,6 @@ def domain_dns_push(operation_logger, domain, dry_run=False, force=False, purge= ignored = "" if action == "create": - old_content = record.get("old_content", "(None)")[:30] new_content = record.get("content", "(None)")[:30] return f"{name:>20} [{t:^5}] {new_content:^30} {ignored}" elif action == "update": @@ -867,7 +866,7 @@ def domain_dns_push(operation_logger, domain, dry_run=False, force=False, purge= f"{name:>20} [{t:^5}] {old_content:^30} -> {new_content:^30} {ignored}" ) elif action == "unchanged": - old_content = new_content = record.get("content", "(None)")[:30] + old_content = record.get("content", "(None)")[:30] return f"{name:>20} [{t:^5}] {old_content:^30}" else: old_content = record.get("content", "(None)")[:30] From 2cc09aca91c97ae2bfbda9d224a93cd422b206ae Mon Sep 17 00:00:00 2001 From: Kay0u Date: Wed, 29 Dec 2021 22:45:25 +0100 Subject: [PATCH 235/619] some improvements --- .../0016_php70_to_php73_pools.py | 12 +++---- src/yunohost/service.py | 2 +- src/yunohost/tools.py | 34 ++++++++----------- 3 files changed, 22 insertions(+), 26 deletions(-) diff --git a/src/yunohost/data_migrations/0016_php70_to_php73_pools.py b/src/yunohost/data_migrations/0016_php70_to_php73_pools.py index fed96c9c8..570e63ea4 100644 --- a/src/yunohost/data_migrations/0016_php70_to_php73_pools.py +++ b/src/yunohost/data_migrations/0016_php70_to_php73_pools.py @@ -38,11 +38,11 @@ class MyMigration(Migration): # Ignore the "www.conf" (default stuff, probably don't want to touch it ?) php70_pool_files = [f for f in php70_pool_files if f != "www.conf"] - for f in php70_pool_files: + for pf in php70_pool_files: # Copy the files to the php7.3 pool - src = "{}/{}".format(PHP70_POOLS, f) - dest = "{}/{}".format(PHP73_POOLS, f) + src = "{}/{}".format(PHP70_POOLS, pf) + dest = "{}/{}".format(PHP73_POOLS, pf) copy2(src, dest) # Replace the socket prefix if it's found @@ -56,17 +56,17 @@ class MyMigration(Migration): c = "sed -i '1i {}' {}".format(MIGRATION_COMMENT, dest) os.system(c) - app_id = os.path.basename(f)[: -len(".conf")] + app_id = os.path.basename(pf)[: -len(".conf")] if _is_installed(app_id): _patch_legacy_php_versions_in_settings( "/etc/yunohost/apps/%s/" % app_id ) nginx_conf_files = glob.glob("/etc/nginx/conf.d/*.d/%s.conf" % app_id) - for f in nginx_conf_files: + for nf in nginx_conf_files: # Replace the socket prefix if it's found c = "sed -i -e 's@{}@{}@g' {}".format( - PHP70_SOCKETS_PREFIX, PHP73_SOCKETS_PREFIX, f + PHP70_SOCKETS_PREFIX, PHP73_SOCKETS_PREFIX, nf ) os.system(c) diff --git a/src/yunohost/service.py b/src/yunohost/service.py index 4f453dfe9..8a7b146b1 100644 --- a/src/yunohost/service.py +++ b/src/yunohost/service.py @@ -587,7 +587,7 @@ def service_regen_conf( if name not in services.keys(): raise YunohostValidationError("service_unknown", service=name) - if names is []: + if names == []: names = list(services.keys()) logger.warning(m18n.n("service_regen_conf_is_deprecated")) diff --git a/src/yunohost/tools.py b/src/yunohost/tools.py index 679b4d16e..a0411c69e 100644 --- a/src/yunohost/tools.py +++ b/src/yunohost/tools.py @@ -236,28 +236,24 @@ def tools_postinstall( # If this is a nohost.me/noho.st, actually check for availability if not ignore_dyndns and is_yunohost_dyndns_domain(domain): - # (Except if the user explicitly said he/she doesn't care about dyndns) - if ignore_dyndns: - dyndns = False # Check if the domain is available... - else: - try: - available = _dyndns_available(domain) - # If an exception is thrown, most likely we don't have internet - # connectivity or something. Assume that this domain isn't manageable - # and inform the user that we could not contact the dyndns host server. - except Exception: - logger.warning( - m18n.n( - "dyndns_provider_unreachable", provider="dyndns.yunohost.org" - ) + try: + available = _dyndns_available(domain) + # If an exception is thrown, most likely we don't have internet + # connectivity or something. Assume that this domain isn't manageable + # and inform the user that we could not contact the dyndns host server. + except Exception: + logger.warning( + m18n.n( + "dyndns_provider_unreachable", provider="dyndns.yunohost.org" ) + ) - if available: - dyndns = True - # If not, abort the postinstall - else: - raise YunohostValidationError("dyndns_unavailable", domain=domain) + if available: + dyndns = True + # If not, abort the postinstall + else: + raise YunohostValidationError("dyndns_unavailable", domain=domain) else: dyndns = False From bbe0486935615779925b4a11ba239395a095f33d Mon Sep 17 00:00:00 2001 From: Kay0u Date: Thu, 30 Dec 2021 00:08:49 +0100 Subject: [PATCH 236/619] Trying to fix some lgtm warnings --- src/yunohost/app.py | 7 ++- src/yunohost/certificate.py | 52 +++++++++---------- .../data_migrations/0018_xtable_to_nftable.py | 6 ++- src/yunohost/domain.py | 20 +++---- src/yunohost/regenconf.py | 5 +- src/yunohost/tools.py | 2 +- src/yunohost/user.py | 24 ++++----- src/yunohost/utils/config.py | 5 +- 8 files changed, 66 insertions(+), 55 deletions(-) diff --git a/src/yunohost/app.py b/src/yunohost/app.py index bf41f163d..ca56be232 100644 --- a/src/yunohost/app.py +++ b/src/yunohost/app.py @@ -627,7 +627,7 @@ def app_upgrade(app=[], url=None, file=None, force=False, no_safety_backup=False if upgrade_failed or broke_the_system: # display this if there are remaining apps - if apps[number + 1 :]: + if apps[number + 1:]: not_upgraded_apps = apps[number:] logger.error( m18n.n( @@ -1626,9 +1626,12 @@ class AppConfigPanel(ConfigPanel): error=message, ) - def _call_config_script(self, action, env={}): + def _call_config_script(self, action, env=None): from yunohost.hook import hook_exec + if env is None: + env = {} + # Add default config script if needed config_script = os.path.join( APPS_SETTING_PATH, self.entity, "scripts", "config" diff --git a/src/yunohost/certificate.py b/src/yunohost/certificate.py index 79e3ae092..2f3676202 100644 --- a/src/yunohost/certificate.py +++ b/src/yunohost/certificate.py @@ -70,28 +70,28 @@ PRODUCTION_CERTIFICATION_AUTHORITY = "https://acme-v02.api.letsencrypt.org" # -def certificate_status(domain_list, full=False): +def certificate_status(domains, full=False): """ Print the status of certificate for given domains (all by default) Keyword argument: - domain_list -- Domains to be checked + domains -- Domains to be checked full -- Display more info about the certificates """ - import yunohost.domain + from yunohost.domain import domain_list, _assert_domain_exists # If no domains given, consider all yunohost domains - if domain_list == []: - domain_list = yunohost.domain.domain_list()["domains"] + if domains == []: + domains = domain_list()["domains"] # Else, validate that yunohost knows the domains given else: - for domain in domain_list: - yunohost.domain._assert_domain_exists(domain) + for domain in domains: + _assert_domain_exists(domain) certificates = {} - for domain in domain_list: + for domain in domains: status = _get_status(domain) if not full: @@ -239,28 +239,28 @@ def _certificate_install_selfsigned(domain_list, force=False): def _certificate_install_letsencrypt( - domain_list, force=False, no_checks=False, staging=False + domains, force=False, no_checks=False, staging=False ): - import yunohost.domain + from yunohost.domain import domain_list, _assert_domain_exists if not os.path.exists(ACCOUNT_KEY_FILE): _generate_account_key() # If no domains given, consider all yunohost domains with self-signed # certificates - if domain_list == []: - for domain in yunohost.domain.domain_list()["domains"]: + if domains == []: + for domain in domain_list()["domains"]: status = _get_status(domain) if status["CA_type"]["code"] != "self-signed": continue - domain_list.append(domain) + domains.append(domain) # Else, validate that yunohost knows the domains given else: - for domain in domain_list: - yunohost.domain._assert_domain_exists(domain) + for domain in domains: + _assert_domain_exists(domain) # Is it self-signed? status = _get_status(domain) @@ -275,7 +275,7 @@ def _certificate_install_letsencrypt( ) # Actual install steps - for domain in domain_list: + for domain in domains: if not no_checks: try: @@ -311,25 +311,25 @@ def _certificate_install_letsencrypt( def certificate_renew( - domain_list, force=False, no_checks=False, email=False, staging=False + domains, force=False, no_checks=False, email=False, staging=False ): """ Renew Let's Encrypt certificate for given domains (all by default) Keyword argument: - domain_list -- Domains for which to renew the certificates + domains -- Domains for which to renew the certificates force -- Ignore the validity threshold (15 days) no-check -- Disable some checks about the reachability of web server before attempting the renewing email -- Emails root if some renewing failed """ - import yunohost.domain + from yunohost.domain import domain_list, _assert_domain_exists # If no domains given, consider all yunohost domains with Let's Encrypt # certificates - if domain_list == []: - for domain in yunohost.domain.domain_list()["domains"]: + if domains == []: + for domain in domain_list()["domains"]: # Does it have a Let's Encrypt cert? status = _get_status(domain) @@ -347,17 +347,17 @@ def certificate_renew( ) continue - domain_list.append(domain) + domains.append(domain) - if len(domain_list) == 0 and not email: + if len(domains) == 0 and not email: logger.info("No certificate needs to be renewed.") # Else, validate the domain list given else: - for domain in domain_list: + for domain in domains: # Is it in Yunohost domain list? - yunohost.domain._assert_domain_exists(domain) + _assert_domain_exists(domain) status = _get_status(domain) @@ -385,7 +385,7 @@ def certificate_renew( ) # Actual renew steps - for domain in domain_list: + for domain in domains: if not no_checks: try: diff --git a/src/yunohost/data_migrations/0018_xtable_to_nftable.py b/src/yunohost/data_migrations/0018_xtable_to_nftable.py index 94b47d944..374620f2f 100644 --- a/src/yunohost/data_migrations/0018_xtable_to_nftable.py +++ b/src/yunohost/data_migrations/0018_xtable_to_nftable.py @@ -41,7 +41,8 @@ class MyMigration(Migration): ) # For some reason if we don't do this, iptables-legacy-save is empty ? self.runcmd("iptables-legacy-save > %s" % self.backup_rules_ipv4) assert ( - open(self.backup_rules_ipv4).read().strip() + os.path.exists(self.backup_rules_ipv4) and + os.stat(self.backup_rules_ipv4).st_size > 0 ), "Uhoh backup of legacy ipv4 rules is empty !?" if self.do_ipv6 and not os.path.exists(self.backup_rules_ipv6): self.runcmd( @@ -49,7 +50,8 @@ class MyMigration(Migration): ) # For some reason if we don't do this, iptables-legacy-save is empty ? self.runcmd("ip6tables-legacy-save > %s" % self.backup_rules_ipv6) assert ( - open(self.backup_rules_ipv6).read().strip() + os.path.exists(self.backup_rules_ipv6) and + os.stat(self.backup_rules_ipv6).st_size > 0 ), "Uhoh backup of legacy ipv6 rules is empty !?" # We inject the legacy rules (iptables-legacy) into the new iptable (just "iptables") diff --git a/src/yunohost/domain.py b/src/yunohost/domain.py index 0bd84ea82..d1ea45a08 100644 --- a/src/yunohost/domain.py +++ b/src/yunohost/domain.py @@ -507,17 +507,17 @@ def _set_domain_settings(domain: str, settings: dict) -> None: def domain_cert_status(domain_list, full=False): - import yunohost.certificate + from yunohost.certificate import certificate_status - return yunohost.certificate.certificate_status(domain_list, full) + return certificate_status(domain_list, full) def domain_cert_install( domain_list, force=False, no_checks=False, self_signed=False, staging=False ): - import yunohost.certificate + from yunohost.certificate import certificate_install - return yunohost.certificate.certificate_install( + return certificate_install( domain_list, force, no_checks, self_signed, staging ) @@ -525,9 +525,9 @@ def domain_cert_install( def domain_cert_renew( domain_list, force=False, no_checks=False, email=False, staging=False ): - import yunohost.certificate + from yunohost.certificate import certificate_renew - return yunohost.certificate.certificate_renew( + return certificate_renew( domain_list, force, no_checks, email, staging ) @@ -537,12 +537,12 @@ def domain_dns_conf(domain): def domain_dns_suggest(domain): - import yunohost.dns + from yunohost.dns import domain_dns_suggest - return yunohost.dns.domain_dns_suggest(domain) + return domain_dns_suggest(domain) def domain_dns_push(domain, dry_run, force, purge): - import yunohost.dns + from yunohost.dns import domain_dns_push - return yunohost.dns.domain_dns_push(domain, dry_run, force, purge) + return domain_dns_push(domain, dry_run, force, purge) diff --git a/src/yunohost/regenconf.py b/src/yunohost/regenconf.py index adec5508d..4b697cd84 100644 --- a/src/yunohost/regenconf.py +++ b/src/yunohost/regenconf.py @@ -48,7 +48,7 @@ logger = log.getActionLogger("yunohost.regenconf") @is_unit_operation([("names", "configuration")]) def regen_conf( operation_logger, - names=[], + names=None, with_diff=False, force=False, dry_run=False, @@ -66,6 +66,9 @@ def regen_conf( """ + if names is None: + names = [] + result = {} # Return the list of pending conf diff --git a/src/yunohost/tools.py b/src/yunohost/tools.py index a0411c69e..6dd4032e9 100644 --- a/src/yunohost/tools.py +++ b/src/yunohost/tools.py @@ -1130,7 +1130,7 @@ class Migration: def description(self): return m18n.n("migration_description_%s" % self.id) - def ldap_migration(run): + def ldap_migration(self, run): def func(self): # Backup LDAP before the migration diff --git a/src/yunohost/user.py b/src/yunohost/user.py index 78fda8d09..a27fffbee 100644 --- a/src/yunohost/user.py +++ b/src/yunohost/user.py @@ -1263,25 +1263,25 @@ def user_group_remove(groupname, usernames, force=False, sync_perm=True): def user_permission_list(short=False, full=False, apps=[]): - import yunohost.permission + from yunohost.permission import user_permission_list - return yunohost.permission.user_permission_list( + return user_permission_list( short, full, absolute_urls=True, apps=apps ) def user_permission_update(permission, label=None, show_tile=None, sync_perm=True): - import yunohost.permission + from yunohost.permission import user_permission_update - return yunohost.permission.user_permission_update( + return user_permission_update( permission, label=label, show_tile=show_tile, sync_perm=sync_perm ) def user_permission_add(permission, names, protected=None, force=False, sync_perm=True): - import yunohost.permission + from yunohost.permission import user_permission_update - return yunohost.permission.user_permission_update( + return user_permission_update( permission, add=names, protected=protected, force=force, sync_perm=sync_perm ) @@ -1289,23 +1289,23 @@ def user_permission_add(permission, names, protected=None, force=False, sync_per def user_permission_remove( permission, names, protected=None, force=False, sync_perm=True ): - import yunohost.permission + from yunohost.permission import user_permission_update - return yunohost.permission.user_permission_update( + return user_permission_update( permission, remove=names, protected=protected, force=force, sync_perm=sync_perm ) def user_permission_reset(permission, sync_perm=True): - import yunohost.permission + from yunohost.permission import user_permission_reset - return yunohost.permission.user_permission_reset(permission, sync_perm=sync_perm) + return user_permission_reset(permission, sync_perm=sync_perm) def user_permission_info(permission): - import yunohost.permission + from yunohost.permission import user_permission_info - return yunohost.permission.user_permission_info(permission) + return user_permission_info(permission) # diff --git a/src/yunohost/utils/config.py b/src/yunohost/utils/config.py index e3b09f870..5b286a92b 100644 --- a/src/yunohost/utils/config.py +++ b/src/yunohost/utils/config.py @@ -52,7 +52,10 @@ CONFIG_PANEL_VERSION_SUPPORTED = 1.0 # Those js-like evaluate functions are used to eval safely visible attributes # The goal is to evaluate in the same way than js simple-evaluate # https://github.com/shepherdwind/simple-evaluate -def evaluate_simple_ast(node, context={}): +def evaluate_simple_ast(node, context=None): + if context is None: + context = {} + operators = { ast.Not: op.not_, ast.Mult: op.mul, From 7cb96c6652eeb6eb1e6a2e37fda26e9d396abfd9 Mon Sep 17 00:00:00 2001 From: Kay0u Date: Thu, 30 Dec 2021 00:25:54 +0100 Subject: [PATCH 237/619] fix ldap_migration decorator --- src/yunohost/tools.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/yunohost/tools.py b/src/yunohost/tools.py index 6dd4032e9..79c558b2d 100644 --- a/src/yunohost/tools.py +++ b/src/yunohost/tools.py @@ -1130,7 +1130,8 @@ class Migration: def description(self): return m18n.n("migration_description_%s" % self.id) - def ldap_migration(self, run): + @staticmethod + def ldap_migration(run): def func(self): # Backup LDAP before the migration From c177a6797e5fa09f7b6c4db1b056e56eadad19c5 Mon Sep 17 00:00:00 2001 From: Kay0u Date: Wed, 29 Dec 2021 22:40:54 +0100 Subject: [PATCH 238/619] Remove unused variable --- data/hooks/diagnosis/12-dnsrecords.py | 1 - 1 file changed, 1 deletion(-) diff --git a/data/hooks/diagnosis/12-dnsrecords.py b/data/hooks/diagnosis/12-dnsrecords.py index cedd3891e..554576f79 100644 --- a/data/hooks/diagnosis/12-dnsrecords.py +++ b/data/hooks/diagnosis/12-dnsrecords.py @@ -56,7 +56,6 @@ class DNSRecordsDiagnoser(Diagnoser): def check_domain(self, domain, is_main_domain): if is_special_use_tld(domain): - categories = [] yield dict( meta={"domain": domain}, data={}, From acd96f1382b68fe23dc3ea72a807257ddecdf058 Mon Sep 17 00:00:00 2001 From: Kay0u Date: Wed, 29 Dec 2021 22:41:57 +0100 Subject: [PATCH 239/619] remove unused lines --- src/yunohost/app.py | 1 - src/yunohost/dns.py | 3 +-- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/src/yunohost/app.py b/src/yunohost/app.py index d5e57d6cf..bf41f163d 100644 --- a/src/yunohost/app.py +++ b/src/yunohost/app.py @@ -1033,7 +1033,6 @@ def app_remove(operation_logger, app, purge=False): remove_script = f"{tmp_workdir_for_app}/scripts/remove" env_dict = {} - app_id, app_instance_nb = _parse_app_instance_name(app) env_dict = _make_environment_for_app_script(app, workdir=tmp_workdir_for_app) env_dict["YNH_APP_PURGE"] = str(1 if purge else 0) diff --git a/src/yunohost/dns.py b/src/yunohost/dns.py index 23c641a35..492b285c0 100644 --- a/src/yunohost/dns.py +++ b/src/yunohost/dns.py @@ -857,7 +857,6 @@ def domain_dns_push(operation_logger, domain, dry_run=False, force=False, purge= ignored = "" if action == "create": - old_content = record.get("old_content", "(None)")[:30] new_content = record.get("content", "(None)")[:30] return f"{name:>20} [{t:^5}] {new_content:^30} {ignored}" elif action == "update": @@ -867,7 +866,7 @@ def domain_dns_push(operation_logger, domain, dry_run=False, force=False, purge= f"{name:>20} [{t:^5}] {old_content:^30} -> {new_content:^30} {ignored}" ) elif action == "unchanged": - old_content = new_content = record.get("content", "(None)")[:30] + old_content = record.get("content", "(None)")[:30] return f"{name:>20} [{t:^5}] {old_content:^30}" else: old_content = record.get("content", "(None)")[:30] From ef44abae6e7e557855f0ece47e5fa4725ed97c14 Mon Sep 17 00:00:00 2001 From: Kay0u Date: Wed, 29 Dec 2021 22:45:25 +0100 Subject: [PATCH 240/619] some improvements --- .../0016_php70_to_php73_pools.py | 12 +++---- src/yunohost/service.py | 2 +- src/yunohost/tools.py | 34 ++++++++----------- 3 files changed, 22 insertions(+), 26 deletions(-) diff --git a/src/yunohost/data_migrations/0016_php70_to_php73_pools.py b/src/yunohost/data_migrations/0016_php70_to_php73_pools.py index fed96c9c8..570e63ea4 100644 --- a/src/yunohost/data_migrations/0016_php70_to_php73_pools.py +++ b/src/yunohost/data_migrations/0016_php70_to_php73_pools.py @@ -38,11 +38,11 @@ class MyMigration(Migration): # Ignore the "www.conf" (default stuff, probably don't want to touch it ?) php70_pool_files = [f for f in php70_pool_files if f != "www.conf"] - for f in php70_pool_files: + for pf in php70_pool_files: # Copy the files to the php7.3 pool - src = "{}/{}".format(PHP70_POOLS, f) - dest = "{}/{}".format(PHP73_POOLS, f) + src = "{}/{}".format(PHP70_POOLS, pf) + dest = "{}/{}".format(PHP73_POOLS, pf) copy2(src, dest) # Replace the socket prefix if it's found @@ -56,17 +56,17 @@ class MyMigration(Migration): c = "sed -i '1i {}' {}".format(MIGRATION_COMMENT, dest) os.system(c) - app_id = os.path.basename(f)[: -len(".conf")] + app_id = os.path.basename(pf)[: -len(".conf")] if _is_installed(app_id): _patch_legacy_php_versions_in_settings( "/etc/yunohost/apps/%s/" % app_id ) nginx_conf_files = glob.glob("/etc/nginx/conf.d/*.d/%s.conf" % app_id) - for f in nginx_conf_files: + for nf in nginx_conf_files: # Replace the socket prefix if it's found c = "sed -i -e 's@{}@{}@g' {}".format( - PHP70_SOCKETS_PREFIX, PHP73_SOCKETS_PREFIX, f + PHP70_SOCKETS_PREFIX, PHP73_SOCKETS_PREFIX, nf ) os.system(c) diff --git a/src/yunohost/service.py b/src/yunohost/service.py index 4f453dfe9..8a7b146b1 100644 --- a/src/yunohost/service.py +++ b/src/yunohost/service.py @@ -587,7 +587,7 @@ def service_regen_conf( if name not in services.keys(): raise YunohostValidationError("service_unknown", service=name) - if names is []: + if names == []: names = list(services.keys()) logger.warning(m18n.n("service_regen_conf_is_deprecated")) diff --git a/src/yunohost/tools.py b/src/yunohost/tools.py index 679b4d16e..a0411c69e 100644 --- a/src/yunohost/tools.py +++ b/src/yunohost/tools.py @@ -236,28 +236,24 @@ def tools_postinstall( # If this is a nohost.me/noho.st, actually check for availability if not ignore_dyndns and is_yunohost_dyndns_domain(domain): - # (Except if the user explicitly said he/she doesn't care about dyndns) - if ignore_dyndns: - dyndns = False # Check if the domain is available... - else: - try: - available = _dyndns_available(domain) - # If an exception is thrown, most likely we don't have internet - # connectivity or something. Assume that this domain isn't manageable - # and inform the user that we could not contact the dyndns host server. - except Exception: - logger.warning( - m18n.n( - "dyndns_provider_unreachable", provider="dyndns.yunohost.org" - ) + try: + available = _dyndns_available(domain) + # If an exception is thrown, most likely we don't have internet + # connectivity or something. Assume that this domain isn't manageable + # and inform the user that we could not contact the dyndns host server. + except Exception: + logger.warning( + m18n.n( + "dyndns_provider_unreachable", provider="dyndns.yunohost.org" ) + ) - if available: - dyndns = True - # If not, abort the postinstall - else: - raise YunohostValidationError("dyndns_unavailable", domain=domain) + if available: + dyndns = True + # If not, abort the postinstall + else: + raise YunohostValidationError("dyndns_unavailable", domain=domain) else: dyndns = False From 270c2eb9c0a7154680b3672689416613ed158a7f Mon Sep 17 00:00:00 2001 From: Kay0u Date: Thu, 30 Dec 2021 00:08:49 +0100 Subject: [PATCH 241/619] Trying to fix some lgtm warnings --- src/yunohost/app.py | 7 ++- src/yunohost/certificate.py | 52 +++++++++---------- .../data_migrations/0018_xtable_to_nftable.py | 6 ++- src/yunohost/domain.py | 20 +++---- src/yunohost/regenconf.py | 5 +- src/yunohost/tools.py | 2 +- src/yunohost/user.py | 24 ++++----- src/yunohost/utils/config.py | 5 +- 8 files changed, 66 insertions(+), 55 deletions(-) diff --git a/src/yunohost/app.py b/src/yunohost/app.py index bf41f163d..ca56be232 100644 --- a/src/yunohost/app.py +++ b/src/yunohost/app.py @@ -627,7 +627,7 @@ def app_upgrade(app=[], url=None, file=None, force=False, no_safety_backup=False if upgrade_failed or broke_the_system: # display this if there are remaining apps - if apps[number + 1 :]: + if apps[number + 1:]: not_upgraded_apps = apps[number:] logger.error( m18n.n( @@ -1626,9 +1626,12 @@ class AppConfigPanel(ConfigPanel): error=message, ) - def _call_config_script(self, action, env={}): + def _call_config_script(self, action, env=None): from yunohost.hook import hook_exec + if env is None: + env = {} + # Add default config script if needed config_script = os.path.join( APPS_SETTING_PATH, self.entity, "scripts", "config" diff --git a/src/yunohost/certificate.py b/src/yunohost/certificate.py index 79e3ae092..2f3676202 100644 --- a/src/yunohost/certificate.py +++ b/src/yunohost/certificate.py @@ -70,28 +70,28 @@ PRODUCTION_CERTIFICATION_AUTHORITY = "https://acme-v02.api.letsencrypt.org" # -def certificate_status(domain_list, full=False): +def certificate_status(domains, full=False): """ Print the status of certificate for given domains (all by default) Keyword argument: - domain_list -- Domains to be checked + domains -- Domains to be checked full -- Display more info about the certificates """ - import yunohost.domain + from yunohost.domain import domain_list, _assert_domain_exists # If no domains given, consider all yunohost domains - if domain_list == []: - domain_list = yunohost.domain.domain_list()["domains"] + if domains == []: + domains = domain_list()["domains"] # Else, validate that yunohost knows the domains given else: - for domain in domain_list: - yunohost.domain._assert_domain_exists(domain) + for domain in domains: + _assert_domain_exists(domain) certificates = {} - for domain in domain_list: + for domain in domains: status = _get_status(domain) if not full: @@ -239,28 +239,28 @@ def _certificate_install_selfsigned(domain_list, force=False): def _certificate_install_letsencrypt( - domain_list, force=False, no_checks=False, staging=False + domains, force=False, no_checks=False, staging=False ): - import yunohost.domain + from yunohost.domain import domain_list, _assert_domain_exists if not os.path.exists(ACCOUNT_KEY_FILE): _generate_account_key() # If no domains given, consider all yunohost domains with self-signed # certificates - if domain_list == []: - for domain in yunohost.domain.domain_list()["domains"]: + if domains == []: + for domain in domain_list()["domains"]: status = _get_status(domain) if status["CA_type"]["code"] != "self-signed": continue - domain_list.append(domain) + domains.append(domain) # Else, validate that yunohost knows the domains given else: - for domain in domain_list: - yunohost.domain._assert_domain_exists(domain) + for domain in domains: + _assert_domain_exists(domain) # Is it self-signed? status = _get_status(domain) @@ -275,7 +275,7 @@ def _certificate_install_letsencrypt( ) # Actual install steps - for domain in domain_list: + for domain in domains: if not no_checks: try: @@ -311,25 +311,25 @@ def _certificate_install_letsencrypt( def certificate_renew( - domain_list, force=False, no_checks=False, email=False, staging=False + domains, force=False, no_checks=False, email=False, staging=False ): """ Renew Let's Encrypt certificate for given domains (all by default) Keyword argument: - domain_list -- Domains for which to renew the certificates + domains -- Domains for which to renew the certificates force -- Ignore the validity threshold (15 days) no-check -- Disable some checks about the reachability of web server before attempting the renewing email -- Emails root if some renewing failed """ - import yunohost.domain + from yunohost.domain import domain_list, _assert_domain_exists # If no domains given, consider all yunohost domains with Let's Encrypt # certificates - if domain_list == []: - for domain in yunohost.domain.domain_list()["domains"]: + if domains == []: + for domain in domain_list()["domains"]: # Does it have a Let's Encrypt cert? status = _get_status(domain) @@ -347,17 +347,17 @@ def certificate_renew( ) continue - domain_list.append(domain) + domains.append(domain) - if len(domain_list) == 0 and not email: + if len(domains) == 0 and not email: logger.info("No certificate needs to be renewed.") # Else, validate the domain list given else: - for domain in domain_list: + for domain in domains: # Is it in Yunohost domain list? - yunohost.domain._assert_domain_exists(domain) + _assert_domain_exists(domain) status = _get_status(domain) @@ -385,7 +385,7 @@ def certificate_renew( ) # Actual renew steps - for domain in domain_list: + for domain in domains: if not no_checks: try: diff --git a/src/yunohost/data_migrations/0018_xtable_to_nftable.py b/src/yunohost/data_migrations/0018_xtable_to_nftable.py index 94b47d944..374620f2f 100644 --- a/src/yunohost/data_migrations/0018_xtable_to_nftable.py +++ b/src/yunohost/data_migrations/0018_xtable_to_nftable.py @@ -41,7 +41,8 @@ class MyMigration(Migration): ) # For some reason if we don't do this, iptables-legacy-save is empty ? self.runcmd("iptables-legacy-save > %s" % self.backup_rules_ipv4) assert ( - open(self.backup_rules_ipv4).read().strip() + os.path.exists(self.backup_rules_ipv4) and + os.stat(self.backup_rules_ipv4).st_size > 0 ), "Uhoh backup of legacy ipv4 rules is empty !?" if self.do_ipv6 and not os.path.exists(self.backup_rules_ipv6): self.runcmd( @@ -49,7 +50,8 @@ class MyMigration(Migration): ) # For some reason if we don't do this, iptables-legacy-save is empty ? self.runcmd("ip6tables-legacy-save > %s" % self.backup_rules_ipv6) assert ( - open(self.backup_rules_ipv6).read().strip() + os.path.exists(self.backup_rules_ipv6) and + os.stat(self.backup_rules_ipv6).st_size > 0 ), "Uhoh backup of legacy ipv6 rules is empty !?" # We inject the legacy rules (iptables-legacy) into the new iptable (just "iptables") diff --git a/src/yunohost/domain.py b/src/yunohost/domain.py index 0bd84ea82..d1ea45a08 100644 --- a/src/yunohost/domain.py +++ b/src/yunohost/domain.py @@ -507,17 +507,17 @@ def _set_domain_settings(domain: str, settings: dict) -> None: def domain_cert_status(domain_list, full=False): - import yunohost.certificate + from yunohost.certificate import certificate_status - return yunohost.certificate.certificate_status(domain_list, full) + return certificate_status(domain_list, full) def domain_cert_install( domain_list, force=False, no_checks=False, self_signed=False, staging=False ): - import yunohost.certificate + from yunohost.certificate import certificate_install - return yunohost.certificate.certificate_install( + return certificate_install( domain_list, force, no_checks, self_signed, staging ) @@ -525,9 +525,9 @@ def domain_cert_install( def domain_cert_renew( domain_list, force=False, no_checks=False, email=False, staging=False ): - import yunohost.certificate + from yunohost.certificate import certificate_renew - return yunohost.certificate.certificate_renew( + return certificate_renew( domain_list, force, no_checks, email, staging ) @@ -537,12 +537,12 @@ def domain_dns_conf(domain): def domain_dns_suggest(domain): - import yunohost.dns + from yunohost.dns import domain_dns_suggest - return yunohost.dns.domain_dns_suggest(domain) + return domain_dns_suggest(domain) def domain_dns_push(domain, dry_run, force, purge): - import yunohost.dns + from yunohost.dns import domain_dns_push - return yunohost.dns.domain_dns_push(domain, dry_run, force, purge) + return domain_dns_push(domain, dry_run, force, purge) diff --git a/src/yunohost/regenconf.py b/src/yunohost/regenconf.py index adec5508d..4b697cd84 100644 --- a/src/yunohost/regenconf.py +++ b/src/yunohost/regenconf.py @@ -48,7 +48,7 @@ logger = log.getActionLogger("yunohost.regenconf") @is_unit_operation([("names", "configuration")]) def regen_conf( operation_logger, - names=[], + names=None, with_diff=False, force=False, dry_run=False, @@ -66,6 +66,9 @@ def regen_conf( """ + if names is None: + names = [] + result = {} # Return the list of pending conf diff --git a/src/yunohost/tools.py b/src/yunohost/tools.py index a0411c69e..6dd4032e9 100644 --- a/src/yunohost/tools.py +++ b/src/yunohost/tools.py @@ -1130,7 +1130,7 @@ class Migration: def description(self): return m18n.n("migration_description_%s" % self.id) - def ldap_migration(run): + def ldap_migration(self, run): def func(self): # Backup LDAP before the migration diff --git a/src/yunohost/user.py b/src/yunohost/user.py index 78fda8d09..a27fffbee 100644 --- a/src/yunohost/user.py +++ b/src/yunohost/user.py @@ -1263,25 +1263,25 @@ def user_group_remove(groupname, usernames, force=False, sync_perm=True): def user_permission_list(short=False, full=False, apps=[]): - import yunohost.permission + from yunohost.permission import user_permission_list - return yunohost.permission.user_permission_list( + return user_permission_list( short, full, absolute_urls=True, apps=apps ) def user_permission_update(permission, label=None, show_tile=None, sync_perm=True): - import yunohost.permission + from yunohost.permission import user_permission_update - return yunohost.permission.user_permission_update( + return user_permission_update( permission, label=label, show_tile=show_tile, sync_perm=sync_perm ) def user_permission_add(permission, names, protected=None, force=False, sync_perm=True): - import yunohost.permission + from yunohost.permission import user_permission_update - return yunohost.permission.user_permission_update( + return user_permission_update( permission, add=names, protected=protected, force=force, sync_perm=sync_perm ) @@ -1289,23 +1289,23 @@ def user_permission_add(permission, names, protected=None, force=False, sync_per def user_permission_remove( permission, names, protected=None, force=False, sync_perm=True ): - import yunohost.permission + from yunohost.permission import user_permission_update - return yunohost.permission.user_permission_update( + return user_permission_update( permission, remove=names, protected=protected, force=force, sync_perm=sync_perm ) def user_permission_reset(permission, sync_perm=True): - import yunohost.permission + from yunohost.permission import user_permission_reset - return yunohost.permission.user_permission_reset(permission, sync_perm=sync_perm) + return user_permission_reset(permission, sync_perm=sync_perm) def user_permission_info(permission): - import yunohost.permission + from yunohost.permission import user_permission_info - return yunohost.permission.user_permission_info(permission) + return user_permission_info(permission) # diff --git a/src/yunohost/utils/config.py b/src/yunohost/utils/config.py index e3b09f870..5b286a92b 100644 --- a/src/yunohost/utils/config.py +++ b/src/yunohost/utils/config.py @@ -52,7 +52,10 @@ CONFIG_PANEL_VERSION_SUPPORTED = 1.0 # Those js-like evaluate functions are used to eval safely visible attributes # The goal is to evaluate in the same way than js simple-evaluate # https://github.com/shepherdwind/simple-evaluate -def evaluate_simple_ast(node, context={}): +def evaluate_simple_ast(node, context=None): + if context is None: + context = {} + operators = { ast.Not: op.not_, ast.Mult: op.mul, From fa9365d5fa50aff9b94b3356492679fa19ad8dca Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Mon, 3 Jan 2022 16:28:35 +0100 Subject: [PATCH 242/619] Yolotweaking for the bullseye migration mecanism to also install, for example, php7.4-zip if an app is gonna need it --- .../0021_migrate_to_bullseye.py | 34 +++++++++++++++++-- 1 file changed, 31 insertions(+), 3 deletions(-) diff --git a/src/yunohost/data_migrations/0021_migrate_to_bullseye.py b/src/yunohost/data_migrations/0021_migrate_to_bullseye.py index f97ab16da..10f385c23 100644 --- a/src/yunohost/data_migrations/0021_migrate_to_bullseye.py +++ b/src/yunohost/data_migrations/0021_migrate_to_bullseye.py @@ -130,9 +130,37 @@ class MyMigration(Migration): os.system("apt update") - # Force explicit install of php7.4-fpm to make sure it's ll be there - # during 0022_php73_to_php74_pools migration - self.apt_install("php7.4-fpm -o Dpkg::Options::='--force-confmiss'") + # Force explicit install of php7.4-fpm and other old 'default' dependencies + # that are now only in Recommends + # + # Also, we need to install php7.4 equivalents of other php7.3 dependencies. + # For example, Nextcloud may depend on php7.3-zip, and after the php pool migration + # to autoupgrade Nextcloud to 7.4, it will need the php7.4-zip to work. + # The following list is based on an ad-hoc analysis of php deps found in the + # app ecosystem, with a known equivalent on php7.4. + # + # This is kinda a dirty hack as it doesnt properly update the *-ynh-deps virtual packages + # with the proper list of dependencies, and the dependencies install this way + # will get flagged as 'manually installed'. + # + # We'll probably want to do something during the Bullseye->Bookworm migration to re-flag + # these as 'auto' so they get autoremoved if not needed anymore. + # Also hopefully by then we'll have manifestv2 (maybe) and will be able to use + # the apt resource mecanism to regenerate the *-ynh-deps virtual packages ;) + + php73packages_suffixes = ['apcu', 'bcmath', 'bz2', 'dom', 'gmp', 'igbinary', 'imagick', 'imap', 'mbstring', 'memcached', 'mysqli', 'mysqlnd', 'pgsql', 'redis', 'simplexml', 'soap', 'sqlite3', 'ssh2', 'tidy', 'xml', 'xmlrpc', 'xsl', 'zip'] + + cmd = f""" + apt show '*-ynh-deps' 2>/dev/null + | grep Depends + | grep -o -E "php7.3-({'|'.join(php73packages_suffixes)})"; + | sort | uniq + | sed 's/php7.3/php7.4/g' + """ + php74packages_to_install = ["php7.4-fpm", "php7.4-common", "php7.4-ldap", "php7.4-intl", "php7.4-mysql", "php7.4-gd", "php7.4-curl", "php-php-gettext"] + php74packages_to_install += [f.strip() for f in check_output(cmd).split("\n") if f.strip()] + + self.apt_install("{' '.join(php74packages_to_install)} -o Dpkg::Options::='--force-confmiss'") # Remove legacy postgresql service record added by helpers, # will now be dynamically handled by the core in bullseye From e98ba46e4b740ee383a24653ed6db08b92eff104 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Mon, 3 Jan 2022 16:32:34 +0100 Subject: [PATCH 243/619] postinstall: don't skip migrate_to_bullseye migration when installing a fresh buster --- src/yunohost/tools.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/yunohost/tools.py b/src/yunohost/tools.py index 79c558b2d..0ed88d871 100644 --- a/src/yunohost/tools.py +++ b/src/yunohost/tools.py @@ -1045,6 +1045,10 @@ def _skip_all_migrations(): all_migrations = _get_migrations_list() new_states = {"migrations": {}} for migration in all_migrations: + # Don't skip bullseye migration while we're + # still on buster + if "migrate_to_bullseye" in migration.id: + continue new_states["migrations"][migration.id] = "skipped" write_to_yaml(MIGRATIONS_STATE_PATH, new_states) From 05b93aaaf1a9be736eae843cb60ca41258bb07af Mon Sep 17 00:00:00 2001 From: yunohost-bot Date: Mon, 3 Jan 2022 16:01:49 +0000 Subject: [PATCH 244/619] [CI] Format code with Black --- src/yunohost/app.py | 2 +- .../data_migrations/0018_xtable_to_nftable.py | 8 ++-- .../0021_migrate_to_bullseye.py | 45 +++++++++++++++++-- src/yunohost/domain.py | 8 +--- src/yunohost/tools.py | 4 +- src/yunohost/user.py | 4 +- 6 files changed, 50 insertions(+), 21 deletions(-) diff --git a/src/yunohost/app.py b/src/yunohost/app.py index ca56be232..d6bb5d92f 100644 --- a/src/yunohost/app.py +++ b/src/yunohost/app.py @@ -627,7 +627,7 @@ def app_upgrade(app=[], url=None, file=None, force=False, no_safety_backup=False if upgrade_failed or broke_the_system: # display this if there are remaining apps - if apps[number + 1:]: + if apps[number + 1 :]: not_upgraded_apps = apps[number:] logger.error( m18n.n( diff --git a/src/yunohost/data_migrations/0018_xtable_to_nftable.py b/src/yunohost/data_migrations/0018_xtable_to_nftable.py index 374620f2f..ae20354d7 100644 --- a/src/yunohost/data_migrations/0018_xtable_to_nftable.py +++ b/src/yunohost/data_migrations/0018_xtable_to_nftable.py @@ -41,8 +41,8 @@ class MyMigration(Migration): ) # For some reason if we don't do this, iptables-legacy-save is empty ? self.runcmd("iptables-legacy-save > %s" % self.backup_rules_ipv4) assert ( - os.path.exists(self.backup_rules_ipv4) and - os.stat(self.backup_rules_ipv4).st_size > 0 + os.path.exists(self.backup_rules_ipv4) + and os.stat(self.backup_rules_ipv4).st_size > 0 ), "Uhoh backup of legacy ipv4 rules is empty !?" if self.do_ipv6 and not os.path.exists(self.backup_rules_ipv6): self.runcmd( @@ -50,8 +50,8 @@ class MyMigration(Migration): ) # For some reason if we don't do this, iptables-legacy-save is empty ? self.runcmd("ip6tables-legacy-save > %s" % self.backup_rules_ipv6) assert ( - os.path.exists(self.backup_rules_ipv6) and - os.stat(self.backup_rules_ipv6).st_size > 0 + os.path.exists(self.backup_rules_ipv6) + and os.stat(self.backup_rules_ipv6).st_size > 0 ), "Uhoh backup of legacy ipv6 rules is empty !?" # We inject the legacy rules (iptables-legacy) into the new iptable (just "iptables") diff --git a/src/yunohost/data_migrations/0021_migrate_to_bullseye.py b/src/yunohost/data_migrations/0021_migrate_to_bullseye.py index 10f385c23..717be4e15 100644 --- a/src/yunohost/data_migrations/0021_migrate_to_bullseye.py +++ b/src/yunohost/data_migrations/0021_migrate_to_bullseye.py @@ -148,7 +148,31 @@ class MyMigration(Migration): # Also hopefully by then we'll have manifestv2 (maybe) and will be able to use # the apt resource mecanism to regenerate the *-ynh-deps virtual packages ;) - php73packages_suffixes = ['apcu', 'bcmath', 'bz2', 'dom', 'gmp', 'igbinary', 'imagick', 'imap', 'mbstring', 'memcached', 'mysqli', 'mysqlnd', 'pgsql', 'redis', 'simplexml', 'soap', 'sqlite3', 'ssh2', 'tidy', 'xml', 'xmlrpc', 'xsl', 'zip'] + php73packages_suffixes = [ + "apcu", + "bcmath", + "bz2", + "dom", + "gmp", + "igbinary", + "imagick", + "imap", + "mbstring", + "memcached", + "mysqli", + "mysqlnd", + "pgsql", + "redis", + "simplexml", + "soap", + "sqlite3", + "ssh2", + "tidy", + "xml", + "xmlrpc", + "xsl", + "zip", + ] cmd = f""" apt show '*-ynh-deps' 2>/dev/null @@ -157,10 +181,23 @@ class MyMigration(Migration): | sort | uniq | sed 's/php7.3/php7.4/g' """ - php74packages_to_install = ["php7.4-fpm", "php7.4-common", "php7.4-ldap", "php7.4-intl", "php7.4-mysql", "php7.4-gd", "php7.4-curl", "php-php-gettext"] - php74packages_to_install += [f.strip() for f in check_output(cmd).split("\n") if f.strip()] + php74packages_to_install = [ + "php7.4-fpm", + "php7.4-common", + "php7.4-ldap", + "php7.4-intl", + "php7.4-mysql", + "php7.4-gd", + "php7.4-curl", + "php-php-gettext", + ] + php74packages_to_install += [ + f.strip() for f in check_output(cmd).split("\n") if f.strip() + ] - self.apt_install("{' '.join(php74packages_to_install)} -o Dpkg::Options::='--force-confmiss'") + self.apt_install( + "{' '.join(php74packages_to_install)} -o Dpkg::Options::='--force-confmiss'" + ) # Remove legacy postgresql service record added by helpers, # will now be dynamically handled by the core in bullseye diff --git a/src/yunohost/domain.py b/src/yunohost/domain.py index d1ea45a08..7c512106a 100644 --- a/src/yunohost/domain.py +++ b/src/yunohost/domain.py @@ -517,9 +517,7 @@ def domain_cert_install( ): from yunohost.certificate import certificate_install - return certificate_install( - domain_list, force, no_checks, self_signed, staging - ) + return certificate_install(domain_list, force, no_checks, self_signed, staging) def domain_cert_renew( @@ -527,9 +525,7 @@ def domain_cert_renew( ): from yunohost.certificate import certificate_renew - return certificate_renew( - domain_list, force, no_checks, email, staging - ) + return certificate_renew(domain_list, force, no_checks, email, staging) def domain_dns_conf(domain): diff --git a/src/yunohost/tools.py b/src/yunohost/tools.py index 0ed88d871..c2014b466 100644 --- a/src/yunohost/tools.py +++ b/src/yunohost/tools.py @@ -244,9 +244,7 @@ def tools_postinstall( # and inform the user that we could not contact the dyndns host server. except Exception: logger.warning( - m18n.n( - "dyndns_provider_unreachable", provider="dyndns.yunohost.org" - ) + m18n.n("dyndns_provider_unreachable", provider="dyndns.yunohost.org") ) if available: diff --git a/src/yunohost/user.py b/src/yunohost/user.py index a27fffbee..64249e9d0 100644 --- a/src/yunohost/user.py +++ b/src/yunohost/user.py @@ -1265,9 +1265,7 @@ def user_group_remove(groupname, usernames, force=False, sync_perm=True): def user_permission_list(short=False, full=False, apps=[]): from yunohost.permission import user_permission_list - return user_permission_list( - short, full, absolute_urls=True, apps=apps - ) + return user_permission_list(short, full, absolute_urls=True, apps=apps) def user_permission_update(permission, label=None, show_tile=None, sync_perm=True): From 63a84f53981a379a7cbecc706fc703fa88c40484 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Mon, 3 Jan 2022 20:02:56 +0100 Subject: [PATCH 245/619] dyndns: replace dnssec-keygen and nsupdate with python code, drop legacy md5 stuff, drop unecessary dyndns 'private' key --- debian/control | 2 +- hooks/conf_regen/01-yunohost | 2 +- src/dyndns.py | 101 +++++++++++++++++------------------ 3 files changed, 51 insertions(+), 54 deletions(-) diff --git a/debian/control b/debian/control index 31204a180..65bb0b529 100644 --- a/debian/control +++ b/debian/control @@ -18,7 +18,7 @@ Depends: ${python3:Depends}, ${misc:Depends} , python-is-python3 , nginx, nginx-extras (>=1.18) , apt, apt-transport-https, apt-utils, dirmngr - , openssh-server, iptables, fail2ban, dnsutils, bind9utils + , openssh-server, iptables, fail2ban, bind9-dnsutils , openssl, ca-certificates, netcat-openbsd, iproute2 , slapd, ldap-utils, sudo-ldap, libnss-ldapd, unscd, libpam-ldapd , dnsmasq, resolvconf, libnss-myhostname diff --git a/hooks/conf_regen/01-yunohost b/hooks/conf_regen/01-yunohost index 14840e2f1..1f6c143a6 100755 --- a/hooks/conf_regen/01-yunohost +++ b/hooks/conf_regen/01-yunohost @@ -109,7 +109,7 @@ EOF # If we subscribed to a dyndns domain, add the corresponding cron # - delay between 0 and 60 secs to spread the check over a 1 min window # - do not run the command if some process already has the lock, to avoid queuing hundreds of commands... - if ls -l /etc/yunohost/dyndns/K*.private 2>/dev/null; then + if ls -l /etc/yunohost/dyndns/K*.key 2>/dev/null; then cat >$pending_dir/etc/cron.d/yunohost-dyndns <[^\s\+]+)\.\+157.+\.private$") - -RE_DYNDNS_PRIVATE_KEY_SHA512 = re.compile( - r".*/K(?P[^\s\+]+)\.\+165.+\.private$" -) - DYNDNS_PROVIDER = "dyndns.yunohost.org" DYNDNS_DNS_AUTH = ["ns0.yunohost.org", "ns1.yunohost.org"] @@ -111,6 +103,10 @@ def dyndns_subscribe(operation_logger, domain=None, key=None): operation_logger.start() + # '165' is the convention identifier for hmac-sha512 algorithm + # '1234' is idk? doesnt matter, but the old format contained a number here... + key_file = f"/etc/yunohost/dyndns/K{domain}.+165+1234.key" + if key is None: if len(glob.glob("/etc/yunohost/dyndns/*.key")) == 0: if not os.path.exists("/etc/yunohost/dyndns"): @@ -118,35 +114,39 @@ def dyndns_subscribe(operation_logger, domain=None, key=None): logger.debug(m18n.n("dyndns_key_generating")) - os.system( - "cd /etc/yunohost/dyndns && " - f"dnssec-keygen -a hmac-sha512 -b 512 -r /dev/urandom -n USER {domain}" - ) + # Here, we emulate the behavior of the old 'dnssec-keygen' utility + # which since bullseye was replaced by ddns-keygen which is now + # in the bind9 package ... but installing bind9 will conflict with dnsmasq + # and is just madness just to have access to a tsig keygen utility -.- + + # Use 512 // 8 = 64 bytes for hmac-sha512 (c.f. https://git.hactrn.net/sra/tsig-keygen/src/master/tsig-keygen.py) + secret = base64.b64encode(os.urandom(512 // 8)).decode("ascii") + + # Idk why but the secret is split in two parts, with the first one + # being 57-long char ... probably some DNS format + secret = f"{secret[:56]} {secret[56:]}" + + key_content = f"{domain}. IN KEY 0 3 165 {secret}" + write_to_file(key_file, key_content) chmod("/etc/yunohost/dyndns", 0o600, recursive=True) chown("/etc/yunohost/dyndns", "root", recursive=True) - private_file = glob.glob("/etc/yunohost/dyndns/*%s*.private" % domain)[0] - key_file = glob.glob("/etc/yunohost/dyndns/*%s*.key" % domain)[0] - with open(key_file) as f: - key = f.readline().strip().split(" ", 6)[-1] - import requests # lazy loading this module for performance reasons # Send subscription try: - b64encoded_key = base64.b64encode(key.encode()).decode() + # Yeah the secret is already a base64-encoded but we double-bas64-encode it, whatever... + b64encoded_key = base64.b64encode(secret.encode()).decode() r = requests.post( f"https://{DYNDNS_PROVIDER}/key/{b64encoded_key}?key_algo=hmac-sha512", data={"subdomain": domain}, timeout=30, ) except Exception as e: - rm(private_file, force=True) rm(key_file, force=True) raise YunohostError("dyndns_registration_failed", error=str(e)) if r.status_code != 201: - rm(private_file, force=True) rm(key_file, force=True) try: error = json.loads(r.text)["error"] @@ -154,7 +154,7 @@ def dyndns_subscribe(operation_logger, domain=None, key=None): error = f'Server error, code: {r.status_code}. (Message: "{r.text}")' raise YunohostError("dyndns_registration_failed", error=error) - # Yunohost regen conf will add the dyndns cron job if a private key exists + # Yunohost regen conf will add the dyndns cron job if a key exists # in /etc/yunohost/dyndns regen_conf(["yunohost"]) @@ -185,6 +185,11 @@ def dyndns_update( """ from yunohost.dns import _build_dns_conf + import dns.query + import dns.tsig + import dns.tsigkeyring + import dns.update + # If domain is not given, try to guess it from keys available... key = None @@ -196,7 +201,7 @@ def dyndns_update( # If key is not given, pick the first file we find with the domain given elif key is None: - keys = glob.glob(f"/etc/yunohost/dyndns/K{domain}.+*.private") + keys = glob.glob(f"/etc/yunohost/dyndns/K{domain}.+*.key") if not keys: raise YunohostValidationError("dyndns_key_not_found") @@ -217,12 +222,14 @@ def dyndns_update( host = domain.split(".")[1:] host = ".".join(host) - logger.debug("Building zone update file ...") + logger.debug("Building zone update ...") - lines = [ - f"server {DYNDNS_PROVIDER}", - f"zone {host}", - ] + with open(key) as f: + key = f.readline().strip().split(" ", 6)[-1] + + keyring = dns.tsigkeyring.from_text({f'{domain}.': key}) + # Python's dns.update is similar to the old nsupdate cli tool + update = dns.update.Update(domain, keyring=keyring, keyalgorithm=dns.tsig.HMAC_SHA512) auth_resolvers = [] @@ -293,9 +300,8 @@ def dyndns_update( # [{"name": "...", "ttl": "...", "type": "...", "value": "..."}] for records in dns_conf.values(): for record in records: - action = "update delete {name}.{domain}.".format(domain=domain, **record) - action = action.replace(" @.", " ") - lines.append(action) + name = f"{record['name']}.{domain}." if record['name'] != "@" else f"{domain}." + update.delete(name) # Add the new records for all domain/subdomains @@ -307,32 +313,22 @@ def dyndns_update( if record["value"] == "@": record["value"] = domain record["value"] = record["value"].replace(";", r"\;") + name = f"{record['name']}.{domain}." if record['name'] != "@" else f"{domain}." - action = "update add {name}.{domain}. {ttl} {type} {value}".format( - domain=domain, **record - ) - action = action.replace(" @.", " ") - lines.append(action) - - lines += ["show", "send"] - - # Write the actions to do to update to a file, to be able to pass it - # to nsupdate as argument - write_to_file(DYNDNS_ZONE, "\n".join(lines)) + update.add(name, record['ttl'], record['type'], record['value']) logger.debug("Now pushing new conf to DynDNS host...") + logger.debug(update) if not dry_run: try: - command = ["/usr/bin/nsupdate", "-k", key, DYNDNS_ZONE] - subprocess.check_call(command) - except subprocess.CalledProcessError: + dns.query.tcp(update, auth_resolvers[0]) + except Exception as e: + logger.error(e) raise YunohostError("dyndns_ip_update_failed") logger.success(m18n.n("dyndns_ip_updated")) else: - print(read_file(DYNDNS_ZONE)) - print("") print( "Warning: dry run, this is only the generated config, it won't be applied" ) @@ -347,15 +343,16 @@ def _guess_current_dyndns_domain(): dynette...) """ + DYNDNS_KEY_REGEX = re.compile( + r".*/K(?P[^\s\+]+)\.\+165.+\.key$" + ) + # Retrieve the first registered domain - paths = list(glob.iglob("/etc/yunohost/dyndns/K*.private")) + paths = list(glob.iglob("/etc/yunohost/dyndns/K*.key")) for path in paths: - # MD5 is legacy ugh - match = RE_DYNDNS_PRIVATE_KEY_MD5.match(path) + match = DYNDNS_KEY_REGEX.match(path) if not match: - match = RE_DYNDNS_PRIVATE_KEY_SHA512.match(path) - if not match: - continue + continue _domain = match.group("domain") # Verify if domain is registered (i.e., if it's available, skip From e12a0153bbc01be4c9098b5211e4262ca0e19baa Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Mon, 3 Jan 2022 20:07:32 +0100 Subject: [PATCH 246/619] Unused imports --- src/tools.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tools.py b/src/tools.py index a1e90daa9..259426a20 100644 --- a/src/tools.py +++ b/src/tools.py @@ -33,7 +33,7 @@ from typing import List from moulinette import Moulinette, m18n from moulinette.utils.log import getActionLogger -from moulinette.utils.process import check_output, call_async_output +from moulinette.utils.process import call_async_output from moulinette.utils.filesystem import read_yaml, write_to_yaml, cp, mkdir, rm from yunohost.app import ( From 620da53fe79442d0ef8bf7264ba2fba9c6be6bca Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Mon, 3 Jan 2022 20:14:36 +0100 Subject: [PATCH 247/619] postfix: move postmap to post regenconf, because the postfix user must be able to access the file, and cant anymore during pre because we moved the pending regenconf folder elsewhere --- hooks/conf_regen/19-postfix | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hooks/conf_regen/19-postfix b/hooks/conf_regen/19-postfix index 4a7325c41..e18243508 100755 --- a/hooks/conf_regen/19-postfix +++ b/hooks/conf_regen/19-postfix @@ -42,7 +42,6 @@ do_pre_regen() { chown postfix ${pending_dir}/etc/postfix/sasl_passwd cat <<<"[${relay_host}]:${relay_port} ${relay_user}:${relay_password}" >${postfix_dir}/sasl_passwd - postmap ${postfix_dir}/sasl_passwd fi export main_domain export domain_list="$YNH_DOMAINS" @@ -71,6 +70,7 @@ do_post_regen() { if [ -e /etc/postfix/sasl_passwd ]; then chmod 750 /etc/postfix/sasl_passwd* chown postfix:root /etc/postfix/sasl_passwd* + postmap /etc/postfix/sasl_passwd fi [[ -z "$regen_conf_files" ]] \ From 017de77405b0c4c93d263410c6ee14397349d92f Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Mon, 3 Jan 2022 20:20:27 +0100 Subject: [PATCH 248/619] debian/mdns: require python3-zeroconf >= 0.36 --- debian/control | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/debian/control b/debian/control index 65bb0b529..6e059231a 100644 --- a/debian/control +++ b/debian/control @@ -14,7 +14,7 @@ Depends: ${python3:Depends}, ${misc:Depends} , python3-psutil, python3-requests, python3-dnspython, python3-openssl , python3-miniupnpc, python3-dbus, python3-jinja2 , python3-toml, python3-packaging, python3-publicsuffix2 - , python3-ldap, python3-zeroconf, python3-lexicon, + , python3-ldap, python3-zeroconf (>= 0.36), python3-lexicon, , python-is-python3 , nginx, nginx-extras (>=1.18) , apt, apt-transport-https, apt-utils, dirmngr From 8321642a34445b35bf19dcf729b0e22e48fc1511 Mon Sep 17 00:00:00 2001 From: Kay0u Date: Tue, 4 Jan 2022 17:41:06 +0100 Subject: [PATCH 249/619] Add codequality --- .gitlab-ci.yml | 14 +++++++++++++- .gitlab/ci/test.gitlab-ci.yml | 4 ++-- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 8403cb8e8..43afb7d4e 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -2,7 +2,7 @@ stages: - build - install - - tests + - test - lint - doc - translation @@ -13,6 +13,17 @@ default: # All jobs are interruptible by default interruptible: true +code_quality: + tags: + - docker + +code_quality_html: + extends: code_quality + variables: + REPORT_FORMAT: html + artifacts: + paths: [gl-code-quality-report.html] + # see: https://docs.gitlab.com/ee/ci/yaml/#switch-between-branch-pipelines-and-merge-request-pipelines workflow: rules: @@ -29,4 +40,5 @@ variables: YNH_BUILD_DIR: "ynh-build" include: + - template: Code-Quality.gitlab-ci.yml - local: .gitlab/ci/*.gitlab-ci.yml diff --git a/.gitlab/ci/test.gitlab-ci.yml b/.gitlab/ci/test.gitlab-ci.yml index 1aad46fbe..64ca65d13 100644 --- a/.gitlab/ci/test.gitlab-ci.yml +++ b/.gitlab/ci/test.gitlab-ci.yml @@ -3,7 +3,7 @@ - DEBIAN_FRONTEND=noninteractive SUDO_FORCE_REMOVE=yes apt --assume-yes -o Dpkg::Options::="--force-confold" --allow-downgrades install ./$YNH_BUILD_DIR/*.deb .test-stage: - stage: tests + stage: test image: "after-install" variables: PYTEST_ADDOPTS: "--color=yes" @@ -28,7 +28,7 @@ ######################################## full-tests: - stage: tests + stage: test image: "before-install" variables: PYTEST_ADDOPTS: "--color=yes" From 816c503d3af888cdb59988d64181a2d1a57a9307 Mon Sep 17 00:00:00 2001 From: Kay0u Date: Tue, 4 Jan 2022 17:59:37 +0100 Subject: [PATCH 250/619] add codeclimate file --- .codeclimate.yml | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 .codeclimate.yml diff --git a/.codeclimate.yml b/.codeclimate.yml new file mode 100644 index 000000000..73707650c --- /dev/null +++ b/.codeclimate.yml @@ -0,0 +1,22 @@ +--- +version: "2" +plugins: + duplication: + enabled: true + config: + languages: + python: + python_version: 3 + shellcheck: + enabled: true + pep8: + enabled: true + sonar-python: + enabled: true + config: + tests_patterns: + - bin/* + - data/** + - doc/* + - src/** + - tests/** \ No newline at end of file From 4a377bbf23ee65fd31d2cd2f6bbb375438056b4c Mon Sep 17 00:00:00 2001 From: Kay0u Date: Tue, 4 Jan 2022 18:05:24 +0100 Subject: [PATCH 251/619] add fixme plugin --- .codeclimate.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.codeclimate.yml b/.codeclimate.yml index 73707650c..453396f07 100644 --- a/.codeclimate.yml +++ b/.codeclimate.yml @@ -11,6 +11,8 @@ plugins: enabled: true pep8: enabled: true + fixme: + enabled: true sonar-python: enabled: true config: From 0973301b0f5d072657969befbd4744e11c89c773 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Tue, 4 Jan 2022 20:09:48 +0100 Subject: [PATCH 252/619] ynh_add_config: crons should be owned by root, otherwise they probably don't run? --- data/helpers.d/utils | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/data/helpers.d/utils b/data/helpers.d/utils index 8b7179289..6929e3f95 100644 --- a/data/helpers.d/utils +++ b/data/helpers.d/utils @@ -967,4 +967,11 @@ _ynh_apply_default_permissions() { chown $app:$app $target fi fi + + # Crons should be owned by root otherwise they probably don't run + if echo "$target" | grep -q '^/etc/cron' + then + chmod 400 $target + chown root:root $target + fi } From 3cc1a0a59df905cab69444f4635d0bf875c64bd2 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Wed, 5 Jan 2022 17:44:15 +0100 Subject: [PATCH 253/619] tools_upgrade: filter more boring apt messages --- src/yunohost/tools.py | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/yunohost/tools.py b/src/yunohost/tools.py index c2014b466..c825ca2ef 100644 --- a/src/yunohost/tools.py +++ b/src/yunohost/tools.py @@ -571,8 +571,18 @@ def tools_upgrade( irrelevants = [ "service sudo-ldap already provided", "Reading database ...", + "Preparing to unpack", + "Selecting previously unselected package", + "Created symlink /etc/systemd", + "Replacing config file", + "Creating config file", + "Installing new version of config file", + "Installing new config file as you requested", + ", does not exist on system.", + "unable to delete old directory", + "update-alternatives:", ] - return all(i not in line.rstrip() for i in irrelevants) + return line.rstrip() and all(i not in line.rstrip() for i in irrelevants) callbacks = ( lambda l: logger.info("+ " + l.rstrip() + "\r") From 17ad3c8581e3d0612132eddf541b1fab3c046510 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Wed, 5 Jan 2022 17:45:23 +0100 Subject: [PATCH 254/619] migrate_to_bullseye: fix typo + reorganize a couple steps --- .../0021_migrate_to_bullseye.py | 63 +++++++++---------- 1 file changed, 31 insertions(+), 32 deletions(-) diff --git a/src/yunohost/data_migrations/0021_migrate_to_bullseye.py b/src/yunohost/data_migrations/0021_migrate_to_bullseye.py index 717be4e15..d26eede88 100644 --- a/src/yunohost/data_migrations/0021_migrate_to_bullseye.py +++ b/src/yunohost/data_migrations/0021_migrate_to_bullseye.py @@ -97,23 +97,6 @@ class MyMigration(Migration): os.system("mv /home/yunohost.conf /var/cache/yunohost/regenconf") rm("/home/yunohost.conf", recursive=True, force=True) - # - # Main upgrade - # - logger.info(m18n.n("migration_0021_main_upgrade")) - - apps_packages = self.get_apps_equivs_packages() - self.hold(apps_packages) - tools_upgrade(target="system", allow_yunohost_upgrade=False) - - if self.debian_major_version() == N_CURRENT_DEBIAN: - raise YunohostError("migration_0021_still_on_buster_after_main_upgrade") - - # Clean the mess - logger.info(m18n.n("migration_0021_cleaning_up")) - os.system("apt autoremove --assume-yes") - os.system("apt clean --assume-yes") - # Force add sury if it's not there yet # This is to solve some weird issue with php-common breaking php7.3-common, # hence breaking many php7.3-deps @@ -128,7 +111,24 @@ class MyMigration(Migration): 'wget --timeout 900 --quiet "https://packages.sury.org/php/apt.gpg" --output-document=- | gpg --dearmor >"/etc/apt/trusted.gpg.d/extra_php_version.gpg"' ) - os.system("apt update") + # Remove legacy postgresql service record added by helpers, + # will now be dynamically handled by the core in bullseye + services = _get_services() + if "postgresql" in services: + del services["postgresql"] + _save_services(services) + + # + # Main upgrade + # + logger.info(m18n.n("migration_0021_main_upgrade")) + + apps_packages = self.get_apps_equivs_packages() + self.hold(apps_packages) + tools_upgrade(target="system", allow_yunohost_upgrade=False) + + if self.debian_major_version() == N_CURRENT_DEBIAN: + raise YunohostError("migration_0021_still_on_buster_after_main_upgrade") # Force explicit install of php7.4-fpm and other old 'default' dependencies # that are now only in Recommends @@ -174,13 +174,13 @@ class MyMigration(Migration): "zip", ] - cmd = f""" - apt show '*-ynh-deps' 2>/dev/null - | grep Depends - | grep -o -E "php7.3-({'|'.join(php73packages_suffixes)})"; - | sort | uniq - | sed 's/php7.3/php7.4/g' - """ + cmd = "apt show '*-ynh-deps' 2>/dev/null" \ + " | grep Depends" \ + f" | grep -o -E \"php7.3-({'|'.join(php73packages_suffixes)})\"" \ + " | sort | uniq" \ + " | sed 's/php7.3/php7.4/g'" \ + " || true" + php74packages_to_install = [ "php7.4-fpm", "php7.4-common", @@ -191,20 +191,19 @@ class MyMigration(Migration): "php7.4-curl", "php-php-gettext", ] + php74packages_to_install += [ f.strip() for f in check_output(cmd).split("\n") if f.strip() ] self.apt_install( - "{' '.join(php74packages_to_install)} -o Dpkg::Options::='--force-confmiss'" + f"{' '.join(php74packages_to_install)} -o Dpkg::Options::='--force-confmiss'" ) - # Remove legacy postgresql service record added by helpers, - # will now be dynamically handled by the core in bullseye - services = _get_services() - if "postgresql" in services: - del services["postgresql"] - _save_services(services) + # Clean the mess + logger.info(m18n.n("migration_0021_cleaning_up")) + os.system("apt autoremove --assume-yes") + os.system("apt clean --assume-yes") # # Yunohost upgrade From fa163cbc2e44a5c54ac7d48adff7c573da6c2b30 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Wed, 5 Jan 2022 19:50:50 +0100 Subject: [PATCH 255/619] migrate_to_bullseye: zblerg, more constrains to not yoloremove app-ynh-deps ... --- .../0021_migrate_to_bullseye.py | 34 +++++++++++++--- src/yunohost/tools.py | 39 ++++++++++--------- 2 files changed, 48 insertions(+), 25 deletions(-) diff --git a/src/yunohost/data_migrations/0021_migrate_to_bullseye.py b/src/yunohost/data_migrations/0021_migrate_to_bullseye.py index d26eede88..153081916 100644 --- a/src/yunohost/data_migrations/0021_migrate_to_bullseye.py +++ b/src/yunohost/data_migrations/0021_migrate_to_bullseye.py @@ -7,7 +7,7 @@ from moulinette.utils.log import getActionLogger from moulinette.utils.process import check_output, call_async_output from moulinette.utils.filesystem import read_file, rm -from yunohost.tools import Migration, tools_update, tools_upgrade +from yunohost.tools import Migration, tools_update, tools_upgrade, _apt_log_line_is_relevant from yunohost.app import unstable_apps from yunohost.regenconf import manually_modified_files, _force_clear_hashes from yunohost.utils.filesystem import free_space_in_directory @@ -77,9 +77,12 @@ class MyMigration(Migration): _force_clear_hashes(["/etc/mysql/my.cnf"]) rm("/etc/mysql/mariadb.cnf", force=True) rm("/etc/mysql/my.cnf", force=True) - self.apt_install( + ret = self.apt_install( "mariadb-common --reinstall -o Dpkg::Options::='--force-confmiss'" ) + if ret != 0: + # FIXME: i18n once this is stable? + raise YunohostError("Failed to reinstall mariadb-common ?", raw_msg=True) # # /usr/share/yunohost/yunohost-config/ssl/yunoCA -> /usr/share/yunohost/ssl @@ -196,9 +199,12 @@ class MyMigration(Migration): f.strip() for f in check_output(cmd).split("\n") if f.strip() ] - self.apt_install( + ret = self.apt_install( f"{' '.join(php74packages_to_install)} -o Dpkg::Options::='--force-confmiss'" ) + if ret != 0: + # FIXME: i18n once this is stable? + raise YunohostError("Failed to force the install of php dependencies ?", raw_msg=True) # Clean the mess logger.info(m18n.n("migration_0021_cleaning_up")) @@ -209,7 +215,21 @@ class MyMigration(Migration): # Yunohost upgrade # logger.info(m18n.n("migration_0021_yunohost_upgrade")) + self.unhold(apps_packages) + + cmd = "LC_ALL=C" + cmd += " DEBIAN_FRONTEND=noninteractive" + cmd += " APT_LISTCHANGES_FRONTEND=none" + cmd += " apt dist-upgrade " + cmd += " --quiet -o=Dpkg::Use-Pty=0 --fix-broken --dry-run" + cmd += " | grep -q '-ynh-deps'" + + logger.info("Simulating upgrade...") + if os.system(cmd) == 0: + # FIXME: i18n once this is stable? + raise YunohostError("The upgrade cannot be completed, because some app dependencies would need to be removed?", raw_msg=True) + tools_upgrade(target="system") def debian_major_version(self): @@ -344,9 +364,11 @@ class MyMigration(Migration): callbacks = ( lambda l: logger.info("+ " + l.rstrip() + "\r") - if is_relevant(l) + if _apt_log_line_is_relevant(l) else logger.debug(l.rstrip() + "\r"), - lambda l: logger.warning(l.rstrip()), + lambda l: logger.warning(l.rstrip()) + if _apt_log_line_is_relevant(l) + else logger.debug(l.rstrip()), ) cmd = ( @@ -356,7 +378,7 @@ class MyMigration(Migration): logger.debug("Running: %s" % cmd) - call_async_output(cmd, callbacks, shell=True) + return call_async_output(cmd, callbacks, shell=True) def patch_yunohost_conflicts(self): # diff --git a/src/yunohost/tools.py b/src/yunohost/tools.py index c825ca2ef..021a8f3a1 100644 --- a/src/yunohost/tools.py +++ b/src/yunohost/tools.py @@ -567,29 +567,12 @@ def tools_upgrade( logger.debug("Running apt command :\n{}".format(dist_upgrade)) - def is_relevant(line): - irrelevants = [ - "service sudo-ldap already provided", - "Reading database ...", - "Preparing to unpack", - "Selecting previously unselected package", - "Created symlink /etc/systemd", - "Replacing config file", - "Creating config file", - "Installing new version of config file", - "Installing new config file as you requested", - ", does not exist on system.", - "unable to delete old directory", - "update-alternatives:", - ] - return line.rstrip() and all(i not in line.rstrip() for i in irrelevants) - callbacks = ( lambda l: logger.info("+ " + l.rstrip() + "\r") - if is_relevant(l) + if _apt_log_line_is_relevant(l) else logger.debug(l.rstrip() + "\r"), lambda l: logger.warning(l.rstrip()) - if is_relevant(l) + if _apt_log_line_is_relevant(l) else logger.debug(l.rstrip()), ) returncode = call_async_output(dist_upgrade, callbacks, shell=True) @@ -689,6 +672,24 @@ def tools_upgrade( operation_logger.success() +def _apt_log_line_is_relevant(line): + irrelevants = [ + "service sudo-ldap already provided", + "Reading database ...", + "Preparing to unpack", + "Selecting previously unselected package", + "Created symlink /etc/systemd", + "Replacing config file", + "Creating config file", + "Installing new version of config file", + "Installing new config file as you requested", + ", does not exist on system.", + "unable to delete old directory", + "update-alternatives:", + ] + return line.rstrip() and all(i not in line.rstrip() for i in irrelevants) + + @is_unit_operation() def tools_shutdown(operation_logger, force=False): shutdown = force From b5e04df39800a1c4754766439d0ebfa7a641ee36 Mon Sep 17 00:00:00 2001 From: Tagada <36127788+Tagadda@users.noreply.github.com> Date: Thu, 6 Jan 2022 11:50:10 +0100 Subject: [PATCH 256/619] [fix] Force install certificate on yunohost domain add --- src/yunohost/domain.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/yunohost/domain.py b/src/yunohost/domain.py index 7c512106a..21787ea36 100644 --- a/src/yunohost/domain.py +++ b/src/yunohost/domain.py @@ -187,7 +187,7 @@ def domain_add(operation_logger, domain, dyndns=False): # Actually subscribe dyndns_subscribe(domain=domain) - _certificate_install_selfsigned([domain], False) + _certificate_install_selfsigned([domain], True) try: attr_dict = { From 2b3138ef8027ed13db301e88d3341fc162d7d80c Mon Sep 17 00:00:00 2001 From: Kayou Date: Thu, 6 Jan 2022 17:37:05 +0100 Subject: [PATCH 257/619] remove args for metadata (#1405) * remove args for metadata * Add explanation for removing 'args' from log metadata Co-authored-by: Alexandre Aubin --- src/yunohost/log.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/yunohost/log.py b/src/yunohost/log.py index d28a35e18..9f9e0b753 100644 --- a/src/yunohost/log.py +++ b/src/yunohost/log.py @@ -659,6 +659,11 @@ class OperationLogger: data["error"] = self._error # TODO: detect if 'extra' erase some key of 'data' data.update(self.extra) + # Remove the 'args' arg from args (yodawg). It corresponds to url-encoded args for app install, config panel set, etc + # Because the data are url encoded, it's hell to properly redact secrets inside it, + # and the useful info is usually already available in `env` too + if "args" in data and isinstance(data["args"], dict) and "args" in data["args"]: + data["args"].pop("args") return data def success(self): From 607fad210593e756f37de8ed053f4f4d65080485 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Fri, 7 Jan 2022 00:54:57 +0100 Subject: [PATCH 258/619] Sury has a crazy new amount of php-* packages that depend on specific versions of php, we shall ban them or it creates a frakin mess --- data/hooks/conf_regen/10-apt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/hooks/conf_regen/10-apt b/data/hooks/conf_regen/10-apt index da0620e59..2b3ae006f 100755 --- a/data/hooks/conf_regen/10-apt +++ b/data/hooks/conf_regen/10-apt @@ -7,7 +7,7 @@ do_pre_regen() { mkdir --parents "${pending_dir}/etc/apt/preferences.d" - packages_to_refuse_from_sury="php php-fpm php-mysql php-xml php-zip php-mbstring php-ldap php-gd php-curl php-bz2 php-json php-sqlite3 php-intl openssl libssl1.1 libssl-dev" + packages_to_refuse_from_sury="php php-* openssl libssl1.1 libssl-dev" for package in $packages_to_refuse_from_sury; do echo " Package: $package From 79c70b76298688a404a3f89555a97abe5a36c04c Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Fri, 7 Jan 2022 01:01:19 +0100 Subject: [PATCH 259/619] migrate_to_bullseye: add the list of app-ynh-deps in the php7.4 install trick, because that seem to solve some stupid dependency blocage issues... --- src/yunohost/data_migrations/0021_migrate_to_bullseye.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/yunohost/data_migrations/0021_migrate_to_bullseye.py b/src/yunohost/data_migrations/0021_migrate_to_bullseye.py index 153081916..9ec8dc17d 100644 --- a/src/yunohost/data_migrations/0021_migrate_to_bullseye.py +++ b/src/yunohost/data_migrations/0021_migrate_to_bullseye.py @@ -200,7 +200,9 @@ class MyMigration(Migration): ] ret = self.apt_install( - f"{' '.join(php74packages_to_install)} -o Dpkg::Options::='--force-confmiss'" + f"{' '.join(php74packages_to_install)} " + "$(dpkg --list | grep ynh-deps | awk '{print $2}') " + "-o Dpkg::Options::='--force-confmiss'" ) if ret != 0: # FIXME: i18n once this is stable? From 9cfbbd122b341eb53dde43f90c2e877024fa3287 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Fri, 7 Jan 2022 02:26:18 +0100 Subject: [PATCH 260/619] migrate_to_bullseye: add sury before running apt update otherwise we end up in an inconsistent state --- .../0021_migrate_to_bullseye.py | 33 +++++++++++-------- 1 file changed, 19 insertions(+), 14 deletions(-) diff --git a/src/yunohost/data_migrations/0021_migrate_to_bullseye.py b/src/yunohost/data_migrations/0021_migrate_to_bullseye.py index 9ec8dc17d..8f15019e9 100644 --- a/src/yunohost/data_migrations/0021_migrate_to_bullseye.py +++ b/src/yunohost/data_migrations/0021_migrate_to_bullseye.py @@ -50,6 +50,25 @@ class MyMigration(Migration): # logger.info(m18n.n("migration_0021_patching_sources_list")) self.patch_apt_sources_list() + + # Force add sury if it's not there yet + # This is to solve some weird issue with php-common breaking php7.3-common, + # hence breaking many php7.3-deps + # hence triggering some dependency conflict (or foobar-ynh-deps uninstall) + # Adding it there shouldnt be a big deal - Yunohost 11.x does add it + # through its regen conf anyway. + if not os.path.exists("/etc/apt/sources.list.d/extra_php_version.list"): + open("/etc/apt/sources.list.d/extra_php_version.list", "w").write( + "deb https://packages.sury.org/php/ bullseye main" + ) + os.system( + 'wget --timeout 900 --quiet "https://packages.sury.org/php/apt.gpg" --output-document=- | gpg --dearmor >"/etc/apt/trusted.gpg.d/extra_php_version.gpg"' + ) + + # + # Run apt update + # + tools_update(target="system") # Tell libc6 it's okay to restart system stuff during the upgrade @@ -100,20 +119,6 @@ class MyMigration(Migration): os.system("mv /home/yunohost.conf /var/cache/yunohost/regenconf") rm("/home/yunohost.conf", recursive=True, force=True) - # Force add sury if it's not there yet - # This is to solve some weird issue with php-common breaking php7.3-common, - # hence breaking many php7.3-deps - # hence triggering some dependency conflict (or foobar-ynh-deps uninstall) - # Adding it there shouldnt be a big deal - Yunohost 11.x does add it - # through its regen conf anyway. - if not os.path.exists("/etc/apt/sources.list.d/extra_php_version.list"): - open("/etc/apt/sources.list.d/extra_php_version.list", "w").write( - "deb https://packages.sury.org/php/ bullseye main" - ) - os.system( - 'wget --timeout 900 --quiet "https://packages.sury.org/php/apt.gpg" --output-document=- | gpg --dearmor >"/etc/apt/trusted.gpg.d/extra_php_version.gpg"' - ) - # Remove legacy postgresql service record added by helpers, # will now be dynamically handled by the core in bullseye services = _get_services() From b7121502d646796622fb4b1ade5859e9c6c18d78 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Fri, 7 Jan 2022 02:48:02 +0100 Subject: [PATCH 261/619] More sury/php madness ... forbidding php-common doesnt seem to be good idea so let's have it --- data/hooks/conf_regen/10-apt | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/data/hooks/conf_regen/10-apt b/data/hooks/conf_regen/10-apt index 2b3ae006f..9eadea90a 100755 --- a/data/hooks/conf_regen/10-apt +++ b/data/hooks/conf_regen/10-apt @@ -15,6 +15,11 @@ Pin: origin \"packages.sury.org\" Pin-Priority: -1" >>"${pending_dir}/etc/apt/preferences.d/extra_php_version" done + echo " +Package: php-common +Pin: origin \"packages.sury.org\" +Pin-Priority: 500" >>"${pending_dir}/etc/apt/preferences.d/extra_php_version" + echo " # PLEASE READ THIS WARNING AND DON'T EDIT THIS FILE From beadea5305e7b9ad1211d03b820f3e02abfa1514 Mon Sep 17 00:00:00 2001 From: Kay0u Date: Fri, 7 Jan 2022 10:47:03 +0100 Subject: [PATCH 262/619] remove unused import --- src/dyndns.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/dyndns.py b/src/dyndns.py index 521b16218..69f1989f6 100644 --- a/src/dyndns.py +++ b/src/dyndns.py @@ -33,7 +33,7 @@ import subprocess from moulinette import m18n from moulinette.core import MoulinetteError from moulinette.utils.log import getActionLogger -from moulinette.utils.filesystem import write_to_file, read_file, rm, chown, chmod +from moulinette.utils.filesystem import write_to_file, rm, chown, chmod from moulinette.utils.network import download_json from yunohost.utils.error import YunohostError, YunohostValidationError From b0f756b1a8a15d217df18a6b4b9ae23a2b9f773a Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Fri, 7 Jan 2022 14:58:50 +0100 Subject: [PATCH 263/619] Aaaand order matters in apt preferences --- data/hooks/conf_regen/10-apt | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/data/hooks/conf_regen/10-apt b/data/hooks/conf_regen/10-apt index 9eadea90a..8e005cbec 100755 --- a/data/hooks/conf_regen/10-apt +++ b/data/hooks/conf_regen/10-apt @@ -7,6 +7,11 @@ do_pre_regen() { mkdir --parents "${pending_dir}/etc/apt/preferences.d" + echo " +Package: php-common +Pin: origin \"packages.sury.org\" +Pin-Priority: 500" >>"${pending_dir}/etc/apt/preferences.d/extra_php_version" + packages_to_refuse_from_sury="php php-* openssl libssl1.1 libssl-dev" for package in $packages_to_refuse_from_sury; do echo " @@ -15,11 +20,6 @@ Pin: origin \"packages.sury.org\" Pin-Priority: -1" >>"${pending_dir}/etc/apt/preferences.d/extra_php_version" done - echo " -Package: php-common -Pin: origin \"packages.sury.org\" -Pin-Priority: 500" >>"${pending_dir}/etc/apt/preferences.d/extra_php_version" - echo " # PLEASE READ THIS WARNING AND DON'T EDIT THIS FILE From 7aa840a9569cc6d137d5e58c8df316812824945f Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Fri, 7 Jan 2022 22:46:15 +0100 Subject: [PATCH 264/619] Typo: grep doesn't like args starting with dashes --- src/yunohost/data_migrations/0021_migrate_to_bullseye.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/yunohost/data_migrations/0021_migrate_to_bullseye.py b/src/yunohost/data_migrations/0021_migrate_to_bullseye.py index 8f15019e9..b046b4b66 100644 --- a/src/yunohost/data_migrations/0021_migrate_to_bullseye.py +++ b/src/yunohost/data_migrations/0021_migrate_to_bullseye.py @@ -230,7 +230,7 @@ class MyMigration(Migration): cmd += " APT_LISTCHANGES_FRONTEND=none" cmd += " apt dist-upgrade " cmd += " --quiet -o=Dpkg::Use-Pty=0 --fix-broken --dry-run" - cmd += " | grep -q '-ynh-deps'" + cmd += " | grep -q 'ynh-deps'" logger.info("Simulating upgrade...") if os.system(cmd) == 0: From bbcbc411ea56eaeb4c78cfa529ce49e29028a1c9 Mon Sep 17 00:00:00 2001 From: yunohost-bot Date: Fri, 7 Jan 2022 22:02:58 +0000 Subject: [PATCH 265/619] [CI] Format code with Black --- .../0021_migrate_to_bullseye.py | 30 +++++++++++++------ 1 file changed, 21 insertions(+), 9 deletions(-) diff --git a/src/yunohost/data_migrations/0021_migrate_to_bullseye.py b/src/yunohost/data_migrations/0021_migrate_to_bullseye.py index b046b4b66..9a45cfb95 100644 --- a/src/yunohost/data_migrations/0021_migrate_to_bullseye.py +++ b/src/yunohost/data_migrations/0021_migrate_to_bullseye.py @@ -7,7 +7,12 @@ from moulinette.utils.log import getActionLogger from moulinette.utils.process import check_output, call_async_output from moulinette.utils.filesystem import read_file, rm -from yunohost.tools import Migration, tools_update, tools_upgrade, _apt_log_line_is_relevant +from yunohost.tools import ( + Migration, + tools_update, + tools_upgrade, + _apt_log_line_is_relevant, +) from yunohost.app import unstable_apps from yunohost.regenconf import manually_modified_files, _force_clear_hashes from yunohost.utils.filesystem import free_space_in_directory @@ -182,12 +187,14 @@ class MyMigration(Migration): "zip", ] - cmd = "apt show '*-ynh-deps' 2>/dev/null" \ - " | grep Depends" \ - f" | grep -o -E \"php7.3-({'|'.join(php73packages_suffixes)})\"" \ - " | sort | uniq" \ - " | sed 's/php7.3/php7.4/g'" \ - " || true" + cmd = ( + "apt show '*-ynh-deps' 2>/dev/null" + " | grep Depends" + f" | grep -o -E \"php7.3-({'|'.join(php73packages_suffixes)})\"" + " | sort | uniq" + " | sed 's/php7.3/php7.4/g'" + " || true" + ) php74packages_to_install = [ "php7.4-fpm", @@ -211,7 +218,9 @@ class MyMigration(Migration): ) if ret != 0: # FIXME: i18n once this is stable? - raise YunohostError("Failed to force the install of php dependencies ?", raw_msg=True) + raise YunohostError( + "Failed to force the install of php dependencies ?", raw_msg=True + ) # Clean the mess logger.info(m18n.n("migration_0021_cleaning_up")) @@ -235,7 +244,10 @@ class MyMigration(Migration): logger.info("Simulating upgrade...") if os.system(cmd) == 0: # FIXME: i18n once this is stable? - raise YunohostError("The upgrade cannot be completed, because some app dependencies would need to be removed?", raw_msg=True) + raise YunohostError( + "The upgrade cannot be completed, because some app dependencies would need to be removed?", + raw_msg=True, + ) tools_upgrade(target="system") From b59348fffe7003756331e070fee56dc97ff6740e Mon Sep 17 00:00:00 2001 From: ljf Date: Sat, 8 Jan 2022 17:33:58 +0100 Subject: [PATCH 266/619] [fix] Force dependencies upgrade even if previous version is accepted --- data/helpers.d/apt | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/data/helpers.d/apt b/data/helpers.d/apt index 281e17f70..0b75138aa 100644 --- a/data/helpers.d/apt +++ b/data/helpers.d/apt @@ -425,6 +425,12 @@ ynh_install_extra_app_dependencies() { # Install requested dependencies from this extra repository. ynh_install_app_dependencies "$package" + # Force to upgrade to the last version... + # Without doing apt install, an already installed dep is not upgraded + local apps_auto_installed="$(apt-mark showauto $package)" + ynh_package_install "$package" + apt-mark auto $apps_auto_installed + # Remove this extra repository after packages are installed ynh_remove_extra_repo --name=$app } From b63136da5264384b28ca00432dc57196971c7f03 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Sun, 9 Jan 2022 18:40:53 +0100 Subject: [PATCH 267/619] certificate: don't attempt to restart metronome if not installed --- src/certificate.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/certificate.py b/src/certificate.py index 0955b9f7c..adf707000 100644 --- a/src/certificate.py +++ b/src/certificate.py @@ -792,6 +792,9 @@ def _enable_certificate(domain, new_cert_folder): logger.debug("Restarting services...") for service in ("postfix", "dovecot", "metronome"): + # Ugly trick to not restart metronome if it's not installed + if service == "metronome" and os.system("dpkg --list | grep -q 'ii *metronome'") != 0: + continue _run_service_command("restart", service) if os.path.isfile("/etc/yunohost/installed"): From ca71d374477c9b7a337ce1f514c0d9dab6a9923d Mon Sep 17 00:00:00 2001 From: Germain Edy Date: Wed, 29 Dec 2021 11:48:02 +0000 Subject: [PATCH 268/619] Translated using Weblate (Spanish) Currently translated at 83.5% (601 of 719 strings) Translation: YunoHost/core Translate-URL: https://translate.yunohost.org/projects/yunohost/core/es/ --- locales/es.json | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/locales/es.json b/locales/es.json index 22493ec11..06f9385cf 100644 --- a/locales/es.json +++ b/locales/es.json @@ -615,5 +615,9 @@ "diagnosis_apps_bad_quality": "Esta aplicación está etiquetada como defectuosa en el catálogo de aplicaciones YunoHost. Podría ser un problema temporal mientras las personas responsables corrigen el asunto. Mientras tanto, la actualización de esta aplicación está desactivada.", "diagnosis_apps_broken": "Esta aplicación está etiquetada como defectuosa en el catálogo de aplicaciones YunoHost. Podría ser un problema temporal mientras las personas responsables corrigen el asunto. Mientras tanto, la actualización de esta aplicación está desactivada.", "diagnosis_apps_deprecated_practices": "La versión instalada de esta aplicación usa aún prácticas de empaquetado obsoletas. Deberías actualizarla.", - "diagnosis_apps_outdated_ynh_requirement": "La versión instalada de esta aplicación solo necesita YunoHost >= 2.x, lo que indica que no está al día con la buena praxis de ayudas y empaquetado recomendadas. Deberías actualizarla." -} \ No newline at end of file + "diagnosis_apps_outdated_ynh_requirement": "La versión instalada de esta aplicación solo necesita YunoHost >= 2.x, lo que indica que no está al día con la buena praxis de ayudas y empaquetado recomendadas. Deberías actualizarla.", + "domain_dns_conf_special_use_tld": "Este dominio se basa en un dominio de primer nivel (TLD) de usos especiales como .local o .test y no debería tener entradas DNS reales.", + "diagnosis_sshd_config_insecure": "Parece que la configuración SSH ha sido modificada manualmente, y es insegura porque no tiene ninguna instrucción 'AllowGroups' o 'AllowUsers' para limitar el acceso a los usuarios autorizados.", + "domain_dns_push_not_applicable": "La configuración automática de los registros DNS no puede realizarse en el dominio {domain}. Deberìas configurar manualmente los registros DNS siguiendo la documentación.", + "domain_dns_push_managed_in_parent_domain": "La configuración automática de los registros DNS es administrada desde el dominio superior {parent_domain}." +} From fb85030bc30ae9831029dcd61bd618cf6c67b400 Mon Sep 17 00:00:00 2001 From: Germain Edy Date: Wed, 29 Dec 2021 10:07:04 +0000 Subject: [PATCH 269/619] Translated using Weblate (French) Currently translated at 100.0% (719 of 719 strings) Translation: YunoHost/core Translate-URL: https://translate.yunohost.org/projects/yunohost/core/fr/ --- locales/fr.json | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/locales/fr.json b/locales/fr.json index cc7088c19..cb2547d9e 100644 --- a/locales/fr.json +++ b/locales/fr.json @@ -216,7 +216,7 @@ "migrations_loading_migration": "Chargement de la migration {id}...", "migrations_migration_has_failed": "La migration {id} a échoué avec l'exception {exception} : annulation", "migrations_no_migrations_to_run": "Aucune migration à lancer", - "migrations_skip_migration": "Ignorer et passer la migration {id}...", + "migrations_skip_migration": "Ignorer et passer la migration {id}…", "server_shutdown": "Le serveur va s'éteindre", "server_shutdown_confirm": "Le serveur va être éteint immédiatement, le voulez-vous vraiment ? [{answers}]", "server_reboot": "Le serveur va redémarrer", @@ -337,7 +337,7 @@ "regenconf_would_be_updated": "La configuration aurait dû être mise à jour pour la catégorie '{category}'", "regenconf_dry_pending_applying": "Vérification de la configuration en attente qui aurait été appliquée pour la catégorie '{category}'...", "regenconf_failed": "Impossible de régénérer la configuration pour la ou les catégorie(s) : '{categories}'", - "regenconf_pending_applying": "Applique la configuration en attente pour la catégorie '{category}'...", + "regenconf_pending_applying": "Applique la configuration en attente pour la catégorie '{category}' …", "service_regen_conf_is_deprecated": "'yunohost service regen-conf' est obsolète ! Veuillez plutôt utiliser 'yunohost tools regen-conf' à la place.", "tools_upgrade_at_least_one": "Veuillez spécifier 'apps' ou 'system'", "tools_upgrade_cant_both": "Impossible de mettre à niveau le système et les applications en même temps", @@ -376,7 +376,7 @@ "migrations_already_ran": "Ces migrations sont déjà effectuées : {ids}", "migrations_dependencies_not_satisfied": "Exécutez ces migrations : '{dependencies_id}', avant migration {id}.", "migrations_failed_to_load_migration": "Impossible de charger la migration {id} : {error}", - "migrations_running_forward": "Exécution de la migration {id}...", + "migrations_running_forward": "Exécution de la migration {id}…", "migrations_success_forward": "Migration {id} terminée", "operation_interrupted": "L'opération a-t-elle été interrompue manuellement ?", "permission_already_exist": "L'autorisation '{permission}' existe déjà", @@ -483,7 +483,7 @@ "diagnosis_ports_forwarding_tip": "Pour résoudre ce problème, vous devez probablement configurer la redirection de port sur votre routeur Internet comme décrit dans https://yunohost.org/isp_box_config", "diagnosis_http_connection_error": "Erreur de connexion : impossible de se connecter au domaine demandé, il est probablement injoignable.", "diagnosis_no_cache": "Pas encore de cache de diagnostique pour la catégorie '{category}'", - "yunohost_postinstall_end_tip": "La post-installation terminée ! Pour finaliser votre configuration, il est recommandé de :\n- ajouter un premier utilisateur depuis la section \"Utilisateurs\" de l'interface web (ou 'yunohost user create ' en ligne de commande) ;\n- diagnostiquer les potentiels problèmes dans la section \"Diagnostic\" de l'interface web (ou 'yunohost diagnosis run' en ligne de commande) ;\n- lire les parties 'Finalisation de votre configuration' et 'Découverte de YunoHost' dans le guide de l'administrateur : https://yunohost.org/admindoc.", + "yunohost_postinstall_end_tip": "La post-installation est terminée ! Pour finaliser votre configuration, il est recommandé de :\n- ajouter un premier utilisateur depuis la section \"Utilisateurs\" de l'interface web (ou 'yunohost user create ' en ligne de commande) ;\n- diagnostiquer les potentiels problèmes dans la section \"Diagnostic\" de l'interface web (ou 'yunohost diagnosis run' en ligne de commande) ;\n- lire les parties 'Finalisation de votre configuration' et 'Découverte de YunoHost' dans le guide de l'administrateur : https://yunohost.org/admindoc.", "diagnosis_services_bad_status_tip": "Vous pouvez essayer de redémarrer le service, et si cela ne fonctionne pas, consultez les journaux de service dans le webadmin (à partir de la ligne de commande, vous pouvez le faire avec yunohost service restart {service} et yunohost service log {service} ).", "diagnosis_http_bad_status_code": "Le système de diagnostique n'a pas réussi à contacter votre serveur. Il se peut qu'une autre machine réponde à la place de votre serveur. Vérifiez que le port 80 est correctement redirigé, que votre configuration Nginx est à jour et qu'un reverse-proxy n'interfère pas.", "diagnosis_http_timeout": "Expiration du délai en essayant de contacter votre serveur de l'extérieur. Il semble être inaccessible. Vérifiez que vous transférez correctement le port 80, que Nginx est en cours d'exécution et qu'un pare-feu n'interfère pas.", @@ -547,7 +547,7 @@ "diagnosis_swap_tip": "Merci d'être prudent et conscient que si vous hébergez une partition SWAP sur une carte SD ou un disque SSD, cela risque de réduire drastiquement l'espérance de vie du périphérique.", "restore_already_installed_apps": "Les applications suivantes ne peuvent pas être restaurées car elles sont déjà installées : {apps}", "regenconf_need_to_explicitly_specify_ssh": "La configuration de ssh a été modifiée manuellement. Vous devez explicitement indiquer la mention --force à \"ssh\" pour appliquer les changements.", - "migration_0015_cleaning_up": "Nettoyage du cache et des paquets qui ne sont plus nécessaires...", + "migration_0015_cleaning_up": "Nettoyage du cache et des paquets qui ne sont plus utiles …", "migration_0015_specific_upgrade": "Démarrage de la mise à jour des paquets du système qui doivent être mis à jour séparément...", "migration_0015_modified_files": "Veuillez noter que les fichiers suivants ont été modifiés manuellement et pourraient être écrasés à la suite de la mise à niveau : {manually_modified_files}", "migration_0015_problematic_apps_warning": "Veuillez noter que des applications qui peuvent poser problèmes ont été détectées. Il semble qu'elles n'aient pas été installées à partir du catalogue d'applications YunoHost, ou bien qu'elles ne soient pas signalées comme \"fonctionnelles\". Par conséquent, il n'est pas possible de garantir que les applications suivantes fonctionneront encore après la mise à niveau : {problematic_apps}", @@ -611,7 +611,7 @@ "diagnosis_rootfstotalspace_critical": "Le système de fichiers racine ne fait que {space} ! Vous allez certainement le remplir très rapidement ! Il est recommandé d'avoir au moins 16 GB pour ce système de fichiers.", "diagnosis_rootfstotalspace_warning": "Le système de fichiers racine n'est que de {space}. Cela peut suffire, mais faites attention car vous risquez de les remplir rapidement... Il est recommandé d'avoir au moins 16 GB pour ce système de fichiers.", "app_restore_script_failed": "Une erreur s'est produite dans le script de restauration de l'application", - "restore_backup_too_old": "Cette sauvegarde ne peut pas être restaurée car elle provient d'une version trop ancienne de YunoHost.", + "restore_backup_too_old": "Cette sauvegarde ne peut pas être restaurée car elle provient d'une version YunoHost trop ancienne.", "migration_update_LDAP_schema": "Mise à jour du schéma LDAP...", "log_backup_create": "Créer une archive de sauvegarde", "global_settings_setting_ssowat_panel_overlay_enabled": "Activer la superposition de la vignette SSOwat", @@ -718,4 +718,4 @@ "migration_0021_patch_yunohost_conflicts": "Application du correctif pour contourner le problème de conflit...", "migration_0021_not_buster": "La distribution Debian actuelle n'est pas Buster !", "migration_description_0021_migrate_to_bullseye": "Mise à niveau du système vers Debian Bullseye et YunoHost 11.x" -} \ No newline at end of file +} From 39d28af963c6ab5b57ef0af3f4fc38e6e4648d23 Mon Sep 17 00:00:00 2001 From: Christian Wehrli Date: Thu, 30 Dec 2021 09:16:46 +0000 Subject: [PATCH 270/619] Translated using Weblate (German) Currently translated at 98.0% (705 of 719 strings) Translation: YunoHost/core Translate-URL: https://translate.yunohost.org/projects/yunohost/core/de/ --- locales/de.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/locales/de.json b/locales/de.json index 537621f99..c5de78e7a 100644 --- a/locales/de.json +++ b/locales/de.json @@ -285,7 +285,7 @@ "diagnosis_no_cache": "Kein Diagnose Cache aktuell für die Kategorie '{category}'", "diagnosis_ip_no_ipv4": "Der Server hat kein funktionierendes IPv4.", "diagnosis_ip_connected_ipv6": "Der Server ist mit dem Internet über IPv6 verbunden!", - "diagnosis_ip_no_ipv6": "Der Server hat kein funktionierendes IPv6.", + "diagnosis_ip_no_ipv6": "Der Server verfügt nicht über eine funktionierende IPv6-Adresse.", "diagnosis_ip_not_connected_at_all": "Der Server scheint überhaupt nicht mit dem Internet verbunden zu sein!?", "diagnosis_failed_for_category": "Diagnose fehlgeschlagen für die Kategorie '{category}': {error}", "diagnosis_cache_still_valid": "(Cache noch gültig für {category} Diagnose. Es wird keine neue Diagnose durchgeführt!)", @@ -318,10 +318,10 @@ "diagnosis_domain_not_found_details": "Die Domäne {domain} existiert nicht in der WHOIS-Datenbank oder sie ist abgelaufen!", "diagnosis_domain_expiration_not_found": "Das Ablaufdatum einiger Domains kann nicht überprüft werden", "diagnosis_dns_try_dyndns_update_force": "Die DNS-Konfiguration dieser Domäne sollte automatisch von YunoHost verwaltet werden. Andernfalls könntest Du mittels yunohost dyndns update --force ein Update erzwingen.", - "diagnosis_dns_point_to_doc": "Bitte schaue in die Dokumentation unter https://yunohost.org/dns_config wenn du hilfe bei der Konfiguration der DNS Einträge brauchst.", + "diagnosis_dns_point_to_doc": "Bitte schauen Sie in der Dokumentation unter https://yunohost.org/dns_config nach, wenn Sie Hilfe bei der Konfiguration der DNS-Einträge brauchen.", "diagnosis_dns_discrepancy": "Der folgende DNS Eintrag scheint nicht den empfohlenen Einstellungen zu entsprechen:
Typ: {type}
Name: {name}
Aktueller Wert: {current}
Erwarteter Wert: {value}", "diagnosis_dns_missing_record": "Gemäß der empfohlenen DNS-Konfiguration sollten Sie einen DNS-Eintrag mit den folgenden Informationen hinzufügen.
Typ: {type}
Name: {name}
Wert: {value}", - "diagnosis_dns_bad_conf": "Einige DNS Einträge für die Domäne {domain} fehlen oder sind nicht korrekt (Kategorie {category})", + "diagnosis_dns_bad_conf": "Einige DNS-Einträge für die Domäne {domain} fehlen oder sind nicht korrekt (Kategorie {category})", "diagnosis_ip_local": "Lokale IP: {local}", "diagnosis_ip_global": "Globale IP: {global}", "diagnosis_ip_no_ipv6_tip": "Die Verwendung von IPv6 ist nicht Voraussetzung für das Funktionieren Ihres Servers, trägt aber zur Gesundheit des Internet als Ganzes bei. IPv6 sollte normalerweise automatisch von Ihrem Server oder Ihrem Provider konfiguriert werden, sofern verfügbar. Andernfalls müßen Sie einige Dinge manuell konfigurieren. Weitere Informationen finden Sie hier: https://yunohost.org/#/ipv6. Wenn Sie IPv6 nicht aktivieren können oder Ihnen das zu technisch ist, können Sie diese Warnung gefahrlos ignorieren.", @@ -704,4 +704,4 @@ "log_domain_config_set": "Konfiguration für die Domäne '{}' aktualisieren", "log_domain_dns_push": "DNS-Einträge für die Domäne '{}' übertragen", "service_description_yunomdns": "Ermöglicht es dir, deinen Server über 'yunohost.local' in deinem lokalen Netzwerk zu erreichen" -} \ No newline at end of file +} From e0e93dd29ed2e366377b8e3a41b00ea706457a13 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Gaspar?= Date: Mon, 3 Jan 2022 16:44:54 +0000 Subject: [PATCH 271/619] Translated using Weblate (French) Currently translated at 100.0% (720 of 720 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 cb2547d9e..2242a48ab 100644 --- a/locales/fr.json +++ b/locales/fr.json @@ -717,5 +717,6 @@ "migration_0021_cleaning_up": "Nettoyage du cache et des paquets qui ne sont plus nécessaires...", "migration_0021_patch_yunohost_conflicts": "Application du correctif pour contourner le problème de conflit...", "migration_0021_not_buster": "La distribution Debian actuelle n'est pas Buster !", - "migration_description_0021_migrate_to_bullseye": "Mise à niveau du système vers Debian Bullseye et YunoHost 11.x" + "migration_description_0021_migrate_to_bullseye": "Mise à niveau du système vers Debian Bullseye et YunoHost 11.x", + "global_settings_setting_security_ssh_password_authentication": "Autoriser l'authentification par mot de passe pour SSH" } From 80805b3bc6b602e446837c2f2a8fcc1cd49ffde4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20M?= Date: Tue, 4 Jan 2022 04:51:36 +0000 Subject: [PATCH 272/619] Translated using Weblate (Galician) Currently translated at 100.0% (720 of 720 strings) Translation: YunoHost/core Translate-URL: https://translate.yunohost.org/projects/yunohost/core/gl/ --- locales/gl.json | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/locales/gl.json b/locales/gl.json index 3c577b935..8820987e0 100644 --- a/locales/gl.json +++ b/locales/gl.json @@ -717,5 +717,6 @@ "migration_0021_patch_yunohost_conflicts": "Solucionando os problemas e conflitos...", "migration_description_0021_migrate_to_bullseye": "Actualizar o sistema a Debian Bullseye e YunoHost 11.x", "migration_0021_system_not_fully_up_to_date": "O teu sistema non está completamente actualizado. Fai unha actualización normal antes de executar a migración a Bullseye.", - "migration_0021_general_warning": "Ten en conta que a migración é unha operación delicada. O equipo de YunoHost fixo todo o que puido para revisalo e probalo, pero aínda así poderían acontecer fallos no sistema ou apps.\n\nAsí as cousas, é recomendable:\n - Facer unha copia de apoio dos datos e apps importantes. Máis info en https://yunohost.org/backup;\n - Ter paciencia unha vez inicias a migración: dependendo da túa conexión a internet e hardware, podería levarlle varias horas completar o proceso." -} \ No newline at end of file + "migration_0021_general_warning": "Ten en conta que a migración é unha operación delicada. O equipo de YunoHost fixo todo o que puido para revisalo e probalo, pero aínda así poderían acontecer fallos no sistema ou apps.\n\nAsí as cousas, é recomendable:\n - Facer unha copia de apoio dos datos e apps importantes. Máis info en https://yunohost.org/backup;\n - Ter paciencia unha vez inicias a migración: dependendo da túa conexión a internet e hardware, podería levarlle varias horas completar o proceso.", + "global_settings_setting_security_ssh_password_authentication": "Permitir autenticación con contrasinal para SSH" +} From dbc8852730723d808a257e4dd8c460d6608ac41e Mon Sep 17 00:00:00 2001 From: Christian Wehrli Date: Thu, 6 Jan 2022 07:48:48 +0000 Subject: [PATCH 273/619] Translated using Weblate (German) Currently translated at 97.9% (705 of 720 strings) Translation: YunoHost/core Translate-URL: https://translate.yunohost.org/projects/yunohost/core/de/ --- locales/de.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/locales/de.json b/locales/de.json index c5de78e7a..3aa07475e 100644 --- a/locales/de.json +++ b/locales/de.json @@ -590,7 +590,7 @@ "service_description_dovecot": "Ermöglicht es E-Mail-Clients auf Konten zuzugreifen (IMAP und POP3)", "service_description_dnsmasq": "Verarbeitet die Auflösung des Domainnamens (DNS)", "restore_backup_too_old": "Dieses Backup kann nicht wieder hergestellt werden, weil es von einer zu alten YunoHost Version stammt.", - "service_description_slapd": "Speichert Benutzer:innen, Domains und verbundene Informationen", + "service_description_slapd": "Speichert Benutzer:innen, Domänen und verbundene Informationen", "service_description_rspamd": "Spamfilter und andere E-Mail-Merkmale", "service_description_redis-server": "Eine spezialisierte Datenbank für den schnellen Datenzugriff, die Aufgabenwarteschlange und die Kommunikation zwischen Programmen", "service_description_postfix": "Wird benutzt, um E-Mails zu senden und zu empfangen", From aba7e3fba38ba9f47cfae703426669994ef26b17 Mon Sep 17 00:00:00 2001 From: Tymofii-Lytvynenko Date: Sun, 9 Jan 2022 02:45:22 +0000 Subject: [PATCH 274/619] Translated using Weblate (Ukrainian) Currently translated at 100.0% (720 of 720 strings) Translation: YunoHost/core Translate-URL: https://translate.yunohost.org/projects/yunohost/core/uk/ --- locales/uk.json | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/locales/uk.json b/locales/uk.json index e997d6bf4..c43a6e490 100644 --- a/locales/uk.json +++ b/locales/uk.json @@ -717,5 +717,6 @@ "migration_0021_not_enough_free_space": "Вільного місця в /var/ досить мало! У вас повинно бути не менше 1 ГБ вільного місця, щоб запустити цю міграцію.", "migration_0021_system_not_fully_up_to_date": "Ваша система не повністю оновлена. Будь ласка, виконайте регулярне оновлення перед запуском міграції на Bullseye.", "migration_0021_general_warning": "Будь ласка, зверніть увагу, що ця міграція є делікатною операцією. Команда YunoHost зробила все можливе, щоб перевірити і протестувати її, але міграція все ще може порушити частину системи або її застосунків.\n\nТому рекомендовано:\n - Виконати резервне копіювання всіх важливих даних або застосунків. Подробиці на сайті https://yunohost.org/backup; \n - Наберіться терпіння після запуску міграції: В залежності від вашого з'єднання з Інтернетом і апаратного забезпечення, оновлення може зайняти до декількох годин.", - "migration_description_0021_migrate_to_bullseye": "Оновлення системи до Debian Bullseye і YunoHost 11.x" -} \ No newline at end of file + "migration_description_0021_migrate_to_bullseye": "Оновлення системи до Debian Bullseye і YunoHost 11.x", + "global_settings_setting_security_ssh_password_authentication": "Дозволити автентифікацію паролем для SSH" +} From cc7fe09efae657f14111d5137e630729025bb8c1 Mon Sep 17 00:00:00 2001 From: Boudewijn Date: Sun, 9 Jan 2022 11:08:58 +0000 Subject: [PATCH 275/619] Translated using Weblate (Dutch) Currently translated at 11.3% (82 of 720 strings) Translation: YunoHost/core Translate-URL: https://translate.yunohost.org/projects/yunohost/core/nl/ --- locales/nl.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/locales/nl.json b/locales/nl.json index 1c3e2083d..038d18283 100644 --- a/locales/nl.json +++ b/locales/nl.json @@ -130,4 +130,4 @@ "app_label_deprecated": "Dit commando is vervallen. Gebruik alsjeblieft het nieuwe commando 'yunohost user permission update' om het label van de app te beheren.", "app_change_url_no_script": "De app '{app_name}' ondersteunt nog geen URL-aanpassingen. Misschien wel na een upgrade.", "app_upgrade_some_app_failed": "Sommige apps konden niet worden bijgewerkt" -} \ No newline at end of file +} From af1937c596f3c1f5c35ffe689cfccccdcf33dd11 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Tue, 11 Jan 2022 12:57:53 +0100 Subject: [PATCH 276/619] Typo --- src/authenticators/ldap_admin.py | 1 - 1 file changed, 1 deletion(-) diff --git a/src/authenticators/ldap_admin.py b/src/authenticators/ldap_admin.py index 7f96165cb..872dd3c8d 100644 --- a/src/authenticators/ldap_admin.py +++ b/src/authenticators/ldap_admin.py @@ -120,7 +120,6 @@ class Authenticator(BaseAuthenticator): return infos - @staticmethod def delete_session_cookie(self): from bottle import response From fedcf6dabbabc565812c91d09b85f2b325504c99 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Tue, 11 Jan 2022 16:04:25 +0100 Subject: [PATCH 277/619] migrate_to_bullseye: mark the base php7.4 packages as auto --- .../data_migrations/0021_migrate_to_bullseye.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/yunohost/data_migrations/0021_migrate_to_bullseye.py b/src/yunohost/data_migrations/0021_migrate_to_bullseye.py index 9a45cfb95..e47087976 100644 --- a/src/yunohost/data_migrations/0021_migrate_to_bullseye.py +++ b/src/yunohost/data_migrations/0021_migrate_to_bullseye.py @@ -196,7 +196,7 @@ class MyMigration(Migration): " || true" ) - php74packages_to_install = [ + basephp74packages_to_install = [ "php7.4-fpm", "php7.4-common", "php7.4-ldap", @@ -207,7 +207,7 @@ class MyMigration(Migration): "php-php-gettext", ] - php74packages_to_install += [ + php74packages_to_install = basephp74packages_to_install + [ f.strip() for f in check_output(cmd).split("\n") if f.strip() ] @@ -222,6 +222,8 @@ class MyMigration(Migration): "Failed to force the install of php dependencies ?", raw_msg=True ) + os.system(f"apt-mark auto {' '.join(basephp74packages_to_install)}") + # Clean the mess logger.info(m18n.n("migration_0021_cleaning_up")) os.system("apt autoremove --assume-yes") @@ -371,11 +373,11 @@ class MyMigration(Migration): def hold(self, packages): for package in packages: - os.system("apt-mark hold {}".format(package)) + os.system(f"apt-mark hold {package}") def unhold(self, packages): for package in packages: - os.system("apt-mark unhold {}".format(package)) + os.system(f"apt-mark unhold {package}") def apt_install(self, cmd): def is_relevant(line): From 23d58c121793ed28a64dd8185d4976cf14f4b529 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Tue, 11 Jan 2022 16:06:32 +0100 Subject: [PATCH 278/619] Reformat fr locale --- locales/fr.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/locales/fr.json b/locales/fr.json index 2242a48ab..92dc4b68a 100644 --- a/locales/fr.json +++ b/locales/fr.json @@ -216,7 +216,7 @@ "migrations_loading_migration": "Chargement de la migration {id}...", "migrations_migration_has_failed": "La migration {id} a échoué avec l'exception {exception} : annulation", "migrations_no_migrations_to_run": "Aucune migration à lancer", - "migrations_skip_migration": "Ignorer et passer la migration {id}…", + "migrations_skip_migration": "Ignorer et passer la migration {id}...", "server_shutdown": "Le serveur va s'éteindre", "server_shutdown_confirm": "Le serveur va être éteint immédiatement, le voulez-vous vraiment ? [{answers}]", "server_reboot": "Le serveur va redémarrer", @@ -337,7 +337,7 @@ "regenconf_would_be_updated": "La configuration aurait dû être mise à jour pour la catégorie '{category}'", "regenconf_dry_pending_applying": "Vérification de la configuration en attente qui aurait été appliquée pour la catégorie '{category}'...", "regenconf_failed": "Impossible de régénérer la configuration pour la ou les catégorie(s) : '{categories}'", - "regenconf_pending_applying": "Applique la configuration en attente pour la catégorie '{category}' …", + "regenconf_pending_applying": "Applique la configuration en attente pour la catégorie '{category}' ...", "service_regen_conf_is_deprecated": "'yunohost service regen-conf' est obsolète ! Veuillez plutôt utiliser 'yunohost tools regen-conf' à la place.", "tools_upgrade_at_least_one": "Veuillez spécifier 'apps' ou 'system'", "tools_upgrade_cant_both": "Impossible de mettre à niveau le système et les applications en même temps", @@ -376,7 +376,7 @@ "migrations_already_ran": "Ces migrations sont déjà effectuées : {ids}", "migrations_dependencies_not_satisfied": "Exécutez ces migrations : '{dependencies_id}', avant migration {id}.", "migrations_failed_to_load_migration": "Impossible de charger la migration {id} : {error}", - "migrations_running_forward": "Exécution de la migration {id}…", + "migrations_running_forward": "Exécution de la migration {id}...", "migrations_success_forward": "Migration {id} terminée", "operation_interrupted": "L'opération a-t-elle été interrompue manuellement ?", "permission_already_exist": "L'autorisation '{permission}' existe déjà", @@ -547,7 +547,7 @@ "diagnosis_swap_tip": "Merci d'être prudent et conscient que si vous hébergez une partition SWAP sur une carte SD ou un disque SSD, cela risque de réduire drastiquement l'espérance de vie du périphérique.", "restore_already_installed_apps": "Les applications suivantes ne peuvent pas être restaurées car elles sont déjà installées : {apps}", "regenconf_need_to_explicitly_specify_ssh": "La configuration de ssh a été modifiée manuellement. Vous devez explicitement indiquer la mention --force à \"ssh\" pour appliquer les changements.", - "migration_0015_cleaning_up": "Nettoyage du cache et des paquets qui ne sont plus utiles …", + "migration_0015_cleaning_up": "Nettoyage du cache et des paquets qui ne sont plus utiles ...", "migration_0015_specific_upgrade": "Démarrage de la mise à jour des paquets du système qui doivent être mis à jour séparément...", "migration_0015_modified_files": "Veuillez noter que les fichiers suivants ont été modifiés manuellement et pourraient être écrasés à la suite de la mise à niveau : {manually_modified_files}", "migration_0015_problematic_apps_warning": "Veuillez noter que des applications qui peuvent poser problèmes ont été détectées. Il semble qu'elles n'aient pas été installées à partir du catalogue d'applications YunoHost, ou bien qu'elles ne soient pas signalées comme \"fonctionnelles\". Par conséquent, il n'est pas possible de garantir que les applications suivantes fonctionneront encore après la mise à niveau : {problematic_apps}", From a118a5a1322c3d15b3ed45e41ecd71d3be2a6f13 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Tue, 11 Jan 2022 16:14:20 +0100 Subject: [PATCH 279/619] ci: typo --- .gitlab/ci/translation.gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab/ci/translation.gitlab-ci.yml b/.gitlab/ci/translation.gitlab-ci.yml index 8daa4f473..fc7ade862 100644 --- a/.gitlab/ci/translation.gitlab-ci.yml +++ b/.gitlab/ci/translation.gitlab-ci.yml @@ -23,7 +23,7 @@ autofix-translated-strings: script: # create a local branch that will overwrite distant one - git checkout -b "ci-autofix-translated-strings-${CI_COMMIT_REF_NAME}" --no-track - - python3 maintenance/missing_i18n_keys --fix + - python3 maintenance/missing_i18n_keys.py --fix - python3 maintenanceautofix_locale_format.py - '[ $(git diff -w | wc -l) != 0 ] || exit 0' # stop if there is nothing to commit - git commit -am "[CI] Reformat / remove stale translated strings" || true From ea6500ebfd08473ce9a7eaeca9853795f1c0f327 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Tue, 11 Jan 2022 17:10:07 +0100 Subject: [PATCH 280/619] ldap: having to repeat the base dn everytime we call search() is boring and inconsistent with other methods, let's use relative dns instead --- src/domain.py | 2 +- src/permission.py | 4 ++-- src/ssh.py | 2 +- src/tests/test_permission.py | 6 +++--- src/user.py | 14 +++++++------- src/utils/ldap.py | 4 +++- 6 files changed, 17 insertions(+), 15 deletions(-) diff --git a/src/domain.py b/src/domain.py index 2560a42f2..57c990762 100644 --- a/src/domain.py +++ b/src/domain.py @@ -69,7 +69,7 @@ def domain_list(exclude_subdomains=False): result = [ entry["virtualdomain"][0] for entry in ldap.search( - "ou=domains,dc=yunohost,dc=org", "virtualdomain=*", ["virtualdomain"] + "ou=domains", "virtualdomain=*", ["virtualdomain"] ) ] diff --git a/src/permission.py b/src/permission.py index e87715e63..493f17278 100644 --- a/src/permission.py +++ b/src/permission.py @@ -58,7 +58,7 @@ def user_permission_list( ldap = _get_ldap_interface() permissions_infos = ldap.search( - "ou=permission,dc=yunohost,dc=org", + "ou=permission", "(objectclass=permissionYnh)", [ "cn", @@ -408,7 +408,7 @@ def permission_create( # Validate uniqueness of permission in LDAP if ldap.get_conflict( - {"cn": permission}, base_dn="ou=permission,dc=yunohost,dc=org" + {"cn": permission}, base_dn="ou=permission" ): raise YunohostValidationError("permission_already_exist", permission=permission) diff --git a/src/ssh.py b/src/ssh.py index ecee39f4a..98fa8fb3c 100644 --- a/src/ssh.py +++ b/src/ssh.py @@ -172,7 +172,7 @@ def _get_user_for_ssh(username, attrs=None): ldap = _get_ldap_interface() user = ldap.search( - "ou=users,dc=yunohost,dc=org", + "ou=users", "(&(objectclass=person)(uid=%s))" % username, attrs, ) diff --git a/src/tests/test_permission.py b/src/tests/test_permission.py index 9c059f0e4..4e7f9f53d 100644 --- a/src/tests/test_permission.py +++ b/src/tests/test_permission.py @@ -236,17 +236,17 @@ def check_LDAP_db_integrity(): ldap = _get_ldap_interface() user_search = ldap.search( - "ou=users,dc=yunohost,dc=org", + "ou=users", "(&(objectclass=person)(!(uid=root))(!(uid=nobody)))", ["uid", "memberOf", "permission"], ) group_search = ldap.search( - "ou=groups,dc=yunohost,dc=org", + "ou=groups", "(objectclass=groupOfNamesYnh)", ["cn", "member", "memberUid", "permission"], ) permission_search = ldap.search( - "ou=permission,dc=yunohost,dc=org", + "ou=permission", "(objectclass=permissionYnh)", ["cn", "groupPermission", "inheritPermission", "memberUid"], ) diff --git a/src/user.py b/src/user.py index be9b74641..6f99321bb 100644 --- a/src/user.py +++ b/src/user.py @@ -111,7 +111,7 @@ def user_list(fields=None): ldap = _get_ldap_interface() result = ldap.search( - "ou=users,dc=yunohost,dc=org", + "ou=users", "(&(objectclass=person)(!(uid=root))(!(uid=nobody)))", attrs, ) @@ -233,7 +233,7 @@ def user_create( } # If it is the first user, add some aliases - if not ldap.search(base="ou=users,dc=yunohost,dc=org", filter="uid=*"): + if not ldap.search(base="ou=users", filter="uid=*"): attr_dict["mail"] = [attr_dict["mail"]] + aliases try: @@ -377,7 +377,7 @@ def user_update( ldap = _get_ldap_interface() attrs_to_fetch = ["givenName", "sn", "mail", "maildrop"] result = ldap.search( - base="ou=users,dc=yunohost,dc=org", + base="ou=users", filter="uid=" + username, attrs=attrs_to_fetch, ) @@ -538,7 +538,7 @@ def user_info(username): else: filter = "uid=" + username - result = ldap.search("ou=users,dc=yunohost,dc=org", filter, user_attrs) + result = ldap.search("ou=users", filter, user_attrs) if result: user = result[0] @@ -938,7 +938,7 @@ def user_group_list(short=False, full=False, include_primary_groups=True): ldap = _get_ldap_interface() groups_infos = ldap.search( - "ou=groups,dc=yunohost,dc=org", + "ou=groups", "(objectclass=groupOfNamesYnh)", ["cn", "member", "permission"], ) @@ -989,7 +989,7 @@ def user_group_create( # Validate uniqueness of groupname in LDAP conflict = ldap.get_conflict( - {"cn": groupname}, base_dn="ou=groups,dc=yunohost,dc=org" + {"cn": groupname}, base_dn="ou=groups" ) if conflict: raise YunohostValidationError("group_already_exist", group=groupname) @@ -1204,7 +1204,7 @@ def user_group_info(groupname): # Fetch info for this group result = ldap.search( - "ou=groups,dc=yunohost,dc=org", + "ou=groups", "cn=" + groupname, ["cn", "member", "permission"], ) diff --git a/src/utils/ldap.py b/src/utils/ldap.py index 651d09f75..98c0fecf7 100644 --- a/src/utils/ldap.py +++ b/src/utils/ldap.py @@ -140,6 +140,8 @@ class LDAPInterface: """ if not base: base = self.basedn + else: + base = base + "," + self.basedn try: result = self.con.search_s(base, ldap.SCOPE_SUBTREE, filter, attrs) @@ -241,7 +243,7 @@ class LDAPInterface: """ dn = rdn + "," + self.basedn - actual_entry = self.search(base=dn, attrs=None) + actual_entry = self.search(rdn, attrs=None) ldif = modlist.modifyModlist(actual_entry[0], attr_dict, ignore_oldexistent=1) if ldif == []: From 3fe44ee73bbe7c96dfb5b5ecc19db1efe37f5d43 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Tue, 11 Jan 2022 19:50:43 +0100 Subject: [PATCH 281/619] ci: moar typoz, wtf @_@ --- .gitlab/ci/translation.gitlab-ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitlab/ci/translation.gitlab-ci.yml b/.gitlab/ci/translation.gitlab-ci.yml index fc7ade862..0d73852c7 100644 --- a/.gitlab/ci/translation.gitlab-ci.yml +++ b/.gitlab/ci/translation.gitlab-ci.yml @@ -4,7 +4,7 @@ test-i18n-keys: stage: translation script: - - python3 maintenance/missing_i18n_keys --check + - python3 maintenance/missing_i18n_keys.py --check only: changes: - locales/en.json @@ -24,7 +24,7 @@ autofix-translated-strings: # create a local branch that will overwrite distant one - git checkout -b "ci-autofix-translated-strings-${CI_COMMIT_REF_NAME}" --no-track - python3 maintenance/missing_i18n_keys.py --fix - - python3 maintenanceautofix_locale_format.py + - python3 maintenance/autofix_locale_format.py - '[ $(git diff -w | wc -l) != 0 ] || exit 0' # stop if there is nothing to commit - git commit -am "[CI] Reformat / remove stale translated strings" || true - git push -f origin "HEAD":"ci-remove-stale-translated-strings-${CI_COMMIT_REF_NAME}" From d81b85a49abebdbf38caf07b30219f2964c4af9d Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Tue, 11 Jan 2022 20:54:55 +0100 Subject: [PATCH 282/619] diagnosis: incorrect dns check (relative vs absolute) for CNAME on subdomain --- data/hooks/diagnosis/12-dnsrecords.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/data/hooks/diagnosis/12-dnsrecords.py b/data/hooks/diagnosis/12-dnsrecords.py index 554576f79..21b3a21a1 100644 --- a/data/hooks/diagnosis/12-dnsrecords.py +++ b/data/hooks/diagnosis/12-dnsrecords.py @@ -97,6 +97,8 @@ class DNSRecordsDiagnoser(Diagnoser): r["current"] = self.get_current_record(fqdn, r["type"]) if r["value"] == "@": r["value"] = domain + "." + elif r["type"] == "CNAME": + r["value"] = r["value"] + f".{base_dns_zone}." if self.current_record_match_expected(r): results[id_] = "OK" From b1fe61ed68be0f80b3ffcce09d63395e5a95f1c8 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Tue, 11 Jan 2022 21:37:11 +0100 Subject: [PATCH 283/619] codequality: fstring all the things! (well, not all but a lot :P) --- src/app.py | 32 +++++++++++-------------------- src/app_catalog.py | 29 ++++++++-------------------- src/backup.py | 37 +++++++++++++++++------------------- src/certificate.py | 19 +++++++------------ src/diagnosis.py | 46 +++++++++++++++++++-------------------------- src/dns.py | 2 +- src/domain.py | 15 +++++++-------- src/hook.py | 7 +++---- src/permission.py | 15 +++++++-------- src/regenconf.py | 17 +++++++---------- src/service.py | 21 +++++++++------------ src/settings.py | 13 ++++++------- src/ssh.py | 4 ++-- src/tools.py | 14 +++++++------- src/user.py | 32 +++++++++++++++---------------- src/utils/legacy.py | 2 +- 16 files changed, 127 insertions(+), 178 deletions(-) diff --git a/src/app.py b/src/app.py index 0ba8cf04d..76c86e326 100644 --- a/src/app.py +++ b/src/app.py @@ -170,7 +170,7 @@ def app_info(app, full=False): ret["label"] = permissions.get(app + ".main", {}).get("label") if not ret["label"]: - logger.warning("Failed to get label for app %s ?" % app) + logger.warning(f"Failed to get label for app {app} ?") return ret @@ -285,8 +285,7 @@ def app_map(app=None, raw=False, user=None): if user: if not app_id + ".main" in permissions: logger.warning( - "Uhoh, no main permission was found for app %s ... sounds like an app was only partially removed due to another bug :/" - % app_id + f"Uhoh, no main permission was found for app {app_id} ... sounds like an app was only partially removed due to another bug :/" ) continue main_perm = permissions[app_id + ".main"] @@ -406,7 +405,7 @@ def app_change_url(operation_logger, app, domain, path): # Execute App change_url script ret = hook_exec(change_url_script, env=env_dict)[0] if ret != 0: - msg = "Failed to change '%s' url." % app + msg = f"Failed to change '{app}' url." logger.error(msg) operation_logger.error(msg) @@ -845,7 +844,7 @@ def app_install( for question in questions: # Or should it be more generally question.redact ? if question.type == "password": - del env_dict_for_logging["YNH_APP_ARG_%s" % question.name.upper()] + del env_dict_for_logging[f"YNH_APP_ARG_{question.name.upper()}"] operation_logger.extra.update({"env": env_dict_for_logging}) @@ -892,8 +891,7 @@ def app_install( # This option is meant for packagers to debug their apps more easily if no_remove_on_failure: raise YunohostError( - "The installation of %s failed, but was not cleaned up as requested by --no-remove-on-failure." - % app_id, + f"The installation of {app_id} failed, but was not cleaned up as requested by --no-remove-on-failure.", raw_msg=True, ) else: @@ -1427,9 +1425,9 @@ def app_action_run(operation_logger, app, action, args=None): actions = {x["id"]: x for x in actions} if action not in actions: + available_actions = ", ".join(actions.keys()), raise YunohostValidationError( - "action '%s' not available for app '%s', available actions are: %s" - % (action, app, ", ".join(actions.keys())), + f"action '{action}' not available for app '{app}', available actions are: {available_actions}", raw_msg=True, ) @@ -1852,8 +1850,7 @@ def _get_manifest_of_app(path): manifest = read_json(os.path.join(path, "manifest.json")) else: raise YunohostError( - "There doesn't seem to be any manifest file in %s ... It looks like an app was not correctly installed/removed." - % path, + f"There doesn't seem to be any manifest file in {path} ... It looks like an app was not correctly installed/removed.", raw_msg=True, ) @@ -2093,7 +2090,7 @@ def _extract_app_from_gitrepo( cmd = f"git ls-remote --exit-code {url} {branch} | awk '{{print $1}}'" manifest["remote"]["revision"] = check_output(cmd) except Exception as e: - logger.warning("cannot get last commit hash because: %s ", e) + logger.warning(f"cannot get last commit hash because: {e}") else: manifest["remote"]["revision"] = revision manifest["lastUpdate"] = app_info.get("lastUpdate") @@ -2279,14 +2276,7 @@ def _assert_no_conflicting_apps(domain, path, ignore_app=None, full_domain=False if conflicts: apps = [] for path, app_id, app_label in conflicts: - apps.append( - " * {domain:s}{path:s} → {app_label:s} ({app_id:s})".format( - domain=domain, - path=path, - app_id=app_id, - app_label=app_label, - ) - ) + apps.append(f" * {domain}{path} → {app_label} ({app_id})") if full_domain: raise YunohostValidationError("app_full_domain_unavailable", domain=domain) @@ -2415,7 +2405,7 @@ def is_true(arg): elif isinstance(arg, str): return arg.lower() in ["yes", "true", "on"] else: - logger.debug("arg should be a boolean or a string, got %r", arg) + logger.debug(f"arg should be a boolean or a string, got {arg}") return True if arg else False diff --git a/src/app_catalog.py b/src/app_catalog.py index c2cbfcd32..b2b35b8c3 100644 --- a/src/app_catalog.py +++ b/src/app_catalog.py @@ -103,9 +103,7 @@ def _initialize_apps_catalog_system(): ) write_to_yaml(APPS_CATALOG_CONF, default_apps_catalog_list) except Exception as e: - raise YunohostError( - "Could not initialize the apps catalog system... : %s" % str(e) - ) + raise YunohostError(f"Could not initialize the apps catalog system... : {e}", raw_msg=True) logger.success(m18n.n("apps_catalog_init_success")) @@ -121,14 +119,12 @@ def _read_apps_catalog_list(): # by returning [] if list_ is None return list_ if list_ else [] except Exception as e: - raise YunohostError("Could not read the apps_catalog list ... : %s" % str(e)) + raise YunohostError(f"Could not read the apps_catalog list ... : {e}", raw_msg=True) def _actual_apps_catalog_api_url(base_url): - return "{base_url}/v{version}/apps.json".format( - base_url=base_url, version=APPS_CATALOG_API_VERSION - ) + return f"{base_url}/v{APPS_CATALOG_API_VERSION}/apps.json" def _update_apps_catalog(): @@ -172,16 +168,11 @@ def _update_apps_catalog(): apps_catalog_content["from_api_version"] = APPS_CATALOG_API_VERSION # Save the apps_catalog data in the cache - cache_file = "{cache_folder}/{list}.json".format( - cache_folder=APPS_CATALOG_CACHE, list=apps_catalog_id - ) + cache_file = f"{APPS_CATALOG_CACHE}/{apps_catalog_id}.json" try: write_to_json(cache_file, apps_catalog_content) except Exception as e: - raise YunohostError( - "Unable to write cache data for %s apps_catalog : %s" - % (apps_catalog_id, str(e)) - ) + raise YunohostError(f"Unable to write cache data for {apps_catalog_id} apps_catalog : {e}", raw_msg=True) logger.success(m18n.n("apps_catalog_update_success")) @@ -197,9 +188,7 @@ def _load_apps_catalog(): for apps_catalog_id in [L["id"] for L in _read_apps_catalog_list()]: # Let's load the json from cache for this catalog - cache_file = "{cache_folder}/{list}.json".format( - cache_folder=APPS_CATALOG_CACHE, list=apps_catalog_id - ) + cache_file = f"{APPS_CATALOG_CACHE}/{apps_catalog_id}.json" try: apps_catalog_content = ( @@ -230,10 +219,8 @@ def _load_apps_catalog(): # (N.B. : there's a small edge case where multiple apps catalog could be listing the same apps ... # in which case we keep only the first one found) if app in merged_catalog["apps"]: - logger.warning( - "Duplicate app %s found between apps catalog %s and %s" - % (app, apps_catalog_id, merged_catalog["apps"][app]["repository"]) - ) + other_catalog = merged_catalog["apps"][app]["repository"] + logger.warning(f"Duplicate app {app} found between apps catalog {apps_catalog_id} and {other_catalog}") continue info["repository"] = apps_catalog_id diff --git a/src/backup.py b/src/backup.py index 3dc2a31f5..57e667d8d 100644 --- a/src/backup.py +++ b/src/backup.py @@ -72,7 +72,7 @@ from yunohost.utils.filesystem import free_space_in_directory from yunohost.settings import settings_get BACKUP_PATH = "/home/yunohost.backup" -ARCHIVES_PATH = "%s/archives" % BACKUP_PATH +ARCHIVES_PATH = f"{BACKUP_PATH}/archives" APP_MARGIN_SPACE_SIZE = 100 # In MB CONF_MARGIN_SPACE_SIZE = 10 # IN MB POSTINSTALL_ESTIMATE_SPACE_SIZE = 5 # In MB @@ -402,7 +402,7 @@ class BackupManager: # backup and restore scripts for app in target_list: - app_script_folder = "/etc/yunohost/apps/%s/scripts" % app + app_script_folder = f"/etc/yunohost/apps/{app}/scripts" backup_script_path = os.path.join(app_script_folder, "backup") restore_script_path = os.path.join(app_script_folder, "restore") @@ -555,7 +555,7 @@ class BackupManager: self._compute_backup_size() # Create backup info file - with open("%s/info.json" % self.work_dir, "w") as f: + with open(f"{self.work_dir}/info.json", "w") as f: f.write(json.dumps(self.info)) def _get_env_var(self, app=None): @@ -732,7 +732,7 @@ class BackupManager: logger.debug(m18n.n("backup_permission", app=app)) permissions = user_permission_list(full=True, apps=[app])["permissions"] this_app_permissions = {name: infos for name, infos in permissions.items()} - write_to_yaml("%s/permissions.yml" % settings_dir, this_app_permissions) + write_to_yaml(f"{settings_dir}/permissions.yml", this_app_permissions) except Exception as e: logger.debug(e) @@ -921,7 +921,7 @@ class RestoreManager: if not os.path.isfile("/etc/yunohost/installed"): # Retrieve the domain from the backup try: - with open("%s/conf/ynh/current_host" % self.work_dir, "r") as f: + with open(f"{self.work_dir}/conf/ynh/current_host", "r") as f: domain = f.readline().rstrip() except IOError: logger.debug( @@ -1004,7 +1004,7 @@ class RestoreManager: continue hook_paths = self.info["system"][system_part]["paths"] - hook_paths = ["hooks/restore/%s" % os.path.basename(p) for p in hook_paths] + hook_paths = [f"hooks/restore/{os.path.basename(p)}" for p in hook_paths] # Otherwise, add it from the archive to the system # FIXME: Refactor hook_add and use it instead @@ -1071,7 +1071,7 @@ class RestoreManager: ret = subprocess.call(["umount", self.work_dir]) if ret == 0: subprocess.call(["rmdir", self.work_dir]) - logger.debug("Unmount dir: {}".format(self.work_dir)) + logger.debug(f"Unmount dir: {self.work_dir}") else: raise YunohostError("restore_removing_tmp_dir_failed") elif os.path.isdir(self.work_dir): @@ -1080,7 +1080,7 @@ class RestoreManager: ) ret = subprocess.call(["rm", "-Rf", self.work_dir]) if ret == 0: - logger.debug("Delete dir: {}".format(self.work_dir)) + logger.debug(f"Delete dir: {self.work_dir}") else: raise YunohostError("restore_removing_tmp_dir_failed") @@ -1182,7 +1182,7 @@ class RestoreManager: self._restore_apps() except Exception as e: raise YunohostError( - "The following critical error happened during restoration: %s" % e + f"The following critical error happened during restoration: {e}" ) finally: self.clean() @@ -1429,20 +1429,19 @@ class RestoreManager: restore_script = os.path.join(tmp_workdir_for_app, "restore") # Restore permissions - if not os.path.isfile("%s/permissions.yml" % app_settings_new_path): + if not os.path.isfile(f"{app_settings_new_path}/permissions.yml"): raise YunohostError( "Didnt find a permssions.yml for the app !?", raw_msg=True ) - permissions = read_yaml("%s/permissions.yml" % app_settings_new_path) + permissions = read_yaml(f"{app_settings_new_path}/permissions.yml") existing_groups = user_group_list()["groups"] for permission_name, permission_infos in permissions.items(): if "allowed" not in permission_infos: logger.warning( - "'allowed' key corresponding to allowed groups for permission %s not found when restoring app %s … You might have to reconfigure permissions yourself." - % (permission_name, app_instance_name) + f"'allowed' key corresponding to allowed groups for permission {permission_name} not found when restoring app {app_instance_name} … You might have to reconfigure permissions yourself." ) should_be_allowed = ["all_users"] else: @@ -1467,7 +1466,7 @@ class RestoreManager: permission_sync_to_user() - os.remove("%s/permissions.yml" % app_settings_new_path) + os.remove(f"{app_settings_new_path}/permissions.yml") _tools_migrations_run_before_app_restore( backup_version=self.info["from_yunohost_version"], @@ -1816,8 +1815,7 @@ class BackupMethod: # where everything is mapped to /dev/mapper/some-stuff # yet there are different devices behind it or idk ... logger.warning( - "Could not link %s to %s (%s) ... falling back to regular copy." - % (src, dest, str(e)) + f"Could not link {src} to {dest} ({e}) ... falling back to regular copy." ) else: # Success, go to next file to organize @@ -2383,7 +2381,7 @@ def backup_list(with_info=False, human_readable=False): """ # Get local archives sorted according to last modification time # (we do a realpath() to resolve symlinks) - archives = glob("%s/*.tar.gz" % ARCHIVES_PATH) + glob("%s/*.tar" % ARCHIVES_PATH) + archives = glob(f"{ARCHIVES_PATH}/*.tar.gz") + glob(f"{ARCHIVES_PATH}/*.tar") archives = {os.path.realpath(archive) for archive in archives} archives = sorted(archives, key=lambda x: os.path.getctime(x)) # Extract only filename without the extension @@ -2405,10 +2403,9 @@ def backup_list(with_info=False, human_readable=False): logger.warning(str(e)) except Exception: import traceback - + trace_ = "\n" + traceback.format_exc() logger.warning( - "Could not check infos for archive %s: %s" - % (archive, "\n" + traceback.format_exc()) + f"Could not check infos for archive {archive}: {trace_}" ) archives = d diff --git a/src/certificate.py b/src/certificate.py index adf707000..ca3329539 100644 --- a/src/certificate.py +++ b/src/certificate.py @@ -228,10 +228,7 @@ def _certificate_install_selfsigned(domain_list, force=False): ) operation_logger.success() else: - msg = ( - "Installation of self-signed certificate installation for %s failed !" - % (domain) - ) + msg = f"Installation of self-signed certificate installation for {domain} failed !" logger.error(msg) operation_logger.error(msg) @@ -299,8 +296,7 @@ def _certificate_install_letsencrypt( operation_logger.error(msg) if no_checks: logger.error( - "Please consider checking the 'DNS records' (basic) and 'Web' categories of the diagnosis to check for possible issues that may prevent installing a Let's Encrypt certificate on domain %s." - % domain + f"Please consider checking the 'DNS records' (basic) and 'Web' categories of the diagnosis to check for possible issues that may prevent installing a Let's Encrypt certificate on domain {domain}." ) else: logger.success(m18n.n("certmanager_cert_install_success", domain=domain)) @@ -417,11 +413,10 @@ def certificate_renew( stack = StringIO() traceback.print_exc(file=stack) - msg = "Certificate renewing for %s failed!" % (domain) + msg = f"Certificate renewing for {domain} failed!" if no_checks: msg += ( - "\nPlease consider checking the 'DNS records' (basic) and 'Web' categories of the diagnosis to check for possible issues that may prevent installing a Let's Encrypt certificate on domain %s." - % domain + f"\nPlease consider checking the 'DNS records' (basic) and 'Web' categories of the diagnosis to check for possible issues that may prevent installing a Let's Encrypt certificate on domain {domain}." ) logger.error(msg) operation_logger.error(msg) @@ -442,9 +437,9 @@ def certificate_renew( def _email_renewing_failed(domain, exception_message, stack=""): - from_ = "certmanager@%s (Certificate Manager)" % domain + from_ = f"certmanager@{domain} (Certificate Manager)" to_ = "root" - subject_ = "Certificate renewing attempt for %s failed!" % domain + subject_ = f"Certificate renewing attempt for {domain} failed!" logs = _tail(50, "/var/log/yunohost/yunohost-cli.log") message = f"""\ @@ -476,7 +471,7 @@ investigate : def _check_acme_challenge_configuration(domain): - domain_conf = "/etc/nginx/conf.d/%s.conf" % domain + domain_conf = f"/etc/nginx/conf.d/{domain}.conf" return "include /etc/nginx/conf.d/acme-challenge.conf.inc" in read_file(domain_conf) diff --git a/src/diagnosis.py b/src/diagnosis.py index 2b0cb7d1e..2486887b9 100644 --- a/src/diagnosis.py +++ b/src/diagnosis.py @@ -188,7 +188,7 @@ def diagnosis_run( # Call the hook ... diagnosed_categories = [] for category in categories: - logger.debug("Running diagnosis for %s ..." % category) + logger.debug(f"Running diagnosis for {category} ...") diagnoser = _load_diagnoser(category) @@ -282,7 +282,7 @@ def _diagnosis_ignore(add_filter=None, remove_filter=None, list=False): ) category = filter_[0] if category not in all_categories_names: - raise YunohostValidationError("%s is not a diagnosis category" % category) + raise YunohostValidationError(f"{category} is not a diagnosis category") if any("=" not in criteria for criteria in filter_[1:]): raise YunohostValidationError( "Criterias should be of the form key=value (e.g. domain=yolo.test)" @@ -423,7 +423,7 @@ class Diagnoser: not force and self.cached_time_ago() < self.cache_duration ): - logger.debug("Cache still valid : %s" % self.cache_file) + logger.debug(f"Cache still valid : {self.cache_file}") logger.info( m18n.n("diagnosis_cache_still_valid", category=self.description) ) @@ -457,7 +457,7 @@ class Diagnoser: new_report = {"id": self.id_, "cached_for": self.cache_duration, "items": items} - logger.debug("Updating cache %s" % self.cache_file) + logger.debug(f"Updating cache {self.cache_file}") self.write_cache(new_report) Diagnoser.i18n(new_report) add_ignore_flag_to_issues(new_report) @@ -530,7 +530,7 @@ class Diagnoser: @staticmethod def cache_file(id_): - return os.path.join(DIAGNOSIS_CACHE, "%s.json" % id_) + return os.path.join(DIAGNOSIS_CACHE, f"{id_}.json") @staticmethod def get_cached_report(id_, item=None, warn_if_no_cache=True): @@ -633,7 +633,7 @@ class Diagnoser: elif ipversion == 6: socket.getaddrinfo = getaddrinfo_ipv6_only - url = "https://{}/{}".format(DIAGNOSIS_SERVER, uri) + url = f"https://{DIAGNOSIS_SERVER}/{uri}" try: r = requests.post(url, json=data, timeout=timeout) finally: @@ -641,18 +641,16 @@ class Diagnoser: if r.status_code not in [200, 400]: raise Exception( - "The remote diagnosis server failed miserably while trying to diagnose your server. This is most likely an error on Yunohost's infrastructure and not on your side. Please contact the YunoHost team an provide them with the following information.
URL: %s
Status code: %s" - % (url, r.status_code) + f"The remote diagnosis server failed miserably while trying to diagnose your server. This is most likely an error on Yunohost's infrastructure and not on your side. Please contact the YunoHost team an provide them with the following information.
URL: {url}
Status code: {r.status_code}" ) if r.status_code == 400: - raise Exception("Diagnosis request was refused: %s" % r.content) + raise Exception(f"Diagnosis request was refused: {r.content}") try: r = r.json() except Exception as e: raise Exception( - "Failed to parse json from diagnosis server response.\nError: %s\nOriginal content: %s" - % (e, r.content) + f"Failed to parse json from diagnosis server response.\nError: {e}\nOriginal content: {r.content}" ) return r @@ -681,7 +679,7 @@ def _load_diagnoser(diagnoser_name): # this is python builtin method to import a module using a name, we # use that to import the migration as a python object so we'll be # able to run it in the next loop - module = import_module("yunohost.diagnosers.{}".format(module_id)) + module = import_module(f"yunohost.diagnosers.{module_id}") return module.MyDiagnoser() except Exception as e: import traceback @@ -695,9 +693,9 @@ def _email_diagnosis_issues(): from yunohost.domain import _get_maindomain maindomain = _get_maindomain() - from_ = "diagnosis@{} (Automatic diagnosis on {})".format(maindomain, maindomain) + from_ = f"diagnosis@{maindomain} (Automatic diagnosis on {maindomain})" to_ = "root" - subject_ = "Issues found by automatic diagnosis on %s" % maindomain + subject_ = f"Issues found by automatic diagnosis on {maindomain}" disclaimer = "The automatic diagnosis on your YunoHost server identified some issues on your server. You will find a description of the issues below. You can manage those issues in the 'Diagnosis' section in your webadmin." @@ -707,23 +705,17 @@ def _email_diagnosis_issues(): content = _dump_human_readable_reports(issues) - message = """\ -From: {} -To: {} -Subject: {} + message = f"""\ +From: {from_} +To: {to_} +Subject: {subject_} -{} +{disclaimer} --- -{} -""".format( - from_, - to_, - subject_, - disclaimer, - content, - ) +{content} +""" import smtplib diff --git a/src/dns.py b/src/dns.py index 362f02826..8991aa742 100644 --- a/src/dns.py +++ b/src/dns.py @@ -338,7 +338,7 @@ def _build_dns_conf(base_domain, include_empty_AAAA_if_no_ipv6=False): def _get_DKIM(domain): - DKIM_file = "/etc/dkim/{domain}.mail.txt".format(domain=domain) + DKIM_file = f"/etc/dkim/{domain}.mail.txt" if not os.path.isfile(DKIM_file): return (None, None) diff --git a/src/domain.py b/src/domain.py index 57c990762..6fd1724b4 100644 --- a/src/domain.py +++ b/src/domain.py @@ -196,7 +196,7 @@ def domain_add(operation_logger, domain, dyndns=False): } try: - ldap.add("virtualdomain=%s,ou=domains" % domain, attr_dict) + ldap.add(f"virtualdomain={domain},ou=domains", attr_dict) except Exception as e: raise YunohostError("domain_creation_failed", domain=domain, error=e) finally: @@ -215,7 +215,7 @@ def domain_add(operation_logger, domain, dyndns=False): # This is a pretty ad hoc solution and only applied to nginx # because it's one of the major service, but in the long term we # should identify the root of this bug... - _force_clear_hashes(["/etc/nginx/conf.d/%s.conf" % domain]) + _force_clear_hashes([f"/etc/nginx/conf.d/{domain}.conf"]) regen_conf( names=["nginx", "metronome", "dnsmasq", "postfix", "rspamd", "mdns"] ) @@ -282,8 +282,7 @@ def domain_remove(operation_logger, domain, remove_apps=False, force=False): apps_on_that_domain.append( ( app, - ' - %s "%s" on https://%s%s' - % (app, label, domain, settings["path"]) + f" - {app} \"{label}\" on https://{domain}{settings['path']}" if "path" in settings else app, ) @@ -342,14 +341,14 @@ def domain_remove(operation_logger, domain, remove_apps=False, force=False): # This is a pretty ad hoc solution and only applied to nginx # because it's one of the major service, but in the long term we # should identify the root of this bug... - _force_clear_hashes(["/etc/nginx/conf.d/%s.conf" % domain]) + _force_clear_hashes([f"/etc/nginx/conf.d/{domain}.conf"]) # And in addition we even force-delete the file Otherwise, if the file was # manually modified, it may not get removed by the regenconf which leads to # catastrophic consequences of nginx breaking because it can't load the # cert file which disappeared etc.. - if os.path.exists("/etc/nginx/conf.d/%s.conf" % domain): + if os.path.exists(f"/etc/nginx/conf.d/{domain}.conf"): _process_regen_conf( - "/etc/nginx/conf.d/%s.conf" % domain, new_conf=None, save=True + f"/etc/nginx/conf.d/{domain}.conf", new_conf=None, save=True ) regen_conf(names=["nginx", "metronome", "dnsmasq", "postfix", "rspamd", "mdns"]) @@ -388,7 +387,7 @@ def domain_main_domain(operation_logger, new_main_domain=None): domain_list_cache = {} _set_hostname(new_main_domain) except Exception as e: - logger.warning("%s" % e, exc_info=1) + logger.warning(str(e), exc_info=1) raise YunohostError("main_domain_change_failed") # Generate SSOwat configuration file diff --git a/src/hook.py b/src/hook.py index 8b18df772..70d3b281b 100644 --- a/src/hook.py +++ b/src/hook.py @@ -95,7 +95,7 @@ def hook_info(action, name): priorities = set() # Search in custom folder first - for h in iglob("{:s}{:s}/*-{:s}".format(CUSTOM_HOOK_FOLDER, action, name)): + for h in iglob(f"{CUSTOM_HOOK_FOLDER}{action}/*-{name}"): priority, _ = _extract_filename_parts(os.path.basename(h)) priorities.add(priority) hooks.append( @@ -105,7 +105,7 @@ def hook_info(action, name): } ) # Append non-overwritten system hooks - for h in iglob("{:s}{:s}/*-{:s}".format(HOOK_FOLDER, action, name)): + for h in iglob(f"{HOOK_FOLDER}{action}/*-{name}"): priority, _ = _extract_filename_parts(os.path.basename(h)) if priority not in priorities: hooks.append( @@ -431,8 +431,7 @@ def _hook_exec_bash(path, args, chdir, env, user, return_format, loggers): # use xtrace on fd 7 which is redirected to stdout env["BASH_XTRACEFD"] = "7" - cmd = '/bin/bash -x "{script}" {args} 7>&1' - command.append(cmd.format(script=cmd_script, args=cmd_args)) + command.append(f'/bin/bash -x "{cmd_script}" {cmd_args} 7>&1') logger.debug("Executing command '%s'" % command) diff --git a/src/permission.py b/src/permission.py index 493f17278..995cd34bb 100644 --- a/src/permission.py +++ b/src/permission.py @@ -133,8 +133,7 @@ def user_permission_list( main_perm_name = name.split(".")[0] + ".main" if main_perm_name not in permissions: logger.debug( - "Uhoh, unknown permission %s ? (Maybe we're in the process or deleting the perm for this app...)" - % main_perm_name + f"Uhoh, unknown permission {main_perm_name} ? (Maybe we're in the process or deleting the perm for this app...)" ) continue main_perm_label = permissions[main_perm_name]["label"] @@ -452,7 +451,7 @@ def permission_create( operation_logger.start() try: - ldap.add("cn=%s,ou=permission" % permission, attr_dict) + ldap.add(f"cn={permission},ou=permission", attr_dict) except Exception as e: raise YunohostError( "permission_creation_failed", permission=permission, error=e @@ -585,7 +584,7 @@ def permission_url( try: ldap.update( - "cn=%s,ou=permission" % permission, + f"cn={permission},ou=permission", { "URL": [url] if url is not None else [], "additionalUrls": new_additional_urls, @@ -633,7 +632,7 @@ def permission_delete(operation_logger, permission, force=False, sync_perm=True) operation_logger.start() try: - ldap.remove("cn=%s,ou=permission" % permission) + ldap.remove(f"cn={permission},ou=permission") except Exception as e: raise YunohostError( "permission_deletion_failed", permission=permission, error=e @@ -679,7 +678,7 @@ def permission_sync_to_user(): new_inherited_perms = { "inheritPermission": [ - "uid=%s,ou=users,dc=yunohost,dc=org" % u + f"uid={u},ou=users,dc=yunohost,dc=org" for u in should_be_allowed_users ], "memberUid": should_be_allowed_users, @@ -687,7 +686,7 @@ def permission_sync_to_user(): # Commit the change with the new inherited stuff try: - ldap.update("cn=%s,ou=permission" % permission_name, new_inherited_perms) + ldap.update(f"cn={permission_name},ou=permission", new_inherited_perms) except Exception as e: raise YunohostError( "permission_update_failed", permission=permission_name, error=e @@ -765,7 +764,7 @@ def _update_ldap_group_permission( update["showTile"] = [str(show_tile).upper()] try: - ldap.update("cn=%s,ou=permission" % permission, update) + ldap.update(f"cn={permission},ou=permission", update) except Exception as e: raise YunohostError("permission_update_failed", permission=permission, error=e) diff --git a/src/regenconf.py b/src/regenconf.py index 9dcec5ae5..0f855878d 100644 --- a/src/regenconf.py +++ b/src/regenconf.py @@ -449,7 +449,7 @@ def _save_regenconf_infos(infos): yaml.safe_dump(infos, f, default_flow_style=False) except Exception as e: logger.warning( - "Error while saving regenconf infos, exception: %s", e, exc_info=1 + f"Error while saving regenconf infos, exception: {e}", exc_info=1 ) raise @@ -506,7 +506,7 @@ def _calculate_hash(path): except IOError as e: logger.warning( - "Error while calculating file '%s' hash: %s", path, e, exc_info=1 + f"Error while calculating file '{path}' hash: {e}", exc_info=1 ) return None @@ -559,11 +559,11 @@ def _get_conf_hashes(category): categories = _get_regenconf_infos() if category not in categories: - logger.debug("category %s is not in categories.yml yet.", category) + logger.debug(f"category {category} is not in categories.yml yet.") return {} elif categories[category] is None or "conffiles" not in categories[category]: - logger.debug("No configuration files for category %s.", category) + logger.debug(f"No configuration files for category {category}.") return {} else: @@ -572,7 +572,7 @@ def _get_conf_hashes(category): def _update_conf_hashes(category, hashes): """Update the registered conf hashes for a category""" - logger.debug("updating conf hashes for '%s' with: %s", category, hashes) + logger.debug(f"updating conf hashes for '{category}' with: {hashes}") categories = _get_regenconf_infos() category_conf = categories.get(category, {}) @@ -603,8 +603,7 @@ def _force_clear_hashes(paths): for category in categories.keys(): if path in categories[category]["conffiles"]: logger.debug( - "force-clearing old conf hash for %s in category %s" - % (path, category) + f"force-clearing old conf hash for {path} in category {category}" ) del categories[category]["conffiles"][path] @@ -647,9 +646,7 @@ def _process_regen_conf(system_conf, new_conf=None, save=True): logger.debug(m18n.n("regenconf_file_updated", conf=system_conf)) except Exception as e: logger.warning( - "Exception while trying to regenerate conf '%s': %s", - system_conf, - e, + f"Exception while trying to regenerate conf '{system_conf}': {e}", exc_info=1, ) if not new_conf and os.path.exists(system_conf): diff --git a/src/service.py b/src/service.py index 0ac03f0c0..4da5d5546 100644 --- a/src/service.py +++ b/src/service.py @@ -407,8 +407,7 @@ def _get_and_format_service_status(service, infos): if raw_status is None: logger.error( - "Failed to get status information via dbus for service %s, systemctl didn't recognize this service ('NoSuchUnit')." - % systemd_service + f"Failed to get status information via dbus for service {systemd_service}, systemctl didn't recognize this service ('NoSuchUnit')." ) return { "status": "unknown", @@ -424,7 +423,7 @@ def _get_and_format_service_status(service, infos): # If no description was there, try to get it from the .json locales if not description: - translation_key = "service_description_%s" % service + translation_key = f"service_description_{service}" if m18n.key_exists(translation_key): description = m18n.n(translation_key) else: @@ -445,7 +444,7 @@ def _get_and_format_service_status(service, infos): "enabled" if glob("/etc/rc[S5].d/S??" + service) else "disabled" ) elif os.path.exists( - "/etc/systemd/system/multi-user.target.wants/%s.service" % service + f"/etc/systemd/system/multi-user.target.wants/{service}.service" ): output["start_on_boot"] = "enabled" @@ -585,8 +584,7 @@ def _run_service_command(action, service): ] if action not in possible_actions: raise ValueError( - "Unknown action '%s', available actions are: %s" - % (action, ", ".join(possible_actions)) + f"Unknown action '{action}', available actions are: {', '.join(possible_actions)}" ) cmd = f"systemctl {action} {service}" @@ -604,7 +602,7 @@ def _run_service_command(action, service): try: # Launch the command - logger.debug("Running '%s'" % cmd) + logger.debug(f"Running '{cmd}'") p = subprocess.Popen(cmd.split(), stderr=subprocess.STDOUT) # If this command needs a lock (because the service uses yunohost # commands inside), find the PID and add a lock for it @@ -651,7 +649,7 @@ def _give_lock(action, service, p): if son_PID != 0: # Append the PID to the lock file logger.debug(f"Giving a lock to PID {son_PID} for service {service} !") - append_to_file(MOULINETTE_LOCK, "\n%s" % str(son_PID)) + append_to_file(MOULINETTE_LOCK, f"\n{son_PID}") return son_PID @@ -815,7 +813,7 @@ def _find_previous_log_file(file): i = int(i[0]) + 1 if len(i) > 0 else 1 previous_file = file if i == 1 else splitext[0] - previous_file = previous_file + ".%d" % (i) + previous_file = previous_file + f".{i}" if os.path.exists(previous_file): return previous_file @@ -835,8 +833,7 @@ def _get_journalctl_logs(service, number="all"): ) except Exception: import traceback - + trace_ = traceback.format_exc() return ( - "error while get services logs from journalctl:\n%s" - % traceback.format_exc() + f"error while get services logs from journalctl:\n{trace_}" ) diff --git a/src/settings.py b/src/settings.py index 0e08a2640..498e6d5cc 100644 --- a/src/settings.py +++ b/src/settings.py @@ -285,7 +285,7 @@ def settings_reset_all(): def _get_setting_description(key): - return m18n.n("global_settings_setting_%s" % key.replace(".", "_")) + return m18n.n(f"global_settings_setting_{key}".replace(".", "_")) def _get_settings(): @@ -315,7 +315,7 @@ def _get_settings(): try: unknown_settings = json.load(open(unknown_settings_path, "r")) except Exception as e: - logger.warning("Error while loading unknown settings %s" % e) + logger.warning(f"Error while loading unknown settings {e}") try: with open(SETTINGS_PATH) as settings_fd: @@ -342,7 +342,7 @@ def _get_settings(): _save_settings(settings) except Exception as e: logger.warning( - "Failed to save unknown settings (because %s), aborting." % e + f"Failed to save unknown settings (because {e}), aborting." ) return settings @@ -374,11 +374,10 @@ post_change_hooks = {} def post_change_hook(setting_name): def decorator(func): assert setting_name in DEFAULTS.keys(), ( - "The setting %s does not exists" % setting_name + f"The setting {setting_name} does not exists" ) assert setting_name not in post_change_hooks, ( - "You can only register one post change hook per setting (in particular for %s)" - % setting_name + f"You can only register one post change hook per setting (in particular for {setting_name})" ) post_change_hooks[setting_name] = func return func @@ -388,7 +387,7 @@ def post_change_hook(setting_name): def trigger_post_change_hook(setting_name, old_value, new_value): if setting_name not in post_change_hooks: - logger.debug("Nothing to do after changing setting %s" % setting_name) + logger.debug(f"Nothing to do after changing setting {setting_name}") return f = post_change_hooks[setting_name] diff --git a/src/ssh.py b/src/ssh.py index 98fa8fb3c..b89dc6c8e 100644 --- a/src/ssh.py +++ b/src/ssh.py @@ -99,7 +99,7 @@ def user_ssh_remove_key(username, key): if not os.path.exists(authorized_keys_file): raise YunohostValidationError( - "this key doesn't exists ({} dosesn't exists)".format(authorized_keys_file), + f"this key doesn't exists ({authorized_keys_file} dosesn't exists)", raw_msg=True, ) @@ -107,7 +107,7 @@ def user_ssh_remove_key(username, key): if key not in authorized_keys_content: raise YunohostValidationError( - "Key '{}' is not present in authorized_keys".format(key), raw_msg=True + f"Key '{key}' is not present in authorized_keys", raw_msg=True ) # don't delete the previous comment because we can't verify if it's legit diff --git a/src/tools.py b/src/tools.py index 1a80d020f..7aa0fa42f 100644 --- a/src/tools.py +++ b/src/tools.py @@ -99,7 +99,7 @@ def tools_adminpw(new_password, check_strength=True): {"userPassword": [new_hash]}, ) except Exception as e: - logger.error("unable to change admin password : %s" % e) + logger.error(f"unable to change admin password : {e}") raise YunohostError("admin_password_change_failed") else: # Write as root password @@ -146,7 +146,7 @@ def _set_hostname(hostname, pretty_hostname=None): """ if not pretty_hostname: - pretty_hostname = "(YunoHost/%s)" % hostname + pretty_hostname = f"(YunoHost/{hostname})" # First clear nsswitch cache for hosts to make sure hostname is resolved... subprocess.call(["nscd", "-i", "hosts"]) @@ -332,7 +332,7 @@ def tools_update(target=None): if target not in ["system", "apps", "all"]: raise YunohostError( - "Unknown target %s, should be 'system', 'apps' or 'all'" % target, + f"Unknown target {target}, should be 'system', 'apps' or 'all'", raw_msg=True, ) @@ -479,7 +479,7 @@ def tools_upgrade( try: app_upgrade(app=upgradable_apps) except Exception as e: - logger.warning("unable to upgrade apps: %s" % str(e)) + logger.warning(f"unable to upgrade apps: {e}") logger.error(m18n.n("app_upgrade_some_app_failed")) return @@ -885,7 +885,7 @@ def _get_migration_by_name(migration_name): try: from . import migrations except ImportError: - raise AssertionError("Unable to find migration with name %s" % migration_name) + raise AssertionError(f"Unable to find migration with name {migration_name}") migrations_path = migrations.__path__[0] migrations_found = [ @@ -895,7 +895,7 @@ def _get_migration_by_name(migration_name): ] assert len(migrations_found) == 1, ( - "Unable to find migration with name %s" % migration_name + f"Unable to find migration with name {migration_name}" ) return _load_migration(migrations_found[0]) @@ -1019,7 +1019,7 @@ class Migration: @property def description(self): - return m18n.n("migration_description_%s" % self.id) + return m18n.n(f"migration_description_{self.id}") def ldap_migration(self, run): def func(self): diff --git a/src/user.py b/src/user.py index 6f99321bb..c03023387 100644 --- a/src/user.py +++ b/src/user.py @@ -163,7 +163,7 @@ def user_create( maindomain = _get_maindomain() domain = Moulinette.prompt( - m18n.n("ask_user_domain") + " (default: %s)" % maindomain + m18n.n("ask_user_domain") + f" (default: {maindomain})" ) if not domain: domain = maindomain @@ -237,7 +237,7 @@ def user_create( attr_dict["mail"] = [attr_dict["mail"]] + aliases try: - ldap.add("uid=%s,ou=users" % username, attr_dict) + ldap.add(f"uid={username},ou=users", attr_dict) except Exception as e: raise YunohostError("user_creation_failed", user=username, error=e) @@ -255,10 +255,10 @@ def user_create( try: subprocess.check_call( - ["setfacl", "-m", "g:all_users:---", "/home/%s" % username] + ["setfacl", "-m", "g:all_users:---", f"/home/{username}"] ) except subprocess.CalledProcessError: - logger.warning("Failed to protect /home/%s" % username, exc_info=1) + logger.warning(f"Failed to protect /home/{username}", exc_info=1) # Create group for user and add to group 'all_users' user_group_create(groupname=username, gid=uid, primary_group=True, sync_perm=False) @@ -318,7 +318,7 @@ def user_delete(operation_logger, username, purge=False, from_import=False): ldap = _get_ldap_interface() try: - ldap.remove("uid=%s,ou=users" % username) + ldap.remove(f"uid={username},ou=users") except Exception as e: raise YunohostError("user_deletion_failed", user=username, error=e) @@ -506,7 +506,7 @@ def user_update( operation_logger.start() try: - ldap.update("uid=%s,ou=users" % username, new_attr_dict) + ldap.update(f"uid={username},ou=users", new_attr_dict) except Exception as e: raise YunohostError("user_update_failed", user=username, error=e) @@ -577,11 +577,11 @@ def user_info(username): logger.warning(m18n.n("mailbox_disabled", user=username)) else: try: - cmd = "doveadm -f flow quota get -u %s" % user["uid"][0] - cmd_result = check_output(cmd) + uid_ = user["uid"][0] + cmd_result = check_output(f"doveadm -f flow quota get -u {uid_}") except Exception as e: cmd_result = "" - logger.warning("Failed to fetch quota info ... : %s " % str(e)) + logger.warning(f"Failed to fetch quota info ... : {e}") # Exemple of return value for cmd: # """Quota name=User quota Type=STORAGE Value=0 Limit=- %=0 @@ -707,8 +707,7 @@ def user_import(operation_logger, csvfile, update=False, delete=False): unknown_groups = [g for g in user["groups"] if g not in existing_groups] if unknown_groups: format_errors.append( - f"username '{user['username']}': unknown groups %s" - % ", ".join(unknown_groups) + f"username '{user['username']}': unknown groups {', '.join(unknown_groups)}" ) # Validate that domains exist @@ -729,8 +728,7 @@ def user_import(operation_logger, csvfile, update=False, delete=False): if unknown_domains: format_errors.append( - f"username '{user['username']}': unknown domains %s" - % ", ".join(unknown_domains) + f"username '{user['username']}': unknown domains {', '.join(unknown_domains)}" ) if format_errors: @@ -1002,7 +1000,7 @@ def user_group_create( m18n.n("group_already_exist_on_system_but_removing_it", group=groupname) ) subprocess.check_call( - "sed --in-place '/^%s:/d' /etc/group" % groupname, shell=True + f"sed --in-place '/^{groupname}:/d' /etc/group", shell=True ) else: raise YunohostValidationError( @@ -1032,7 +1030,7 @@ def user_group_create( operation_logger.start() try: - ldap.add("cn=%s,ou=groups" % groupname, attr_dict) + ldap.add(f"cn={groupname},ou=groups", attr_dict) except Exception as e: raise YunohostError("group_creation_failed", group=groupname, error=e) @@ -1075,7 +1073,7 @@ def user_group_delete(operation_logger, groupname, force=False, sync_perm=True): operation_logger.start() ldap = _get_ldap_interface() try: - ldap.remove("cn=%s,ou=groups" % groupname) + ldap.remove(f"cn={groupname},ou=groups") except Exception as e: raise YunohostError("group_deletion_failed", group=groupname, error=e) @@ -1171,7 +1169,7 @@ def user_group_update( ldap = _get_ldap_interface() try: ldap.update( - "cn=%s,ou=groups" % groupname, + f"cn={groupname},ou=groups", {"member": set(new_group_dns), "memberUid": set(new_group)}, ) except Exception as e: diff --git a/src/utils/legacy.py b/src/utils/legacy.py index 4186fa336..306fcc87f 100644 --- a/src/utils/legacy.py +++ b/src/utils/legacy.py @@ -117,7 +117,7 @@ def _patch_legacy_php_versions(app_folder): c = ( "sed -i " + "".join( - "-e 's@{pattern}@{replace}@g' ".format(pattern=p, replace=r) + f"-e 's@{p}@{r}@g' " for p, r in LEGACY_PHP_VERSION_REPLACEMENTS ) + "%s" % filename From d196f0be34d913c39f214c872b5e9a1d38ed6675 Mon Sep 17 00:00:00 2001 From: Boudewijn Date: Thu, 13 Jan 2022 21:06:05 +0000 Subject: [PATCH 284/619] Translated using Weblate (Dutch) Currently translated at 13.1% (95 of 720 strings) Translation: YunoHost/core Translate-URL: https://translate.yunohost.org/projects/yunohost/core/nl/ --- locales/nl.json | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/locales/nl.json b/locales/nl.json index 038d18283..d9f4e7a93 100644 --- a/locales/nl.json +++ b/locales/nl.json @@ -40,7 +40,7 @@ "extracting": "Uitpakken...", "installation_complete": "Installatie voltooid", "mail_alias_remove_failed": "Kan mail-alias '{mail}' niet verwijderen", - "pattern_email": "Moet een geldig emailadres bevatten (bv. abc@example.org)", + "pattern_email": "Moet een geldig e-mailadres bevatten, zonder '+' symbool er in (bv. abc@example.org)", "pattern_mailbox_quota": "Mailbox quota moet een waarde bevatten met b/k/M/G/T erachter of 0 om geen quota in te stellen", "pattern_password": "Wachtwoord moet tenminste 3 karakters lang zijn", "port_already_closed": "Poort {port} is al gesloten voor {ip_version} verbindingen", @@ -129,5 +129,17 @@ "additional_urls_already_removed": "Extra URL '{url}' is al verwijderd in de extra URL voor privilege '{permission}'", "app_label_deprecated": "Dit commando is vervallen. Gebruik alsjeblieft het nieuwe commando 'yunohost user permission update' om het label van de app te beheren.", "app_change_url_no_script": "De app '{app_name}' ondersteunt nog geen URL-aanpassingen. Misschien wel na een upgrade.", - "app_upgrade_some_app_failed": "Sommige apps konden niet worden bijgewerkt" + "app_upgrade_some_app_failed": "Sommige apps konden niet worden bijgewerkt", + "other_available_options": "... en {n} andere beschikbare opties die niet getoond worden", + "password_listed": "Dit wachtwoord is een van de meest gebruikte wachtwoorden ter wereld. Kies alstublieft iets wat minder voor de hand ligt.", + "password_too_simple_4": "Het wachtwoord moet minimaal 12 tekens lang zijn en moet cijfers, hoofdletters, kleine letters en speciale tekens bevatten", + "pattern_email_forward": "Het moet een geldig e-mailadres zijn, '+' symbool is toegestaan (ikzelf@mijndomein.nl bijvoorbeeld, of ikzelf+yunohost@mijndomein.nl)", + "password_too_simple_2": "Het wachtwoord moet minimaal 8 tekens lang zijn en moet cijfers, hoofdletters en kleine letters bevatten", + "operation_interrupted": "Werd de bewerking handmatig onderbroken?", + "packages_upgrade_failed": "Niet alle pakketten konden bijgewerkt worden", + "pattern_backup_archive_name": "Moet een geldige bestandsnaam zijn van maximaal 30 tekens; alleen alfanumerieke tekens en -_. zijn toegestaan", + "pattern_domain": "Moet een geldige domeinnaam zijn (mijneigendomein.nl, bijvoorbeeld)", + "pattern_firstname": "Het moet een geldige voornaam zijn", + "pattern_lastname": "Het moet een geldige achternaam zijn", + "password_too_simple_3": "Het wachtwoord moet minimaal 8 tekens lang zijn en moet cijfers, hoofdletters, kleine letters en speciale tekens bevatten" } From f322783d15200ea558d24b06a4999da3a7389bbc Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Fri, 14 Jan 2022 01:34:47 +0100 Subject: [PATCH 285/619] Tmp remove bullseye migration for minor release --- .../0021_migrate_to_bullseye.py | 427 ------------------ 1 file changed, 427 deletions(-) delete mode 100644 src/yunohost/data_migrations/0021_migrate_to_bullseye.py diff --git a/src/yunohost/data_migrations/0021_migrate_to_bullseye.py b/src/yunohost/data_migrations/0021_migrate_to_bullseye.py deleted file mode 100644 index e47087976..000000000 --- a/src/yunohost/data_migrations/0021_migrate_to_bullseye.py +++ /dev/null @@ -1,427 +0,0 @@ -import glob -import os - -from moulinette import m18n -from yunohost.utils.error import YunohostError -from moulinette.utils.log import getActionLogger -from moulinette.utils.process import check_output, call_async_output -from moulinette.utils.filesystem import read_file, rm - -from yunohost.tools import ( - Migration, - tools_update, - tools_upgrade, - _apt_log_line_is_relevant, -) -from yunohost.app import unstable_apps -from yunohost.regenconf import manually_modified_files, _force_clear_hashes -from yunohost.utils.filesystem import free_space_in_directory -from yunohost.utils.packages import ( - get_ynh_package_version, - _list_upgradable_apt_packages, -) -from yunohost.service import _get_services, _save_services - -logger = getActionLogger("yunohost.migration") - -N_CURRENT_DEBIAN = 10 -N_CURRENT_YUNOHOST = 4 - -N_NEXT_DEBAN = 11 -N_NEXT_YUNOHOST = 11 - - -class MyMigration(Migration): - - "Upgrade the system to Debian Bullseye and Yunohost 11.x" - - mode = "manual" - - def run(self): - - self.check_assertions() - - logger.info(m18n.n("migration_0021_start")) - - # - # Add new apt .deb signing key - # - - new_apt_key = "https://forge.yunohost.org/yunohost_bullseye.asc" - check_output(f"wget -O- {new_apt_key} -q | apt-key add -qq -") - - # - # Patch sources.list - # - logger.info(m18n.n("migration_0021_patching_sources_list")) - self.patch_apt_sources_list() - - # Force add sury if it's not there yet - # This is to solve some weird issue with php-common breaking php7.3-common, - # hence breaking many php7.3-deps - # hence triggering some dependency conflict (or foobar-ynh-deps uninstall) - # Adding it there shouldnt be a big deal - Yunohost 11.x does add it - # through its regen conf anyway. - if not os.path.exists("/etc/apt/sources.list.d/extra_php_version.list"): - open("/etc/apt/sources.list.d/extra_php_version.list", "w").write( - "deb https://packages.sury.org/php/ bullseye main" - ) - os.system( - 'wget --timeout 900 --quiet "https://packages.sury.org/php/apt.gpg" --output-document=- | gpg --dearmor >"/etc/apt/trusted.gpg.d/extra_php_version.gpg"' - ) - - # - # Run apt update - # - - tools_update(target="system") - - # Tell libc6 it's okay to restart system stuff during the upgrade - os.system( - "echo 'libc6 libraries/restart-without-asking boolean true' | debconf-set-selections" - ) - - # Don't send an email to root about the postgresql migration. It should be handled automatically after. - os.system( - "echo 'postgresql-common postgresql-common/obsolete-major seen true' | debconf-set-selections" - ) - - # - # Patch yunohost conflicts - # - logger.info(m18n.n("migration_0021_patch_yunohost_conflicts")) - - self.patch_yunohost_conflicts() - - # - # Specific tweaking to get rid of custom my.cnf and use debian's default one - # (my.cnf is actually a symlink to mariadb.cnf) - # - - _force_clear_hashes(["/etc/mysql/my.cnf"]) - rm("/etc/mysql/mariadb.cnf", force=True) - rm("/etc/mysql/my.cnf", force=True) - ret = self.apt_install( - "mariadb-common --reinstall -o Dpkg::Options::='--force-confmiss'" - ) - if ret != 0: - # FIXME: i18n once this is stable? - raise YunohostError("Failed to reinstall mariadb-common ?", raw_msg=True) - - # - # /usr/share/yunohost/yunohost-config/ssl/yunoCA -> /usr/share/yunohost/ssl - # - if os.path.exists("/usr/share/yunohost/yunohost-config/ssl/yunoCA"): - os.system( - "mv /usr/share/yunohost/yunohost-config/ssl/yunoCA /usr/share/yunohost/ssl" - ) - rm("/usr/share/yunohost/yunohost-config", recursive=True, force=True) - - # - # /home/yunohost.conf -> /var/cache/yunohost/regenconf - # - if os.path.exists("/home/yunohost.conf"): - os.system("mv /home/yunohost.conf /var/cache/yunohost/regenconf") - rm("/home/yunohost.conf", recursive=True, force=True) - - # Remove legacy postgresql service record added by helpers, - # will now be dynamically handled by the core in bullseye - services = _get_services() - if "postgresql" in services: - del services["postgresql"] - _save_services(services) - - # - # Main upgrade - # - logger.info(m18n.n("migration_0021_main_upgrade")) - - apps_packages = self.get_apps_equivs_packages() - self.hold(apps_packages) - tools_upgrade(target="system", allow_yunohost_upgrade=False) - - if self.debian_major_version() == N_CURRENT_DEBIAN: - raise YunohostError("migration_0021_still_on_buster_after_main_upgrade") - - # Force explicit install of php7.4-fpm and other old 'default' dependencies - # that are now only in Recommends - # - # Also, we need to install php7.4 equivalents of other php7.3 dependencies. - # For example, Nextcloud may depend on php7.3-zip, and after the php pool migration - # to autoupgrade Nextcloud to 7.4, it will need the php7.4-zip to work. - # The following list is based on an ad-hoc analysis of php deps found in the - # app ecosystem, with a known equivalent on php7.4. - # - # This is kinda a dirty hack as it doesnt properly update the *-ynh-deps virtual packages - # with the proper list of dependencies, and the dependencies install this way - # will get flagged as 'manually installed'. - # - # We'll probably want to do something during the Bullseye->Bookworm migration to re-flag - # these as 'auto' so they get autoremoved if not needed anymore. - # Also hopefully by then we'll have manifestv2 (maybe) and will be able to use - # the apt resource mecanism to regenerate the *-ynh-deps virtual packages ;) - - php73packages_suffixes = [ - "apcu", - "bcmath", - "bz2", - "dom", - "gmp", - "igbinary", - "imagick", - "imap", - "mbstring", - "memcached", - "mysqli", - "mysqlnd", - "pgsql", - "redis", - "simplexml", - "soap", - "sqlite3", - "ssh2", - "tidy", - "xml", - "xmlrpc", - "xsl", - "zip", - ] - - cmd = ( - "apt show '*-ynh-deps' 2>/dev/null" - " | grep Depends" - f" | grep -o -E \"php7.3-({'|'.join(php73packages_suffixes)})\"" - " | sort | uniq" - " | sed 's/php7.3/php7.4/g'" - " || true" - ) - - basephp74packages_to_install = [ - "php7.4-fpm", - "php7.4-common", - "php7.4-ldap", - "php7.4-intl", - "php7.4-mysql", - "php7.4-gd", - "php7.4-curl", - "php-php-gettext", - ] - - php74packages_to_install = basephp74packages_to_install + [ - f.strip() for f in check_output(cmd).split("\n") if f.strip() - ] - - ret = self.apt_install( - f"{' '.join(php74packages_to_install)} " - "$(dpkg --list | grep ynh-deps | awk '{print $2}') " - "-o Dpkg::Options::='--force-confmiss'" - ) - if ret != 0: - # FIXME: i18n once this is stable? - raise YunohostError( - "Failed to force the install of php dependencies ?", raw_msg=True - ) - - os.system(f"apt-mark auto {' '.join(basephp74packages_to_install)}") - - # Clean the mess - logger.info(m18n.n("migration_0021_cleaning_up")) - os.system("apt autoremove --assume-yes") - os.system("apt clean --assume-yes") - - # - # Yunohost upgrade - # - logger.info(m18n.n("migration_0021_yunohost_upgrade")) - - self.unhold(apps_packages) - - cmd = "LC_ALL=C" - cmd += " DEBIAN_FRONTEND=noninteractive" - cmd += " APT_LISTCHANGES_FRONTEND=none" - cmd += " apt dist-upgrade " - cmd += " --quiet -o=Dpkg::Use-Pty=0 --fix-broken --dry-run" - cmd += " | grep -q 'ynh-deps'" - - logger.info("Simulating upgrade...") - if os.system(cmd) == 0: - # FIXME: i18n once this is stable? - raise YunohostError( - "The upgrade cannot be completed, because some app dependencies would need to be removed?", - raw_msg=True, - ) - - tools_upgrade(target="system") - - def debian_major_version(self): - # The python module "platform" and lsb_release are not reliable because - # on some setup, they may still return Release=9 even after upgrading to - # buster ... (Apparently this is related to OVH overriding some stuff - # with /etc/lsb-release for instance -_-) - # Instead, we rely on /etc/os-release which should be the raw info from - # the distribution... - return int( - check_output( - "grep VERSION_ID /etc/os-release | head -n 1 | tr '\"' ' ' | cut -d ' ' -f2" - ) - ) - - def yunohost_major_version(self): - return int(get_ynh_package_version("yunohost")["version"].split(".")[0]) - - def check_assertions(self): - - # Be on buster (10.x) and yunohost 4.x - # NB : we do both check to cover situations where the upgrade crashed - # in the middle and debian version could be > 9.x but yunohost package - # would still be in 3.x... - if ( - not self.debian_major_version() == N_CURRENT_DEBIAN - and not self.yunohost_major_version() == N_CURRENT_YUNOHOST - ): - raise YunohostError("migration_0021_not_buster") - - # Have > 1 Go free space on /var/ ? - if free_space_in_directory("/var/") / (1024 ** 3) < 1.0: - raise YunohostError("migration_0021_not_enough_free_space") - - # Check system is up to date - # (but we don't if 'bullseye' is already in the sources.list ... - # which means maybe a previous upgrade crashed and we're re-running it) - if " bullseye " not in read_file("/etc/apt/sources.list"): - tools_update(target="system") - upgradable_system_packages = list(_list_upgradable_apt_packages()) - if upgradable_system_packages: - raise YunohostError("migration_0021_system_not_fully_up_to_date") - - @property - def disclaimer(self): - - # Avoid having a super long disclaimer + uncessary check if we ain't - # on buster / yunohost 4.x anymore - # NB : we do both check to cover situations where the upgrade crashed - # in the middle and debian version could be >= 10.x but yunohost package - # would still be in 4.x... - if ( - not self.debian_major_version() == N_CURRENT_DEBIAN - and not self.yunohost_major_version() == N_CURRENT_YUNOHOST - ): - return None - - # Get list of problematic apps ? I.e. not official or community+working - problematic_apps = unstable_apps() - problematic_apps = "".join(["\n - " + app for app in problematic_apps]) - - # Manually modified files ? (c.f. yunohost service regen-conf) - modified_files = manually_modified_files() - modified_files = "".join(["\n - " + f for f in modified_files]) - - message = m18n.n("migration_0021_general_warning") - - # FIXME: re-enable this message with updated topic link once we release the migration as stable - # message = ( - # "N.B.: This migration has been tested by the community over the last few months but has only been declared stable recently. If your server hosts critical services and if you are not too confident with debugging possible issues, we recommend you to wait a little bit more while we gather more feedback and polish things up. If on the other hand you are relatively confident with debugging small issues that may arise, you are encouraged to run this migration ;)! You can read about remaining known issues and feedback from the community here: https://forum.yunohost.org/t/12195\n\n" - # + message - # ) - - if problematic_apps: - message += "\n\n" + m18n.n( - "migration_0021_problematic_apps_warning", - problematic_apps=problematic_apps, - ) - - if modified_files: - message += "\n\n" + m18n.n( - "migration_0021_modified_files", manually_modified_files=modified_files - ) - - return message - - def patch_apt_sources_list(self): - - sources_list = glob.glob("/etc/apt/sources.list.d/*.list") - sources_list.append("/etc/apt/sources.list") - - # This : - # - replace single 'buster' occurence by 'bulleye' - # - comments lines containing "backports" - # - replace 'buster/updates' by 'bullseye/updates' (or same with -) - # Special note about the security suite: - # https://www.debian.org/releases/bullseye/amd64/release-notes/ch-information.en.html#security-archive - for f in sources_list: - command = ( - f"sed -i {f} " - "-e 's@ buster @ bullseye @g' " - "-e '/backports/ s@^#*@#@' " - "-e 's@ buster/updates @ bullseye-security @g' " - "-e 's@ buster-@ bullseye-@g' " - ) - os.system(command) - - def get_apps_equivs_packages(self): - - command = ( - "dpkg --get-selections" - " | grep -v deinstall" - " | awk '{print $1}'" - " | { grep 'ynh-deps$' || true; }" - ) - - output = check_output(command) - - return output.split("\n") if output else [] - - def hold(self, packages): - for package in packages: - os.system(f"apt-mark hold {package}") - - def unhold(self, packages): - for package in packages: - os.system(f"apt-mark unhold {package}") - - def apt_install(self, cmd): - def is_relevant(line): - return "Reading database ..." not in line.rstrip() - - callbacks = ( - lambda l: logger.info("+ " + l.rstrip() + "\r") - if _apt_log_line_is_relevant(l) - else logger.debug(l.rstrip() + "\r"), - lambda l: logger.warning(l.rstrip()) - if _apt_log_line_is_relevant(l) - else logger.debug(l.rstrip()), - ) - - cmd = ( - "LC_ALL=C DEBIAN_FRONTEND=noninteractive APT_LISTCHANGES_FRONTEND=none apt install --quiet -o=Dpkg::Use-Pty=0 --fix-broken --assume-yes " - + cmd - ) - - logger.debug("Running: %s" % cmd) - - return call_async_output(cmd, callbacks, shell=True) - - def patch_yunohost_conflicts(self): - # - # This is a super dirty hack to remove the conflicts from yunohost's debian/control file - # Those conflicts are there to prevent mistakenly upgrading critical packages - # such as dovecot, postfix, nginx, openssl, etc... usually related to mistakenly - # using backports etc. - # - # The hack consists in savagely removing the conflicts directly in /var/lib/dpkg/status - # - - # We only patch the conflict if we're on yunohost 4.x - if self.yunohost_major_version() != N_CURRENT_YUNOHOST: - return - - conflicts = check_output("dpkg-query -s yunohost | grep '^Conflicts:'").strip() - if conflicts: - # We want to keep conflicting with apache/bind9 tho - new_conflicts = "Conflicts: apache2, bind9" - - command = ( - f"sed -i /var/lib/dpkg/status -e 's@{conflicts}@{new_conflicts}@g'" - ) - logger.debug(f"Running: {command}") - os.system(command) From 4e560a93950d2ea09a2eb4ed83391707c8649b67 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Fri, 14 Jan 2022 01:35:09 +0100 Subject: [PATCH 286/619] Update changelog for 4.3.6 --- debian/changelog | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/debian/changelog b/debian/changelog index 49227f946..a59dfe2b0 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,18 @@ +yunohost (4.3.6) stable; urgency=low + + - [enh] ssh: add a new setting to manage PasswordAuthentication in sshd_config ([#1388](https://github.com/YunoHost/yunohost/pull/1388)) + - [enh] upgrades: filter more boring apt messages (3cc1a0a5) + - [fix] ynh_add_config: crons should be owned by root, otherwise they probably don't run? (0973301b) + - [fix] domains: force cert install during domain_add ([#1404](https://github.com/YunoHost/yunohost/pull/1404)) + - [fix] logs: remove 'args' for metadata, may contain unredacted secrets in edge cases + - [fix] helpers, apt: upgrade apt dependencies from extra repos ([#1407](https://github.com/YunoHost/yunohost/pull/1407)) + - [fix] diagnosis: incorrect dns check (relative vs absolute) for CNAME on subdomain (d81b85a4) + - [i18n] Translations updated for Dutch, French, Galician, German, Spanish, Ukrainian + + Thanks to all contributors <3 ! (Boudewijn, Christian Wehrli, Éric Gaspar, Germain Edy, José M, Kay0u, Kayou, ljf, Tagada, Tymofii-Lytvynenko) + + -- Alexandre Aubin Fri, 14 Jan 2022 01:29:58 +0100 + yunohost (4.3.5) stable; urgency=low - [fix] backup: bug in backup_delete when compress_tar_archives is True ([#1381](https://github.com/YunoHost/yunohost/pull/1381)) From 08efbbb9045eaed8e64d3dfc3f5e22e6ac0b5ecd Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Fri, 14 Jan 2022 01:37:17 +0100 Subject: [PATCH 287/619] Revert "Tmp remove bullseye migration for minor release" This reverts commit f322783d15200ea558d24b06a4999da3a7389bbc. --- .../0021_migrate_to_bullseye.py | 427 ++++++++++++++++++ 1 file changed, 427 insertions(+) create mode 100644 src/yunohost/data_migrations/0021_migrate_to_bullseye.py diff --git a/src/yunohost/data_migrations/0021_migrate_to_bullseye.py b/src/yunohost/data_migrations/0021_migrate_to_bullseye.py new file mode 100644 index 000000000..e47087976 --- /dev/null +++ b/src/yunohost/data_migrations/0021_migrate_to_bullseye.py @@ -0,0 +1,427 @@ +import glob +import os + +from moulinette import m18n +from yunohost.utils.error import YunohostError +from moulinette.utils.log import getActionLogger +from moulinette.utils.process import check_output, call_async_output +from moulinette.utils.filesystem import read_file, rm + +from yunohost.tools import ( + Migration, + tools_update, + tools_upgrade, + _apt_log_line_is_relevant, +) +from yunohost.app import unstable_apps +from yunohost.regenconf import manually_modified_files, _force_clear_hashes +from yunohost.utils.filesystem import free_space_in_directory +from yunohost.utils.packages import ( + get_ynh_package_version, + _list_upgradable_apt_packages, +) +from yunohost.service import _get_services, _save_services + +logger = getActionLogger("yunohost.migration") + +N_CURRENT_DEBIAN = 10 +N_CURRENT_YUNOHOST = 4 + +N_NEXT_DEBAN = 11 +N_NEXT_YUNOHOST = 11 + + +class MyMigration(Migration): + + "Upgrade the system to Debian Bullseye and Yunohost 11.x" + + mode = "manual" + + def run(self): + + self.check_assertions() + + logger.info(m18n.n("migration_0021_start")) + + # + # Add new apt .deb signing key + # + + new_apt_key = "https://forge.yunohost.org/yunohost_bullseye.asc" + check_output(f"wget -O- {new_apt_key} -q | apt-key add -qq -") + + # + # Patch sources.list + # + logger.info(m18n.n("migration_0021_patching_sources_list")) + self.patch_apt_sources_list() + + # Force add sury if it's not there yet + # This is to solve some weird issue with php-common breaking php7.3-common, + # hence breaking many php7.3-deps + # hence triggering some dependency conflict (or foobar-ynh-deps uninstall) + # Adding it there shouldnt be a big deal - Yunohost 11.x does add it + # through its regen conf anyway. + if not os.path.exists("/etc/apt/sources.list.d/extra_php_version.list"): + open("/etc/apt/sources.list.d/extra_php_version.list", "w").write( + "deb https://packages.sury.org/php/ bullseye main" + ) + os.system( + 'wget --timeout 900 --quiet "https://packages.sury.org/php/apt.gpg" --output-document=- | gpg --dearmor >"/etc/apt/trusted.gpg.d/extra_php_version.gpg"' + ) + + # + # Run apt update + # + + tools_update(target="system") + + # Tell libc6 it's okay to restart system stuff during the upgrade + os.system( + "echo 'libc6 libraries/restart-without-asking boolean true' | debconf-set-selections" + ) + + # Don't send an email to root about the postgresql migration. It should be handled automatically after. + os.system( + "echo 'postgresql-common postgresql-common/obsolete-major seen true' | debconf-set-selections" + ) + + # + # Patch yunohost conflicts + # + logger.info(m18n.n("migration_0021_patch_yunohost_conflicts")) + + self.patch_yunohost_conflicts() + + # + # Specific tweaking to get rid of custom my.cnf and use debian's default one + # (my.cnf is actually a symlink to mariadb.cnf) + # + + _force_clear_hashes(["/etc/mysql/my.cnf"]) + rm("/etc/mysql/mariadb.cnf", force=True) + rm("/etc/mysql/my.cnf", force=True) + ret = self.apt_install( + "mariadb-common --reinstall -o Dpkg::Options::='--force-confmiss'" + ) + if ret != 0: + # FIXME: i18n once this is stable? + raise YunohostError("Failed to reinstall mariadb-common ?", raw_msg=True) + + # + # /usr/share/yunohost/yunohost-config/ssl/yunoCA -> /usr/share/yunohost/ssl + # + if os.path.exists("/usr/share/yunohost/yunohost-config/ssl/yunoCA"): + os.system( + "mv /usr/share/yunohost/yunohost-config/ssl/yunoCA /usr/share/yunohost/ssl" + ) + rm("/usr/share/yunohost/yunohost-config", recursive=True, force=True) + + # + # /home/yunohost.conf -> /var/cache/yunohost/regenconf + # + if os.path.exists("/home/yunohost.conf"): + os.system("mv /home/yunohost.conf /var/cache/yunohost/regenconf") + rm("/home/yunohost.conf", recursive=True, force=True) + + # Remove legacy postgresql service record added by helpers, + # will now be dynamically handled by the core in bullseye + services = _get_services() + if "postgresql" in services: + del services["postgresql"] + _save_services(services) + + # + # Main upgrade + # + logger.info(m18n.n("migration_0021_main_upgrade")) + + apps_packages = self.get_apps_equivs_packages() + self.hold(apps_packages) + tools_upgrade(target="system", allow_yunohost_upgrade=False) + + if self.debian_major_version() == N_CURRENT_DEBIAN: + raise YunohostError("migration_0021_still_on_buster_after_main_upgrade") + + # Force explicit install of php7.4-fpm and other old 'default' dependencies + # that are now only in Recommends + # + # Also, we need to install php7.4 equivalents of other php7.3 dependencies. + # For example, Nextcloud may depend on php7.3-zip, and after the php pool migration + # to autoupgrade Nextcloud to 7.4, it will need the php7.4-zip to work. + # The following list is based on an ad-hoc analysis of php deps found in the + # app ecosystem, with a known equivalent on php7.4. + # + # This is kinda a dirty hack as it doesnt properly update the *-ynh-deps virtual packages + # with the proper list of dependencies, and the dependencies install this way + # will get flagged as 'manually installed'. + # + # We'll probably want to do something during the Bullseye->Bookworm migration to re-flag + # these as 'auto' so they get autoremoved if not needed anymore. + # Also hopefully by then we'll have manifestv2 (maybe) and will be able to use + # the apt resource mecanism to regenerate the *-ynh-deps virtual packages ;) + + php73packages_suffixes = [ + "apcu", + "bcmath", + "bz2", + "dom", + "gmp", + "igbinary", + "imagick", + "imap", + "mbstring", + "memcached", + "mysqli", + "mysqlnd", + "pgsql", + "redis", + "simplexml", + "soap", + "sqlite3", + "ssh2", + "tidy", + "xml", + "xmlrpc", + "xsl", + "zip", + ] + + cmd = ( + "apt show '*-ynh-deps' 2>/dev/null" + " | grep Depends" + f" | grep -o -E \"php7.3-({'|'.join(php73packages_suffixes)})\"" + " | sort | uniq" + " | sed 's/php7.3/php7.4/g'" + " || true" + ) + + basephp74packages_to_install = [ + "php7.4-fpm", + "php7.4-common", + "php7.4-ldap", + "php7.4-intl", + "php7.4-mysql", + "php7.4-gd", + "php7.4-curl", + "php-php-gettext", + ] + + php74packages_to_install = basephp74packages_to_install + [ + f.strip() for f in check_output(cmd).split("\n") if f.strip() + ] + + ret = self.apt_install( + f"{' '.join(php74packages_to_install)} " + "$(dpkg --list | grep ynh-deps | awk '{print $2}') " + "-o Dpkg::Options::='--force-confmiss'" + ) + if ret != 0: + # FIXME: i18n once this is stable? + raise YunohostError( + "Failed to force the install of php dependencies ?", raw_msg=True + ) + + os.system(f"apt-mark auto {' '.join(basephp74packages_to_install)}") + + # Clean the mess + logger.info(m18n.n("migration_0021_cleaning_up")) + os.system("apt autoremove --assume-yes") + os.system("apt clean --assume-yes") + + # + # Yunohost upgrade + # + logger.info(m18n.n("migration_0021_yunohost_upgrade")) + + self.unhold(apps_packages) + + cmd = "LC_ALL=C" + cmd += " DEBIAN_FRONTEND=noninteractive" + cmd += " APT_LISTCHANGES_FRONTEND=none" + cmd += " apt dist-upgrade " + cmd += " --quiet -o=Dpkg::Use-Pty=0 --fix-broken --dry-run" + cmd += " | grep -q 'ynh-deps'" + + logger.info("Simulating upgrade...") + if os.system(cmd) == 0: + # FIXME: i18n once this is stable? + raise YunohostError( + "The upgrade cannot be completed, because some app dependencies would need to be removed?", + raw_msg=True, + ) + + tools_upgrade(target="system") + + def debian_major_version(self): + # The python module "platform" and lsb_release are not reliable because + # on some setup, they may still return Release=9 even after upgrading to + # buster ... (Apparently this is related to OVH overriding some stuff + # with /etc/lsb-release for instance -_-) + # Instead, we rely on /etc/os-release which should be the raw info from + # the distribution... + return int( + check_output( + "grep VERSION_ID /etc/os-release | head -n 1 | tr '\"' ' ' | cut -d ' ' -f2" + ) + ) + + def yunohost_major_version(self): + return int(get_ynh_package_version("yunohost")["version"].split(".")[0]) + + def check_assertions(self): + + # Be on buster (10.x) and yunohost 4.x + # NB : we do both check to cover situations where the upgrade crashed + # in the middle and debian version could be > 9.x but yunohost package + # would still be in 3.x... + if ( + not self.debian_major_version() == N_CURRENT_DEBIAN + and not self.yunohost_major_version() == N_CURRENT_YUNOHOST + ): + raise YunohostError("migration_0021_not_buster") + + # Have > 1 Go free space on /var/ ? + if free_space_in_directory("/var/") / (1024 ** 3) < 1.0: + raise YunohostError("migration_0021_not_enough_free_space") + + # Check system is up to date + # (but we don't if 'bullseye' is already in the sources.list ... + # which means maybe a previous upgrade crashed and we're re-running it) + if " bullseye " not in read_file("/etc/apt/sources.list"): + tools_update(target="system") + upgradable_system_packages = list(_list_upgradable_apt_packages()) + if upgradable_system_packages: + raise YunohostError("migration_0021_system_not_fully_up_to_date") + + @property + def disclaimer(self): + + # Avoid having a super long disclaimer + uncessary check if we ain't + # on buster / yunohost 4.x anymore + # NB : we do both check to cover situations where the upgrade crashed + # in the middle and debian version could be >= 10.x but yunohost package + # would still be in 4.x... + if ( + not self.debian_major_version() == N_CURRENT_DEBIAN + and not self.yunohost_major_version() == N_CURRENT_YUNOHOST + ): + return None + + # Get list of problematic apps ? I.e. not official or community+working + problematic_apps = unstable_apps() + problematic_apps = "".join(["\n - " + app for app in problematic_apps]) + + # Manually modified files ? (c.f. yunohost service regen-conf) + modified_files = manually_modified_files() + modified_files = "".join(["\n - " + f for f in modified_files]) + + message = m18n.n("migration_0021_general_warning") + + # FIXME: re-enable this message with updated topic link once we release the migration as stable + # message = ( + # "N.B.: This migration has been tested by the community over the last few months but has only been declared stable recently. If your server hosts critical services and if you are not too confident with debugging possible issues, we recommend you to wait a little bit more while we gather more feedback and polish things up. If on the other hand you are relatively confident with debugging small issues that may arise, you are encouraged to run this migration ;)! You can read about remaining known issues and feedback from the community here: https://forum.yunohost.org/t/12195\n\n" + # + message + # ) + + if problematic_apps: + message += "\n\n" + m18n.n( + "migration_0021_problematic_apps_warning", + problematic_apps=problematic_apps, + ) + + if modified_files: + message += "\n\n" + m18n.n( + "migration_0021_modified_files", manually_modified_files=modified_files + ) + + return message + + def patch_apt_sources_list(self): + + sources_list = glob.glob("/etc/apt/sources.list.d/*.list") + sources_list.append("/etc/apt/sources.list") + + # This : + # - replace single 'buster' occurence by 'bulleye' + # - comments lines containing "backports" + # - replace 'buster/updates' by 'bullseye/updates' (or same with -) + # Special note about the security suite: + # https://www.debian.org/releases/bullseye/amd64/release-notes/ch-information.en.html#security-archive + for f in sources_list: + command = ( + f"sed -i {f} " + "-e 's@ buster @ bullseye @g' " + "-e '/backports/ s@^#*@#@' " + "-e 's@ buster/updates @ bullseye-security @g' " + "-e 's@ buster-@ bullseye-@g' " + ) + os.system(command) + + def get_apps_equivs_packages(self): + + command = ( + "dpkg --get-selections" + " | grep -v deinstall" + " | awk '{print $1}'" + " | { grep 'ynh-deps$' || true; }" + ) + + output = check_output(command) + + return output.split("\n") if output else [] + + def hold(self, packages): + for package in packages: + os.system(f"apt-mark hold {package}") + + def unhold(self, packages): + for package in packages: + os.system(f"apt-mark unhold {package}") + + def apt_install(self, cmd): + def is_relevant(line): + return "Reading database ..." not in line.rstrip() + + callbacks = ( + lambda l: logger.info("+ " + l.rstrip() + "\r") + if _apt_log_line_is_relevant(l) + else logger.debug(l.rstrip() + "\r"), + lambda l: logger.warning(l.rstrip()) + if _apt_log_line_is_relevant(l) + else logger.debug(l.rstrip()), + ) + + cmd = ( + "LC_ALL=C DEBIAN_FRONTEND=noninteractive APT_LISTCHANGES_FRONTEND=none apt install --quiet -o=Dpkg::Use-Pty=0 --fix-broken --assume-yes " + + cmd + ) + + logger.debug("Running: %s" % cmd) + + return call_async_output(cmd, callbacks, shell=True) + + def patch_yunohost_conflicts(self): + # + # This is a super dirty hack to remove the conflicts from yunohost's debian/control file + # Those conflicts are there to prevent mistakenly upgrading critical packages + # such as dovecot, postfix, nginx, openssl, etc... usually related to mistakenly + # using backports etc. + # + # The hack consists in savagely removing the conflicts directly in /var/lib/dpkg/status + # + + # We only patch the conflict if we're on yunohost 4.x + if self.yunohost_major_version() != N_CURRENT_YUNOHOST: + return + + conflicts = check_output("dpkg-query -s yunohost | grep '^Conflicts:'").strip() + if conflicts: + # We want to keep conflicting with apache/bind9 tho + new_conflicts = "Conflicts: apache2, bind9" + + command = ( + f"sed -i /var/lib/dpkg/status -e 's@{conflicts}@{new_conflicts}@g'" + ) + logger.debug(f"Running: {command}") + os.system(command) From 9354227a4e06b888d81498e23369ae5723a3148a Mon Sep 17 00:00:00 2001 From: Kay0u Date: Fri, 14 Jan 2022 12:07:46 +0100 Subject: [PATCH 288/619] [dnsmasq] ensure interface is up --- data/hooks/conf_regen/43-dnsmasq | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/hooks/conf_regen/43-dnsmasq b/data/hooks/conf_regen/43-dnsmasq index 3029b4a1f..c4c3d5498 100755 --- a/data/hooks/conf_regen/43-dnsmasq +++ b/data/hooks/conf_regen/43-dnsmasq @@ -28,7 +28,7 @@ do_pre_regen() { interfaces="$(ip -j addr show | jq -r '[.[].ifname]|join(" ")')" wireless_interfaces="lo" for dev in $(ls /sys/class/net); do - if [ -d "/sys/class/net/$dev/wireless" ]; then + if [ -d "/sys/class/net/$dev/wireless" ] && grep -q "up" "/sys/class/net/$dev/operstate"; then wireless_interfaces+=" $dev" fi done From 5479befabbc027503c985b2f9dc40ba4e3aab7c4 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Sun, 16 Jan 2022 03:27:14 +0100 Subject: [PATCH 289/619] [fix] helpers apt: Remove boring message about 'file.asc' wasnt deleted because it doesnt exists --- helpers/apt | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/helpers/apt b/helpers/apt index a38289dd2..ee352aebe 100644 --- a/helpers/apt +++ b/helpers/apt @@ -497,8 +497,14 @@ ynh_remove_extra_repo() { ynh_secure_remove --file="/etc/apt/sources.list.d/$name.list" # Sury pinning is managed by the regenconf in the core... [[ "$name" == "extra_php_version" ]] || ynh_secure_remove "/etc/apt/preferences.d/$name" - ynh_secure_remove --file="/etc/apt/trusted.gpg.d/$name.gpg" >/dev/null - ynh_secure_remove --file="/etc/apt/trusted.gpg.d/$name.asc" >/dev/null + if [ -e /etc/apt/trusted.gpg.d/$name.gpg ]; then + ynh_secure_remove --file="/etc/apt/trusted.gpg.d/$name.gpg" + fi + + # (Do we even create a .asc file anywhere ...?) + if [ -e /etc/apt/trusted.gpg.d/$name.asc ]; then + ynh_secure_remove --file="/etc/apt/trusted.gpg.d/$name.asc" + fi # Update the list of package to exclude the old repo ynh_package_update From 938d08134ec17dc7e85e0df037fb5f63839d3a66 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Mon, 17 Jan 2022 14:12:53 +0100 Subject: [PATCH 290/619] migrate_to_bullseye: Try to tell the system to not yolorestart nginx in the middle of the big upgrade because of nginx-common... --- .../data_migrations/0021_migrate_to_bullseye.py | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/yunohost/data_migrations/0021_migrate_to_bullseye.py b/src/yunohost/data_migrations/0021_migrate_to_bullseye.py index e47087976..82847c9a6 100644 --- a/src/yunohost/data_migrations/0021_migrate_to_bullseye.py +++ b/src/yunohost/data_migrations/0021_migrate_to_bullseye.py @@ -5,7 +5,7 @@ from moulinette import m18n from yunohost.utils.error import YunohostError from moulinette.utils.log import getActionLogger from moulinette.utils.process import check_output, call_async_output -from moulinette.utils.filesystem import read_file, rm +from moulinette.utils.filesystem import read_file, rm, write_to_file from yunohost.tools import ( Migration, @@ -81,6 +81,16 @@ class MyMigration(Migration): "echo 'libc6 libraries/restart-without-asking boolean true' | debconf-set-selections" ) + # Do not restart nginx during the upgrade of nginx-common ... + # c.f. https://manpages.debian.org/bullseye/init-system-helpers/deb-systemd-invoke.1p.en.html + # and the code inside /usr/bin/deb-systemd-invoke to see how it calls /usr/sbin/policy-rc.d ... + write_to_file( + '/usr/sbin/policy-rc.d', + '#!/bin/bash\n[[ "$1" == "nginx" ]] && return 101 || return 0' + ) + os.system("chmod +x /usr/sbin/policy-rc.d") + # FIXME: we still need to explicitly restart nginx somewhere ... + # Don't send an email to root about the postgresql migration. It should be handled automatically after. os.system( "echo 'postgresql-common postgresql-common/obsolete-major seen true' | debconf-set-selections" From b80158befe8d39946170940557ba1f52e0487116 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Mon, 17 Jan 2022 14:31:06 +0100 Subject: [PATCH 291/619] typo, in bash return is only inside functions... --- src/yunohost/data_migrations/0021_migrate_to_bullseye.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/yunohost/data_migrations/0021_migrate_to_bullseye.py b/src/yunohost/data_migrations/0021_migrate_to_bullseye.py index 82847c9a6..0cfa0ab7d 100644 --- a/src/yunohost/data_migrations/0021_migrate_to_bullseye.py +++ b/src/yunohost/data_migrations/0021_migrate_to_bullseye.py @@ -86,7 +86,7 @@ class MyMigration(Migration): # and the code inside /usr/bin/deb-systemd-invoke to see how it calls /usr/sbin/policy-rc.d ... write_to_file( '/usr/sbin/policy-rc.d', - '#!/bin/bash\n[[ "$1" == "nginx" ]] && return 101 || return 0' + '#!/bin/bash\n[[ "$1" == "nginx" ]] && exit 101 || exit 0' ) os.system("chmod +x /usr/sbin/policy-rc.d") # FIXME: we still need to explicitly restart nginx somewhere ... From 2612df97d09123303124c0494443f0257e432fd5 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Mon, 17 Jan 2022 15:47:19 +0100 Subject: [PATCH 292/619] hmpf --- src/yunohost/data_migrations/0021_migrate_to_bullseye.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/yunohost/data_migrations/0021_migrate_to_bullseye.py b/src/yunohost/data_migrations/0021_migrate_to_bullseye.py index 0cfa0ab7d..fad29332c 100644 --- a/src/yunohost/data_migrations/0021_migrate_to_bullseye.py +++ b/src/yunohost/data_migrations/0021_migrate_to_bullseye.py @@ -81,12 +81,14 @@ class MyMigration(Migration): "echo 'libc6 libraries/restart-without-asking boolean true' | debconf-set-selections" ) - # Do not restart nginx during the upgrade of nginx-common ... + # Do not restart nginx during the upgrade of nginx-common and nginx-extras ... # c.f. https://manpages.debian.org/bullseye/init-system-helpers/deb-systemd-invoke.1p.en.html + # and zcat /usr/share/doc/init-system-helpers/README.policy-rc.d.gz # and the code inside /usr/bin/deb-systemd-invoke to see how it calls /usr/sbin/policy-rc.d ... + # and also invoke-rc.d ... write_to_file( '/usr/sbin/policy-rc.d', - '#!/bin/bash\n[[ "$1" == "nginx" ]] && exit 101 || exit 0' + '#!/bin/bash\n[[ "$1" =~ "nginx" ]] && [[ "$2" == "restart" ]] && exit 101 || exit 0' ) os.system("chmod +x /usr/sbin/policy-rc.d") # FIXME: we still need to explicitly restart nginx somewhere ... From c2c03587814a7898c3cf2b72a7ea97a7663a4626 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Mon, 17 Jan 2022 16:23:27 +0100 Subject: [PATCH 293/619] Moar boring apt warnings to filter --- src/yunohost/tools.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/yunohost/tools.py b/src/yunohost/tools.py index 021a8f3a1..c3202cf54 100644 --- a/src/yunohost/tools.py +++ b/src/yunohost/tools.py @@ -686,6 +686,12 @@ def _apt_log_line_is_relevant(line): ", does not exist on system.", "unable to delete old directory", "update-alternatives:", + "Configuration file '/etc", + "==> Modified (by you or by a script) since installation.", + "==> Package distributor has shipped an updated version.", + "==> Keeping old config file as default.", + "is a disabled or a static unit", + " update-rc.d: warning: start and stop actions are no longer supported; falling back to defaults", ] return line.rstrip() and all(i not in line.rstrip() for i in irrelevants) From 6ea327282875d06367612cd4cf06775fcc65efb7 Mon Sep 17 00:00:00 2001 From: Kay0u Date: Mon, 17 Jan 2022 17:36:54 +0100 Subject: [PATCH 294/619] fix ynh_install_app_dependencies when an app change his default phpversion --- data/helpers.d/apt | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/data/helpers.d/apt b/data/helpers.d/apt index 0b75138aa..b50f4a87b 100644 --- a/data/helpers.d/apt +++ b/data/helpers.d/apt @@ -321,6 +321,20 @@ EOF # Set the default php version back as the default version for php-cli. update-alternatives --set php /usr/bin/php$YNH_DEFAULT_PHP_VERSION + local old_phpversion=$(ynh_app_setting_get --app=$app --key=phpversion) + + # If the PHP version changed, remove the old fpm conf + if [ -n "$old_phpversion" ] && [ "$old_phpversion" != "$specific_php_version" ]; then + local old_php_fpm_config_dir=$(ynh_app_setting_get --app=$app --key=fpm_config_dir) + local old_php_finalphpconf="$old_php_fpm_config_dir/pool.d/$app.conf" + + if [[ -f "$old_php_finalphpconf" ]] + then + ynh_backup_if_checksum_is_different --file="$old_php_finalphpconf" + ynh_remove_fpm_config + fi + fi + # Store phpversion into the config of this app ynh_app_setting_set --app=$app --key=phpversion --value=$specific_php_version From ac5718c66629603221d81e1f4511755a211893c3 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Mon, 17 Jan 2022 20:38:00 +0100 Subject: [PATCH 295/619] =?UTF-8?q?migrate=5Fto=5Fbullseye:=20add=20super?= =?UTF-8?q?=20ugly=20and=20boring=20hack=20to=20tools=5Fupgrade=20to=20run?= =?UTF-8?q?=20some=20commands=20needed=20after=20migrations=20=C3=A9=5F?= =?UTF-8?q?=C3=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../0021_migrate_to_bullseye.py | 9 +++++--- src/yunohost/tools.py | 23 ++++++++++--------- 2 files changed, 18 insertions(+), 14 deletions(-) diff --git a/src/yunohost/data_migrations/0021_migrate_to_bullseye.py b/src/yunohost/data_migrations/0021_migrate_to_bullseye.py index fad29332c..88825dfa1 100644 --- a/src/yunohost/data_migrations/0021_migrate_to_bullseye.py +++ b/src/yunohost/data_migrations/0021_migrate_to_bullseye.py @@ -91,7 +91,6 @@ class MyMigration(Migration): '#!/bin/bash\n[[ "$1" =~ "nginx" ]] && [[ "$2" == "restart" ]] && exit 101 || exit 0' ) os.system("chmod +x /usr/sbin/policy-rc.d") - # FIXME: we still need to explicitly restart nginx somewhere ... # Don't send an email to root about the postgresql migration. It should be handled automatically after. os.system( @@ -234,8 +233,6 @@ class MyMigration(Migration): "Failed to force the install of php dependencies ?", raw_msg=True ) - os.system(f"apt-mark auto {' '.join(basephp74packages_to_install)}") - # Clean the mess logger.info(m18n.n("migration_0021_cleaning_up")) os.system("apt autoremove --assume-yes") @@ -263,6 +260,12 @@ class MyMigration(Migration): raw_msg=True, ) + + postupgradecmds = f"apt-mark auto {' '.join(basephp74packages_to_install)}\n" + postupgradecmds += "rm -f /usr/sbin/policy-rc.d\n" + postupgradecmds += "echo 'Restarting nginx...' >&2\n" + postupgradecmds += "systemctl restart nginx\n" + tools_upgrade(target="system") def debian_major_version(self): diff --git a/src/yunohost/tools.py b/src/yunohost/tools.py index c3202cf54..1eaad28bf 100644 --- a/src/yunohost/tools.py +++ b/src/yunohost/tools.py @@ -448,7 +448,7 @@ def _list_upgradable_apps(): @is_unit_operation() def tools_upgrade( - operation_logger, target=None, apps=False, system=False, allow_yunohost_upgrade=True + operation_logger, target=None, apps=False, system=False, allow_yunohost_upgrade=True, postupgradecmds="" ): """ Update apps & package cache, then display changelog @@ -646,19 +646,20 @@ def tools_upgrade( upgrade_completed = "\n" + m18n.n( "tools_upgrade_special_packages_completed" ) - command = "({wait} && {dist_upgrade}) && {mark_success} || {mark_failure}; {update_metadata}; echo '{done}'".format( - wait=wait_until_end_of_yunohost_command, - dist_upgrade=dist_upgrade, - mark_success=mark_success, - mark_failure=mark_failure, - update_metadata=update_log_metadata, - done=upgrade_completed, - ) + script = f""" +({wait_until_end_of_yunohost_command} && {dist_upgrade}) \\ +&& {mark_success} \\ +|| {mark_failure} + +{update_log_metadata} +{postupgradecmds} +echo '{upgrade_completed}' +""" logger.warning(m18n.n("tools_upgrade_special_packages_explanation")) - logger.debug("Running command :\n{}".format(command)) + logger.debug("Running script :\n{}".format(script)) open("/tmp/yunohost-selfupgrade", "w").write( - "rm /tmp/yunohost-selfupgrade; " + command + "rm /tmp/yunohost-selfupgrade\n " + script ) # Using systemd-run --scope is like nohup/disown and &, but more robust somehow # (despite using nohup/disown and &, the self-upgrade process was still getting killed...) From ecb8419ee0bd5055784f4c11cf7d927c4e4b77c7 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Mon, 17 Jan 2022 21:21:46 +0100 Subject: [PATCH 296/619] dyndns: fix dyndns_update, needs to construct the update object using the target zone, not the domain itself --- src/dyndns.py | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/dyndns.py b/src/dyndns.py index 69f1989f6..c9da4f1be 100644 --- a/src/dyndns.py +++ b/src/dyndns.py @@ -219,8 +219,8 @@ def dyndns_update( return # Extract 'host', e.g. 'nohost.me' from 'foo.nohost.me' - host = domain.split(".")[1:] - host = ".".join(host) + zone = domain.split(".")[1:] + zone = ".".join(zone) logger.debug("Building zone update ...") @@ -229,7 +229,7 @@ def dyndns_update( keyring = dns.tsigkeyring.from_text({f'{domain}.': key}) # Python's dns.update is similar to the old nsupdate cli tool - update = dns.update.Update(domain, keyring=keyring, keyalgorithm=dns.tsig.HMAC_SHA512) + update = dns.update.Update(zone, keyring=keyring, keyalgorithm=dns.tsig.HMAC_SHA512) auth_resolvers = [] @@ -322,11 +322,15 @@ def dyndns_update( if not dry_run: try: - dns.query.tcp(update, auth_resolvers[0]) + r = dns.query.tcp(update, auth_resolvers[0]) except Exception as e: logger.error(e) raise YunohostError("dyndns_ip_update_failed") + if "rcode NOERROR" not in str(r): + logger.error(str(r)) + raise YunohostError("dyndns_ip_update_failed") + logger.success(m18n.n("dyndns_ip_updated")) else: print( From 019839dbf92a5d36c162a80abf6944d8f4a5f3a3 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Mon, 17 Jan 2022 22:06:49 +0100 Subject: [PATCH 297/619] certificates: fix edge case where None is returned, triggering 'NoneType has no attribute get' --- src/yunohost/certificate.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/yunohost/certificate.py b/src/yunohost/certificate.py index 2f3676202..3d90895c7 100644 --- a/src/yunohost/certificate.py +++ b/src/yunohost/certificate.py @@ -860,14 +860,14 @@ def _check_domain_is_ready_for_ACME(domain): if is_yunohost_dyndns_domain(parent_domain): record_name = "@" - A_record_status = dnsrecords.get("data").get(f"A:{record_name}") - AAAA_record_status = dnsrecords.get("data").get(f"AAAA:{record_name}") + A_record_status = dnsrecords.get("data", {}).get(f"A:{record_name}") + AAAA_record_status = dnsrecords.get("data", {}).get(f"AAAA:{record_name}") # Fallback to wildcard in case no result yet for the DNS name? if not A_record_status: - A_record_status = dnsrecords.get("data").get("A:*") + A_record_status = dnsrecords.get("data", {}).get("A:*") if not AAAA_record_status: - AAAA_record_status = dnsrecords.get("data").get("AAAA:*") + AAAA_record_status = dnsrecords.get("data", {}).get("AAAA:*") if ( not httpreachable From deda909eba18e1c5d05343e5e0756d2dd16eb5a6 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Mon, 17 Jan 2022 22:48:45 +0100 Subject: [PATCH 298/619] =?UTF-8?q?typoe=20/=20Aaaand=20ofc=20I=20forgot?= =?UTF-8?q?=20to=20pass=20the=20var=20as=20argument=20=E2=88=95o\?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/yunohost/data_migrations/0021_migrate_to_bullseye.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/yunohost/data_migrations/0021_migrate_to_bullseye.py b/src/yunohost/data_migrations/0021_migrate_to_bullseye.py index 88825dfa1..58bb259f7 100644 --- a/src/yunohost/data_migrations/0021_migrate_to_bullseye.py +++ b/src/yunohost/data_migrations/0021_migrate_to_bullseye.py @@ -266,7 +266,7 @@ class MyMigration(Migration): postupgradecmds += "echo 'Restarting nginx...' >&2\n" postupgradecmds += "systemctl restart nginx\n" - tools_upgrade(target="system") + tools_upgrade(target="system", postupgradecmds=postupgradecmds) def debian_major_version(self): # The python module "platform" and lsb_release are not reliable because From 1bbe3441d863467215ea63ad9378c30a861b9deb Mon Sep 17 00:00:00 2001 From: Gregor Date: Mon, 17 Jan 2022 04:07:48 +0000 Subject: [PATCH 299/619] Translated using Weblate (German) Currently translated at 100.0% (720 of 720 strings) Translation: YunoHost/core Translate-URL: https://translate.yunohost.org/projects/yunohost/core/de/ --- locales/de.json | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/locales/de.json b/locales/de.json index 3aa07475e..9e1087316 100644 --- a/locales/de.json +++ b/locales/de.json @@ -350,7 +350,7 @@ "diagnosis_ram_low": "Das System hat nur {available} ({available_percent}%) RAM zur Verfügung! (von insgesamt {total}). Seien Sie vorsichtig.", "service_reload_or_restart_failed": "Der Dienst '{service}' konnte nicht erneut geladen oder gestartet werden.\n\nKürzlich erstellte Logs des Dienstes: {logs}", "diagnosis_domain_expiration_not_found_details": "Die WHOIS-Informationen für die Domäne {domain} scheinen keine Informationen über das Ablaufdatum zu enthalten. Stimmt das?", - "diagnosis_domain_expiration_warning": "Einige Domänen werden bald ablaufen.", + "diagnosis_domain_expiration_warning": "Einige Domänen werden bald ablaufen!", "diagnosis_diskusage_ok": "Der Speicher {mountpoint} (auf Gerät {device}) hat immer noch {free} ({free_percent}%) freien Speicherplatz übrig(von insgesamt {total})!", "diagnosis_ram_ok": "Das System hat immer noch {available} ({available_percent}%) RAM zu Verfügung von {total}.", "diagnosis_swap_none": "Das System hat gar keinen Swap. Sie sollten sich überlegen mindestens {recommended} an Swap einzurichten, um Situationen zu verhindern, in welchen der RAM des Systems knapp wird.", @@ -698,10 +698,25 @@ "ldap_attribute_already_exists": "LDAP-Attribut '{attribute}' existiert bereits mit dem Wert '{value}'", "user_import_success": "Benutzer:innen erfolgreich importiert", "domain_registrar_is_not_configured": "Der DNS-Registrar ist noch nicht für die Domäne '{domain}' konfiguriert.", - "domain_dns_push_not_applicable": "Die automatische DNS-Konfiguration ist nicht auf die Domäne {domain} anwendbar. Konfiguriere die DNS-Einträge manuell, wie unter https://yunohost.org/dns_config beschrieben.", + "domain_dns_push_not_applicable": "Die automatische DNS-Konfiguration ist nicht auf die Domäne {domain} anwendbar. Konfiguriere die DNS-Einträge manuell, wie unter https://yunohost.org/dns_config beschrieben.", "domain_dns_registrar_experimental": "Bislang wurde die Schnittstelle zur API von **{registrar}** noch nicht außreichend von der YunoHost-Community getestet und geprüft. Der Support ist **sehr experimentell** – sei vorsichtig!", "domain_dns_push_failed_to_authenticate": "Die Authentifizierung bei der API des Registrars für die Domäne '{domain}' ist fehlgeschlagen. Wahrscheinlich sind die Anmeldedaten falsch? (Fehler: {error})", "log_domain_config_set": "Konfiguration für die Domäne '{}' aktualisieren", "log_domain_dns_push": "DNS-Einträge für die Domäne '{}' übertragen", - "service_description_yunomdns": "Ermöglicht es dir, deinen Server über 'yunohost.local' in deinem lokalen Netzwerk zu erreichen" + "service_description_yunomdns": "Ermöglicht es dir, deinen Server über 'yunohost.local' in deinem lokalen Netzwerk zu erreichen", + "migration_0021_start": "Beginnen von Migration zu Bullseye", + "migration_0021_patching_sources_list": "Aktualisieren der sources.lists...", + "migration_0021_main_upgrade": "Starte Hauptupdate...", + "migration_0021_still_on_buster_after_main_upgrade": "Irgendetwas ist während des Haupt-Upgrades schief gelaufen, das System scheint immer noch auf Debian Buster zu laufen", + "migration_0021_yunohost_upgrade": "Start des YunoHost Kern-Upgrades...", + "migration_0021_not_buster": "Die aktuelle Debian-Distribution ist nicht Buster!", + "migration_0021_not_enough_free_space": "Der freie Speicherplatz in /var/ ist ziemlich gering! Sie sollten mindestens 1 GB frei haben, um diese Migration durchzuführen.", + "migration_0021_system_not_fully_up_to_date": "Ihr System ist nicht ganz aktuell. Bitte führen Sie ein reguläres Update durch, bevor Sie die Migration zu Bullseye durchführen.", + "migration_0021_problematic_apps_warning": "Bitte beachten Sie, dass die folgenden möglicherweise problematischen installierten Anwendungen erkannt wurden. Es sieht so aus, als ob diese nicht aus dem YunoHost-App-Katalog installiert wurden oder nicht als \"funktionierend\" gekennzeichnet sind. Es kann daher nicht garantiert werden, dass sie nach dem Update noch funktionieren werden: {problematic_apps}", + "migration_0021_modified_files": "Bitte beachten Sie, dass die folgenden Dateien manuell geändert wurden und nach dem Update möglicherweise überschrieben werden: {manually_modified_files}", + "migration_0021_cleaning_up": "Bereinigung von Cache und Paketen nicht mehr nötig...", + "migration_0021_patch_yunohost_conflicts": "Patch anwenden, um das Konfliktproblem zu umgehen...", + "global_settings_setting_security_ssh_password_authentication": "Passwort-Authentifizierung für SSH zulassen", + "migration_description_0021_migrate_to_bullseye": "Upgrade des Systems auf Debian Bullseye und YunoHost 11.x", + "migration_0021_general_warning": "Bitte beachten Sie, dass diese Migration ein heikler Vorgang ist. Das YunoHost-Team hat sein Bestes getan, um sie zu überprüfen und zu testen, aber die Migration könnte immer noch Teile des Systems oder seiner Anwendungen beschädigen.\n\nEs wird daher empfohlen,:\n - Führen Sie ein Backup aller kritischen Daten oder Anwendungen durch. Mehr Informationen unter https://yunohost.org/backup;\n - Haben Sie Geduld, nachdem Sie die Migration gestartet haben: Je nach Internetverbindung und Hardware kann es bis zu ein paar Stunden dauern, bis alles aktualisiert ist." } From 7373971573a13b72da9eef8b9c7f106d27dc5552 Mon Sep 17 00:00:00 2001 From: yunohost-bot Date: Mon, 17 Jan 2022 22:03:13 +0000 Subject: [PATCH 300/619] [CI] Format code with Black --- src/yunohost/data_migrations/0021_migrate_to_bullseye.py | 5 ++--- src/yunohost/tools.py | 7 ++++++- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/yunohost/data_migrations/0021_migrate_to_bullseye.py b/src/yunohost/data_migrations/0021_migrate_to_bullseye.py index 58bb259f7..eace6ca2e 100644 --- a/src/yunohost/data_migrations/0021_migrate_to_bullseye.py +++ b/src/yunohost/data_migrations/0021_migrate_to_bullseye.py @@ -87,8 +87,8 @@ class MyMigration(Migration): # and the code inside /usr/bin/deb-systemd-invoke to see how it calls /usr/sbin/policy-rc.d ... # and also invoke-rc.d ... write_to_file( - '/usr/sbin/policy-rc.d', - '#!/bin/bash\n[[ "$1" =~ "nginx" ]] && [[ "$2" == "restart" ]] && exit 101 || exit 0' + "/usr/sbin/policy-rc.d", + '#!/bin/bash\n[[ "$1" =~ "nginx" ]] && [[ "$2" == "restart" ]] && exit 101 || exit 0', ) os.system("chmod +x /usr/sbin/policy-rc.d") @@ -260,7 +260,6 @@ class MyMigration(Migration): raw_msg=True, ) - postupgradecmds = f"apt-mark auto {' '.join(basephp74packages_to_install)}\n" postupgradecmds += "rm -f /usr/sbin/policy-rc.d\n" postupgradecmds += "echo 'Restarting nginx...' >&2\n" diff --git a/src/yunohost/tools.py b/src/yunohost/tools.py index 1eaad28bf..dbd3af5f5 100644 --- a/src/yunohost/tools.py +++ b/src/yunohost/tools.py @@ -448,7 +448,12 @@ def _list_upgradable_apps(): @is_unit_operation() def tools_upgrade( - operation_logger, target=None, apps=False, system=False, allow_yunohost_upgrade=True, postupgradecmds="" + operation_logger, + target=None, + apps=False, + system=False, + allow_yunohost_upgrade=True, + postupgradecmds="", ): """ Update apps & package cache, then display changelog From 89dda11b5649d28ccafe83a2911e09ed857728ab Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Mon, 17 Jan 2022 23:58:04 +0100 Subject: [PATCH 301/619] postgresql migration: Attempt to fix cluster upgrade, complaining that cluster for 13 already existed, suspecting a race condition maybe --- src/migrations/0023_postgresql_11_to_13.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/migrations/0023_postgresql_11_to_13.py b/src/migrations/0023_postgresql_11_to_13.py index 145f15558..8f03f8c5f 100644 --- a/src/migrations/0023_postgresql_11_to_13.py +++ b/src/migrations/0023_postgresql_11_to_13.py @@ -1,4 +1,5 @@ import subprocess +import time from moulinette import m18n from yunohost.utils.error import YunohostError, YunohostValidationError @@ -42,9 +43,11 @@ class MyMigration(Migration): ) self.runcmd("systemctl stop postgresql") + time.sleep(3) self.runcmd( "LC_ALL=C pg_dropcluster --stop 13 main || true" ) # We do not trigger an exception if the command fails because that probably means cluster 13 doesn't exists, which is fine because it's created during the pg_upgradecluster) + time.sleep(3) self.runcmd("LC_ALL=C pg_upgradecluster -m upgrade 11 main") self.runcmd("LC_ALL=C pg_dropcluster --stop 11 main") self.runcmd("systemctl start postgresql") From 383e540ee0d95ed46cedb7bdc5dbb92d9d3c8a5c Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Wed, 19 Jan 2022 20:08:34 +0100 Subject: [PATCH 302/619] Tmp remove bullseye migration for stable release --- .../0021_migrate_to_bullseye.py | 441 ------------------ 1 file changed, 441 deletions(-) delete mode 100644 src/yunohost/data_migrations/0021_migrate_to_bullseye.py diff --git a/src/yunohost/data_migrations/0021_migrate_to_bullseye.py b/src/yunohost/data_migrations/0021_migrate_to_bullseye.py deleted file mode 100644 index eace6ca2e..000000000 --- a/src/yunohost/data_migrations/0021_migrate_to_bullseye.py +++ /dev/null @@ -1,441 +0,0 @@ -import glob -import os - -from moulinette import m18n -from yunohost.utils.error import YunohostError -from moulinette.utils.log import getActionLogger -from moulinette.utils.process import check_output, call_async_output -from moulinette.utils.filesystem import read_file, rm, write_to_file - -from yunohost.tools import ( - Migration, - tools_update, - tools_upgrade, - _apt_log_line_is_relevant, -) -from yunohost.app import unstable_apps -from yunohost.regenconf import manually_modified_files, _force_clear_hashes -from yunohost.utils.filesystem import free_space_in_directory -from yunohost.utils.packages import ( - get_ynh_package_version, - _list_upgradable_apt_packages, -) -from yunohost.service import _get_services, _save_services - -logger = getActionLogger("yunohost.migration") - -N_CURRENT_DEBIAN = 10 -N_CURRENT_YUNOHOST = 4 - -N_NEXT_DEBAN = 11 -N_NEXT_YUNOHOST = 11 - - -class MyMigration(Migration): - - "Upgrade the system to Debian Bullseye and Yunohost 11.x" - - mode = "manual" - - def run(self): - - self.check_assertions() - - logger.info(m18n.n("migration_0021_start")) - - # - # Add new apt .deb signing key - # - - new_apt_key = "https://forge.yunohost.org/yunohost_bullseye.asc" - check_output(f"wget -O- {new_apt_key} -q | apt-key add -qq -") - - # - # Patch sources.list - # - logger.info(m18n.n("migration_0021_patching_sources_list")) - self.patch_apt_sources_list() - - # Force add sury if it's not there yet - # This is to solve some weird issue with php-common breaking php7.3-common, - # hence breaking many php7.3-deps - # hence triggering some dependency conflict (or foobar-ynh-deps uninstall) - # Adding it there shouldnt be a big deal - Yunohost 11.x does add it - # through its regen conf anyway. - if not os.path.exists("/etc/apt/sources.list.d/extra_php_version.list"): - open("/etc/apt/sources.list.d/extra_php_version.list", "w").write( - "deb https://packages.sury.org/php/ bullseye main" - ) - os.system( - 'wget --timeout 900 --quiet "https://packages.sury.org/php/apt.gpg" --output-document=- | gpg --dearmor >"/etc/apt/trusted.gpg.d/extra_php_version.gpg"' - ) - - # - # Run apt update - # - - tools_update(target="system") - - # Tell libc6 it's okay to restart system stuff during the upgrade - os.system( - "echo 'libc6 libraries/restart-without-asking boolean true' | debconf-set-selections" - ) - - # Do not restart nginx during the upgrade of nginx-common and nginx-extras ... - # c.f. https://manpages.debian.org/bullseye/init-system-helpers/deb-systemd-invoke.1p.en.html - # and zcat /usr/share/doc/init-system-helpers/README.policy-rc.d.gz - # and the code inside /usr/bin/deb-systemd-invoke to see how it calls /usr/sbin/policy-rc.d ... - # and also invoke-rc.d ... - write_to_file( - "/usr/sbin/policy-rc.d", - '#!/bin/bash\n[[ "$1" =~ "nginx" ]] && [[ "$2" == "restart" ]] && exit 101 || exit 0', - ) - os.system("chmod +x /usr/sbin/policy-rc.d") - - # Don't send an email to root about the postgresql migration. It should be handled automatically after. - os.system( - "echo 'postgresql-common postgresql-common/obsolete-major seen true' | debconf-set-selections" - ) - - # - # Patch yunohost conflicts - # - logger.info(m18n.n("migration_0021_patch_yunohost_conflicts")) - - self.patch_yunohost_conflicts() - - # - # Specific tweaking to get rid of custom my.cnf and use debian's default one - # (my.cnf is actually a symlink to mariadb.cnf) - # - - _force_clear_hashes(["/etc/mysql/my.cnf"]) - rm("/etc/mysql/mariadb.cnf", force=True) - rm("/etc/mysql/my.cnf", force=True) - ret = self.apt_install( - "mariadb-common --reinstall -o Dpkg::Options::='--force-confmiss'" - ) - if ret != 0: - # FIXME: i18n once this is stable? - raise YunohostError("Failed to reinstall mariadb-common ?", raw_msg=True) - - # - # /usr/share/yunohost/yunohost-config/ssl/yunoCA -> /usr/share/yunohost/ssl - # - if os.path.exists("/usr/share/yunohost/yunohost-config/ssl/yunoCA"): - os.system( - "mv /usr/share/yunohost/yunohost-config/ssl/yunoCA /usr/share/yunohost/ssl" - ) - rm("/usr/share/yunohost/yunohost-config", recursive=True, force=True) - - # - # /home/yunohost.conf -> /var/cache/yunohost/regenconf - # - if os.path.exists("/home/yunohost.conf"): - os.system("mv /home/yunohost.conf /var/cache/yunohost/regenconf") - rm("/home/yunohost.conf", recursive=True, force=True) - - # Remove legacy postgresql service record added by helpers, - # will now be dynamically handled by the core in bullseye - services = _get_services() - if "postgresql" in services: - del services["postgresql"] - _save_services(services) - - # - # Main upgrade - # - logger.info(m18n.n("migration_0021_main_upgrade")) - - apps_packages = self.get_apps_equivs_packages() - self.hold(apps_packages) - tools_upgrade(target="system", allow_yunohost_upgrade=False) - - if self.debian_major_version() == N_CURRENT_DEBIAN: - raise YunohostError("migration_0021_still_on_buster_after_main_upgrade") - - # Force explicit install of php7.4-fpm and other old 'default' dependencies - # that are now only in Recommends - # - # Also, we need to install php7.4 equivalents of other php7.3 dependencies. - # For example, Nextcloud may depend on php7.3-zip, and after the php pool migration - # to autoupgrade Nextcloud to 7.4, it will need the php7.4-zip to work. - # The following list is based on an ad-hoc analysis of php deps found in the - # app ecosystem, with a known equivalent on php7.4. - # - # This is kinda a dirty hack as it doesnt properly update the *-ynh-deps virtual packages - # with the proper list of dependencies, and the dependencies install this way - # will get flagged as 'manually installed'. - # - # We'll probably want to do something during the Bullseye->Bookworm migration to re-flag - # these as 'auto' so they get autoremoved if not needed anymore. - # Also hopefully by then we'll have manifestv2 (maybe) and will be able to use - # the apt resource mecanism to regenerate the *-ynh-deps virtual packages ;) - - php73packages_suffixes = [ - "apcu", - "bcmath", - "bz2", - "dom", - "gmp", - "igbinary", - "imagick", - "imap", - "mbstring", - "memcached", - "mysqli", - "mysqlnd", - "pgsql", - "redis", - "simplexml", - "soap", - "sqlite3", - "ssh2", - "tidy", - "xml", - "xmlrpc", - "xsl", - "zip", - ] - - cmd = ( - "apt show '*-ynh-deps' 2>/dev/null" - " | grep Depends" - f" | grep -o -E \"php7.3-({'|'.join(php73packages_suffixes)})\"" - " | sort | uniq" - " | sed 's/php7.3/php7.4/g'" - " || true" - ) - - basephp74packages_to_install = [ - "php7.4-fpm", - "php7.4-common", - "php7.4-ldap", - "php7.4-intl", - "php7.4-mysql", - "php7.4-gd", - "php7.4-curl", - "php-php-gettext", - ] - - php74packages_to_install = basephp74packages_to_install + [ - f.strip() for f in check_output(cmd).split("\n") if f.strip() - ] - - ret = self.apt_install( - f"{' '.join(php74packages_to_install)} " - "$(dpkg --list | grep ynh-deps | awk '{print $2}') " - "-o Dpkg::Options::='--force-confmiss'" - ) - if ret != 0: - # FIXME: i18n once this is stable? - raise YunohostError( - "Failed to force the install of php dependencies ?", raw_msg=True - ) - - # Clean the mess - logger.info(m18n.n("migration_0021_cleaning_up")) - os.system("apt autoremove --assume-yes") - os.system("apt clean --assume-yes") - - # - # Yunohost upgrade - # - logger.info(m18n.n("migration_0021_yunohost_upgrade")) - - self.unhold(apps_packages) - - cmd = "LC_ALL=C" - cmd += " DEBIAN_FRONTEND=noninteractive" - cmd += " APT_LISTCHANGES_FRONTEND=none" - cmd += " apt dist-upgrade " - cmd += " --quiet -o=Dpkg::Use-Pty=0 --fix-broken --dry-run" - cmd += " | grep -q 'ynh-deps'" - - logger.info("Simulating upgrade...") - if os.system(cmd) == 0: - # FIXME: i18n once this is stable? - raise YunohostError( - "The upgrade cannot be completed, because some app dependencies would need to be removed?", - raw_msg=True, - ) - - postupgradecmds = f"apt-mark auto {' '.join(basephp74packages_to_install)}\n" - postupgradecmds += "rm -f /usr/sbin/policy-rc.d\n" - postupgradecmds += "echo 'Restarting nginx...' >&2\n" - postupgradecmds += "systemctl restart nginx\n" - - tools_upgrade(target="system", postupgradecmds=postupgradecmds) - - def debian_major_version(self): - # The python module "platform" and lsb_release are not reliable because - # on some setup, they may still return Release=9 even after upgrading to - # buster ... (Apparently this is related to OVH overriding some stuff - # with /etc/lsb-release for instance -_-) - # Instead, we rely on /etc/os-release which should be the raw info from - # the distribution... - return int( - check_output( - "grep VERSION_ID /etc/os-release | head -n 1 | tr '\"' ' ' | cut -d ' ' -f2" - ) - ) - - def yunohost_major_version(self): - return int(get_ynh_package_version("yunohost")["version"].split(".")[0]) - - def check_assertions(self): - - # Be on buster (10.x) and yunohost 4.x - # NB : we do both check to cover situations where the upgrade crashed - # in the middle and debian version could be > 9.x but yunohost package - # would still be in 3.x... - if ( - not self.debian_major_version() == N_CURRENT_DEBIAN - and not self.yunohost_major_version() == N_CURRENT_YUNOHOST - ): - raise YunohostError("migration_0021_not_buster") - - # Have > 1 Go free space on /var/ ? - if free_space_in_directory("/var/") / (1024 ** 3) < 1.0: - raise YunohostError("migration_0021_not_enough_free_space") - - # Check system is up to date - # (but we don't if 'bullseye' is already in the sources.list ... - # which means maybe a previous upgrade crashed and we're re-running it) - if " bullseye " not in read_file("/etc/apt/sources.list"): - tools_update(target="system") - upgradable_system_packages = list(_list_upgradable_apt_packages()) - if upgradable_system_packages: - raise YunohostError("migration_0021_system_not_fully_up_to_date") - - @property - def disclaimer(self): - - # Avoid having a super long disclaimer + uncessary check if we ain't - # on buster / yunohost 4.x anymore - # NB : we do both check to cover situations where the upgrade crashed - # in the middle and debian version could be >= 10.x but yunohost package - # would still be in 4.x... - if ( - not self.debian_major_version() == N_CURRENT_DEBIAN - and not self.yunohost_major_version() == N_CURRENT_YUNOHOST - ): - return None - - # Get list of problematic apps ? I.e. not official or community+working - problematic_apps = unstable_apps() - problematic_apps = "".join(["\n - " + app for app in problematic_apps]) - - # Manually modified files ? (c.f. yunohost service regen-conf) - modified_files = manually_modified_files() - modified_files = "".join(["\n - " + f for f in modified_files]) - - message = m18n.n("migration_0021_general_warning") - - # FIXME: re-enable this message with updated topic link once we release the migration as stable - # message = ( - # "N.B.: This migration has been tested by the community over the last few months but has only been declared stable recently. If your server hosts critical services and if you are not too confident with debugging possible issues, we recommend you to wait a little bit more while we gather more feedback and polish things up. If on the other hand you are relatively confident with debugging small issues that may arise, you are encouraged to run this migration ;)! You can read about remaining known issues and feedback from the community here: https://forum.yunohost.org/t/12195\n\n" - # + message - # ) - - if problematic_apps: - message += "\n\n" + m18n.n( - "migration_0021_problematic_apps_warning", - problematic_apps=problematic_apps, - ) - - if modified_files: - message += "\n\n" + m18n.n( - "migration_0021_modified_files", manually_modified_files=modified_files - ) - - return message - - def patch_apt_sources_list(self): - - sources_list = glob.glob("/etc/apt/sources.list.d/*.list") - sources_list.append("/etc/apt/sources.list") - - # This : - # - replace single 'buster' occurence by 'bulleye' - # - comments lines containing "backports" - # - replace 'buster/updates' by 'bullseye/updates' (or same with -) - # Special note about the security suite: - # https://www.debian.org/releases/bullseye/amd64/release-notes/ch-information.en.html#security-archive - for f in sources_list: - command = ( - f"sed -i {f} " - "-e 's@ buster @ bullseye @g' " - "-e '/backports/ s@^#*@#@' " - "-e 's@ buster/updates @ bullseye-security @g' " - "-e 's@ buster-@ bullseye-@g' " - ) - os.system(command) - - def get_apps_equivs_packages(self): - - command = ( - "dpkg --get-selections" - " | grep -v deinstall" - " | awk '{print $1}'" - " | { grep 'ynh-deps$' || true; }" - ) - - output = check_output(command) - - return output.split("\n") if output else [] - - def hold(self, packages): - for package in packages: - os.system(f"apt-mark hold {package}") - - def unhold(self, packages): - for package in packages: - os.system(f"apt-mark unhold {package}") - - def apt_install(self, cmd): - def is_relevant(line): - return "Reading database ..." not in line.rstrip() - - callbacks = ( - lambda l: logger.info("+ " + l.rstrip() + "\r") - if _apt_log_line_is_relevant(l) - else logger.debug(l.rstrip() + "\r"), - lambda l: logger.warning(l.rstrip()) - if _apt_log_line_is_relevant(l) - else logger.debug(l.rstrip()), - ) - - cmd = ( - "LC_ALL=C DEBIAN_FRONTEND=noninteractive APT_LISTCHANGES_FRONTEND=none apt install --quiet -o=Dpkg::Use-Pty=0 --fix-broken --assume-yes " - + cmd - ) - - logger.debug("Running: %s" % cmd) - - return call_async_output(cmd, callbacks, shell=True) - - def patch_yunohost_conflicts(self): - # - # This is a super dirty hack to remove the conflicts from yunohost's debian/control file - # Those conflicts are there to prevent mistakenly upgrading critical packages - # such as dovecot, postfix, nginx, openssl, etc... usually related to mistakenly - # using backports etc. - # - # The hack consists in savagely removing the conflicts directly in /var/lib/dpkg/status - # - - # We only patch the conflict if we're on yunohost 4.x - if self.yunohost_major_version() != N_CURRENT_YUNOHOST: - return - - conflicts = check_output("dpkg-query -s yunohost | grep '^Conflicts:'").strip() - if conflicts: - # We want to keep conflicting with apache/bind9 tho - new_conflicts = "Conflicts: apache2, bind9" - - command = ( - f"sed -i /var/lib/dpkg/status -e 's@{conflicts}@{new_conflicts}@g'" - ) - logger.debug(f"Running: {command}") - os.system(command) From 1725da45d43226c7d008fdaa5230e3f1ebe0f368 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Wed, 19 Jan 2022 20:08:50 +0100 Subject: [PATCH 303/619] Update changelog for 4.3.6.1 --- debian/changelog | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/debian/changelog b/debian/changelog index a59dfe2b0..520f6485e 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,14 @@ +yunohost (4.3.6.1) stable; urgency=low + + - [fix] dnsmasq: ensure interface is up ([#1410](https://github.com/YunoHost/yunohost/pull/1410)) + - [fix] apt helpers: fix ynh_install_app_dependencies when an app change his default phpversion (6ea32728) + - [fix] certificates: fix edge case where None is returned, triggering 'NoneType has no attribute get' (019839db) + - [i18n] Translations updated for German + + Thanks to all contributors <3 ! (Gregor, Kay0u) + + -- Alexandre Aubin Wed, 19 Jan 2022 20:05:13 +0100 + yunohost (4.3.6) stable; urgency=low - [enh] ssh: add a new setting to manage PasswordAuthentication in sshd_config ([#1388](https://github.com/YunoHost/yunohost/pull/1388)) From 7920cc6280ac8ca3f93a6fd3e418532a186bcea7 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Wed, 19 Jan 2022 20:30:11 +0100 Subject: [PATCH 304/619] apt helpers: fix bug when var is empty... --- data/helpers.d/apt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/helpers.d/apt b/data/helpers.d/apt index b50f4a87b..490a59f24 100644 --- a/data/helpers.d/apt +++ b/data/helpers.d/apt @@ -443,7 +443,7 @@ ynh_install_extra_app_dependencies() { # Without doing apt install, an already installed dep is not upgraded local apps_auto_installed="$(apt-mark showauto $package)" ynh_package_install "$package" - apt-mark auto $apps_auto_installed + [ -z "$apps_auto_installed" ] || apt-mark auto $apps_auto_installed # Remove this extra repository after packages are installed ynh_remove_extra_repo --name=$app From 981fca64e234848510a2daeafec1eda07516e0ac Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Wed, 19 Jan 2022 20:31:04 +0100 Subject: [PATCH 305/619] Update changelog for 4.3.6.2 --- debian/changelog | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/debian/changelog b/debian/changelog index 520f6485e..066fcbe9d 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,9 @@ +yunohost (4.3.6.2) stable; urgency=low + + - [fix] apt helpers: fix bug when var is empty... (7920cc62) + + -- Alexandre Aubin Wed, 19 Jan 2022 20:30:25 +0100 + yunohost (4.3.6.1) stable; urgency=low - [fix] dnsmasq: ensure interface is up ([#1410](https://github.com/YunoHost/yunohost/pull/1410)) From 9c1f3c4be885abc3b39268f451cfe325cb6ff005 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Wed, 19 Jan 2022 20:34:59 +0100 Subject: [PATCH 306/619] Revert "Tmp remove bullseye migration for stable release" This reverts commit 383e540ee0d95ed46cedb7bdc5dbb92d9d3c8a5c. --- .../0021_migrate_to_bullseye.py | 441 ++++++++++++++++++ 1 file changed, 441 insertions(+) create mode 100644 src/yunohost/data_migrations/0021_migrate_to_bullseye.py diff --git a/src/yunohost/data_migrations/0021_migrate_to_bullseye.py b/src/yunohost/data_migrations/0021_migrate_to_bullseye.py new file mode 100644 index 000000000..eace6ca2e --- /dev/null +++ b/src/yunohost/data_migrations/0021_migrate_to_bullseye.py @@ -0,0 +1,441 @@ +import glob +import os + +from moulinette import m18n +from yunohost.utils.error import YunohostError +from moulinette.utils.log import getActionLogger +from moulinette.utils.process import check_output, call_async_output +from moulinette.utils.filesystem import read_file, rm, write_to_file + +from yunohost.tools import ( + Migration, + tools_update, + tools_upgrade, + _apt_log_line_is_relevant, +) +from yunohost.app import unstable_apps +from yunohost.regenconf import manually_modified_files, _force_clear_hashes +from yunohost.utils.filesystem import free_space_in_directory +from yunohost.utils.packages import ( + get_ynh_package_version, + _list_upgradable_apt_packages, +) +from yunohost.service import _get_services, _save_services + +logger = getActionLogger("yunohost.migration") + +N_CURRENT_DEBIAN = 10 +N_CURRENT_YUNOHOST = 4 + +N_NEXT_DEBAN = 11 +N_NEXT_YUNOHOST = 11 + + +class MyMigration(Migration): + + "Upgrade the system to Debian Bullseye and Yunohost 11.x" + + mode = "manual" + + def run(self): + + self.check_assertions() + + logger.info(m18n.n("migration_0021_start")) + + # + # Add new apt .deb signing key + # + + new_apt_key = "https://forge.yunohost.org/yunohost_bullseye.asc" + check_output(f"wget -O- {new_apt_key} -q | apt-key add -qq -") + + # + # Patch sources.list + # + logger.info(m18n.n("migration_0021_patching_sources_list")) + self.patch_apt_sources_list() + + # Force add sury if it's not there yet + # This is to solve some weird issue with php-common breaking php7.3-common, + # hence breaking many php7.3-deps + # hence triggering some dependency conflict (or foobar-ynh-deps uninstall) + # Adding it there shouldnt be a big deal - Yunohost 11.x does add it + # through its regen conf anyway. + if not os.path.exists("/etc/apt/sources.list.d/extra_php_version.list"): + open("/etc/apt/sources.list.d/extra_php_version.list", "w").write( + "deb https://packages.sury.org/php/ bullseye main" + ) + os.system( + 'wget --timeout 900 --quiet "https://packages.sury.org/php/apt.gpg" --output-document=- | gpg --dearmor >"/etc/apt/trusted.gpg.d/extra_php_version.gpg"' + ) + + # + # Run apt update + # + + tools_update(target="system") + + # Tell libc6 it's okay to restart system stuff during the upgrade + os.system( + "echo 'libc6 libraries/restart-without-asking boolean true' | debconf-set-selections" + ) + + # Do not restart nginx during the upgrade of nginx-common and nginx-extras ... + # c.f. https://manpages.debian.org/bullseye/init-system-helpers/deb-systemd-invoke.1p.en.html + # and zcat /usr/share/doc/init-system-helpers/README.policy-rc.d.gz + # and the code inside /usr/bin/deb-systemd-invoke to see how it calls /usr/sbin/policy-rc.d ... + # and also invoke-rc.d ... + write_to_file( + "/usr/sbin/policy-rc.d", + '#!/bin/bash\n[[ "$1" =~ "nginx" ]] && [[ "$2" == "restart" ]] && exit 101 || exit 0', + ) + os.system("chmod +x /usr/sbin/policy-rc.d") + + # Don't send an email to root about the postgresql migration. It should be handled automatically after. + os.system( + "echo 'postgresql-common postgresql-common/obsolete-major seen true' | debconf-set-selections" + ) + + # + # Patch yunohost conflicts + # + logger.info(m18n.n("migration_0021_patch_yunohost_conflicts")) + + self.patch_yunohost_conflicts() + + # + # Specific tweaking to get rid of custom my.cnf and use debian's default one + # (my.cnf is actually a symlink to mariadb.cnf) + # + + _force_clear_hashes(["/etc/mysql/my.cnf"]) + rm("/etc/mysql/mariadb.cnf", force=True) + rm("/etc/mysql/my.cnf", force=True) + ret = self.apt_install( + "mariadb-common --reinstall -o Dpkg::Options::='--force-confmiss'" + ) + if ret != 0: + # FIXME: i18n once this is stable? + raise YunohostError("Failed to reinstall mariadb-common ?", raw_msg=True) + + # + # /usr/share/yunohost/yunohost-config/ssl/yunoCA -> /usr/share/yunohost/ssl + # + if os.path.exists("/usr/share/yunohost/yunohost-config/ssl/yunoCA"): + os.system( + "mv /usr/share/yunohost/yunohost-config/ssl/yunoCA /usr/share/yunohost/ssl" + ) + rm("/usr/share/yunohost/yunohost-config", recursive=True, force=True) + + # + # /home/yunohost.conf -> /var/cache/yunohost/regenconf + # + if os.path.exists("/home/yunohost.conf"): + os.system("mv /home/yunohost.conf /var/cache/yunohost/regenconf") + rm("/home/yunohost.conf", recursive=True, force=True) + + # Remove legacy postgresql service record added by helpers, + # will now be dynamically handled by the core in bullseye + services = _get_services() + if "postgresql" in services: + del services["postgresql"] + _save_services(services) + + # + # Main upgrade + # + logger.info(m18n.n("migration_0021_main_upgrade")) + + apps_packages = self.get_apps_equivs_packages() + self.hold(apps_packages) + tools_upgrade(target="system", allow_yunohost_upgrade=False) + + if self.debian_major_version() == N_CURRENT_DEBIAN: + raise YunohostError("migration_0021_still_on_buster_after_main_upgrade") + + # Force explicit install of php7.4-fpm and other old 'default' dependencies + # that are now only in Recommends + # + # Also, we need to install php7.4 equivalents of other php7.3 dependencies. + # For example, Nextcloud may depend on php7.3-zip, and after the php pool migration + # to autoupgrade Nextcloud to 7.4, it will need the php7.4-zip to work. + # The following list is based on an ad-hoc analysis of php deps found in the + # app ecosystem, with a known equivalent on php7.4. + # + # This is kinda a dirty hack as it doesnt properly update the *-ynh-deps virtual packages + # with the proper list of dependencies, and the dependencies install this way + # will get flagged as 'manually installed'. + # + # We'll probably want to do something during the Bullseye->Bookworm migration to re-flag + # these as 'auto' so they get autoremoved if not needed anymore. + # Also hopefully by then we'll have manifestv2 (maybe) and will be able to use + # the apt resource mecanism to regenerate the *-ynh-deps virtual packages ;) + + php73packages_suffixes = [ + "apcu", + "bcmath", + "bz2", + "dom", + "gmp", + "igbinary", + "imagick", + "imap", + "mbstring", + "memcached", + "mysqli", + "mysqlnd", + "pgsql", + "redis", + "simplexml", + "soap", + "sqlite3", + "ssh2", + "tidy", + "xml", + "xmlrpc", + "xsl", + "zip", + ] + + cmd = ( + "apt show '*-ynh-deps' 2>/dev/null" + " | grep Depends" + f" | grep -o -E \"php7.3-({'|'.join(php73packages_suffixes)})\"" + " | sort | uniq" + " | sed 's/php7.3/php7.4/g'" + " || true" + ) + + basephp74packages_to_install = [ + "php7.4-fpm", + "php7.4-common", + "php7.4-ldap", + "php7.4-intl", + "php7.4-mysql", + "php7.4-gd", + "php7.4-curl", + "php-php-gettext", + ] + + php74packages_to_install = basephp74packages_to_install + [ + f.strip() for f in check_output(cmd).split("\n") if f.strip() + ] + + ret = self.apt_install( + f"{' '.join(php74packages_to_install)} " + "$(dpkg --list | grep ynh-deps | awk '{print $2}') " + "-o Dpkg::Options::='--force-confmiss'" + ) + if ret != 0: + # FIXME: i18n once this is stable? + raise YunohostError( + "Failed to force the install of php dependencies ?", raw_msg=True + ) + + # Clean the mess + logger.info(m18n.n("migration_0021_cleaning_up")) + os.system("apt autoremove --assume-yes") + os.system("apt clean --assume-yes") + + # + # Yunohost upgrade + # + logger.info(m18n.n("migration_0021_yunohost_upgrade")) + + self.unhold(apps_packages) + + cmd = "LC_ALL=C" + cmd += " DEBIAN_FRONTEND=noninteractive" + cmd += " APT_LISTCHANGES_FRONTEND=none" + cmd += " apt dist-upgrade " + cmd += " --quiet -o=Dpkg::Use-Pty=0 --fix-broken --dry-run" + cmd += " | grep -q 'ynh-deps'" + + logger.info("Simulating upgrade...") + if os.system(cmd) == 0: + # FIXME: i18n once this is stable? + raise YunohostError( + "The upgrade cannot be completed, because some app dependencies would need to be removed?", + raw_msg=True, + ) + + postupgradecmds = f"apt-mark auto {' '.join(basephp74packages_to_install)}\n" + postupgradecmds += "rm -f /usr/sbin/policy-rc.d\n" + postupgradecmds += "echo 'Restarting nginx...' >&2\n" + postupgradecmds += "systemctl restart nginx\n" + + tools_upgrade(target="system", postupgradecmds=postupgradecmds) + + def debian_major_version(self): + # The python module "platform" and lsb_release are not reliable because + # on some setup, they may still return Release=9 even after upgrading to + # buster ... (Apparently this is related to OVH overriding some stuff + # with /etc/lsb-release for instance -_-) + # Instead, we rely on /etc/os-release which should be the raw info from + # the distribution... + return int( + check_output( + "grep VERSION_ID /etc/os-release | head -n 1 | tr '\"' ' ' | cut -d ' ' -f2" + ) + ) + + def yunohost_major_version(self): + return int(get_ynh_package_version("yunohost")["version"].split(".")[0]) + + def check_assertions(self): + + # Be on buster (10.x) and yunohost 4.x + # NB : we do both check to cover situations where the upgrade crashed + # in the middle and debian version could be > 9.x but yunohost package + # would still be in 3.x... + if ( + not self.debian_major_version() == N_CURRENT_DEBIAN + and not self.yunohost_major_version() == N_CURRENT_YUNOHOST + ): + raise YunohostError("migration_0021_not_buster") + + # Have > 1 Go free space on /var/ ? + if free_space_in_directory("/var/") / (1024 ** 3) < 1.0: + raise YunohostError("migration_0021_not_enough_free_space") + + # Check system is up to date + # (but we don't if 'bullseye' is already in the sources.list ... + # which means maybe a previous upgrade crashed and we're re-running it) + if " bullseye " not in read_file("/etc/apt/sources.list"): + tools_update(target="system") + upgradable_system_packages = list(_list_upgradable_apt_packages()) + if upgradable_system_packages: + raise YunohostError("migration_0021_system_not_fully_up_to_date") + + @property + def disclaimer(self): + + # Avoid having a super long disclaimer + uncessary check if we ain't + # on buster / yunohost 4.x anymore + # NB : we do both check to cover situations where the upgrade crashed + # in the middle and debian version could be >= 10.x but yunohost package + # would still be in 4.x... + if ( + not self.debian_major_version() == N_CURRENT_DEBIAN + and not self.yunohost_major_version() == N_CURRENT_YUNOHOST + ): + return None + + # Get list of problematic apps ? I.e. not official or community+working + problematic_apps = unstable_apps() + problematic_apps = "".join(["\n - " + app for app in problematic_apps]) + + # Manually modified files ? (c.f. yunohost service regen-conf) + modified_files = manually_modified_files() + modified_files = "".join(["\n - " + f for f in modified_files]) + + message = m18n.n("migration_0021_general_warning") + + # FIXME: re-enable this message with updated topic link once we release the migration as stable + # message = ( + # "N.B.: This migration has been tested by the community over the last few months but has only been declared stable recently. If your server hosts critical services and if you are not too confident with debugging possible issues, we recommend you to wait a little bit more while we gather more feedback and polish things up. If on the other hand you are relatively confident with debugging small issues that may arise, you are encouraged to run this migration ;)! You can read about remaining known issues and feedback from the community here: https://forum.yunohost.org/t/12195\n\n" + # + message + # ) + + if problematic_apps: + message += "\n\n" + m18n.n( + "migration_0021_problematic_apps_warning", + problematic_apps=problematic_apps, + ) + + if modified_files: + message += "\n\n" + m18n.n( + "migration_0021_modified_files", manually_modified_files=modified_files + ) + + return message + + def patch_apt_sources_list(self): + + sources_list = glob.glob("/etc/apt/sources.list.d/*.list") + sources_list.append("/etc/apt/sources.list") + + # This : + # - replace single 'buster' occurence by 'bulleye' + # - comments lines containing "backports" + # - replace 'buster/updates' by 'bullseye/updates' (or same with -) + # Special note about the security suite: + # https://www.debian.org/releases/bullseye/amd64/release-notes/ch-information.en.html#security-archive + for f in sources_list: + command = ( + f"sed -i {f} " + "-e 's@ buster @ bullseye @g' " + "-e '/backports/ s@^#*@#@' " + "-e 's@ buster/updates @ bullseye-security @g' " + "-e 's@ buster-@ bullseye-@g' " + ) + os.system(command) + + def get_apps_equivs_packages(self): + + command = ( + "dpkg --get-selections" + " | grep -v deinstall" + " | awk '{print $1}'" + " | { grep 'ynh-deps$' || true; }" + ) + + output = check_output(command) + + return output.split("\n") if output else [] + + def hold(self, packages): + for package in packages: + os.system(f"apt-mark hold {package}") + + def unhold(self, packages): + for package in packages: + os.system(f"apt-mark unhold {package}") + + def apt_install(self, cmd): + def is_relevant(line): + return "Reading database ..." not in line.rstrip() + + callbacks = ( + lambda l: logger.info("+ " + l.rstrip() + "\r") + if _apt_log_line_is_relevant(l) + else logger.debug(l.rstrip() + "\r"), + lambda l: logger.warning(l.rstrip()) + if _apt_log_line_is_relevant(l) + else logger.debug(l.rstrip()), + ) + + cmd = ( + "LC_ALL=C DEBIAN_FRONTEND=noninteractive APT_LISTCHANGES_FRONTEND=none apt install --quiet -o=Dpkg::Use-Pty=0 --fix-broken --assume-yes " + + cmd + ) + + logger.debug("Running: %s" % cmd) + + return call_async_output(cmd, callbacks, shell=True) + + def patch_yunohost_conflicts(self): + # + # This is a super dirty hack to remove the conflicts from yunohost's debian/control file + # Those conflicts are there to prevent mistakenly upgrading critical packages + # such as dovecot, postfix, nginx, openssl, etc... usually related to mistakenly + # using backports etc. + # + # The hack consists in savagely removing the conflicts directly in /var/lib/dpkg/status + # + + # We only patch the conflict if we're on yunohost 4.x + if self.yunohost_major_version() != N_CURRENT_YUNOHOST: + return + + conflicts = check_output("dpkg-query -s yunohost | grep '^Conflicts:'").strip() + if conflicts: + # We want to keep conflicting with apache/bind9 tho + new_conflicts = "Conflicts: apache2, bind9" + + command = ( + f"sed -i /var/lib/dpkg/status -e 's@{conflicts}@{new_conflicts}@g'" + ) + logger.debug(f"Running: {command}") + os.system(command) From d07cf83d93086d57060d4afb4284df45326f3bae Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Wed, 19 Jan 2022 20:44:51 +0100 Subject: [PATCH 307/619] migrate_to_bullseye: tweaks to point to the current beta-testing forum thread --- src/yunohost/app.py | 3 ++- src/yunohost/data_migrations/0021_migrate_to_bullseye.py | 9 +++++---- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/yunohost/app.py b/src/yunohost/app.py index d6bb5d92f..997403a07 100644 --- a/src/yunohost/app.py +++ b/src/yunohost/app.py @@ -2502,13 +2502,14 @@ def is_true(arg): def unstable_apps(): output = [] + deprecated_apps = ["mailman"] for infos in app_list(full=True)["apps"]: if not infos.get("from_catalog") or infos.get("from_catalog").get("state") in [ "inprogress", "notworking", - ]: + ] or infos["id"] in deprecated_apps: output.append(infos["id"]) return output diff --git a/src/yunohost/data_migrations/0021_migrate_to_bullseye.py b/src/yunohost/data_migrations/0021_migrate_to_bullseye.py index eace6ca2e..77797c63f 100644 --- a/src/yunohost/data_migrations/0021_migrate_to_bullseye.py +++ b/src/yunohost/data_migrations/0021_migrate_to_bullseye.py @@ -116,7 +116,6 @@ class MyMigration(Migration): "mariadb-common --reinstall -o Dpkg::Options::='--force-confmiss'" ) if ret != 0: - # FIXME: i18n once this is stable? raise YunohostError("Failed to reinstall mariadb-common ?", raw_msg=True) # @@ -228,7 +227,6 @@ class MyMigration(Migration): "-o Dpkg::Options::='--force-confmiss'" ) if ret != 0: - # FIXME: i18n once this is stable? raise YunohostError( "Failed to force the install of php dependencies ?", raw_msg=True ) @@ -254,7 +252,6 @@ class MyMigration(Migration): logger.info("Simulating upgrade...") if os.system(cmd) == 0: - # FIXME: i18n once this is stable? raise YunohostError( "The upgrade cannot be completed, because some app dependencies would need to be removed?", raw_msg=True, @@ -332,7 +329,11 @@ class MyMigration(Migration): message = m18n.n("migration_0021_general_warning") - # FIXME: re-enable this message with updated topic link once we release the migration as stable + # FIXME: update this message with updated topic link once we release the migration as stable + message = ( + "N.B.: **THIS MIGRATION IS STILL IN BETA-STAGE** ! If your server hosts critical services and if you are not too confident with debugging possible issues, we recommend you to wait a little bit more while we gather more feedback and polish things up. If on the other hand you are relatively confident with debugging small issues that may arise, you are encouraged to run this migration ;)! You can read and share feedbacks on this forum thread: https://forum.yunohost.org/t/18531\n\n" + + message + ) # message = ( # "N.B.: This migration has been tested by the community over the last few months but has only been declared stable recently. If your server hosts critical services and if you are not too confident with debugging possible issues, we recommend you to wait a little bit more while we gather more feedback and polish things up. If on the other hand you are relatively confident with debugging small issues that may arise, you are encouraged to run this migration ;)! You can read about remaining known issues and feedback from the community here: https://forum.yunohost.org/t/12195\n\n" # + message From 61a01f5c813f0bb6b1f8f00ad8fa584a966aa27b Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Wed, 19 Jan 2022 20:47:41 +0100 Subject: [PATCH 308/619] Update changelog for 4.4.0 --- debian/changelog | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/debian/changelog b/debian/changelog index 066fcbe9d..900ed7beb 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,9 @@ +yunohost (4.4.0) testing; urgency=low + + - [enh] Add buster->bullseye migration + + -- Alexandre Aubin Wed, 19 Jan 2022 20:45:22 +0100 + yunohost (4.3.6.2) stable; urgency=low - [fix] apt helpers: fix bug when var is empty... (7920cc62) From 140e50253fac0d3c9aa6fcab9e392a462c914e98 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Wed, 19 Jan 2022 20:53:27 +0100 Subject: [PATCH 309/619] Update changelog for 11.0.2 --- debian/changelog | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/debian/changelog b/debian/changelog index c1c60e69c..cbc6cfc99 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,16 +1,17 @@ -yunohost (11.0.1~alpha) unstable; urgency=low +yunohost (11.0.2) testing; urgency=low - - [mod] Various tweaks for Python 3.9, PHP 7.4, and other changes related to Buster->Bullseye ecosystem - - [mod] quality: Rework repository code architecture ([#1377](https://github.com/YunoHost/yunohost/pull/1377)) - - [mod] quality: Rework where yunohost files are deployed (yunohost now a proper python lib with files in /usr/lib/python3/dist-packages/yunohost/, and other files are in /usr/share/yunohost) ([#1377](https://github.com/YunoHost/yunohost/pull/1377)) + - [mod] Various tweaks for Python 3.9, PHP 7.4, PostgreSQL 13, and other changes related to Buster->Bullseye ecosystem - [mod] debian: Moved mysql, php, and metronome from Depends to Recommends ([#1369](https://github.com/YunoHost/yunohost/pull/1369)) - - [mod] apt: Add sury by default ([#1369](https://github.com/YunoHost/yunohost/pull/1369)) + - [mod] apt: **Add sury by default** ([#1369](https://github.com/YunoHost/yunohost/pull/1369)) + - [enh] mysql: **Drop super old mysql config, now rely on Debian default** ([44c972f...144126f](https://github.com/YunoHost/yunohost/compare/44c972f2dd65...144126f56a3d)) - [enh] regenconf/helpers: Better integration for postgresql ([#1369](https://github.com/YunoHost/yunohost/pull/1369)) - - [enh] regenconf: Store regenconf cache in /var/cache/yunohost/regenconf instead of /home/yunohost.conf (00d535a6) - - [enh] mysql: Drop super old mysql config, now rely on Debian default's one ([44c972f...144126f](https://github.com/YunoHost/yunohost/compare/44c972f2dd65...144126f56a3d)) - - [enh] upgrade: Try to implement a smarter self-upgrade mechanism to prevent/limit API downtime and related UX issues ([#1374](https://github.com/YunoHost/yunohost/pull/1374)) + - [mod] quality: **Rework repository code architecture** ([#1377](https://github.com/YunoHost/yunohost/pull/1377)) + - [mod] quality: **Rework where yunohost files are deployed** (yunohost now a much closer to a python lib with files in /usr/lib/python3/dist-packages/yunohost/, and other "common" files are in /usr/share/yunohost) ([#1377](https://github.com/YunoHost/yunohost/pull/1377)) + - [enh] upgrade: Try to implement **a smarter self-upgrade mechanism to prevent/limit API downtime and related UX issues** ([#1374](https://github.com/YunoHost/yunohost/pull/1374)) + - [mod] regenconf: store tmp files in /var/cache/yunohost/ instead of the misleading /home/yunohost.conf folder (00d535a6) + - [mod] dyndns: rewrite tsig keygen + nsupdate using full python, now that dnssec-keygen doesnt support hmacsha512 anymore (63a84f53) - [mod] app: During app scripts (and all stuff run in hook_exec), do not inject the HOME variable if it exists. This aims to prevent inconsistencies between CLI (where HOME usually is defined) and API (where HOME doesnt exists) (f43e567b) - - [mod] quality: Cleanup legacy stuff + - [mod] quality: **Drop legacy commands or arguments** listed below - Drop `--other_vars` options in ynh_add_fail2ban_config and systemd_config helpers - Drop deprecated/superold `ynh_bind_or_cp`, `ynh_mkdir_tmp`, `ynh_get_plain_key` helpers - Drop obsolete `yunohost-reset-ldap-password` command @@ -18,12 +19,12 @@ yunohost (11.0.1~alpha) unstable; urgency=low - Drop deprecated `yunohost service regen-conf` command (see `tools regen-conf` instead) - Drop deprecated `yunohost app fetchlist` command - Drop obsolete `yunohost app add/remove/clearaccess` commands - - Drop depcreated `--list` and `--filter` options in `yunohost app list` + - Drop deprecated `--installed` and `--filter` options in `yunohost app list` - Drop deprecated `--apps` and `--system` options in `yunohost tools update/upgrade` (no double dashes anymore) - Drop deprecated `--status` and `--log_type` options in `yunohost service add` - Drop deprecated `--mail` option in `yunohost user create` - -- Alexandre Aubin Fri, 05 Feb 2021 00:02:38 +0100 + -- Alexandre Aubin Wed, 19 Jan 2022 20:52:39 +0100 yunohost (4.4.0) testing; urgency=low From 30983a4efd89585b778257df695fb636616876bf Mon Sep 17 00:00:00 2001 From: Tagada <36127788+Tagadda@users.noreply.github.com> Date: Sat, 8 Jan 2022 00:12:45 +0100 Subject: [PATCH 310/619] [enh] Manage default applications with DomainConfigPanel [enh] makedefault with domain_config_set() [enh] Allow webadmin to reverse makedefault [legacy] translate legacy redirections to new domain config --- locales/en.json | 1 + share/actionsmap.yml | 4 +++ share/config_domain.toml | 5 ++++ src/app.py | 61 ++++++++++++++++++++-------------------- src/domain.py | 15 ++++++++++ src/utils/config.py | 19 +++++++++++++ src/utils/legacy.py | 46 ++++++++++++++++++++++++++++++ 7 files changed, 120 insertions(+), 31 deletions(-) diff --git a/locales/en.json b/locales/en.json index 91db42cb5..72aca192f 100644 --- a/locales/en.json +++ b/locales/en.json @@ -310,6 +310,7 @@ "domain_config_auth_key": "Authentication key", "domain_config_auth_secret": "Authentication secret", "domain_config_auth_token": "Authentication token", + "domain_config_default_app": "Default app", "domain_config_features_disclaimer": "So far, enabling/disabling mail or XMPP features only impact the recommended and automatic DNS configuration, not system configurations!", "domain_config_mail_in": "Incoming emails", "domain_config_mail_out": "Outgoing emails", diff --git a/share/actionsmap.yml b/share/actionsmap.yml index 9eee48716..ce395942f 100644 --- a/share/actionsmap.yml +++ b/share/actionsmap.yml @@ -896,6 +896,10 @@ app: -d: full: --domain help: Specific domain to put app on (the app domain by default) + -u: + full: --undo + help: Undo redirection + action: store_true ### app_ssowatconf() ssowatconf: diff --git a/share/config_domain.toml b/share/config_domain.toml index 93551458b..b0131f1c1 100644 --- a/share/config_domain.toml +++ b/share/config_domain.toml @@ -11,6 +11,11 @@ i18n = "domain_config" # [feature] + [feature.app] + [feature.app.default_app] + type = "app" + filters = ["is_webapp"] + default = "_none" [feature.mail] #services = ['postfix', 'dovecot'] diff --git a/src/app.py b/src/app.py index af13765e3..beee7799b 100644 --- a/src/app.py +++ b/src/app.py @@ -117,6 +117,7 @@ def app_info(app, full=False): Get info for a specific app """ from yunohost.permission import user_permission_list + from yunohost.domain import domain_config_get _assert_is_installed(app) @@ -153,6 +154,9 @@ def app_info(app, full=False): ret["is_webapp"] = "domain" in settings and "path" in settings + if ret["is_webapp"]: + ret["is_default"] = domain_config_get(settings["domain"], "feature.app.default_app") == app + ret["supports_change_url"] = os.path.exists( os.path.join(setting_path, "scripts", "change_url") ) @@ -989,6 +993,7 @@ def app_remove(operation_logger, app, purge=False): permission_delete, permission_sync_to_user, ) + from yunohost.domain import domain_list, domain_config_get, domain_config_set if not _is_installed(app): raise YunohostValidationError( @@ -1048,12 +1053,16 @@ def app_remove(operation_logger, app, purge=False): hook_remove(app) + for domain in domain_list()["domains"]: + if (domain_config_get(domain, "feature.app.default_app") == app): + domain_config_set(domain, "feature.app.default_app", "_none") + permission_sync_to_user() _assert_system_is_sane_for_app(manifest, "post") @is_unit_operation() -def app_makedefault(operation_logger, app, domain=None): +def app_makedefault(operation_logger, app, domain=None, undo=False): """ Redirect domain root to an app @@ -1062,11 +1071,10 @@ def app_makedefault(operation_logger, app, domain=None): domain """ - from yunohost.domain import _assert_domain_exists + from yunohost.domain import _assert_domain_exists, domain_config_set app_settings = _get_app_settings(app) app_domain = app_settings["domain"] - app_path = app_settings["path"] if domain is None: domain = app_domain @@ -1075,36 +1083,12 @@ def app_makedefault(operation_logger, app, domain=None): operation_logger.related_to.append(("domain", domain)) - if "/" in app_map(raw=True)[domain]: - raise YunohostValidationError( - "app_make_default_location_already_used", - app=app, - domain=app_domain, - other_app=app_map(raw=True)[domain]["/"]["id"], - ) - operation_logger.start() - # TODO / FIXME : current trick is to add this to conf.json.persisten - # This is really not robust and should be improved - # e.g. have a flag in /etc/yunohost/apps/$app/ to say that this is the - # default app or idk... - if not os.path.exists("/etc/ssowat/conf.json.persistent"): - ssowat_conf = {} + if undo: + domain_config_set(domain, 'feature.app.default_app', "_none") else: - ssowat_conf = read_json("/etc/ssowat/conf.json.persistent") - - if "redirected_urls" not in ssowat_conf: - ssowat_conf["redirected_urls"] = {} - - ssowat_conf["redirected_urls"][domain + "/"] = app_domain + app_path - - write_to_json( - "/etc/ssowat/conf.json.persistent", ssowat_conf, sort_keys=True, indent=4 - ) - chmod("/etc/ssowat/conf.json.persistent", 0o644) - - logger.success(m18n.n("ssowat_conf_updated")) + domain_config_set(domain, 'feature.app.default_app', app) def app_setting(app, key, value=None, delete=False): @@ -1303,7 +1287,7 @@ def app_ssowatconf(): """ - from yunohost.domain import domain_list, _get_maindomain + from yunohost.domain import domain_list, _get_maindomain, domain_config_get from yunohost.permission import user_permission_list main_domain = _get_maindomain() @@ -1341,6 +1325,21 @@ def app_ssowatconf(): redirected_urls.update(app_settings.get("redirected_urls", {})) redirected_regex.update(app_settings.get("redirected_regex", {})) + from .utils.legacy import translate_legacy_default_app_in_ssowant_conf_json_persistent + + translate_legacy_default_app_in_ssowant_conf_json_persistent() + + for domain in domains: + default_app = domain_config_get(domain, "feature.app.default_app") + if default_app != "_none" and _is_installed(default_app): + app_settings = _get_app_settings(default_app) + app_domain = app_settings["domain"] + app_path = app_settings["path"] + + # Prevent infinite redirect loop... + if domain + "/" != app_domain + app_path: + redirected_urls[domain + "/"] = app_domain + app_path + # New permission system for perm_name, perm_info in all_permissions.items(): diff --git a/src/domain.py b/src/domain.py index 6fd1724b4..f2e7fd7f4 100644 --- a/src/domain.py +++ b/src/domain.py @@ -456,6 +456,21 @@ class DomainConfigPanel(ConfigPanel): save_path_tpl = f"{DOMAIN_SETTINGS_DIR}/{{entity}}.yml" save_mode = "diff" + def _apply(self): + if ("default_app" in self.future_values and self.future_values["default_app"] != self.values["default_app"]): + from yunohost.app import app_ssowatconf, app_map + + if "/" in app_map(raw=True)[self.entity]: + raise YunohostValidationError( + "app_make_default_location_already_used", + app=self.future_values["default_app"], + domain=self.entity, + other_app=app_map(raw=True)[self.entity]["/"]["id"], + ) + + super()._apply() + app_ssowatconf() + def _get_toml(self): from yunohost.dns import _get_registrar_config_section diff --git a/src/utils/config.py b/src/utils/config.py index 99a002404..f3c8f8177 100644 --- a/src/utils/config.py +++ b/src/utils/config.py @@ -438,6 +438,7 @@ class ConfigPanel: "step", "accept", "redact", + "filters", ], "defaults": {}, }, @@ -703,6 +704,7 @@ class Question: self.ask = question.get("ask", {"en": self.name}) self.help = question.get("help") self.redact = question.get("redact", False) + self.filters = question.get("filters", []) # .current_value is the currently stored value self.current_value = question.get("current_value") # .value is the "proposed" value which we got from the user @@ -1123,6 +1125,22 @@ class DomainQuestion(Question): return value +class AppQuestion(Question): + argument_type = "app" + + def __init__( + self, question, context: Mapping[str, Any] = {}, hooks: Dict[str, Callable] = {} + ): + from yunohost.app import app_list + + super().__init__(question, context, hooks) + + apps = app_list(full=True)["apps"] + for _filter in self.filters: + print(_filter) + apps = [ app for app in apps if _filter in app and app[_filter] ] + + self.choices = ["_none"] + [app['id'] for app in apps] class UserQuestion(Question): argument_type = "user" @@ -1315,6 +1333,7 @@ ARGUMENTS_TYPE_PARSERS = { "alert": DisplayTextQuestion, "markdown": DisplayTextQuestion, "file": FileQuestion, + "app": AppQuestion, } diff --git a/src/utils/legacy.py b/src/utils/legacy.py index 306fcc87f..7a8a4540a 100644 --- a/src/utils/legacy.py +++ b/src/utils/legacy.py @@ -68,6 +68,52 @@ def legacy_permission_label(app, permission_type): ) +def translate_legacy_default_app_in_ssowant_conf_json_persistent(): + from yunohost.app import app_list + from yunohost.domain import domain_config_set + + persistent_file_name = "/etc/ssowat/conf.json.persistent" + if not os.path.exists(persistent_file_name): + return + + # Ugly hack because for some reason so many people have tabs in their conf.json.persistent ... + os.system(r"sed -i 's/\t/ /g' /etc/ssowat/conf.json.persistent") + + # Ugly hack to try not to misarably fail migration + persistent = read_yaml(persistent_file_name) + + if "redirected_urls" not in persistent: + return + + redirected_urls = persistent["redirected_urls"] + + if not any(from_url.count('/') == 1 and from_url.endswith('/') for from_url in redirected_urls): + return + + apps = app_list()['apps'] + + if not any('domain_path' in app and app['domain_path'] in redirected_urls.values() for app in apps): + return + + for from_url, dest_url in redirected_urls.items(): + # Not a root domain, skip + if from_url.count('/') != 1 or not from_url.endswith('/'): + continue + for app in apps: + if 'domain_path' not in app or app['domain_path'] is not dest_url: + continue + domain_config_set(from_url.strip('/'), "feature.app.default", app['id']) + del redirected_urls[from_url] + + persistent["redirected_urls"] = redirected_urls + + write_to_json(persistent_file_name, persistent, sort_keys=True, indent=4) + + logger.warning( + "YunoHost automatically translated some legacy redirections in /etc/ssowat/conf.json.persistent to match the new default application using domain configuration" + ) + + LEGACY_PHP_VERSION_REPLACEMENTS = [ ("/etc/php5", "/etc/php/7.4"), ("/etc/php/7.0", "/etc/php/7.4"), From 9ef3a1bfff71570716a6775b58818cb4b8fd4ce5 Mon Sep 17 00:00:00 2001 From: Tagadda <36127788+Tagadda@users.noreply.github.com> Date: Wed, 19 Jan 2022 20:10:28 +0000 Subject: [PATCH 311/619] [enh] Add SNI support to postfix and dovecot --- conf/dovecot/dovecot.conf | 5 +++++ conf/postfix/main.cf | 7 +++++-- conf/postfix/sni | 2 ++ hooks/conf_regen/19-postfix | 3 +++ hooks/conf_regen/25-dovecot | 1 + 5 files changed, 16 insertions(+), 2 deletions(-) create mode 100644 conf/postfix/sni diff --git a/conf/dovecot/dovecot.conf b/conf/dovecot/dovecot.conf index 273bd45dc..72fd71c4d 100644 --- a/conf/dovecot/dovecot.conf +++ b/conf/dovecot/dovecot.conf @@ -21,6 +21,11 @@ ssl = required ssl_cert = /path/to/dhparam ssl_dh = Date: Thu, 20 Jan 2022 11:46:01 +0100 Subject: [PATCH 312/619] [mdns] Set the StandardOutput to journal --- conf/mdns/yunomdns.service | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/mdns/yunomdns.service b/conf/mdns/yunomdns.service index c1f1b7b06..1102f18f6 100644 --- a/conf/mdns/yunomdns.service +++ b/conf/mdns/yunomdns.service @@ -8,7 +8,7 @@ Group=mdns Type=simple Environment=PYTHONUNBUFFERED=1 ExecStart=/usr/bin/yunomdns -StandardOutput=syslog +StandardOutput=journal [Install] WantedBy=default.target From d6bbdfa5f49146ae577ee829e9eb39f8b4d458ae Mon Sep 17 00:00:00 2001 From: Kay0u Date: Thu, 20 Jan 2022 19:22:40 +0100 Subject: [PATCH 313/619] fix tox --- tox.ini | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tox.ini b/tox.ini index 3e3fcbf2e..b037df0b8 100644 --- a/tox.ini +++ b/tox.ini @@ -9,7 +9,7 @@ deps = py39-mypy: mypy >= 0.900 commands = py39-lint: flake8 src doc data tests --ignore E402,E501,E203,W503 --exclude src/vendor - py39-invalidcode: flake8 src data --exclude src/tests,src/vendor --select F,E722,W605 - py39-black-check: black --check --diff src doc data tests - py39-black-run: black src doc data tests + py39-invalidcode: flake8 src bin maintenance --exclude src/tests,src/vendor --select F,E722,W605 + py39-black-check: black --check --diff bin src doc maintenance tests + py39-black-run: bin src doc maintenance tests py39-mypy: mypy --ignore-missing-import --install-types --non-interactive --follow-imports silent src/ --exclude (acme_tiny|migrations) From 7ee5565a83e0e202e275b6055d8d80de6463239a Mon Sep 17 00:00:00 2001 From: Kay0u Date: Thu, 20 Jan 2022 19:23:45 +0100 Subject: [PATCH 314/619] another one --- tox.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tox.ini b/tox.ini index b037df0b8..1ebf47ad1 100644 --- a/tox.ini +++ b/tox.ini @@ -8,7 +8,7 @@ deps = py39-black-{run,check}: black py39-mypy: mypy >= 0.900 commands = - py39-lint: flake8 src doc data tests --ignore E402,E501,E203,W503 --exclude src/vendor + py39-lint: flake8 src doc maintenance tests --ignore E402,E501,E203,W503 --exclude src/vendor py39-invalidcode: flake8 src bin maintenance --exclude src/tests,src/vendor --select F,E722,W605 py39-black-check: black --check --diff bin src doc maintenance tests py39-black-run: bin src doc maintenance tests From cf971362377fb25e5eeceecc4d896b13fcf8e435 Mon Sep 17 00:00:00 2001 From: Kay0u Date: Thu, 20 Jan 2022 19:27:00 +0100 Subject: [PATCH 315/619] fix autofix locale format path --- maintenance/autofix_locale_format.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/maintenance/autofix_locale_format.py b/maintenance/autofix_locale_format.py index 400704ddb..6eb78b497 100644 --- a/maintenance/autofix_locale_format.py +++ b/maintenance/autofix_locale_format.py @@ -89,11 +89,11 @@ def autofix_orthotypography_and_standardized_words(): def reformat(lang, transformations): - locale = open(f"../locales/{lang}.json").read() + locale = open(f"{LOCALE_FOLDER}{lang}.json").read() for pattern, replace in transformations.items(): locale = re.compile(pattern).sub(replace, locale) - open(f"../locales/{lang}.json", "w").write(locale) + open(f"{LOCALE_FOLDER}{lang}.json", "w").write(locale) ###################################################### From 3779b9203a5d8cef712f95f32493d9a4bfc7d234 Mon Sep 17 00:00:00 2001 From: Kay0u Date: Thu, 20 Jan 2022 19:32:13 +0100 Subject: [PATCH 316/619] oupsi add black again --- tox.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tox.ini b/tox.ini index 1ebf47ad1..dc2c52074 100644 --- a/tox.ini +++ b/tox.ini @@ -11,5 +11,5 @@ commands = py39-lint: flake8 src doc maintenance tests --ignore E402,E501,E203,W503 --exclude src/vendor py39-invalidcode: flake8 src bin maintenance --exclude src/tests,src/vendor --select F,E722,W605 py39-black-check: black --check --diff bin src doc maintenance tests - py39-black-run: bin src doc maintenance tests + py39-black-run: black bin src doc maintenance tests py39-mypy: mypy --ignore-missing-import --install-types --non-interactive --follow-imports silent src/ --exclude (acme_tiny|migrations) From b9060da7508e1e3ec6d5624aca331a878a95f2c4 Mon Sep 17 00:00:00 2001 From: yunohost-bot Date: Thu, 20 Jan 2022 18:43:33 +0000 Subject: [PATCH 317/619] [CI] Format code with Black --- maintenance/autofix_locale_format.py | 15 ++++++++------- src/__init__.py | 2 +- src/app.py | 15 ++++++++++----- src/app_catalog.py | 17 +++++++++++++---- src/backup.py | 7 +++---- src/certificate.py | 9 +++++---- src/diagnosers/10-ip.py | 4 +--- src/diagnosis.py | 18 +++++++++++------- src/domain.py | 4 +--- src/dyndns.py | 17 +++++++++-------- src/migrations/0021_migrate_to_bullseye.py | 4 ++-- src/permission.py | 7 ++----- src/regenconf.py | 4 +--- src/service.py | 19 ++++++++++++------- src/settings.py | 16 +++++++--------- src/tools.py | 10 ++++------ src/user.py | 8 ++------ src/utils/error.py | 1 - src/utils/legacy.py | 21 ++++++++++++++------- 19 files changed, 106 insertions(+), 92 deletions(-) diff --git a/maintenance/autofix_locale_format.py b/maintenance/autofix_locale_format.py index 6eb78b497..1c56ea386 100644 --- a/maintenance/autofix_locale_format.py +++ b/maintenance/autofix_locale_format.py @@ -60,18 +60,20 @@ def autofix_i18n_placeholders(): k[0] for k in re.findall(r"{(\w+)(:\w)?}", this_locale[key]) ] if any(k not in subkeys_in_ref for k in subkeys_in_this_locale): - raise Exception("""\n + raise Exception( + """\n ========================== Format inconsistency for string {key} in {locale_file}:" en.json -> {string} {locale_file} -> {translated_string} Please fix it manually ! """.format( - key=key, - string=string.encode("utf-8"), - locale_file=locale_file, - translated_string=this_locale[key].encode("utf-8"), - )) + key=key, + string=string.encode("utf-8"), + locale_file=locale_file, + translated_string=this_locale[key].encode("utf-8"), + ) + ) if fixed_stuff: json.dump( @@ -86,7 +88,6 @@ Please fix it manually ! def autofix_orthotypography_and_standardized_words(): - def reformat(lang, transformations): locale = open(f"{LOCALE_FOLDER}{lang}.json").read() diff --git a/src/__init__.py b/src/__init__.py index b9dcd93d9..608917185 100644 --- a/src/__init__.py +++ b/src/__init__.py @@ -28,7 +28,7 @@ def cli(debug, quiet, output_as, timeout, args, parser): locales_dir="/usr/share/yunohost/locales/", output_as=output_as, timeout=timeout, - top_parser=parser + top_parser=parser, ) sys.exit(ret) diff --git a/src/app.py b/src/app.py index af13765e3..e03d94317 100644 --- a/src/app.py +++ b/src/app.py @@ -1425,7 +1425,7 @@ def app_action_run(operation_logger, app, action, args=None): actions = {x["id"]: x for x in actions} if action not in actions: - available_actions = ", ".join(actions.keys()), + available_actions = (", ".join(actions.keys()),) raise YunohostValidationError( f"action '{action}' not available for app '{app}', available actions are: {available_actions}", raw_msg=True, @@ -2416,10 +2416,15 @@ def unstable_apps(): for infos in app_list(full=True)["apps"]: - if not infos.get("from_catalog") or infos.get("from_catalog").get("state") in [ - "inprogress", - "notworking", - ] or infos["id"] in deprecated_apps: + if ( + not infos.get("from_catalog") + or infos.get("from_catalog").get("state") + in [ + "inprogress", + "notworking", + ] + or infos["id"] in deprecated_apps + ): output.append(infos["id"]) return output diff --git a/src/app_catalog.py b/src/app_catalog.py index b2b35b8c3..5ae8ef30b 100644 --- a/src/app_catalog.py +++ b/src/app_catalog.py @@ -103,7 +103,9 @@ def _initialize_apps_catalog_system(): ) write_to_yaml(APPS_CATALOG_CONF, default_apps_catalog_list) except Exception as e: - raise YunohostError(f"Could not initialize the apps catalog system... : {e}", raw_msg=True) + raise YunohostError( + f"Could not initialize the apps catalog system... : {e}", raw_msg=True + ) logger.success(m18n.n("apps_catalog_init_success")) @@ -119,7 +121,9 @@ def _read_apps_catalog_list(): # by returning [] if list_ is None return list_ if list_ else [] except Exception as e: - raise YunohostError(f"Could not read the apps_catalog list ... : {e}", raw_msg=True) + raise YunohostError( + f"Could not read the apps_catalog list ... : {e}", raw_msg=True + ) def _actual_apps_catalog_api_url(base_url): @@ -172,7 +176,10 @@ def _update_apps_catalog(): try: write_to_json(cache_file, apps_catalog_content) except Exception as e: - raise YunohostError(f"Unable to write cache data for {apps_catalog_id} apps_catalog : {e}", raw_msg=True) + raise YunohostError( + f"Unable to write cache data for {apps_catalog_id} apps_catalog : {e}", + raw_msg=True, + ) logger.success(m18n.n("apps_catalog_update_success")) @@ -220,7 +227,9 @@ def _load_apps_catalog(): # in which case we keep only the first one found) if app in merged_catalog["apps"]: other_catalog = merged_catalog["apps"][app]["repository"] - logger.warning(f"Duplicate app {app} found between apps catalog {apps_catalog_id} and {other_catalog}") + logger.warning( + f"Duplicate app {app} found between apps catalog {apps_catalog_id} and {other_catalog}" + ) continue info["repository"] = apps_catalog_id diff --git a/src/backup.py b/src/backup.py index 57e667d8d..bba60b895 100644 --- a/src/backup.py +++ b/src/backup.py @@ -866,7 +866,7 @@ class RestoreManager: from_version = self.info.get("from_yunohost_version", "") # Remove any '~foobar' in the version ... c.f ~alpha, ~beta version during # early dev for next debian version - from_version = re.sub(r'~\w+', '', from_version) + from_version = re.sub(r"~\w+", "", from_version) if not from_version or version.parse(from_version) < version.parse("4.2.0"): raise YunohostValidationError("restore_backup_too_old") @@ -2403,10 +2403,9 @@ def backup_list(with_info=False, human_readable=False): logger.warning(str(e)) except Exception: import traceback + trace_ = "\n" + traceback.format_exc() - logger.warning( - f"Could not check infos for archive {archive}: {trace_}" - ) + logger.warning(f"Could not check infos for archive {archive}: {trace_}") archives = d diff --git a/src/certificate.py b/src/certificate.py index a681d106b..2ad294605 100644 --- a/src/certificate.py +++ b/src/certificate.py @@ -415,9 +415,7 @@ def certificate_renew( traceback.print_exc(file=stack) msg = f"Certificate renewing for {domain} failed!" if no_checks: - msg += ( - f"\nPlease consider checking the 'DNS records' (basic) and 'Web' categories of the diagnosis to check for possible issues that may prevent installing a Let's Encrypt certificate on domain {domain}." - ) + msg += f"\nPlease consider checking the 'DNS records' (basic) and 'Web' categories of the diagnosis to check for possible issues that may prevent installing a Let's Encrypt certificate on domain {domain}." logger.error(msg) operation_logger.error(msg) logger.error(stack.getvalue()) @@ -788,7 +786,10 @@ def _enable_certificate(domain, new_cert_folder): for service in ("postfix", "dovecot", "metronome"): # Ugly trick to not restart metronome if it's not installed - if service == "metronome" and os.system("dpkg --list | grep -q 'ii *metronome'") != 0: + if ( + service == "metronome" + and os.system("dpkg --list | grep -q 'ii *metronome'") != 0 + ): continue _run_service_command("restart", service) diff --git a/src/diagnosers/10-ip.py b/src/diagnosers/10-ip.py index 5e49ae927..247c486fc 100644 --- a/src/diagnosers/10-ip.py +++ b/src/diagnosers/10-ip.py @@ -155,9 +155,7 @@ class MyDiagnoser(Diagnoser): return None # We use the resolver file as a list of well-known, trustable (ie not google ;)) IPs that we can ping - resolver_file = ( - "/usr/share/yunohost/conf/dnsmasq/plain/resolv.dnsmasq.conf" - ) + resolver_file = "/usr/share/yunohost/conf/dnsmasq/plain/resolv.dnsmasq.conf" resolvers = [ r.split(" ")[1] for r in read_file(resolver_file).split("\n") diff --git a/src/diagnosis.py b/src/diagnosis.py index 2486887b9..b44028d29 100644 --- a/src/diagnosis.py +++ b/src/diagnosis.py @@ -419,10 +419,7 @@ class Diagnoser: def diagnose(self, force=False): - if ( - not force - and self.cached_time_ago() < self.cache_duration - ): + if not force and self.cached_time_ago() < self.cache_duration: logger.debug(f"Cache still valid : {self.cache_file}") logger.info( m18n.n("diagnosis_cache_still_valid", category=self.description) @@ -659,7 +656,9 @@ class Diagnoser: def _list_diagnosis_categories(): paths = glob.glob(os.path.dirname(__file__) + "/diagnosers/??-*.py") - names = sorted([os.path.basename(path)[: -len(".py")].split("-")[-1] for path in paths]) + names = sorted( + [os.path.basename(path)[: -len(".py")].split("-")[-1] for path in paths] + ) return names @@ -671,7 +670,10 @@ def _load_diagnoser(diagnoser_name): paths = glob.glob(os.path.dirname(__file__) + f"/diagnosers/??-{diagnoser_name}.py") if len(paths) != 1: - raise YunohostError(f"Uhoh, found several matches (or none?) for diagnoser {diagnoser_name} : {paths}", raw_msg=True) + raise YunohostError( + f"Uhoh, found several matches (or none?) for diagnoser {diagnoser_name} : {paths}", + raw_msg=True, + ) module_id = os.path.basename(paths[0][: -len(".py")]) @@ -686,7 +688,9 @@ def _load_diagnoser(diagnoser_name): traceback.print_exc() - raise YunohostError(f"Failed to load diagnoser {diagnoser_name} : {e}", raw_msg=True) + raise YunohostError( + f"Failed to load diagnoser {diagnoser_name} : {e}", raw_msg=True + ) def _email_diagnosis_issues(): diff --git a/src/domain.py b/src/domain.py index 6fd1724b4..c94dc694d 100644 --- a/src/domain.py +++ b/src/domain.py @@ -68,9 +68,7 @@ def domain_list(exclude_subdomains=False): ldap = _get_ldap_interface() result = [ entry["virtualdomain"][0] - for entry in ldap.search( - "ou=domains", "virtualdomain=*", ["virtualdomain"] - ) + for entry in ldap.search("ou=domains", "virtualdomain=*", ["virtualdomain"]) ] result_list = [] diff --git a/src/dyndns.py b/src/dyndns.py index c9da4f1be..34f3dd5dc 100644 --- a/src/dyndns.py +++ b/src/dyndns.py @@ -190,7 +190,6 @@ def dyndns_update( import dns.tsigkeyring import dns.update - # If domain is not given, try to guess it from keys available... key = None if domain is None: @@ -227,7 +226,7 @@ def dyndns_update( with open(key) as f: key = f.readline().strip().split(" ", 6)[-1] - keyring = dns.tsigkeyring.from_text({f'{domain}.': key}) + keyring = dns.tsigkeyring.from_text({f"{domain}.": key}) # Python's dns.update is similar to the old nsupdate cli tool update = dns.update.Update(zone, keyring=keyring, keyalgorithm=dns.tsig.HMAC_SHA512) @@ -300,7 +299,9 @@ def dyndns_update( # [{"name": "...", "ttl": "...", "type": "...", "value": "..."}] for records in dns_conf.values(): for record in records: - name = f"{record['name']}.{domain}." if record['name'] != "@" else f"{domain}." + name = ( + f"{record['name']}.{domain}." if record["name"] != "@" else f"{domain}." + ) update.delete(name) # Add the new records for all domain/subdomains @@ -313,9 +314,11 @@ def dyndns_update( if record["value"] == "@": record["value"] = domain record["value"] = record["value"].replace(";", r"\;") - name = f"{record['name']}.{domain}." if record['name'] != "@" else f"{domain}." + name = ( + f"{record['name']}.{domain}." if record["name"] != "@" else f"{domain}." + ) - update.add(name, record['ttl'], record['type'], record['value']) + update.add(name, record["ttl"], record["type"], record["value"]) logger.debug("Now pushing new conf to DynDNS host...") logger.debug(update) @@ -347,9 +350,7 @@ def _guess_current_dyndns_domain(): dynette...) """ - DYNDNS_KEY_REGEX = re.compile( - r".*/K(?P[^\s\+]+)\.\+165.+\.key$" - ) + DYNDNS_KEY_REGEX = re.compile(r".*/K(?P[^\s\+]+)\.\+165.+\.key$") # Retrieve the first registered domain paths = list(glob.iglob("/etc/yunohost/dyndns/K*.key")) diff --git a/src/migrations/0021_migrate_to_bullseye.py b/src/migrations/0021_migrate_to_bullseye.py index 77797c63f..f4361cb19 100644 --- a/src/migrations/0021_migrate_to_bullseye.py +++ b/src/migrations/0021_migrate_to_bullseye.py @@ -331,8 +331,8 @@ class MyMigration(Migration): # FIXME: update this message with updated topic link once we release the migration as stable message = ( - "N.B.: **THIS MIGRATION IS STILL IN BETA-STAGE** ! If your server hosts critical services and if you are not too confident with debugging possible issues, we recommend you to wait a little bit more while we gather more feedback and polish things up. If on the other hand you are relatively confident with debugging small issues that may arise, you are encouraged to run this migration ;)! You can read and share feedbacks on this forum thread: https://forum.yunohost.org/t/18531\n\n" - + message + "N.B.: **THIS MIGRATION IS STILL IN BETA-STAGE** ! If your server hosts critical services and if you are not too confident with debugging possible issues, we recommend you to wait a little bit more while we gather more feedback and polish things up. If on the other hand you are relatively confident with debugging small issues that may arise, you are encouraged to run this migration ;)! You can read and share feedbacks on this forum thread: https://forum.yunohost.org/t/18531\n\n" + + message ) # message = ( # "N.B.: This migration has been tested by the community over the last few months but has only been declared stable recently. If your server hosts critical services and if you are not too confident with debugging possible issues, we recommend you to wait a little bit more while we gather more feedback and polish things up. If on the other hand you are relatively confident with debugging small issues that may arise, you are encouraged to run this migration ;)! You can read about remaining known issues and feedback from the community here: https://forum.yunohost.org/t/12195\n\n" diff --git a/src/permission.py b/src/permission.py index 995cd34bb..2a6f6d954 100644 --- a/src/permission.py +++ b/src/permission.py @@ -406,9 +406,7 @@ def permission_create( permission = permission + ".main" # Validate uniqueness of permission in LDAP - if ldap.get_conflict( - {"cn": permission}, base_dn="ou=permission" - ): + if ldap.get_conflict({"cn": permission}, base_dn="ou=permission"): raise YunohostValidationError("permission_already_exist", permission=permission) # Get random GID @@ -678,8 +676,7 @@ def permission_sync_to_user(): new_inherited_perms = { "inheritPermission": [ - f"uid={u},ou=users,dc=yunohost,dc=org" - for u in should_be_allowed_users + f"uid={u},ou=users,dc=yunohost,dc=org" for u in should_be_allowed_users ], "memberUid": should_be_allowed_users, } diff --git a/src/regenconf.py b/src/regenconf.py index 0f855878d..5922e6832 100644 --- a/src/regenconf.py +++ b/src/regenconf.py @@ -505,9 +505,7 @@ def _calculate_hash(path): return hasher.hexdigest() except IOError as e: - logger.warning( - f"Error while calculating file '{path}' hash: {e}", exc_info=1 - ) + logger.warning(f"Error while calculating file '{path}' hash: {e}", exc_info=1) return None diff --git a/src/service.py b/src/service.py index 4da5d5546..988c7eb13 100644 --- a/src/service.py +++ b/src/service.py @@ -695,19 +695,25 @@ def _get_services(): if "log" not in services["ynh-vpnclient"]: services["ynh-vpnclient"]["log"] = ["/var/log/ynh-vpnclient.log"] - services_with_package_condition = [name for name, infos in services.items() if infos.get("ignore_if_package_is_not_installed")] + services_with_package_condition = [ + name + for name, infos in services.items() + if infos.get("ignore_if_package_is_not_installed") + ] for name in services_with_package_condition: package = services[name]["ignore_if_package_is_not_installed"] if os.system(f"dpkg --list | grep -q 'ii *{package}'") != 0: del services[name] - php_fpm_versions = check_output(r"dpkg --list | grep -P 'ii php\d.\d-fpm' | awk '{print $2}' | grep -o -P '\d.\d' || true") - php_fpm_versions = [v for v in php_fpm_versions.split('\n') if v.strip()] + php_fpm_versions = check_output( + r"dpkg --list | grep -P 'ii php\d.\d-fpm' | awk '{print $2}' | grep -o -P '\d.\d' || true" + ) + php_fpm_versions = [v for v in php_fpm_versions.split("\n") if v.strip()] for version in php_fpm_versions: services[f"php{version}-fpm"] = { "log": f"/var/log/php{version}-fpm.log", "test_conf": f"php-fpm{version} --test", # ofc the service is phpx.y-fpm but the program is php-fpmx.y because why not ... - "category": "web" + "category": "web", } # Remove legacy /var/log/daemon.log and /var/log/syslog from log entries @@ -833,7 +839,6 @@ def _get_journalctl_logs(service, number="all"): ) except Exception: import traceback + trace_ = traceback.format_exc() - return ( - f"error while get services logs from journalctl:\n{trace_}" - ) + return f"error while get services logs from journalctl:\n{trace_}" diff --git a/src/settings.py b/src/settings.py index 498e6d5cc..cec416550 100644 --- a/src/settings.py +++ b/src/settings.py @@ -341,9 +341,7 @@ def _get_settings(): _save_settings(unknown_settings, location=unknown_settings_path) _save_settings(settings) except Exception as e: - logger.warning( - f"Failed to save unknown settings (because {e}), aborting." - ) + logger.warning(f"Failed to save unknown settings (because {e}), aborting.") return settings @@ -373,12 +371,12 @@ post_change_hooks = {} def post_change_hook(setting_name): def decorator(func): - assert setting_name in DEFAULTS.keys(), ( - f"The setting {setting_name} does not exists" - ) - assert setting_name not in post_change_hooks, ( - f"You can only register one post change hook per setting (in particular for {setting_name})" - ) + assert ( + setting_name in DEFAULTS.keys() + ), f"The setting {setting_name} does not exists" + assert ( + setting_name not in post_change_hooks + ), f"You can only register one post change hook per setting (in particular for {setting_name})" post_change_hooks[setting_name] = func return func diff --git a/src/tools.py b/src/tools.py index 9ede24551..28b4457b4 100644 --- a/src/tools.py +++ b/src/tools.py @@ -536,9 +536,7 @@ def tools_upgrade(operation_logger, target=None): # Restart the API after 10 sec (at now doesn't support sub-minute times...) # We do this so that the API / webadmin still gets the proper HTTP response # It's then up to the webadmin to implement a proper UX process to wait 10 sec and then auto-fresh the webadmin - cmd = ( - "at -M now >/dev/null 2>&1 <<< \"sleep 10; systemctl restart yunohost-api\"" - ) + cmd = 'at -M now >/dev/null 2>&1 <<< "sleep 10; systemctl restart yunohost-api"' # For some reason subprocess doesn't like the redirections so we have to use bash -c explicity... subprocess.check_call(["bash", "-c", cmd]) @@ -894,9 +892,9 @@ def _get_migration_by_name(migration_name): if re.match(r"^\d+_%s\.py$" % migration_name, x) ] - assert len(migrations_found) == 1, ( - f"Unable to find migration with name {migration_name}" - ) + assert ( + len(migrations_found) == 1 + ), f"Unable to find migration with name {migration_name}" return _load_migration(migrations_found[0]) diff --git a/src/user.py b/src/user.py index c03023387..7d023fd83 100644 --- a/src/user.py +++ b/src/user.py @@ -254,9 +254,7 @@ def user_create( logger.warning(m18n.n("user_home_creation_failed", home=home), exc_info=1) try: - subprocess.check_call( - ["setfacl", "-m", "g:all_users:---", f"/home/{username}"] - ) + subprocess.check_call(["setfacl", "-m", "g:all_users:---", f"/home/{username}"]) except subprocess.CalledProcessError: logger.warning(f"Failed to protect /home/{username}", exc_info=1) @@ -986,9 +984,7 @@ def user_group_create( ldap = _get_ldap_interface() # Validate uniqueness of groupname in LDAP - conflict = ldap.get_conflict( - {"cn": groupname}, base_dn="ou=groups" - ) + conflict = ldap.get_conflict({"cn": groupname}, base_dn="ou=groups") if conflict: raise YunohostValidationError("group_already_exist", group=groupname) diff --git a/src/utils/error.py b/src/utils/error.py index aa76ba67e..a92f3bd5a 100644 --- a/src/utils/error.py +++ b/src/utils/error.py @@ -65,4 +65,3 @@ class YunohostValidationError(YunohostError): class YunohostAuthenticationError(MoulinetteAuthenticationError): pass - diff --git a/src/utils/legacy.py b/src/utils/legacy.py index 306fcc87f..910dfd5a3 100644 --- a/src/utils/legacy.py +++ b/src/utils/legacy.py @@ -116,10 +116,7 @@ def _patch_legacy_php_versions(app_folder): c = ( "sed -i " - + "".join( - f"-e 's@{p}@{r}@g' " - for p, r in LEGACY_PHP_VERSION_REPLACEMENTS - ) + + "".join(f"-e 's@{p}@{r}@g' " for p, r in LEGACY_PHP_VERSION_REPLACEMENTS) + "%s" % filename ) os.system(c) @@ -137,7 +134,11 @@ def _patch_legacy_php_versions_in_settings(app_folder): settings["phpversion"] = "7.4" # We delete these checksums otherwise the file will appear as manually modified - list_to_remove = ["checksum__etc_php_7.3_fpm_pool", "checksum__etc_php_7.0_fpm_pool", "checksum__etc_nginx_conf.d"] + list_to_remove = [ + "checksum__etc_php_7.3_fpm_pool", + "checksum__etc_php_7.0_fpm_pool", + "checksum__etc_nginx_conf.d", + ] settings = { k: v for k, v in settings.items() @@ -168,9 +169,15 @@ def _patch_legacy_helpers(app_folder): "important": False, }, # Old $1, $2 in backup/restore scripts... - "app=$2": {"only_for": ["scripts/backup", "scripts/restore"], "important": True}, + "app=$2": { + "only_for": ["scripts/backup", "scripts/restore"], + "important": True, + }, # Old $1, $2 in backup/restore scripts... - "backup_dir=$1": {"only_for": ["scripts/backup", "scripts/restore"], "important": True}, + "backup_dir=$1": { + "only_for": ["scripts/backup", "scripts/restore"], + "important": True, + }, # Old $1, $2 in backup/restore scripts... "restore_dir=$1": {"only_for": ["scripts/restore"], "important": True}, # Old $1, $2 in install scripts... From 409cd48b4242f138e64dde861e168636bbeca142 Mon Sep 17 00:00:00 2001 From: yunohost-bot Date: Thu, 20 Jan 2022 18:44:27 +0000 Subject: [PATCH 318/619] [CI] Reformat / remove stale translated strings --- locales/ca.json | 9 --------- locales/de.json | 11 +---------- locales/en.json | 3 +-- locales/eo.json | 9 --------- locales/es.json | 11 +---------- locales/eu.json | 9 --------- locales/fa.json | 9 --------- locales/fr.json | 11 +---------- locales/gl.json | 11 +---------- locales/it.json | 9 --------- locales/nl.json | 3 +-- locales/oc.json | 9 --------- locales/pt.json | 1 - locales/uk.json | 11 +---------- locales/zh_Hans.json | 9 --------- 15 files changed, 7 insertions(+), 118 deletions(-) diff --git a/locales/ca.json b/locales/ca.json index 4b1c51edd..b8d7a6718 100644 --- a/locales/ca.json +++ b/locales/ca.json @@ -215,7 +215,6 @@ "mail_unavailable": "Aquesta adreça de correu està reservada i ha de ser atribuïda automàticament el primer usuari", "main_domain_change_failed": "No s'ha pogut canviar el domini principal", "main_domain_changed": "S'ha canviat el domini principal", - "migrations_cant_reach_migration_file": "No s'ha pogut accedir als fitxers de migració al camí «%s»", "migrations_list_conflict_pending_done": "No es pot utilitzar «--previous» i «--done» al mateix temps.", "migrations_loading_migration": "Carregant la migració {id}...", "migrations_migration_has_failed": "La migració {id} ha fallat, cancel·lant. Error: {exception}", @@ -224,7 +223,6 @@ "migrations_to_be_ran_manually": "La migració {id} s'ha de fer manualment. Aneu a Eines → Migracions a la interfície admin, o executeu «yunohost tools migrations run».", "migrations_need_to_accept_disclaimer": "Per fer la migració {id}, heu d'acceptar aquesta clàusula de no responsabilitat:\n---\n{disclaimer}\n---\nSi accepteu fer la migració, torneu a executar l'ordre amb l'opció «--accept-disclaimer».", "not_enough_disk_space": "No hi ha prou espai en «{path}»", - "packages_upgrade_failed": "No s'han pogut actualitzar tots els paquets", "pattern_backup_archive_name": "Ha de ser un nom d'arxiu vàlid amb un màxim de 30 caràcters, compost per caràcters alfanumèrics i -_. exclusivament", "pattern_domain": "Ha de ser un nom de domini vàlid (ex.: el-meu-domini.cat)", "pattern_email": "Ha de ser una adreça de correu vàlida, sense el símbol «+» (ex.: algu@domini.cat)", @@ -313,13 +311,6 @@ "system_upgraded": "S'ha actualitzat el sistema", "system_username_exists": "El nom d'usuari ja existeix en la llista d'usuaris de sistema", "this_action_broke_dpkg": "Aquesta acció a trencat dpkg/APT (els gestors de paquets del sistema)... Podeu intentar resoldre el problema connectant-vos amb SSH i executant «sudo apt install --fix-broken» i/o «sudo dpkg --configure -a».", - "tools_upgrade_cant_hold_critical_packages": "No es poden mantenir els paquets crítics...", - "tools_upgrade_cant_unhold_critical_packages": "No es poden deixar de mantenir els paquets crítics...", - "tools_upgrade_regular_packages": "Actualitzant els paquets «normals» (no relacionats amb YunoHost)...", - "tools_upgrade_regular_packages_failed": "No s'han pogut actualitzar els paquets següents: {packages_list}", - "tools_upgrade_special_packages": "Actualitzant els paquets «especials» (relacionats amb YunoHost)...", - "tools_upgrade_special_packages_explanation": "Aquesta actualització especial continuarà en segon pla. No comenceu cap altra acció al servidor en els pròxims ~10 minuts (depèn de la velocitat del maquinari). Després d'això, pot ser que us hagueu de tornar a connectar a la interfície d'administració. Els registres de l'actualització estaran disponibles a Eines → Registres (a la interfície d'administració) o utilitzant «yunohost log list» (des de la línia d'ordres).", - "tools_upgrade_special_packages_completed": "Actualització dels paquets YunoHost acabada.\nPremeu [Enter] per tornar a la línia d'ordres", "unbackup_app": "{app} no es guardarà", "unexpected_error": "Hi ha hagut un error inesperat: {error}", "unlimit": "Sense quota", diff --git a/locales/de.json b/locales/de.json index 836893eb6..c1b97104c 100644 --- a/locales/de.json +++ b/locales/de.json @@ -71,7 +71,6 @@ "mail_forward_remove_failed": "Die Weiterleitungs-E-Mail '{mail}' konnte nicht gelöscht werden", "main_domain_change_failed": "Die Hauptdomain konnte nicht geändert werden", "main_domain_changed": "Die Hauptdomain wurde geändert", - "packages_upgrade_failed": "Konnte nicht alle Pakete aktualisieren", "pattern_backup_archive_name": "Muss ein gültiger Dateiname mit maximal 30 alphanumerischen sowie -_. Zeichen sein", "pattern_domain": "Muss ein gültiger Domainname sein (z.B. meine-domain.org)", "pattern_email": "Muss eine gültige E-Mail-Adresse ohne '+' Symbol sein (z.B. someone@example.com)", @@ -478,7 +477,6 @@ "migrations_pending_cant_rerun": "Diese Migrationen sind immer noch anstehend und können deshalb nicht erneut durchgeführt werden: {ids}", "migrations_not_pending_cant_skip": "Diese Migrationen sind nicht anstehend und können deshalb nicht übersprungen werden: {ids}", "migrations_success_forward": "Migration {id} abgeschlossen", - "migrations_cant_reach_migration_file": "Die Migrationsdateien konnten nicht aufgerufen werden im Verzeichnis '%s'", "migrations_dependencies_not_satisfied": "Führen Sie diese Migrationen aus: '{dependencies_id}', vor der Migration {id}.", "migrations_failed_to_load_migration": "Konnte Migration nicht laden {id}: {error}", "migrations_list_conflict_pending_done": "Sie können nicht '--previous' und '--done' gleichzeitig benützen.", @@ -577,15 +575,8 @@ "root_password_replaced_by_admin_password": "Ihr Root Passwort wurde durch Ihr Admin Passwort ersetzt.", "show_tile_cant_be_enabled_for_regex": "Du kannst 'show_tile' momentan nicht aktivieren, weil die URL für die Berechtigung '{permission}' ein regulärer Ausdruck ist", "show_tile_cant_be_enabled_for_url_not_defined": "Momentan können Sie 'show_tile' nicht aktivieren, weil Sie zuerst eine URL für die Berechtigung '{permission}' definieren müssen", - "tools_upgrade_regular_packages_failed": "Konnte für die folgenden Pakete das Upgrade nicht durchführen: {packages_list}", - "tools_upgrade_regular_packages": "Momentan werden Upgrades für das System (YunoHost-unabhängige) Pakete durchgeführt...", - "tools_upgrade_cant_unhold_critical_packages": "Konnte für die kritischen Pakete das Flag 'hold' nicht aufheben...", - "tools_upgrade_cant_hold_critical_packages": "Konnte für die kritischen Pakete das Flag 'hold' nicht setzen...", "this_action_broke_dpkg": "Diese Aktion hat unkonfigurierte Pakete verursacht, welche durch dpkg/apt (die Paketverwaltungen dieses Systems) zurückgelassen wurden... Sie können versuchen dieses Problem zu lösen, indem Sie 'sudo apt install --fix-broken' und/oder 'sudo dpkg --configure -a' ausführen.", "update_apt_cache_failed": "Kann den Cache von APT (Debians Paketmanager) nicht aktualisieren. Hier ist ein Auszug aus den sources.list-Zeilen, die helfen könnten, das Problem zu identifizieren:\n{sourceslist}", - "tools_upgrade_special_packages_completed": "YunoHost-Paketupdate beendet.\nDrücke [Enter], um zurück zur Kommandoziele zu kommen", - "tools_upgrade_special_packages_explanation": "Das Upgrade \"special\" wird im Hintergrund ausgeführt. Bitte starten Sie keine anderen Aktionen auf Ihrem Server für die nächsten ~10 Minuten. Die Dauer ist abhängig von der Geschwindigkeit Ihres Servers. Nach dem Upgrade müssen Sie sich eventuell erneut in das Adminportal einloggen. Upgrade-Logs sind im Adminbereich unter Tools → Log verfügbar. Alternativ können Sie in der Befehlszeile 'yunohost log list' eingeben.", - "tools_upgrade_special_packages": "\"special\" (YunoHost-bezogene) Pakete werden jetzt aktualisiert...", "unknown_main_domain_path": "Unbekannte:r Domain oder Pfad für '{app}'. Du musst eine Domain und einen Pfad setzen, um die URL für Berechtigungen zu setzen.", "yunohost_postinstall_end_tip": "Post-install ist fertig! Um das Setup abzuschliessen, wird empfohlen:\n - einen ersten Benutzer über den Bereich 'Benutzer:in' im Adminbereich hinzuzufügen (oder mit 'yunohost user create ' in der Kommandezeile);\n - mögliche Fehler zu diagnostizieren über den Bereich 'Diagnose' im Adminbereich (oder mit 'yunohost diagnosis run' in der Kommandozeile;\n - Die Abschnitte 'Install YunoHost' und 'Geführte Tour' im Administratorenhandbuch zu lesen: https://yunohost.org/admindoc.", "user_already_exists": "Benutzer:in '{user}' ist bereits vorhanden", @@ -686,4 +677,4 @@ "global_settings_setting_security_ssh_password_authentication": "Passwort-Authentifizierung für SSH zulassen", "migration_description_0021_migrate_to_bullseye": "Upgrade des Systems auf Debian Bullseye und YunoHost 11.x", "migration_0021_general_warning": "Bitte beachten Sie, dass diese Migration ein heikler Vorgang ist. Das YunoHost-Team hat sein Bestes getan, um sie zu überprüfen und zu testen, aber die Migration könnte immer noch Teile des Systems oder seiner Anwendungen beschädigen.\n\nEs wird daher empfohlen,:\n - Führen Sie ein Backup aller kritischen Daten oder Anwendungen durch. Mehr Informationen unter https://yunohost.org/backup;\n - Haben Sie Geduld, nachdem Sie die Migration gestartet haben: Je nach Internetverbindung und Hardware kann es bis zu ein paar Stunden dauern, bis alles aktualisiert ist." -} +} \ No newline at end of file diff --git a/locales/en.json b/locales/en.json index 91db42cb5..856cbc418 100644 --- a/locales/en.json +++ b/locales/en.json @@ -528,7 +528,6 @@ "not_enough_disk_space": "Not enough free space on '{path}'", "operation_interrupted": "The operation was manually interrupted?", "other_available_options": "... and {n} other available options not shown", - "packages_upgrade_failed": "Could not upgrade all the packages", "password_listed": "This password is among the most used passwords in the world. Please choose something more unique.", "password_too_simple_1": "The password needs to be at least 8 characters long", "password_too_simple_2": "The password needs to be at least 8 characters long and contain a digit, upper and lower characters", @@ -686,4 +685,4 @@ "yunohost_installing": "Installing YunoHost...", "yunohost_not_installed": "YunoHost is not correctly installed. Please run 'yunohost tools postinstall'", "yunohost_postinstall_end_tip": "The post-install completed! To finalize your setup, please consider:\n - adding a first user through the 'Users' section of the webadmin (or 'yunohost user create ' in command-line);\n - diagnose potential issues through the 'Diagnosis' section of the webadmin (or 'yunohost diagnosis run' in command-line);\n - reading the 'Finalizing your setup' and 'Getting to know YunoHost' parts in the admin documentation: https://yunohost.org/admindoc." -} +} \ No newline at end of file diff --git a/locales/eo.json b/locales/eo.json index 1d98e8597..255d873d8 100644 --- a/locales/eo.json +++ b/locales/eo.json @@ -114,7 +114,6 @@ "migrations_must_provide_explicit_targets": "Vi devas provizi eksplicitajn celojn kiam vi uzas '--skip' aŭ '--force-rerun'", "permission_update_failed": "Ne povis ĝisdatigi permeson '{permission}': {error}", "permission_updated": "Ĝisdatigita \"{permission}\" rajtigita", - "tools_upgrade_cant_hold_critical_packages": "Ne povis teni kritikajn pakojn…", "upnp_dev_not_found": "Neniu UPnP-aparato trovita", "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!", @@ -154,8 +153,6 @@ "permission_deletion_failed": "Ne povis forigi permeson '{permission}': {error}", "permission_not_found": "Permesita \"{permission}\" ne trovita", "restore_not_enough_disk_space": "Ne sufiĉa spaco (spaco: {free_space} B, necesa spaco: {needed_space} B, sekureca marĝeno: {margin} B)", - "tools_upgrade_regular_packages": "Nun ĝisdatigi 'regulajn' (ne-yunohost-rilatajn) pakojn …", - "tools_upgrade_special_packages_explanation": "La speciala ĝisdatigo daŭros en la fono. Bonvolu ne komenci aliajn agojn en via servilo dum la sekvaj ~ 10 minutoj (depende de la aparata rapideco). Post tio, vi eble devos re-ensaluti al la retadreso. La ĝisdatiga registro estos havebla en Iloj → Ensaluto (en la retadreso) aŭ uzante 'yunohost logliston' (el la komandlinio).", "unrestore_app": "App '{app}' ne restarigos", "group_created": "Grupo '{group}' kreita", "group_creation_failed": "Ne povis krei la grupon '{group}': {error}", @@ -168,7 +165,6 @@ "ip6tables_unavailable": "Vi ne povas ludi kun ip6tabloj ĉi tie. Vi estas en ujo aŭ via kerno ne subtenas ĝin", "mail_unavailable": "Ĉi tiu retpoŝta adreso estas rezervita kaj aŭtomate estos atribuita al la unua uzanto", "certmanager_domain_dns_ip_differs_from_public_ip": "La DNS 'A' rekordo por la domajno '{domain}' diferencas de la IP de ĉi tiu servilo. Se vi lastatempe modifis vian A-registron, bonvolu atendi ĝin propagandi (iuj DNS-disvastigaj kontroliloj estas disponeblaj interrete). (Se vi scias, kion vi faras, uzu '--no-checks' por malŝalti tiujn ĉekojn.)", - "tools_upgrade_special_packages_completed": "Plenumis la ĝisdatigon de pakaĵoj de YunoHost.\nPremu [Enter] por retrovi la komandlinion", "log_remove_on_failed_install": "Forigu '{}' post malsukcesa instalado", "regenconf_file_manually_modified": "La agorddosiero '{conf}' estis modifita permane kaj ne estos ĝisdatigita", "regenconf_would_be_updated": "La agordo estus aktualigita por la kategorio '{category}'", @@ -184,10 +180,8 @@ "upgrading_packages": "Ĝisdatigi pakojn…", "custom_app_url_required": "Vi devas provizi URL por altgradigi vian kutimon app {app}", "service_reload_failed": "Ne povis reŝargi la servon '{service}'\n\nLastatempaj servaj protokoloj: {logs}", - "packages_upgrade_failed": "Ne povis ĝisdatigi ĉiujn pakojn", "hook_json_return_error": "Ne povis legi revenon de hoko {path}. Eraro: {msg}. Kruda enhavo: {raw_content}", "dyndns_key_not_found": "DNS-ŝlosilo ne trovita por la domajno", - "tools_upgrade_regular_packages_failed": "Ne povis ĝisdatigi pakojn: {packages_list}", "service_start_failed": "Ne povis komenci la servon '{service}'\n\nLastatempaj servaj protokoloj: {logs}", "service_reloaded": "Servo '{service}' reŝargita", "system_upgraded": "Sistemo ĝisdatigita", @@ -201,7 +195,6 @@ "domain_dyndns_already_subscribed": "Vi jam abonis DynDNS-domajnon", "log_letsencrypt_cert_renew": "Renovigu '{}' Let's Encrypt atestilon", "backup_output_directory_required": "Vi devas provizi elirejan dosierujon por la sekurkopio", - "tools_upgrade_cant_unhold_critical_packages": "Ne povis malŝalti kritikajn pakojn…", "log_link_to_log": "Plena ŝtipo de ĉi tiu operacio: '{desc} '", "global_settings_cant_serialize_settings": "Ne eblis serialigi datumojn pri agordoj, motivo: {reason}", "backup_running_hooks": "Kurado de apogaj hokoj …", @@ -251,7 +244,6 @@ "downloading": "Elŝutante …", "user_deleted": "Uzanto forigita", "service_enable_failed": "Ne povis fari la servon '{service}' aŭtomate komenci ĉe la ekkuro.\n\nLastatempaj servaj protokoloj: {logs}", - "tools_upgrade_special_packages": "Nun ĝisdatigi 'specialajn' (rilatajn al yunohost)…", "domains_available": "Haveblaj domajnoj:", "dyndns_registered": "Registrita domajno DynDNS", "service_description_fail2ban": "Protektas kontraŭ bruta forto kaj aliaj specoj de atakoj de la interreto", @@ -331,7 +323,6 @@ "regenconf_file_copy_failed": "Ne povis kopii la novan agordodosieron '{new}' al '{conf}'", "restore_already_installed_app": "App kun la ID '{app}' estas jam instalita", "mail_domain_unknown": "Nevalida retadreso por domajno '{domain}'. Bonvolu uzi domajnon administritan de ĉi tiu servilo.", - "migrations_cant_reach_migration_file": "Ne povis aliri migrajn dosierojn ĉe la vojo '% s'", "pattern_email": "Devas esti valida retpoŝta adreso (t.e. iu@ekzemple.com)", "mail_alias_remove_failed": "Ne povis forigi retpoŝton alias '{mail}'", "regenconf_file_manually_removed": "La dosiero de agordo '{conf}' estis forigita permane, kaj ne estos kreita", diff --git a/locales/es.json b/locales/es.json index e3a6ca87a..62831fc1b 100644 --- a/locales/es.json +++ b/locales/es.json @@ -80,7 +80,6 @@ "main_domain_change_failed": "No se pudo cambiar el dominio principal", "main_domain_changed": "El dominio principal ha cambiado", "not_enough_disk_space": "No hay espacio libre suficiente en «{path}»", - "packages_upgrade_failed": "No se pudieron actualizar todos los paquetes", "pattern_backup_archive_name": "Debe ser un nombre de archivo válido con un máximo de 30 caracteres, solo se admiten caracteres alfanuméricos y los caracteres -_. (guiones y punto)", "pattern_domain": "El nombre de dominio debe ser válido (por ejemplo mi-dominio.org)", "pattern_email": "Debe ser una dirección de correo electrónico válida, sin el símbolo '+' (ej. alguien@ejemplo.com)", @@ -203,13 +202,6 @@ "password_too_simple_4": "La contraseña debe ser de al menos 12 caracteres de longitud e incluir un número, mayúsculas, minúsculas y caracteres especiales", "update_apt_cache_warning": "Algo fue mal durante la actualización de la caché de APT (gestor de paquetes de Debian). Aquí tiene un volcado de las líneas de sources.list que podría ayudarle a identificar las líneas problemáticas:\n{sourceslist}", "update_apt_cache_failed": "Imposible actualizar la caché de APT (gestor de paquetes de Debian). Aquí tienes un volcado de las líneas de sources.list que podrían ayudarte a identificar las líneas problemáticas:\n{sourceslist}", - "tools_upgrade_special_packages_completed": "Actualización de paquetes de YunoHost completada.\nPulse [Intro] para regresar a la línea de órdenes", - "tools_upgrade_special_packages_explanation": "La actualización especial continuará en segundo plano. No inicie ninguna otra acción en su servidor durante los próximos 10 minutos (dependiendo de la velocidad del hardware). Después de esto, es posible que deba volver a iniciar sesión en el administrador web. El registro de actualización estará disponible en Herramientas → Registro (en el webadmin) o usando 'yunohost log list' (desde la línea de comandos).", - "tools_upgrade_special_packages": "Actualizando ahora paquetes «especiales» (relacionados con YunoHost)…", - "tools_upgrade_regular_packages_failed": "No se pudieron actualizar los paquetes: {packages_list}", - "tools_upgrade_regular_packages": "Actualizando ahora paquetes «normales» (no relacionados con YunoHost)…", - "tools_upgrade_cant_unhold_critical_packages": "No se pudo liberar los paquetes críticos…", - "tools_upgrade_cant_hold_critical_packages": "Imposible etiquetar con 'hold' los paquetes críticos…", "this_action_broke_dpkg": "Esta acción rompió dpkg/APT(los gestores de paquetes del sistema)… Puedes tratar de solucionar este problema conectándote mediante SSH y ejecutando `sudo apt install --fix-broken` and/or `sudo dpkg --configure -a`.", "service_reloaded_or_restarted": "El servicio '{service}' fue recargado o reiniciado", "service_reload_or_restart_failed": "No se pudo recargar o reiniciar el servicio «{service}»\n\nRegistro de servicios recientes:{logs}", @@ -281,7 +273,6 @@ "migrations_exclusive_options": "«--auto», «--skip», and «--force-rerun» son opciones mutuamente excluyentes.", "migrations_failed_to_load_migration": "No se pudo cargar la migración {id}: {error}", "migrations_dependencies_not_satisfied": "Ejecutar estas migraciones: «{dependencies_id}» antes de migrar {id}.", - "migrations_cant_reach_migration_file": "No se pudo acceder a los archivos de migración en la ruta «%s»", "migrations_already_ran": "Esas migraciones ya se han realizado: {ids}", "mail_unavailable": "Esta dirección de correo está reservada y será asignada automáticamente al primer usuario", "mailbox_disabled": "Correo desactivado para usuario {user}", @@ -604,4 +595,4 @@ "diagnosis_sshd_config_insecure": "Parece que la configuración SSH ha sido modificada manualmente, y es insegura porque no tiene ninguna instrucción 'AllowGroups' o 'AllowUsers' para limitar el acceso a los usuarios autorizados.", "domain_dns_push_not_applicable": "La configuración automática de los registros DNS no puede realizarse en el dominio {domain}. Deberìas configurar manualmente los registros DNS siguiendo la documentación.", "domain_dns_push_managed_in_parent_domain": "La configuración automática de los registros DNS es administrada desde el dominio superior {parent_domain}." -} +} \ No newline at end of file diff --git a/locales/eu.json b/locales/eu.json index 91d744a7f..6cf1ed9f6 100644 --- a/locales/eu.json +++ b/locales/eu.json @@ -482,8 +482,6 @@ "pattern_lastname": "Abizen horrek ez du balio", "permission_deleted": "'{permission}' baimena ezabatu da", "service_disabled": "'{service}' zerbitzua ez da etorkizunean zerbitzaria abiaraztearekin batera exekutatuko.", - "tools_upgrade_regular_packages_failed": "Ezin izan dira paketeak eguneratu: {packages_list}", - "tools_upgrade_special_packages_completed": "YunoHosten paketeak eguneratu dira.\nSakatu [Enter] komando-lerrora bueltatzeko", "unexpected_error": "Ezusteko zerbaitek huts egin du: {error}", "updating_apt_cache": "Sistemaren paketeen eguneraketak eskuratzen…", "mail_forward_remove_failed": "Ezinezkoa izan da '{mail}' posta elektronikoko birbidalketa ezabatzea", @@ -507,13 +505,9 @@ "permission_require_account": "'{permission}' baimena zerbitzarian kontua duten erabiltzaileentzat da eta, beraz, ezin da gaitu bisitarientzat.", "postinstall_low_rootfsspace": "'root' fitxategi-sistemak 10 GB edo espazio gutxiago dauka, kezkatzekoa dena! Litekeena da espaziorik gabe geratzea aurki! Gomendagarria da 'root' fitxategi-sistemak gutxienez 16 GB libre izatea. Jakinarazpen honen ondoren YunoHost instalatzen jarraitu nahi baduzu, berrabiarazi agindua '--force-diskspace' gehituz", "this_action_broke_dpkg": "Eragiketa honek dpkg/APT (sistemaren pakete kudeatzaileak) kaltetu ditu… Arazoa konpontzeko SSH bidez konektatu eta 'sudo apt install --fix-broken' edota 'sudo dpkg --configure -a' exekutatu dezakezu.", - "tools_upgrade_special_packages_explanation": "Eguneraketa bereziak atzeko planoan jarraituko du. Mesedez, ez abiarazi bestelako eragiketarik datozen ~10 minutuetan (zure hardwarearen abiaduraren arabera). Honen ondoren litekeena da saioa berriro hasi behar izatea. Eguneraketaren erregistroa Erramintak → Erregistroak atalean (administrazio-atarian) edo 'yunohost log list' komandoa erabiliz egongo da ikusgai.", "user_import_bad_line": "{line} lerro okerra: {details}", "restore_complete": "Lehengoratzea amaitu da", "restore_extracting": "Behar diren fitxategiak ateratzen…", - "tools_upgrade_cant_unhold_critical_packages": "Ezin izan dira pakete kritikoak deuseztatu…", - "tools_upgrade_regular_packages": "Orain pakete \"arruntak\" (YunoHostekin zerikusia ez dutenak) eguneratzen…", - "tools_upgrade_special_packages": "Orain pakete \"bereziak\" (YunoHostekin zerikusia dutenak) eguneratzen…", "regenconf_would_be_updated": "'{category}' atalerako konfigurazioa eguneratu izango litzatekeen", "migrations_dependencies_not_satisfied": "Exekutatu honako migrazioak: '{dependencies_id}', {id} migratu baino lehen.", "permission_created": "'{permission}' baimena sortu da", @@ -542,8 +536,6 @@ "migrations_pending_cant_rerun": "Migrazio hauek exekutatzeke daude eta, beraz, ezin dira berriro abiarazi: {ids}", "regenconf_file_kept_back": "'{conf}' konfigurazio fitxategia regen-conf-ek ({category} atala) ezabatzekoa zen baina mantendu egin da.", "regenconf_file_removed": "'{conf}' konfigurazio fitxategia ezabatu da", - "tools_upgrade_cant_hold_critical_packages": "Ezin izan dira pakete kritikoak mantendu…", - "migrations_cant_reach_migration_file": "Ezinezkoa izan da '%s' migrazioen fitxategia eskuratzea", "permission_already_allowed": "'{group} taldeak badauka dagoeneko '{permission}' baimena", "permission_cant_add_to_all_users": "{permission} baimena ezin da erabiltzaile guztiei ezarri.", "mailbox_disabled": "Posta elektronikoa desgaituta dago {user} erabiltzailearentzat", @@ -562,7 +554,6 @@ "user_import_missing_columns": "Ondorengo zutabeak falta dira: {columns}", "service_disable_failed": "Ezin izan da '{service}' zerbitzua geldiarazi zerbitzaria abiaraztean.\n\nZerbitzuen erregistro berrienak: {logs}", "migrations_skip_migration": "{id} migrazioa saihesten…", - "packages_upgrade_failed": "Ezinezkoa izan da pakete guztiak eguneratzea", "upnp_disabled": "UPnP itzalita dago", "main_domain_change_failed": "Ezinezkoa izan da domeinu nagusia aldatzea", "regenconf_failed": "Ezinezkoa izan da ondorengo atal(ar)en konfigurazioa berregitea: {categories}", diff --git a/locales/fa.json b/locales/fa.json index ce2ba91bd..fa5045fbb 100644 --- a/locales/fa.json +++ b/locales/fa.json @@ -386,7 +386,6 @@ "password_too_simple_2": "گذرواژه باید حداقل 8 کاراکتر طول داشته باشد و شامل عدد ، حروف الفبائی کوچک و بزرگ باشد", "password_too_simple_1": "رمز عبور باید حداقل 8 کاراکتر باشد", "password_listed": "این رمز در بین پر استفاده ترین رمزهای عبور در جهان قرار دارد. لطفاً چیزی منحصر به فرد تر انتخاب کنید.", - "packages_upgrade_failed": "همه بسته ها را نمی توان ارتقا داد", "operation_interrupted": "عملیات به صورت دستی قطع شد؟", "invalid_password": "رمز عبور نامعتبر", "invalid_number": "باید یک عدد باشد", @@ -407,7 +406,6 @@ "migrations_exclusive_options": "'--auto', '--skip'، و '--force-rerun' گزینه های متقابل هستند.", "migrations_failed_to_load_migration": "مهاجرت بار نشد {id}: {error}", "migrations_dependencies_not_satisfied": "این مهاجرت ها را اجرا کنید: '{dependencies_id}' ، قبل از مهاجرت {id}.", - "migrations_cant_reach_migration_file": "دسترسی به پرونده های مهاجرت در مسیر '٪ s' امکان پذیر نیست", "migrations_already_ran": "این مهاجرت ها قبلاً انجام شده است: {ids}", "migration_ldap_rollback_success": "سیستم برگردانده شد.", "migration_ldap_migration_failed_trying_to_rollback": "نمی توان مهاجرت کرد... تلاش برای بازگرداندن سیستم.", @@ -498,13 +496,6 @@ "unknown_main_domain_path": "دامنه یا مسیر ناشناخته برای '{app}'. شما باید یک دامنه و یک مسیر را مشخص کنید تا بتوانید یک آدرس اینترنتی برای مجوز تعیین کنید.", "unexpected_error": "مشکل غیر منتظره ای پیش آمده: {error}", "unbackup_app": "{app} ذخیره نمی شود", - "tools_upgrade_special_packages_completed": "ارتقاء بسته YunoHost به پایان رسید\nبرای بازگرداندن خط فرمان [Enter] را فشار دهید", - "tools_upgrade_special_packages_explanation": "ارتقاء ویژه در پس زمینه ادامه خواهد یافت. لطفاً تا 10 دقیقه دیگر (بسته به سرعت سخت افزار) هیچ اقدام دیگری را روی سرور خود شروع نکنید. پس از این کار ، ممکن است مجبور شوید دوباره وارد webadmin شوید. گزارش ارتقاء در Tools → Log (در webadmin) یا با استفاده از 'yunohost log list' (در خط فرمان) در دسترس خواهد بود.", - "tools_upgrade_special_packages": "در حال ارتقاء بسته های 'special' (مربوط به yunohost)...", - "tools_upgrade_regular_packages_failed": "بسته ها را نمی توان ارتقا داد: {packages_list}", - "tools_upgrade_regular_packages": "در حال ارتقاء بسته های 'regular' (غیر مرتبط با yunohost)...", - "tools_upgrade_cant_unhold_critical_packages": "بسته های مهم و حیاتی را نمی توان نگه نداشت...", - "tools_upgrade_cant_hold_critical_packages": "بسته های مهم و حیاتی را نمی توان نگه داشت...", "this_action_broke_dpkg": "این اقدام dpkg/APT (مدیران بسته های سیستم) را خراب کرد... می توانید با اتصال از طریق SSH و اجرای فرمان `sudo apt install --fix -break` و/یا` sudo dpkg --configure -a` این مشکل را حل کنید.", "system_username_exists": "نام کاربری قبلاً در لیست کاربران سیستم وجود دارد", "system_upgraded": "سیستم ارتقا یافت", diff --git a/locales/fr.json b/locales/fr.json index 00df04bae..de88b79f8 100644 --- a/locales/fr.json +++ b/locales/fr.json @@ -82,7 +82,6 @@ "main_domain_change_failed": "Impossible de modifier le domaine principal", "main_domain_changed": "Le domaine principal a été modifié", "not_enough_disk_space": "L'espace disque est insuffisant sur '{path}'", - "packages_upgrade_failed": "Impossible de mettre à jour tous les paquets", "pattern_backup_archive_name": "Doit être un nom de fichier valide avec un maximum de 30 caractères, et composé de caractères alphanumériques et -_. uniquement", "pattern_domain": "Doit être un nom de domaine valide (ex : mon-domaine.fr)", "pattern_email": "Il faut une adresse électronique valide, sans le symbole '+' (par exemple johndoe@exemple.com)", @@ -212,7 +211,6 @@ "restore_system_part_failed": "Impossible de restaurer la partie '{part}' du système", "backup_couldnt_bind": "Impossible de lier {src} avec {dest}.", "domain_dns_conf_is_just_a_recommendation": "Cette commande vous montre la configuration *recommandée*. Elle ne configure pas le DNS pour vous. Il est de votre ressort de configurer votre zone DNS chez votre registrar/fournisseur conformément à cette recommandation.", - "migrations_cant_reach_migration_file": "Impossible d'accéder aux fichiers de migration via le chemin '%s'", "migrations_loading_migration": "Chargement de la migration {id}...", "migrations_migration_has_failed": "La migration {id} a échoué avec l'exception {exception} : annulation", "migrations_no_migrations_to_run": "Aucune migration à lancer", @@ -338,14 +336,7 @@ "regenconf_dry_pending_applying": "Vérification de la configuration en attente qui aurait été appliquée pour la catégorie '{category}'...", "regenconf_failed": "Impossible de régénérer la configuration pour la ou les catégorie(s) : '{categories}'", "regenconf_pending_applying": "Applique la configuration en attente pour la catégorie '{category}'...", - "tools_upgrade_cant_hold_critical_packages": "Impossibilité d'ajouter le drapeau 'hold' pour les paquets critiques...", - "tools_upgrade_regular_packages": "Mise à jour des paquets du système (non liés a YunoHost)...", - "tools_upgrade_regular_packages_failed": "Impossible de mettre à jour les paquets suivants : {packages_list}", - "tools_upgrade_special_packages": "Mise à jour des paquets 'spécifiques' (liés a YunoHost)...", - "tools_upgrade_special_packages_completed": "La mise à jour des paquets de YunoHost est finie !\nPressez [Entrée] pour revenir à la ligne de commande", "dpkg_lock_not_available": "Cette commande ne peut pas être exécutée pour le moment car un autre programme semble utiliser le verrou de dpkg (le gestionnaire de package système)", - "tools_upgrade_cant_unhold_critical_packages": "Impossible d'enlever le drapeau 'hold' pour les paquets critiques...", - "tools_upgrade_special_packages_explanation": "La mise à niveau spécifique à YunoHost se poursuivra en arrière-plan. Veuillez ne pas lancer d'autres actions sur votre serveur pendant les 10 prochaines minutes (selon la vitesse du matériel). Après cela, vous devrez peut-être vous reconnecter à la webadmin. Le journal de mise à niveau sera disponible dans Outils → Journal (dans le webadmin) ou en utilisant 'yunohost log list' (à partir de la ligne de commande).", "update_apt_cache_failed": "Impossible de mettre à jour le cache APT (gestionnaire de paquets Debian). Voici un extrait du fichier sources.list qui pourrait vous aider à identifier les lignes problématiques :\n{sourceslist}", "update_apt_cache_warning": "Des erreurs se sont produites lors de la mise à jour du cache APT (gestionnaire de paquets Debian). Voici un extrait des lignes du fichier sources.list qui pourrait vous aider à identifier les lignes problématiques :\n{sourceslist}", "backup_permission": "Permission de sauvegarde pour {app}", @@ -686,4 +677,4 @@ "migration_0021_not_buster": "La distribution Debian actuelle n'est pas Buster !", "migration_description_0021_migrate_to_bullseye": "Mise à niveau du système vers Debian Bullseye et YunoHost 11.x", "global_settings_setting_security_ssh_password_authentication": "Autoriser l'authentification par mot de passe pour SSH" -} +} \ No newline at end of file diff --git a/locales/gl.json b/locales/gl.json index fb68860e0..5ac7ea9da 100644 --- a/locales/gl.json +++ b/locales/gl.json @@ -447,7 +447,6 @@ "password_too_simple_3": "O contrasinal ten que ter 8 caracteres como mínimo e conter un díxito, maiúsculas, minúsculas e caracteres especiais", "password_too_simple_2": "O contrasinal ten que ter 8 caracteres como mínimo e conter un díxito, maiúsculas e minúsculas", "password_listed": "Este contrasinal está entre os máis utilizados no mundo. Por favor elixe outro que sexa máis orixinal.", - "packages_upgrade_failed": "Non se puideron actualizar tódolos paquetes", "operation_interrupted": "Foi interrumpida manualmente a operación?", "invalid_number": "Ten que ser un número", "not_enough_disk_space": "Non hai espazo libre abondo en '{path}'", @@ -467,7 +466,6 @@ "migrations_exclusive_options": "'--auto', '--skip', e '--force-rerun' son opcións que se exclúen unhas a outras.", "migrations_failed_to_load_migration": "Non se cargou a migración {id}: {error}", "migrations_dependencies_not_satisfied": "Executar estas migracións: '{dependencies_id}', antes da migración {id}.", - "migrations_cant_reach_migration_file": "Non se pode acceder aos ficheiros de migración na ruta '%s'", "regenconf_file_manually_removed": "O ficheiro de configuración '{conf}' foi eliminado manualmente e non será creado", "regenconf_file_manually_modified": "O ficheiro de configuración '{conf}' foi modificado manualmente e non vai ser actualizado", "regenconf_file_kept_back": "Era de agardar que o ficheiro de configuración '{conf}' fose eliminado por regen-conf (categoría {category}) mais foi mantido.", @@ -572,13 +570,6 @@ "unknown_main_domain_path": "Dominio ou ruta descoñecida '{app}'. Tes que indicar un dominio e ruta para poder especificar un URL para o permiso.", "unexpected_error": "Aconteceu un fallo non agardado: {error}", "unbackup_app": "{app} non vai ser gardada", - "tools_upgrade_special_packages_completed": "Completada a actualización dos paquetes YunoHost.\nPreme [Enter] para recuperar a liña de comandos", - "tools_upgrade_special_packages_explanation": "A actualización especial continuará en segundo plano. Non inicies outras tarefas no servidor nos seguintes ~10 minutos (depende do hardware). Após isto, podes volver a conectar na webadmin. O rexistro da actualización estará dispoñible en Ferramentas → Rexistro (na webadmin) ou con 'yunohost log list' (na liña de comandos).", - "tools_upgrade_special_packages": "Actualizando paquetes 'special' (yunohost-related)...", - "tools_upgrade_regular_packages_failed": "Non se actualizaron os paquetes: {packages_list}", - "tools_upgrade_regular_packages": "Actualizando os paquetes 'regular' (non-yunohost-related)...", - "tools_upgrade_cant_unhold_critical_packages": "Non se desbloquearon os paquetes críticos...", - "tools_upgrade_cant_hold_critical_packages": "Non se puideron bloquear os paquetes críticos...", "this_action_broke_dpkg": "Esta acción rachou dpkg/APT (xestores de paquetes do sistema)... Podes intentar resolver o problema conectando a través de SSH e executando `sudo apt install --fix-broken`e/ou `sudo dpkg --configure -a`.", "system_username_exists": "Xa existe este nome de usuaria na lista de usuarias do sistema", "system_upgraded": "Sistema actualizado", @@ -686,4 +677,4 @@ "migration_0021_system_not_fully_up_to_date": "O teu sistema non está completamente actualizado. Fai unha actualización normal antes de executar a migración a Bullseye.", "migration_0021_general_warning": "Ten en conta que a migración é unha operación delicada. O equipo de YunoHost fixo todo o que puido para revisalo e probalo, pero aínda así poderían acontecer fallos no sistema ou apps.\n\nAsí as cousas, é recomendable:\n - Facer unha copia de apoio dos datos e apps importantes. Máis info en https://yunohost.org/backup;\n - Ter paciencia unha vez inicias a migración: dependendo da túa conexión a internet e hardware, podería levarlle varias horas completar o proceso.", "global_settings_setting_security_ssh_password_authentication": "Permitir autenticación con contrasinal para SSH" -} +} \ No newline at end of file diff --git a/locales/it.json b/locales/it.json index bb2e7af6c..5c4a19df7 100644 --- a/locales/it.json +++ b/locales/it.json @@ -95,7 +95,6 @@ "main_domain_change_failed": "Impossibile cambiare il dominio principale", "main_domain_changed": "Il dominio principale è stato cambiato", "not_enough_disk_space": "Non c'è abbastanza spazio libero in '{path}'", - "packages_upgrade_failed": "Impossibile aggiornare tutti i pacchetti", "pattern_backup_archive_name": "Deve essere un nome di file valido di massimo 30 caratteri di lunghezza, con caratteri alfanumerici e \"-_.\" come unica punteggiatura", "pattern_domain": "Deve essere un nome di dominio valido (es. il-mio-dominio.org)", "pattern_firstname": "Deve essere un nome valido", @@ -391,13 +390,6 @@ "update_apt_cache_warning": "Qualcosa è andato storto mentre eseguivo l'aggiornamento della cache APT (package manager di Debian). Ecco il dump di sources.list, che potrebbe aiutare ad identificare le linee problematiche:\n{sourceslist}", "update_apt_cache_failed": "Impossibile aggiornare la cache di APT (package manager di Debian). Ecco il dump di sources.list, che potrebbe aiutare ad identificare le linee problematiche:\n{sourceslist}", "unknown_main_domain_path": "Percorso o dominio sconosciuto per '{app}'. Devi specificare un dominio e un percorso per poter specificare un URL per il permesso.", - "tools_upgrade_special_packages_completed": "Aggiornamento pacchetti YunoHost completato.\nPremi [Invio] per tornare al terminale", - "tools_upgrade_special_packages_explanation": "L'aggiornamento speciale continuerà in background. Per favore non iniziare nessun'altra azione sul tuo server per i prossimi ~10 minuti (dipende dalla velocità hardware). Dopo questo, dovrai ri-loggarti nel webadmin. Il registro di aggiornamento sarà disponibile in Strumenti → Log/Registri (nel webadmin) o dalla linea di comando eseguendo 'yunohost log list'.", - "tools_upgrade_special_packages": "Adesso aggiorno i pacchetti 'speciali' (correlati a yunohost)...", - "tools_upgrade_regular_packages_failed": "Impossibile aggiornare i pacchetti: {packages_list}", - "tools_upgrade_regular_packages": "Adesso aggiorno i pacchetti 'normali' (non correlati a yunohost)...", - "tools_upgrade_cant_unhold_critical_packages": "Impossibile annullare il blocco dei pacchetti critici/importanti...", - "tools_upgrade_cant_hold_critical_packages": "Impossibile bloccare i pacchetti critici/importanti...", "show_tile_cant_be_enabled_for_regex": "Non puoi abilitare 'show_tile' in questo momento, perché l'URL del permesso '{permission}' è una regex", "show_tile_cant_be_enabled_for_url_not_defined": "Non puoi abilitare 'show_tile' in questo momento, devi prima definire un URL per il permesso '{permission}'", "service_reloaded_or_restarted": "Il servizio '{service}' è stato ricaricato o riavviato", @@ -484,7 +476,6 @@ "migrations_exclusive_options": "'--auto', '--skip', e '--force-rerun' sono opzioni che si escludono a vicenda.", "migrations_failed_to_load_migration": "Impossibile caricare la migrazione {id}: {error}", "migrations_dependencies_not_satisfied": "Esegui queste migrazioni: '{dependencies_id}', prima di {id}.", - "migrations_cant_reach_migration_file": "Impossibile accedere ai file di migrazione nel path '%s'", "migrations_already_ran": "Migrazioni già effettuate: {ids}", "mailbox_disabled": "E-mail disabilitate per l'utente {user}", "log_user_permission_reset": "Resetta il permesso '{}'", diff --git a/locales/nl.json b/locales/nl.json index d9f4e7a93..f8b6df327 100644 --- a/locales/nl.json +++ b/locales/nl.json @@ -136,10 +136,9 @@ "pattern_email_forward": "Het moet een geldig e-mailadres zijn, '+' symbool is toegestaan (ikzelf@mijndomein.nl bijvoorbeeld, of ikzelf+yunohost@mijndomein.nl)", "password_too_simple_2": "Het wachtwoord moet minimaal 8 tekens lang zijn en moet cijfers, hoofdletters en kleine letters bevatten", "operation_interrupted": "Werd de bewerking handmatig onderbroken?", - "packages_upgrade_failed": "Niet alle pakketten konden bijgewerkt worden", "pattern_backup_archive_name": "Moet een geldige bestandsnaam zijn van maximaal 30 tekens; alleen alfanumerieke tekens en -_. zijn toegestaan", "pattern_domain": "Moet een geldige domeinnaam zijn (mijneigendomein.nl, bijvoorbeeld)", "pattern_firstname": "Het moet een geldige voornaam zijn", "pattern_lastname": "Het moet een geldige achternaam zijn", "password_too_simple_3": "Het wachtwoord moet minimaal 8 tekens lang zijn en moet cijfers, hoofdletters, kleine letters en speciale tekens bevatten" -} +} \ No newline at end of file diff --git a/locales/oc.json b/locales/oc.json index d9ec19b09..6901b0f0b 100644 --- a/locales/oc.json +++ b/locales/oc.json @@ -126,11 +126,9 @@ "global_settings_unknown_setting_from_settings_file": "Clau desconeguda dins los paramètres : {setting_key}, apartada e salvagardada dins /etc/yunohost/settings-unknown.json", "main_domain_change_failed": "Modificacion impossibla del domeni màger", "main_domain_changed": "Lo domeni màger es estat modificat", - "migrations_cant_reach_migration_file": "Impossible d’accedir als fichièrs de migracion amb lo camin %s", "migrations_list_conflict_pending_done": "Podètz pas utilizar --previous e --done a l’encòp.", "migrations_loading_migration": "Cargament de la migracion {id}…", "migrations_no_migrations_to_run": "Cap de migracion de lançar", - "packages_upgrade_failed": "Actualizacion de totes los paquets impossibla", "pattern_domain": "Deu èsser un nom de domeni valid (ex : mon-domeni.org)", "pattern_email": "Deu èsser una adreça electronica valida (ex : escais@domeni.org)", "pattern_firstname": "Deu èsser un pichon nom valid", @@ -310,8 +308,6 @@ "dpkg_lock_not_available": "Aquesta comanda pòt pas s’executar pel moment perque un autre programa sembla utilizar lo varrolh de dpkg (lo gestionari de paquets del sistèma)", "log_regen_conf": "Regenerar las configuracions del sistèma « {} »", "service_reloaded_or_restarted": "Lo servici « {service} » es estat recargat o reaviat", - "tools_upgrade_regular_packages_failed": "Actualizacion impossibla dels paquets seguents : {packages_list}", - "tools_upgrade_special_packages_completed": "L’actualizacion dels paquets de YunoHost es acabada !\nQuichatz [Entrada] per tornar a la linha de comanda", "dpkg_is_broken": "Podètz pas far aquò pel moment perque dpkg/APT (los gestionaris de paquets del sistèma) sembla èsser mal configurat… Podètz ensajar de solucionar aquò en vos connectar via SSH e en executar « sudo dpkg --configure -a ».", "global_settings_setting_service_ssh_allow_deprecated_dsa_hostkey": "Autorizar l’utilizacion de la clau òst DSA (obsolèta) per la configuracion del servici SSH", "hook_json_return_error": "Fracàs de la lectura del retorn de l’script {path}. Error : {msg}. Contengut brut : {raw_content}", @@ -330,7 +326,6 @@ "regenconf_dry_pending_applying": "Verificacion de la configuracion que seriá estada aplicada a la categoria « {category} »…", "regenconf_failed": "Regeneracion impossibla de la configuracion per la(s) categoria(s) : {categories}", "regenconf_pending_applying": "Aplicacion de la configuracion en espèra per la categoria « {category} »…", - "tools_upgrade_cant_hold_critical_packages": "Manteniment impossible dels paquets critiques…", "global_settings_setting_security_nginx_compatibility": "Solucion de compromés entre compatibilitat e seguretat pel servidor web NGINX Afècta los criptografs (e d’autres aspèctes ligats amb la seguretat)", "global_settings_setting_security_ssh_compatibility": "Solucion de compromés entre compatibilitat e seguretat pel servidor SSH. Afècta los criptografs (e d’autres aspèctes ligats amb la seguretat)", "global_settings_setting_security_postfix_compatibility": "Solucion de compromés entre compatibilitat e seguretat pel servidor Postfix. Afècta los criptografs (e d’autres aspèctes ligats amb la seguretat)", @@ -339,10 +334,6 @@ "service_reload_or_restart_failed": "Impossible de recargar o reaviar lo servici « {service} »\n\nJornal d’audit recent : {logs}", "regenconf_file_kept_back": "S’espèra que lo fichièr de configuracion « {conf} » siá suprimit per regen-conf (categoria {category} mas es estat mantengut.", "this_action_broke_dpkg": "Aquesta accion a copat dpkg/apt (los gestionaris de paquets del sistèma)… Podètz ensajar de resòlver aqueste problèma en vos connectant amb SSH e executant « sudo dpkg --configure -a ».", - "tools_upgrade_cant_unhold_critical_packages": "Se pòt pas quitar de manténer los paquets critics…", - "tools_upgrade_regular_packages": "Actualizacion dels paquets « normals » (pas ligats a YunoHost)…", - "tools_upgrade_special_packages": "Actualizacion dels paquets « especials » (ligats a YunoHost)…", - "tools_upgrade_special_packages_explanation": "Aquesta accion s’acabarà mas l’actualizacion especiala actuala contunharà en rèire-plan. Comencetz pas cap d’autra accion sul servidor dins las ~ 10 minutas que venon (depend de la velocitat de la maquina). Un còp acabat, benlèu que vos calrà vos tornar connectar a l’interfàcia d’administracion. Los jornals d’audit de l’actualizacion seràn disponibles a Aisinas > Jornals d’audit (dins l’interfàcia d’administracion) o amb « yunohost log list » (en linha de comanda).", "update_apt_cache_failed": "I a agut d’errors en actualizar la memòria cache d’APT (lo gestionari de paquets de Debian). Aquí avètz las linhas de sources.list que pòdon vos ajudar a identificar las linhas problematicas : \n{sourceslist}", "update_apt_cache_warning": "I a agut d’errors en actualizar la memòria cache d’APT (lo gestionari de paquets de Debian). Aquí avètz las linhas de sources.list que pòdon vos ajudar a identificar las linhas problematicas : \n{sourceslist}", "backup_permission": "Autorizacion de salvagarda per l’aplicacion {app}", diff --git a/locales/pt.json b/locales/pt.json index 154ab700f..681bafb73 100644 --- a/locales/pt.json +++ b/locales/pt.json @@ -48,7 +48,6 @@ "mail_forward_remove_failed": "Não foi possível remover o reencaminhamento de correio '{mail}'", "main_domain_change_failed": "Incapaz alterar o domínio raiz", "main_domain_changed": "Domínio raiz alterado com êxito", - "packages_upgrade_failed": "Não foi possível atualizar todos os pacotes", "pattern_domain": "Deve ser um nome de domínio válido (p.e. meu-dominio.org)", "pattern_email": "Deve ser um endereço de correio válido (p.e. alguem@dominio.org)", "pattern_firstname": "Deve ser um primeiro nome válido", diff --git a/locales/uk.json b/locales/uk.json index 7e3395aba..1f99ba1b4 100644 --- a/locales/uk.json +++ b/locales/uk.json @@ -137,7 +137,6 @@ "password_too_simple_2": "Пароль має складатися не менше ніж з 8 символів і містити цифри, великі та малі символи", "password_too_simple_1": "Пароль має складатися не менше ніж з 8 символів", "password_listed": "Цей пароль входить в число найбільш часто використовуваних паролів у світі. Будь ласка, виберіть щось неповторюваніше.", - "packages_upgrade_failed": "Не вдалося оновити всі пакети", "operation_interrupted": "Операція була вручну перервана?", "invalid_number": "Має бути числом", "not_enough_disk_space": "Недостатньо вільного місця на '{path}'", @@ -157,7 +156,6 @@ "migrations_exclusive_options": "'--auto', '--skip', і '--force-rerun' є взаємовиключними опціями.", "migrations_failed_to_load_migration": "Не вдалося завантажити міграцію {id}: {error}", "migrations_dependencies_not_satisfied": "Запустіть ці міграції: '{dependencies_id}', перед міграцією {id}.", - "migrations_cant_reach_migration_file": "Не вдалося отримати доступ до файлів міграцій за шляхом '%s'", "migrations_already_ran": "Наступні міграції вже виконано: {ids}", "migration_ldap_rollback_success": "Система відкотилася.", "migration_ldap_migration_failed_trying_to_rollback": "Не вдалося виконати міграцію... Пробуємо відкотити систему.", @@ -404,13 +402,6 @@ "unknown_main_domain_path": "Невідомий домен або шлях для '{app}'. Вам необхідно вказати домен і шлях, щоб мати можливість вказати URL для дозволу.", "unexpected_error": "Щось пішло не так: {error}", "unbackup_app": "{app} НЕ буде збережено", - "tools_upgrade_special_packages_completed": "Оновлення пакета YunoHost завершено.\nНатисніть [Enter] для повернення до командного рядка", - "tools_upgrade_special_packages_explanation": "Спеціальне оновлення триватиме у тлі. Будь ласка, не запускайте ніяких інших дій на вашому сервері протягом наступних ~ 10 хвилин (в залежності від швидкості обладнання). Після цього вам, можливо, доведеться заново увійти в вебадміністрації. Журнал оновлення буде доступний в Засоби → Журнал (в вебадміністрації) або за допомогою 'yunohost log list' (з командного рядка).", - "tools_upgrade_special_packages": "Тепер оновлюємо 'спеціальні' (пов'язані з yunohost) пакети…", - "tools_upgrade_regular_packages_failed": "Не вдалося оновити пакети: {packages_list}", - "tools_upgrade_regular_packages": "Тепер оновлюємо 'звичайні' (не пов'язані з yunohost) пакети…", - "tools_upgrade_cant_unhold_critical_packages": "Не вдалося розтримати критичні пакети…", - "tools_upgrade_cant_hold_critical_packages": "Не вдалося утримати критичні пакети…", "this_action_broke_dpkg": "Ця дія порушила dpkg/APT (системні менеджери пакетів)... Ви можете спробувати вирішити цю проблему, під'єднавшись по SSH і запустивши `sudo apt install --fix-broken` та/або `sudo dpkg --configure -a`.", "system_username_exists": "Ім'я користувача вже існує в списку користувачів системи", "system_upgraded": "Систему оновлено", @@ -686,4 +677,4 @@ "migration_0021_general_warning": "Будь ласка, зверніть увагу, що ця міграція є делікатною операцією. Команда YunoHost зробила все можливе, щоб перевірити і протестувати її, але міграція все ще може порушити частину системи або її застосунків.\n\nТому рекомендовано:\n - Виконати резервне копіювання всіх важливих даних або застосунків. Подробиці на сайті https://yunohost.org/backup; \n - Наберіться терпіння після запуску міграції: В залежності від вашого з'єднання з Інтернетом і апаратного забезпечення, оновлення може зайняти до декількох годин.", "migration_description_0021_migrate_to_bullseye": "Оновлення системи до Debian Bullseye і YunoHost 11.x", "global_settings_setting_security_ssh_password_authentication": "Дозволити автентифікацію паролем для SSH" -} +} \ No newline at end of file diff --git a/locales/zh_Hans.json b/locales/zh_Hans.json index 4b3067909..a05a44437 100644 --- a/locales/zh_Hans.json +++ b/locales/zh_Hans.json @@ -237,9 +237,6 @@ "service_enable_failed": "无法使服务 '{service}'在启动时自动启动。\n\n最近的服务日志:{logs}", "service_disabled": "系统启动时,服务 '{service}' 将不再启动。", "service_disable_failed": "服务'{service}'在启动时无法启动。\n\n最近的服务日志:{logs}", - "tools_upgrade_regular_packages": "现在正在升级 'regular' (与yunohost无关)的软件包…", - "tools_upgrade_cant_unhold_critical_packages": "无法解压关键软件包…", - "tools_upgrade_cant_hold_critical_packages": "无法保存重要软件包…", "this_action_broke_dpkg": "此操作破坏了dpkg / APT(系统软件包管理器)...您可以尝试通过SSH连接并运行`sudo apt install --fix-broken`和/或`sudo dpkg --configure -a`来解决此问题。", "system_username_exists": "用户名已存在于系统用户列表中", "system_upgraded": "系统升级", @@ -261,10 +258,6 @@ "unknown_main_domain_path": "'{app}'的域或路径未知。您需要指定一个域和一个路径,以便能够指定用于许可的URL。", "unexpected_error": "出乎意料的错误: {error}", "unbackup_app": "{app} 将不会保存", - "tools_upgrade_special_packages_completed": "YunoHost软件包升级完成。\n按[Enter]返回命令行", - "tools_upgrade_special_packages_explanation": "特殊升级将在后台继续。请在接下来的10分钟内(取决于硬件速度)在服务器上不要执行任何其他操作。此后,您可能必须重新登录Webadmin。升级日志将在“工具”→“日志”(在Webadmin中)或使用'yunohost log list'(从命令行)中可用。", - "tools_upgrade_special_packages": "现在正在升级'special'(与yunohost相关的)程序包…", - "tools_upgrade_regular_packages_failed": "无法升级软件包: {packages_list}", "yunohost_installing": "正在安装YunoHost ...", "yunohost_configured": "现在已配置YunoHost", "yunohost_already_installed": "YunoHost已经安装", @@ -543,7 +536,6 @@ "password_too_simple_3": "密码长度至少为8个字符,并且包含数字,大写,小写和特殊字符", "password_too_simple_2": "密码长度至少为8个字符,并且包含数字,大写和小写字符", "password_listed": "该密码是世界上最常用的密码之一。 请选择一些更独特的东西。", - "packages_upgrade_failed": "无法升级所有软件包", "invalid_number": "必须是数字", "not_enough_disk_space": "'{path}'上的可用空间不足", "migrations_to_be_ran_manually": "迁移{id}必须手动运行。请转到webadmin页面上的工具→迁移,或运行`yunohost tools migrations run`。", @@ -562,7 +554,6 @@ "migrations_exclusive_options": "'--auto', '--skip',和'--force-rerun'是互斥的选项。", "migrations_failed_to_load_migration": "无法加载迁移{id}: {error}", "migrations_dependencies_not_satisfied": "在迁移{id}之前运行以下迁移: '{dependencies_id}'。", - "migrations_cant_reach_migration_file": "无法访问路径'%s'处的迁移文件", "migrations_already_ran": "这些迁移已经完成: {ids}", "migration_ldap_rollback_success": "系统回滚。", "migration_ldap_migration_failed_trying_to_rollback": "无法迁移...试图回滚系统。", From 98167e35e59a4c13ed0fc3e413ad3d86e0897c96 Mon Sep 17 00:00:00 2001 From: Kay0u Date: Thu, 20 Jan 2022 20:26:53 +0100 Subject: [PATCH 319/619] trying to fix autofix-translated-strings --- .gitlab/ci/lint.gitlab-ci.yml | 4 ++-- .gitlab/ci/translation.gitlab-ci.yml | 7 ++++--- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/.gitlab/ci/lint.gitlab-ci.yml b/.gitlab/ci/lint.gitlab-ci.yml index 169b32ccf..ef60dd427 100644 --- a/.gitlab/ci/lint.gitlab-ci.yml +++ b/.gitlab/ci/lint.gitlab-ci.yml @@ -44,5 +44,5 @@ black: - git push -f origin "ci-format-${CI_COMMIT_REF_NAME}":"ci-format-${CI_COMMIT_REF_NAME}" - hub pull-request -m "[CI] Format code with Black" -b Yunohost:dev -p || true # GITHUB_USER and GITHUB_TOKEN registered here https://gitlab.com/yunohost/yunohost/-/settings/ci_cd only: - refs: - - dev + variables: + - $CI_COMMIT_REF_NAME == $CI_DEFAULT_BRANCH diff --git a/.gitlab/ci/translation.gitlab-ci.yml b/.gitlab/ci/translation.gitlab-ci.yml index 0d73852c7..631f52327 100644 --- a/.gitlab/ci/translation.gitlab-ci.yml +++ b/.gitlab/ci/translation.gitlab-ci.yml @@ -19,15 +19,16 @@ autofix-translated-strings: - apt-get update -y && apt-get install git hub -y - git config --global user.email "yunohost@yunohost.org" - git config --global user.name "$GITHUB_USER" - - git remote set-url origin https://$GITHUB_TOKEN:x-oauth-basic@github.com/YunoHost/yunohost.git + - hub clone --branch ${CI_COMMIT_REF_NAME} "https://$GITHUB_TOKEN:x-oauth-basic@github.com/YunoHost/yunohost.git" github_repo + - cd github_repo script: # create a local branch that will overwrite distant one - git checkout -b "ci-autofix-translated-strings-${CI_COMMIT_REF_NAME}" --no-track - python3 maintenance/missing_i18n_keys.py --fix - python3 maintenance/autofix_locale_format.py - - '[ $(git diff -w | wc -l) != 0 ] || exit 0' # stop if there is nothing to commit + - '[ $(git diff | wc -l) != 0 ] || exit 0' # stop if there is nothing to commit - git commit -am "[CI] Reformat / remove stale translated strings" || true - - git push -f origin "HEAD":"ci-remove-stale-translated-strings-${CI_COMMIT_REF_NAME}" + - git push -f origin "ci-autofix-translated-strings-${CI_COMMIT_REF_NAME}":"ci-remove-stale-translated-strings-${CI_COMMIT_REF_NAME}" - hub pull-request -m "[CI] Reformat / remove stale translated strings" -b Yunohost:dev -p || true # GITHUB_USER and GITHUB_TOKEN registered here https://gitlab.com/yunohost/yunohost/-/settings/ci_cd only: variables: From ac4771058446df5c79f73b73bbb0339f8b7d6aa6 Mon Sep 17 00:00:00 2001 From: Kay0u Date: Thu, 20 Jan 2022 20:34:56 +0100 Subject: [PATCH 320/619] remove of the default hard-coded branch in ci scripts --- .gitlab-ci.yml | 2 +- .gitlab/ci/lint.gitlab-ci.yml | 2 +- .gitlab/ci/translation.gitlab-ci.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 43afb7d4e..4d0f30679 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -30,7 +30,7 @@ workflow: - if: $CI_PIPELINE_SOURCE == "merge_request_event" # If we move to gitlab one day - if: $CI_PIPELINE_SOURCE == "external_pull_request_event" # For github PR - if: $CI_COMMIT_TAG # For tags - - if: $CI_COMMIT_REF_NAME == "ci-format-dev" # Ignore black formatting branch created by the CI + - if: $CI_COMMIT_REF_NAME == "ci-format-$CI_DEFAULT_BRANCH" # Ignore black formatting branch created by the CI when: never - if: $CI_COMMIT_REF_NAME != $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE == "push" # If it's not the default branch and if it's a push, then do not trigger a build when: never diff --git a/.gitlab/ci/lint.gitlab-ci.yml b/.gitlab/ci/lint.gitlab-ci.yml index ef60dd427..2c2bdcc1d 100644 --- a/.gitlab/ci/lint.gitlab-ci.yml +++ b/.gitlab/ci/lint.gitlab-ci.yml @@ -42,7 +42,7 @@ black: - '[ $(git diff | wc -l) != 0 ] || exit 0' # stop if there is nothing to commit - git commit -am "[CI] Format code with Black" || true - git push -f origin "ci-format-${CI_COMMIT_REF_NAME}":"ci-format-${CI_COMMIT_REF_NAME}" - - hub pull-request -m "[CI] Format code with Black" -b Yunohost:dev -p || true # GITHUB_USER and GITHUB_TOKEN registered here https://gitlab.com/yunohost/yunohost/-/settings/ci_cd + - hub pull-request -m "[CI] Format code with Black" -b Yunohost:$CI_COMMIT_REF_NAME -p || true # GITHUB_USER and GITHUB_TOKEN registered here https://gitlab.com/yunohost/yunohost/-/settings/ci_cd only: variables: - $CI_COMMIT_REF_NAME == $CI_DEFAULT_BRANCH diff --git a/.gitlab/ci/translation.gitlab-ci.yml b/.gitlab/ci/translation.gitlab-ci.yml index 631f52327..b6c683f57 100644 --- a/.gitlab/ci/translation.gitlab-ci.yml +++ b/.gitlab/ci/translation.gitlab-ci.yml @@ -29,7 +29,7 @@ autofix-translated-strings: - '[ $(git diff | wc -l) != 0 ] || exit 0' # stop if there is nothing to commit - git commit -am "[CI] Reformat / remove stale translated strings" || true - git push -f origin "ci-autofix-translated-strings-${CI_COMMIT_REF_NAME}":"ci-remove-stale-translated-strings-${CI_COMMIT_REF_NAME}" - - hub pull-request -m "[CI] Reformat / remove stale translated strings" -b Yunohost:dev -p || true # GITHUB_USER and GITHUB_TOKEN registered here https://gitlab.com/yunohost/yunohost/-/settings/ci_cd + - hub pull-request -m "[CI] Reformat / remove stale translated strings" -b Yunohost:$CI_COMMIT_REF_NAME -p || true # GITHUB_USER and GITHUB_TOKEN registered here https://gitlab.com/yunohost/yunohost/-/settings/ci_cd only: variables: - $CI_COMMIT_REF_NAME == $CI_DEFAULT_BRANCH From cb7bfe7a669943e0a0cbaf9ce5cd8b92da22f0d1 Mon Sep 17 00:00:00 2001 From: Tagadda <36127788+Tagadda@users.noreply.github.com> Date: Thu, 20 Jan 2022 20:23:32 +0000 Subject: [PATCH 321/619] fix for bullseye --- src/utils/config.py | 1 - src/utils/legacy.py | 9 +++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/utils/config.py b/src/utils/config.py index f3c8f8177..837416ab5 100644 --- a/src/utils/config.py +++ b/src/utils/config.py @@ -1137,7 +1137,6 @@ class AppQuestion(Question): apps = app_list(full=True)["apps"] for _filter in self.filters: - print(_filter) apps = [ app for app in apps if _filter in app and app[_filter] ] self.choices = ["_none"] + [app['id'] for app in apps] diff --git a/src/utils/legacy.py b/src/utils/legacy.py index 7a8a4540a..3d42af20b 100644 --- a/src/utils/legacy.py +++ b/src/utils/legacy.py @@ -7,6 +7,7 @@ from moulinette.utils.filesystem import ( read_file, write_to_file, write_to_yaml, + write_to_json, read_yaml, ) @@ -92,17 +93,17 @@ def translate_legacy_default_app_in_ssowant_conf_json_persistent(): apps = app_list()['apps'] - if not any('domain_path' in app and app['domain_path'] in redirected_urls.values() for app in apps): + if not any(app.get('domain_path') in redirected_urls.values() for app in apps): return - for from_url, dest_url in redirected_urls.items(): + for from_url, dest_url in redirected_urls.copy().items(): # Not a root domain, skip if from_url.count('/') != 1 or not from_url.endswith('/'): continue for app in apps: - if 'domain_path' not in app or app['domain_path'] is not dest_url: + if app.get('domain_path') != dest_url: continue - domain_config_set(from_url.strip('/'), "feature.app.default", app['id']) + domain_config_set(from_url.strip('/'), "feature.app.default_app", app['id']) del redirected_urls[from_url] persistent["redirected_urls"] = redirected_urls From 4571c5b22f09f8113ae037a4ab48b0d94d1cef72 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Fri, 21 Jan 2022 15:56:08 +0100 Subject: [PATCH 322/619] services: fix a couple edge cases --- src/service.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/service.py b/src/service.py index 988c7eb13..f135a3a80 100644 --- a/src/service.py +++ b/src/service.py @@ -744,14 +744,14 @@ def _save_services(services): diff = {} for service_name, service_infos in services.items(): - service_conf_base = conf_base.get(service_name, {}) + service_conf_base = conf_base.get(service_name, {}) or {} diff[service_name] = {} for key, value in service_infos.items(): if service_conf_base.get(key) != value: diff[service_name][key] = value - diff = {name: infos for name, infos in diff.items() if infos} + diff = {name: infos for name, infos in diff.items() if infos or name not in conf_base} write_to_yaml(SERVICES_CONF, diff) From 5b30347dfa4561996e953eb1d7230af73ffae16f Mon Sep 17 00:00:00 2001 From: yunohost-bot Date: Fri, 21 Jan 2022 15:06:31 +0000 Subject: [PATCH 323/619] [CI] Format code with Black --- src/service.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/service.py b/src/service.py index f135a3a80..3cb83d084 100644 --- a/src/service.py +++ b/src/service.py @@ -751,7 +751,9 @@ def _save_services(services): if service_conf_base.get(key) != value: diff[service_name][key] = value - diff = {name: infos for name, infos in diff.items() if infos or name not in conf_base} + diff = { + name: infos for name, infos in diff.items() if infos or name not in conf_base + } write_to_yaml(SERVICES_CONF, diff) From 5d0f8021b84707e6704aa662368cd1d9691e6cc6 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Fri, 21 Jan 2022 18:28:16 +0100 Subject: [PATCH 324/619] [fix] Do not save php-fpm services in services.yml --- src/service.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/service.py b/src/service.py index 3cb83d084..506d3223e 100644 --- a/src/service.py +++ b/src/service.py @@ -744,6 +744,12 @@ def _save_services(services): diff = {} for service_name, service_infos in services.items(): + + # Ignore php-fpm services, they are to be added dynamically by the core, + # but not actually saved + if service_name.startswith("php") and service_name.endswith("-fpm"): + continue + service_conf_base = conf_base.get(service_name, {}) or {} diff[service_name] = {} From d5008bc656507293de622bd35e32de6aedad8867 Mon Sep 17 00:00:00 2001 From: Tagadda <36127788+Tagadda@users.noreply.github.com> Date: Fri, 21 Jan 2022 17:29:31 +0000 Subject: [PATCH 325/619] [fix] reorder diagnosers un-funkify the order 8) --- src/diagnosis.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/diagnosis.py b/src/diagnosis.py index b44028d29..34bdd2e54 100644 --- a/src/diagnosis.py +++ b/src/diagnosis.py @@ -656,9 +656,9 @@ class Diagnoser: def _list_diagnosis_categories(): paths = glob.glob(os.path.dirname(__file__) + "/diagnosers/??-*.py") - names = sorted( - [os.path.basename(path)[: -len(".py")].split("-")[-1] for path in paths] - ) + names = [name.split("-")[-1] for name in sorted( + [os.path.basename(path)[: -len(".py")] for path in paths] + )] return names From 5565e6c55c4ca640bcd3354577c8b4a24eadde6a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20M?= Date: Fri, 21 Jan 2022 08:16:53 +0000 Subject: [PATCH 326/619] Translated using Weblate (Galician) Currently translated at 100.0% (686 of 686 strings) Translation: YunoHost/core Translate-URL: https://translate.yunohost.org/projects/yunohost/core/gl/ --- locales/gl.json | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/locales/gl.json b/locales/gl.json index 5ac7ea9da..e25c698c0 100644 --- a/locales/gl.json +++ b/locales/gl.json @@ -676,5 +676,13 @@ "migration_description_0021_migrate_to_bullseye": "Actualizar o sistema a Debian Bullseye e YunoHost 11.x", "migration_0021_system_not_fully_up_to_date": "O teu sistema non está completamente actualizado. Fai unha actualización normal antes de executar a migración a Bullseye.", "migration_0021_general_warning": "Ten en conta que a migración é unha operación delicada. O equipo de YunoHost fixo todo o que puido para revisalo e probalo, pero aínda así poderían acontecer fallos no sistema ou apps.\n\nAsí as cousas, é recomendable:\n - Facer unha copia de apoio dos datos e apps importantes. Máis info en https://yunohost.org/backup;\n - Ter paciencia unha vez inicias a migración: dependendo da túa conexión a internet e hardware, podería levarlle varias horas completar o proceso.", - "global_settings_setting_security_ssh_password_authentication": "Permitir autenticación con contrasinal para SSH" -} \ No newline at end of file + "global_settings_setting_security_ssh_password_authentication": "Permitir autenticación con contrasinal para SSH", + "tools_upgrade_failed": "Non se actualizaron os paquetes: {packages_list}", + "migration_0023_not_enough_space": "Crear espazo suficiente en {path} para realizar a migración.", + "migration_0023_postgresql_11_not_installed": "PostgreSQL non estaba instalado no sistema. Nada que facer.", + "migration_0023_postgresql_13_not_installed": "PostgreSQL 11 está instalado, pero PostgreSQL 13 non!? Algo raro debeu pasarlle ao teu sistema :(...", + "migration_description_0022_php73_to_php74_pools": "Migrar ficheiros de configuración de php7.3-fpm 'pool' a php7.4", + "migration_description_0023_postgresql_11_to_13": "Migrar bases de datos de PostgreSQL 11 a 13", + "service_description_postgresql": "Almacena datos da app (Base datos SQL)", + "tools_upgrade": "Actualizando paquetes do sistema" +} From 2f7ec5b368b5b393dcc166077e970eda96281baf Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Fri, 21 Jan 2022 20:05:59 +0100 Subject: [PATCH 327/619] configpanels: config_get should return possible choices for domain, user questions (and other dynamic-choices questions) --- src/utils/config.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/utils/config.py b/src/utils/config.py index 99a002404..90bc0be9f 100644 --- a/src/utils/config.py +++ b/src/utils/config.py @@ -285,8 +285,10 @@ class ConfigPanel: ask = m18n.n(self.config["i18n"] + "_" + option["id"]) if mode == "full": - # edit self.config directly option["ask"] = ask + question_class = ARGUMENTS_TYPE_PARSERS[option.get("type", "string")] + # FIXME : maybe other properties should be taken from the question, not just choices ?. + option["choices"] = question_class(option).choices else: result[key] = {"ask": ask} if "current_value" in option: @@ -1109,7 +1111,7 @@ class DomainQuestion(Question): if self.default is None: self.default = _get_maindomain() - self.choices = domain_list()["domains"] + self.choices = {domain: domain + ' ★' if domain == self.default else '' for domain in domain_list()['domains']} @staticmethod def normalize(value, option={}): @@ -1134,7 +1136,9 @@ class UserQuestion(Question): from yunohost.domain import _get_maindomain super().__init__(question, context, hooks) - self.choices = list(user_list()["users"].keys()) + + self.choices = {username: f"{infos['fullname']} ({infos['mail']})" + for username, infos in user_list()["users"].items()} if not self.choices: raise YunohostValidationError( From dfa021fbf7482243f30b1d0e50df92ba099f2bc4 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Sat, 22 Jan 2022 15:44:37 +0100 Subject: [PATCH 328/619] Fix tests --- src/tests/test_app_config.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/tests/test_app_config.py b/src/tests/test_app_config.py index 8de03bfd5..d6cf8045d 100644 --- a/src/tests/test_app_config.py +++ b/src/tests/test_app_config.py @@ -19,6 +19,7 @@ from yunohost.app import ( app_config_set, app_ssowatconf, ) +from yunohost.user import user_create, user_delete from yunohost.utils.error import YunohostError, YunohostValidationError @@ -101,6 +102,8 @@ def config_app(request): def test_app_config_get(config_app): + user_create("alice", "Alice", "White", _get_maindomain(), "test123Ynh") + assert isinstance(app_config_get(config_app), dict) assert isinstance(app_config_get(config_app, full=True), dict) assert isinstance(app_config_get(config_app, export=True), dict) @@ -108,6 +111,8 @@ def test_app_config_get(config_app): assert isinstance(app_config_get(config_app, "main.components"), dict) assert app_config_get(config_app, "main.components.boolean") == "0" + user_delete("alice") + def test_app_config_nopanel(legacy_app): From fde01fafd7c3375dd6323c449e39ea33419f8224 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Mon, 24 Jan 2022 18:31:04 +0100 Subject: [PATCH 329/619] app questions in config panel: handle choices with nice display names for webadmin --- src/utils/config.py | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/utils/config.py b/src/utils/config.py index 79d73b6ec..1ba38c604 100644 --- a/src/utils/config.py +++ b/src/utils/config.py @@ -1127,6 +1127,7 @@ class DomainQuestion(Question): return value + class AppQuestion(Question): argument_type = "app" @@ -1139,9 +1140,15 @@ class AppQuestion(Question): apps = app_list(full=True)["apps"] for _filter in self.filters: - apps = [ app for app in apps if _filter in app and app[_filter] ] + apps = [app for app in apps if _filter in app and app[_filter]] + + def _app_display(app): + domain_path = f" ({app['domain_path']})" if 'domain_path' in app else "" + return app["label"] + domain_path + + self.choices = {"_none": "---"} + self.choices.update({app['id']: _app_display(app) for app in apps}) - self.choices = ["_none"] + [app['id'] for app in apps] class UserQuestion(Question): argument_type = "user" From 71e73c7cf2f77d7ea83157e26afb37632bfb5f8d Mon Sep 17 00:00:00 2001 From: yunohost-bot Date: Mon, 24 Jan 2022 18:16:08 +0000 Subject: [PATCH 330/619] [CI] Format code with Black --- src/app.py | 16 ++++++++++------ src/diagnosis.py | 7 ++++--- src/domain.py | 7 +++++-- src/utils/config.py | 15 ++++++++++----- src/utils/legacy.py | 17 ++++++++++------- 5 files changed, 39 insertions(+), 23 deletions(-) diff --git a/src/app.py b/src/app.py index 22946eabc..a75f25bc4 100644 --- a/src/app.py +++ b/src/app.py @@ -155,7 +155,9 @@ def app_info(app, full=False): ret["is_webapp"] = "domain" in settings and "path" in settings if ret["is_webapp"]: - ret["is_default"] = domain_config_get(settings["domain"], "feature.app.default_app") == app + ret["is_default"] = ( + domain_config_get(settings["domain"], "feature.app.default_app") == app + ) ret["supports_change_url"] = os.path.exists( os.path.join(setting_path, "scripts", "change_url") @@ -1054,7 +1056,7 @@ def app_remove(operation_logger, app, purge=False): hook_remove(app) for domain in domain_list()["domains"]: - if (domain_config_get(domain, "feature.app.default_app") == app): + if domain_config_get(domain, "feature.app.default_app") == app: domain_config_set(domain, "feature.app.default_app", "_none") permission_sync_to_user() @@ -1086,9 +1088,9 @@ def app_makedefault(operation_logger, app, domain=None, undo=False): operation_logger.start() if undo: - domain_config_set(domain, 'feature.app.default_app', "_none") + domain_config_set(domain, "feature.app.default_app", "_none") else: - domain_config_set(domain, 'feature.app.default_app', app) + domain_config_set(domain, "feature.app.default_app", app) def app_setting(app, key, value=None, delete=False): @@ -1325,8 +1327,10 @@ def app_ssowatconf(): redirected_urls.update(app_settings.get("redirected_urls", {})) redirected_regex.update(app_settings.get("redirected_regex", {})) - from .utils.legacy import translate_legacy_default_app_in_ssowant_conf_json_persistent - + from .utils.legacy import ( + translate_legacy_default_app_in_ssowant_conf_json_persistent, + ) + translate_legacy_default_app_in_ssowant_conf_json_persistent() for domain in domains: diff --git a/src/diagnosis.py b/src/diagnosis.py index 34bdd2e54..007719dfc 100644 --- a/src/diagnosis.py +++ b/src/diagnosis.py @@ -656,9 +656,10 @@ class Diagnoser: def _list_diagnosis_categories(): paths = glob.glob(os.path.dirname(__file__) + "/diagnosers/??-*.py") - names = [name.split("-")[-1] for name in sorted( - [os.path.basename(path)[: -len(".py")] for path in paths] - )] + names = [ + name.split("-")[-1] + for name in sorted([os.path.basename(path)[: -len(".py")] for path in paths]) + ] return names diff --git a/src/domain.py b/src/domain.py index 1fdded817..e73d6ed5f 100644 --- a/src/domain.py +++ b/src/domain.py @@ -455,7 +455,10 @@ class DomainConfigPanel(ConfigPanel): save_mode = "diff" def _apply(self): - if ("default_app" in self.future_values and self.future_values["default_app"] != self.values["default_app"]): + if ( + "default_app" in self.future_values + and self.future_values["default_app"] != self.values["default_app"] + ): from yunohost.app import app_ssowatconf, app_map if "/" in app_map(raw=True)[self.entity]: @@ -468,7 +471,7 @@ class DomainConfigPanel(ConfigPanel): super()._apply() app_ssowatconf() - + def _get_toml(self): from yunohost.dns import _get_registrar_config_section diff --git a/src/utils/config.py b/src/utils/config.py index 1ba38c604..56c45d5f8 100644 --- a/src/utils/config.py +++ b/src/utils/config.py @@ -1113,7 +1113,10 @@ class DomainQuestion(Question): if self.default is None: self.default = _get_maindomain() - self.choices = {domain: domain + ' ★' if domain == self.default else '' for domain in domain_list()['domains']} + self.choices = { + domain: domain + " ★" if domain == self.default else "" + for domain in domain_list()["domains"] + } @staticmethod def normalize(value, option={}): @@ -1143,11 +1146,11 @@ class AppQuestion(Question): apps = [app for app in apps if _filter in app and app[_filter]] def _app_display(app): - domain_path = f" ({app['domain_path']})" if 'domain_path' in app else "" + domain_path = f" ({app['domain_path']})" if "domain_path" in app else "" return app["label"] + domain_path self.choices = {"_none": "---"} - self.choices.update({app['id']: _app_display(app) for app in apps}) + self.choices.update({app["id"]: _app_display(app) for app in apps}) class UserQuestion(Question): @@ -1161,8 +1164,10 @@ class UserQuestion(Question): super().__init__(question, context, hooks) - self.choices = {username: f"{infos['fullname']} ({infos['mail']})" - for username, infos in user_list()["users"].items()} + self.choices = { + username: f"{infos['fullname']} ({infos['mail']})" + for username, infos in user_list()["users"].items() + } if not self.choices: raise YunohostValidationError( diff --git a/src/utils/legacy.py b/src/utils/legacy.py index 4c61edb05..85898f28d 100644 --- a/src/utils/legacy.py +++ b/src/utils/legacy.py @@ -88,24 +88,27 @@ def translate_legacy_default_app_in_ssowant_conf_json_persistent(): redirected_urls = persistent["redirected_urls"] - if not any(from_url.count('/') == 1 and from_url.endswith('/') for from_url in redirected_urls): + if not any( + from_url.count("/") == 1 and from_url.endswith("/") + for from_url in redirected_urls + ): return - apps = app_list()['apps'] + apps = app_list()["apps"] - if not any(app.get('domain_path') in redirected_urls.values() for app in apps): + if not any(app.get("domain_path") in redirected_urls.values() for app in apps): return for from_url, dest_url in redirected_urls.copy().items(): # Not a root domain, skip - if from_url.count('/') != 1 or not from_url.endswith('/'): + if from_url.count("/") != 1 or not from_url.endswith("/"): continue for app in apps: - if app.get('domain_path') != dest_url: + if app.get("domain_path") != dest_url: continue - domain_config_set(from_url.strip('/'), "feature.app.default_app", app['id']) + domain_config_set(from_url.strip("/"), "feature.app.default_app", app["id"]) del redirected_urls[from_url] - + persistent["redirected_urls"] = redirected_urls write_to_json(persistent_file_name, persistent, sort_keys=True, indent=4) From 07396b8b34c29b582c5fd16a57fcc0ceee8f4579 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Tue, 25 Jan 2022 13:04:06 +0100 Subject: [PATCH 331/619] [fix] When no main app permission found, fallback to default label instead of having a 'None' label to prevent the webadmin from displaying an empty app list --- src/app.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/app.py b/src/app.py index a75f25bc4..3b6b0a5aa 100644 --- a/src/app.py +++ b/src/app.py @@ -177,6 +177,7 @@ def app_info(app, full=False): if not ret["label"]: logger.warning(f"Failed to get label for app {app} ?") + ret["label"] = local_manifest["name"] return ret From 9b89f66bba2465c57ad82d841a64882e446ee6f9 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Tue, 25 Jan 2022 13:09:19 +0100 Subject: [PATCH 332/619] Update changelog for 11.0.3 --- debian/changelog | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/debian/changelog b/debian/changelog index cbc6cfc99..b0229fe8d 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,18 @@ +yunohost (11.0.3) testing; urgency=low + + - [enh] mail: Add SNI support for postfix and dovecot ([#1413](https://github.com/YunoHost/yunohost/pull/1413)) + - [fix] services: fix a couple edge cases (4571c5b2) + - [fix] services: Do not save php-fpm services in services.yml (5d0f8021) + - [fix] diagnosis: diagnosers were run in a funky order ([#1418](https://github.com/YunoHost/yunohost/pull/1418)) + - [fix] configpanels: config_get should return possible choices for domain, user questions (and other dynamic-choices questions) ([#1420](https://github.com/YunoHost/yunohost/pull/1420)) + - [enh] apps/domain: Clarify the default app mecanism, handle it fron domain config panel ([#1406](https://github.com/YunoHost/yunohost/pull/1406)) + - [fix] apps: When no main app permission found, fallback to default label instead of having a 'None' label to prevent the webadmin from displaying an empty app list (07396b8b) + - [i18n] Translations updated for Galician + + Thanks to all contributors <3 ! (José M, Kay0u, Tagadda, tituspijean) + + -- Alexandre Aubin Tue, 25 Jan 2022 13:06:10 +0100 + yunohost (11.0.2) testing; urgency=low - [mod] Various tweaks for Python 3.9, PHP 7.4, PostgreSQL 13, and other changes related to Buster->Bullseye ecosystem From dcf1a892bfb530ee782546d2f0f852a164f9ef3d Mon Sep 17 00:00:00 2001 From: Kay0u Date: Wed, 26 Jan 2022 14:19:09 +0100 Subject: [PATCH 333/619] fix bash_completion --- debian/install | 2 +- doc/generate_bash_completion.py | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/debian/install b/debian/install index db88462ab..5169d0b62 100644 --- a/debian/install +++ b/debian/install @@ -5,6 +5,6 @@ helpers/* /usr/share/yunohost/helpers.d/ conf/* /usr/share/yunohost/conf/ locales/* /usr/share/yunohost/locales/ doc/yunohost.8.gz /usr/share/man/man8/ -doc/bash-completion.sh /etc/bash_completion.d/yunohost +doc/bash_completion.d/* /etc/bash_completion.d/ conf/metronome/modules/* /usr/lib/metronome/modules/ src/* /usr/lib/python3/dist-packages/yunohost/ diff --git a/doc/generate_bash_completion.py b/doc/generate_bash_completion.py index 72a524210..d55973010 100644 --- a/doc/generate_bash_completion.py +++ b/doc/generate_bash_completion.py @@ -13,7 +13,8 @@ import yaml THIS_SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__)) ACTIONSMAP_FILE = THIS_SCRIPT_DIR + "/../share/actionsmap.yml" -BASH_COMPLETION_FILE = THIS_SCRIPT_DIR + "/bash-completion.sh" +BASH_COMPLETION_FOLDER = THIS_SCRIPT_DIR + "/bash_completion.d" +BASH_COMPLETION_FILE = BASH_COMPLETION_FOLDER + "/yunohost" def get_dict_actions(OPTION_SUBTREE, category): @@ -61,6 +62,8 @@ with open(ACTIONSMAP_FILE, "r") as stream: OPTION_TREE[category]["subcategories"], subcategory ) + os.makedirs(BASH_COMPLETION_FOLDER, exist_ok=True) + with open(BASH_COMPLETION_FILE, "w") as generated_file: # header of the file From 4b78e8e32796ef412499e525c8bb49ea40d908fb Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Wed, 26 Jan 2022 14:28:45 +0100 Subject: [PATCH 334/619] [mod] certificate: drop unused 'staging' LE mode --- share/actionsmap.yml | 12 ---------- src/certificate.py | 52 +++++++++----------------------------------- src/domain.py | 8 +++---- 3 files changed, 14 insertions(+), 58 deletions(-) diff --git a/share/actionsmap.yml b/share/actionsmap.yml index ce395942f..43b610a9d 100644 --- a/share/actionsmap.yml +++ b/share/actionsmap.yml @@ -531,9 +531,6 @@ domain: --self-signed: help: Install self-signed certificate instead of Let's Encrypt action: store_true - --staging: - help: Use the fake/staging Let's Encrypt certification authority. The new certificate won't actually be enabled - it is only intended to test the main steps of the procedure. - action: store_true ### certificate_renew() cert-renew: @@ -552,9 +549,6 @@ domain: --no-checks: help: Does not perform any check that your domain seems correctly configured (DNS, reachability) before attempting to renew. (Not recommended) action: store_true - --staging: - help: Use the fake/staging Let's Encrypt certification authority. The new certificate won't actually be enabled - it is only intended to test the main steps of the procedure. - action: store_true ### domain_url_available() url-available: @@ -677,9 +671,6 @@ domain: --self-signed: help: Install self-signed certificate instead of Let's Encrypt action: store_true - --staging: - help: Use the fake/staging Let's Encrypt certification authority. The new certificate won't actually be enabled - it is only intended to test the main steps of the procedure. - action: store_true ### certificate_renew() renew: @@ -698,9 +689,6 @@ domain: --no-checks: help: Does not perform any check that your domain seems correctly configured (DNS, reachability) before attempting to renew. (Not recommended) action: store_true - --staging: - help: Use the fake/staging Let's Encrypt certification authority. The new certificate won't actually be enabled - it is only intended to test the main steps of the procedure. - action: store_true ############################# diff --git a/src/certificate.py b/src/certificate.py index 2ad294605..308b79f1c 100644 --- a/src/certificate.py +++ b/src/certificate.py @@ -60,8 +60,6 @@ KEY_SIZE = 3072 VALIDITY_LIMIT = 15 # days -# For tests -STAGING_CERTIFICATION_AUTHORITY = "https://acme-staging-v02.api.letsencrypt.org" # For prod PRODUCTION_CERTIFICATION_AUTHORITY = "https://acme-v02.api.letsencrypt.org" @@ -114,7 +112,7 @@ def certificate_status(domains, full=False): def certificate_install( - domain_list, force=False, no_checks=False, self_signed=False, staging=False + domain_list, force=False, no_checks=False, self_signed=False ): """ Install a Let's Encrypt certificate for given domains (all by default) @@ -130,7 +128,7 @@ def certificate_install( if self_signed: _certificate_install_selfsigned(domain_list, force) else: - _certificate_install_letsencrypt(domain_list, force, no_checks, staging) + _certificate_install_letsencrypt(domain_list, force, no_checks) def _certificate_install_selfsigned(domain_list, force=False): @@ -234,7 +232,7 @@ def _certificate_install_selfsigned(domain_list, force=False): def _certificate_install_letsencrypt( - domains, force=False, no_checks=False, staging=False + domains, force=False, no_checks=False ): from yunohost.domain import domain_list, _assert_domain_exists @@ -264,11 +262,6 @@ def _certificate_install_letsencrypt( "certmanager_domain_cert_not_selfsigned", domain=domain ) - if staging: - logger.warning( - "Please note that you used the --staging option, and that no new certificate will actually be enabled !" - ) - # Actual install steps for domain in domains: @@ -284,12 +277,12 @@ def _certificate_install_letsencrypt( operation_logger = OperationLogger( "letsencrypt_cert_install", [("domain", domain)], - args={"force": force, "no_checks": no_checks, "staging": staging}, + args={"force": force, "no_checks": no_checks}, ) operation_logger.start() try: - _fetch_and_enable_new_certificate(domain, staging, no_checks=no_checks) + _fetch_and_enable_new_certificate(domain, no_checks=no_checks) except Exception as e: msg = f"Certificate installation for {domain} failed !\nException: {e}" logger.error(msg) @@ -305,7 +298,7 @@ def _certificate_install_letsencrypt( def certificate_renew( - domains, force=False, no_checks=False, email=False, staging=False + domains, force=False, no_checks=False, email=False ): """ Renew Let's Encrypt certificate for given domains (all by default) @@ -373,11 +366,6 @@ def certificate_renew( "certmanager_acme_not_configured_for_domain", domain=domain ) - if staging: - logger.warning( - "Please note that you used the --staging option, and that no new certificate will actually be enabled !" - ) - # Actual renew steps for domain in domains: @@ -399,14 +387,13 @@ def certificate_renew( args={ "force": force, "no_checks": no_checks, - "staging": staging, "email": email, }, ) operation_logger.start() try: - _fetch_and_enable_new_certificate(domain, staging, no_checks=no_checks) + _fetch_and_enable_new_certificate(domain, no_checks=no_checks) except Exception as e: import traceback from io import StringIO @@ -473,7 +460,7 @@ def _check_acme_challenge_configuration(domain): return "include /etc/nginx/conf.d/acme-challenge.conf.inc" in read_file(domain_conf) -def _fetch_and_enable_new_certificate(domain, staging=False, no_checks=False): +def _fetch_and_enable_new_certificate(domain, no_checks=False): if not os.path.exists(ACCOUNT_KEY_FILE): _generate_account_key() @@ -507,11 +494,6 @@ def _fetch_and_enable_new_certificate(domain, staging=False, no_checks=False): domain_csr_file = f"{TMP_FOLDER}/{domain}.csr" - if staging: - certification_authority = STAGING_CERTIFICATION_AUTHORITY - else: - certification_authority = PRODUCTION_CERTIFICATION_AUTHORITY - try: signed_certificate = sign_certificate( ACCOUNT_KEY_FILE, @@ -519,7 +501,7 @@ def _fetch_and_enable_new_certificate(domain, staging=False, no_checks=False): WEBROOT_FOLDER, log=logger, disable_check=no_checks, - CA=certification_authority, + CA=PRODUCTION_CERTIFICATION_AUTHORITY, ) except ValueError as e: if "urn:acme:error:rateLimited" in str(e): @@ -539,12 +521,7 @@ def _fetch_and_enable_new_certificate(domain, staging=False, no_checks=False): # Create corresponding directory date_tag = datetime.utcnow().strftime("%Y%m%d.%H%M%S") - if staging: - folder_flag = "staging" - else: - folder_flag = "letsencrypt" - - new_cert_folder = f"{CERT_FOLDER}/{domain}-history/{date_tag}-{folder_flag}" + new_cert_folder = f"{CERT_FOLDER}/{domain}-history/{date_tag}-letsencrypt" os.makedirs(new_cert_folder) @@ -563,9 +540,6 @@ def _fetch_and_enable_new_certificate(domain, staging=False, no_checks=False): _set_permissions(domain_cert_file, "root", "ssl-cert", 0o640) - if staging: - return - _enable_certificate(domain, new_cert_folder) # Check the status of the certificate is now good @@ -677,12 +651,6 @@ def _get_status(domain): "verbose": "Let's Encrypt", } - elif cert_issuer.startswith("Fake LE"): - CA_type = { - "code": "fake-lets-encrypt", - "verbose": "Fake Let's Encrypt", - } - else: CA_type = { "code": "other-unknown", diff --git a/src/domain.py b/src/domain.py index e73d6ed5f..7481e4088 100644 --- a/src/domain.py +++ b/src/domain.py @@ -528,19 +528,19 @@ def domain_cert_status(domain_list, full=False): def domain_cert_install( - domain_list, force=False, no_checks=False, self_signed=False, staging=False + domain_list, force=False, no_checks=False, self_signed=False ): from yunohost.certificate import certificate_install - return certificate_install(domain_list, force, no_checks, self_signed, staging) + return certificate_install(domain_list, force, no_checks, self_signed) def domain_cert_renew( - domain_list, force=False, no_checks=False, email=False, staging=False + domain_list, force=False, no_checks=False, email=False ): from yunohost.certificate import certificate_renew - return certificate_renew(domain_list, force, no_checks, email, staging) + return certificate_renew(domain_list, force, no_checks, email) def domain_dns_conf(domain): From 67cce15d0276e3f1a916540c06ad77274a53aa46 Mon Sep 17 00:00:00 2001 From: tituspijean Date: Wed, 26 Jan 2022 20:59:56 +0000 Subject: [PATCH 335/619] Enhance yunomdns service startup Make it rely on network-online.target instead of network.target Co-authored-by: Alexandre Aubin --- conf/mdns/yunomdns.service | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/conf/mdns/yunomdns.service b/conf/mdns/yunomdns.service index 1102f18f6..5fc98afbd 100644 --- a/conf/mdns/yunomdns.service +++ b/conf/mdns/yunomdns.service @@ -1,6 +1,7 @@ [Unit] Description=YunoHost mDNS service -After=network.target +Wants=network-online.target +After=network-online.target [Service] User=mdns From 377558b54e75ea372930e2096266f238f7fcd7f5 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Thu, 27 Jan 2022 12:15:09 +0100 Subject: [PATCH 336/619] Fix typo --- locales/en.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/locales/en.json b/locales/en.json index 4a8f2c1b2..e902ecc2a 100644 --- a/locales/en.json +++ b/locales/en.json @@ -501,7 +501,7 @@ "migration_0021_yunohost_upgrade": "Starting YunoHost core upgrade...", "migration_0023_not_enough_space": "Make sufficient space available in {path} to run the migration.", "migration_0023_postgresql_11_not_installed": "PostgreSQL was not installed on your system. Nothing to do.", - "migration_0023_postgresql_13_not_installed": "PostgreSQL 11 is installed, but not postgresql 13!? Something weird might have happened on your system :(...", + "migration_0023_postgresql_13_not_installed": "PostgreSQL 11 is installed, but not PostgreSQL 13!? Something weird might have happened on your system :(...", "migration_description_0021_migrate_to_bullseye": "Upgrade the system to Debian Bullseye and YunoHost 11.x", "migration_description_0022_php73_to_php74_pools": "Migrate php7.3-fpm 'pool' conf files to php7.4", "migration_description_0023_postgresql_11_to_13": "Migrate databases from PostgreSQL 11 to 13", From 740eaa43aef51c1125851b99005185c826e363d2 Mon Sep 17 00:00:00 2001 From: Tagadda <36127788+Tagadda@users.noreply.github.com> Date: Fri, 28 Jan 2022 02:39:02 +0000 Subject: [PATCH 337/619] typos --- src/utils/config.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/utils/config.py b/src/utils/config.py index 56c45d5f8..f3b906f00 100644 --- a/src/utils/config.py +++ b/src/utils/config.py @@ -1114,7 +1114,7 @@ class DomainQuestion(Question): self.default = _get_maindomain() self.choices = { - domain: domain + " ★" if domain == self.default else "" + domain: domain + " ★" if domain == self.default else domain for domain in domain_list()["domains"] } @@ -1178,7 +1178,7 @@ class UserQuestion(Question): if self.default is None: root_mail = "root@%s" % _get_maindomain() - for user in self.choices: + for user in self.choices.keys(): if root_mail in user_info(user).get("mail-aliases", []): self.default = user break From 9486931674230f65a5fe87f036ebcf231f309c4d Mon Sep 17 00:00:00 2001 From: Tagadda <36127788+Tagadda@users.noreply.github.com> Date: Fri, 28 Jan 2022 02:39:20 +0000 Subject: [PATCH 338/619] Hydrate manifest with choices --- src/app.py | 4 ++++ src/utils/config.py | 12 ++++++++++++ 2 files changed, 16 insertions(+) diff --git a/src/app.py b/src/app.py index 3b6b0a5aa..d7310c0ea 100644 --- a/src/app.py +++ b/src/app.py @@ -57,6 +57,7 @@ from yunohost.utils.config import ( ask_questions_and_parse_answers, DomainQuestion, PathQuestion, + hydrate_questions_with_choices, ) from yunohost.utils.i18n import _value_for_locale from yunohost.utils.error import YunohostError, YunohostValidationError @@ -678,6 +679,9 @@ def app_manifest(app): shutil.rmtree(extracted_app_folder) + raw_questions = manifest.get("arguments", {}).get("install", []) + manifest['arguments']['install'] = hydrate_questions_with_choices(raw_questions) + return manifest diff --git a/src/utils/config.py b/src/utils/config.py index f3b906f00..f44fe5c22 100644 --- a/src/utils/config.py +++ b/src/utils/config.py @@ -1396,3 +1396,15 @@ def ask_questions_and_parse_answers( out.append(question) return out + +def hydrate_questions_with_choices(raw_questions: List) -> List: + out = [] + + for raw_question in raw_questions: + question = ARGUMENTS_TYPE_PARSERS[raw_question.get("type", "string")](raw_question) + if question.choices: + raw_question["choices"] = question.choices + raw_question["default"] = question.default + out.append(raw_question) + + return out From 49b444e4809b927b54af6ec9e5ef563dad04a524 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Sat, 29 Jan 2022 14:36:10 +0100 Subject: [PATCH 339/619] tools_upgrade: raise a Yunohost error, not a raw exception, when misusing args --- src/tools.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tools.py b/src/tools.py index 28b4457b4..f85d0abdf 100644 --- a/src/tools.py +++ b/src/tools.py @@ -453,7 +453,7 @@ def tools_upgrade(operation_logger, target=None): raise YunohostValidationError("dpkg_lock_not_available") if target not in ["apps", "system"]: - raise Exception( + raise YunohostValidationError( "Uhoh ?! tools_upgrade should have 'apps' or 'system' value for argument target" ) From fc3834bff56917df6e3d791b938873b821e77d74 Mon Sep 17 00:00:00 2001 From: Tymofii-Lytvynenko Date: Tue, 25 Jan 2022 01:28:28 +0000 Subject: [PATCH 340/619] Translated using Weblate (Ukrainian) Currently translated at 100.0% (687 of 687 strings) Translation: YunoHost/core Translate-URL: https://translate.yunohost.org/projects/yunohost/core/uk/ --- locales/uk.json | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/locales/uk.json b/locales/uk.json index 1f99ba1b4..ae363bd35 100644 --- a/locales/uk.json +++ b/locales/uk.json @@ -676,5 +676,14 @@ "migration_0021_system_not_fully_up_to_date": "Ваша система не повністю оновлена. Будь ласка, виконайте регулярне оновлення перед запуском міграції на Bullseye.", "migration_0021_general_warning": "Будь ласка, зверніть увагу, що ця міграція є делікатною операцією. Команда YunoHost зробила все можливе, щоб перевірити і протестувати її, але міграція все ще може порушити частину системи або її застосунків.\n\nТому рекомендовано:\n - Виконати резервне копіювання всіх важливих даних або застосунків. Подробиці на сайті https://yunohost.org/backup; \n - Наберіться терпіння після запуску міграції: В залежності від вашого з'єднання з Інтернетом і апаратного забезпечення, оновлення може зайняти до декількох годин.", "migration_description_0021_migrate_to_bullseye": "Оновлення системи до Debian Bullseye і YunoHost 11.x", - "global_settings_setting_security_ssh_password_authentication": "Дозволити автентифікацію паролем для SSH" -} \ No newline at end of file + "global_settings_setting_security_ssh_password_authentication": "Дозволити автентифікацію паролем для SSH", + "service_description_postgresql": "Зберігає дані застосунків (база даних SQL)", + "domain_config_default_app": "Типовий застосунок", + "migration_0023_postgresql_13_not_installed": "PostgreSQL 11 встановлено, але не PostgreSQL 13!? У вашій системі могло статися щось неприємне :(...", + "migration_description_0023_postgresql_11_to_13": "Перенесення баз даних з PostgreSQL 11 на 13", + "tools_upgrade": "Оновлення системних пакетів", + "tools_upgrade_failed": "Не вдалося оновити наступні пакети: {packages_list}", + "migration_0023_not_enough_space": "Звільніть достатньо місця в {path} для виконання міграції.", + "migration_0023_postgresql_11_not_installed": "PostgreSQL не було встановлено у вашій системі. Нічого робити.", + "migration_description_0022_php73_to_php74_pools": "Перенесення конфігураційних файлів php7.3-fpm 'pool' на php7.4" +} From c9606d353bc095077769ce0aaae18dc02c4df33e Mon Sep 17 00:00:00 2001 From: Weblate Date: Wed, 26 Jan 2022 13:41:52 +0000 Subject: [PATCH 341/619] Added translation using Weblate (Danish) --- locales/da.json | 1 + 1 file changed, 1 insertion(+) create mode 100644 locales/da.json diff --git a/locales/da.json b/locales/da.json new file mode 100644 index 000000000..0967ef424 --- /dev/null +++ b/locales/da.json @@ -0,0 +1 @@ +{} From d79e3618de1204216f29f4c869030f51bc0c0b11 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Gaspar?= Date: Thu, 27 Jan 2022 11:07:18 +0000 Subject: [PATCH 342/619] Translated using Weblate (French) Currently translated at 100.0% (687 of 687 strings) Translation: YunoHost/core Translate-URL: https://translate.yunohost.org/projects/yunohost/core/fr/ --- locales/fr.json | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/locales/fr.json b/locales/fr.json index de88b79f8..a14850b8b 100644 --- a/locales/fr.json +++ b/locales/fr.json @@ -676,5 +676,14 @@ "migration_0021_patch_yunohost_conflicts": "Application du correctif pour contourner le problème de conflit...", "migration_0021_not_buster": "La distribution Debian actuelle n'est pas Buster !", "migration_description_0021_migrate_to_bullseye": "Mise à niveau du système vers Debian Bullseye et YunoHost 11.x", - "global_settings_setting_security_ssh_password_authentication": "Autoriser l'authentification par mot de passe pour SSH" -} \ No newline at end of file + "global_settings_setting_security_ssh_password_authentication": "Autoriser l'authentification par mot de passe pour SSH", + "domain_config_default_app": "Application par défaut", + "migration_description_0022_php73_to_php74_pools": "Migration des fichiers de configuration php7.3-fpm 'pool' vers php7.4", + "migration_description_0023_postgresql_11_to_13": "Migration des bases de données de PostgreSQL 11 vers 13", + "service_description_postgresql": "Stocke les données d'application (base de données SQL)", + "tools_upgrade": "Mise à niveau des packages système", + "migration_0023_postgresql_13_not_installed": "PostgreSQL 11 est installé, mais pas PostgreSQL 13 ! ? Quelque chose d'anormal s'est peut-être produit sur votre système :(...", + "tools_upgrade_failed": "Impossible de mettre à jour les paquets : {packages_list}", + "migration_0023_not_enough_space": "Prévoyez suffisamment d'espace disponible dans {path} pour exécuter la migration.", + "migration_0023_postgresql_11_not_installed": "PostgreSQL n'a pas été installé sur votre système. Il n'y a rien à faire." +} From bccff1b4421eaa68d2da45493eaf99517233e5aa Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Sat, 29 Jan 2022 15:52:16 +0100 Subject: [PATCH 343/619] regenconf: make some systemctl enable/disable quiet --- hooks/conf_regen/01-yunohost | 2 +- hooks/conf_regen/37-mdns | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/hooks/conf_regen/01-yunohost b/hooks/conf_regen/01-yunohost index 1f6c143a6..ceab4b2f6 100755 --- a/hooks/conf_regen/01-yunohost +++ b/hooks/conf_regen/01-yunohost @@ -62,7 +62,7 @@ do_init_regen() { systemctl daemon-reload - systemctl enable yunohost-api.service + systemctl enable yunohost-api.service --quiet systemctl start yunohost-api.service # Yunohost-firewall is enabled only during postinstall, not init, not 100% sure why diff --git a/hooks/conf_regen/37-mdns b/hooks/conf_regen/37-mdns index 246b5b469..b99584863 100755 --- a/hooks/conf_regen/37-mdns +++ b/hooks/conf_regen/37-mdns @@ -27,7 +27,7 @@ _generate_config() { do_init_regen() { do_pre_regen do_post_regen /etc/systemd/system/yunomdns.service - systemctl enable yunomdns + systemctl enable yunomdns --quiet } do_pre_regen() { @@ -53,12 +53,12 @@ do_post_regen() { systemctl daemon-reload fi - systemctl disable avahi-daemon.socket --now 2>&1|| true - systemctl disable avahi-daemon --now 2>&1 || true + systemctl disable avahi-daemon.socket --quiet --now 2>&1 || true + systemctl disable avahi-daemon --quiet --now 2>&1 || true # Legacy stuff to enable the new yunomdns service on legacy systems if [[ -e /etc/avahi/avahi-daemon.conf ]] && grep -q 'yunohost' /etc/avahi/avahi-daemon.conf; then - systemctl enable yunomdns --now + systemctl enable yunomdns --now --quiet sleep 2 fi From 345e50ae0098e4fc6f45a52b783bf6acca46a373 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Sat, 29 Jan 2022 16:49:03 +0100 Subject: [PATCH 344/619] =?UTF-8?q?regenconf:=20make=20some=20systemctl=20?= =?UTF-8?q?enable/disable=20quiet=C2=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hooks/conf_regen/37-mdns | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/hooks/conf_regen/37-mdns b/hooks/conf_regen/37-mdns index b99584863..3a877970b 100755 --- a/hooks/conf_regen/37-mdns +++ b/hooks/conf_regen/37-mdns @@ -53,8 +53,8 @@ do_post_regen() { systemctl daemon-reload fi - systemctl disable avahi-daemon.socket --quiet --now 2>&1 || true - systemctl disable avahi-daemon --quiet --now 2>&1 || true + systemctl disable avahi-daemon.socket --quiet --now 2>/dev/null || true + systemctl disable avahi-daemon --quiet --now 2>/dev/null || true # Legacy stuff to enable the new yunomdns service on legacy systems if [[ -e /etc/avahi/avahi-daemon.conf ]] && grep -q 'yunohost' /etc/avahi/avahi-daemon.conf; then From 3ca302b85dd4d4a86d1a406b8f56d8a9b0e95526 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Sat, 29 Jan 2022 16:54:27 +0100 Subject: [PATCH 345/619] Tmp fix to try to debug the CI @_@ --- src/domain.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/domain.py b/src/domain.py index 7481e4088..c4c8d0160 100644 --- a/src/domain.py +++ b/src/domain.py @@ -389,7 +389,11 @@ def domain_main_domain(operation_logger, new_main_domain=None): raise YunohostError("main_domain_change_failed") # Generate SSOwat configuration file - app_ssowatconf() + try: + app_ssowatconf() + except Exception as e: + logger.warning(str(e), exc_info=1) + raise YunohostError("main_domain_change_failed") # Regen configurations if os.path.exists("/etc/yunohost/installed"): From 16946372cca69c12fa3f6a2f0069206aa6911964 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Sat, 29 Jan 2022 17:18:24 +0100 Subject: [PATCH 346/619] Moar tmp tweaks to try to debug the CI --- src/domain.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/domain.py b/src/domain.py index c4c8d0160..974a8d72c 100644 --- a/src/domain.py +++ b/src/domain.py @@ -385,6 +385,8 @@ def domain_main_domain(operation_logger, new_main_domain=None): domain_list_cache = {} _set_hostname(new_main_domain) except Exception as e: + import traceback + traceback.print_exc() logger.warning(str(e), exc_info=1) raise YunohostError("main_domain_change_failed") @@ -392,6 +394,8 @@ def domain_main_domain(operation_logger, new_main_domain=None): try: app_ssowatconf() except Exception as e: + import traceback + traceback.print_exc() logger.warning(str(e), exc_info=1) raise YunohostError("main_domain_change_failed") From bf6252ac1db0247637f8978d0a2b71a95dd4c822 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Sat, 29 Jan 2022 17:49:45 +0100 Subject: [PATCH 347/619] configpanels: optimize _get_toml for domains to not load the whole DNS section stuff when just getting a simple info from another section --- src/domain.py | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/src/domain.py b/src/domain.py index 974a8d72c..a773bcaad 100644 --- a/src/domain.py +++ b/src/domain.py @@ -481,18 +481,24 @@ class DomainConfigPanel(ConfigPanel): app_ssowatconf() def _get_toml(self): - from yunohost.dns import _get_registrar_config_section toml = super()._get_toml() toml["feature"]["xmpp"]["xmpp"]["default"] = ( 1 if self.entity == _get_maindomain() else 0 ) - toml["dns"]["registrar"] = _get_registrar_config_section(self.entity) - # FIXME: Ugly hack to save the registar id/value and reinject it in _load_current_values ... - self.registar_id = toml["dns"]["registrar"]["registrar"]["value"] - del toml["dns"]["registrar"]["registrar"]["value"] + # Optimize wether or not to load the DNS section, + # e.g. we don't want to trigger the whole _get_registary_config_section + # when just getting the current value from the feature section + filter_key = self.filter_key.split(".") if self.filter_key != "" else [] + if not filter_key or filter_key[0] == "dns": + from yunohost.dns import _get_registrar_config_section + toml["dns"]["registrar"] = _get_registrar_config_section(self.entity) + + # FIXME: Ugly hack to save the registar id/value and reinject it in _load_current_values ... + self.registar_id = toml["dns"]["registrar"]["registrar"]["value"] + del toml["dns"]["registrar"]["registrar"]["value"] return toml @@ -502,7 +508,8 @@ class DomainConfigPanel(ConfigPanel): super()._load_current_values() # FIXME: Ugly hack to save the registar id/value and reinject it in _load_current_values ... - self.values["registrar"] = self.registar_id + if self.hasattr("registrar_id"): + self.values["registrar"] = self.registar_id def _get_domain_settings(domain: str) -> dict: From 74e73c470f6ad4c8f078eb6506e5b0797f582ac5 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Sat, 29 Jan 2022 17:49:59 +0100 Subject: [PATCH 348/619] Revert "Moar tmp tweaks to try to debug the CI" This reverts commit 16946372cca69c12fa3f6a2f0069206aa6911964. --- src/domain.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/domain.py b/src/domain.py index a773bcaad..1e869c985 100644 --- a/src/domain.py +++ b/src/domain.py @@ -385,8 +385,6 @@ def domain_main_domain(operation_logger, new_main_domain=None): domain_list_cache = {} _set_hostname(new_main_domain) except Exception as e: - import traceback - traceback.print_exc() logger.warning(str(e), exc_info=1) raise YunohostError("main_domain_change_failed") @@ -394,8 +392,6 @@ def domain_main_domain(operation_logger, new_main_domain=None): try: app_ssowatconf() except Exception as e: - import traceback - traceback.print_exc() logger.warning(str(e), exc_info=1) raise YunohostError("main_domain_change_failed") From 73777983855d51c11da398ff5634d2b4ce7ef920 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Sat, 29 Jan 2022 17:50:03 +0100 Subject: [PATCH 349/619] Revert "Tmp fix to try to debug the CI @_@" This reverts commit 3ca302b85dd4d4a86d1a406b8f56d8a9b0e95526. --- src/domain.py | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/domain.py b/src/domain.py index 1e869c985..ad3eaaed2 100644 --- a/src/domain.py +++ b/src/domain.py @@ -389,11 +389,7 @@ def domain_main_domain(operation_logger, new_main_domain=None): raise YunohostError("main_domain_change_failed") # Generate SSOwat configuration file - try: - app_ssowatconf() - except Exception as e: - logger.warning(str(e), exc_info=1) - raise YunohostError("main_domain_change_failed") + app_ssowatconf() # Regen configurations if os.path.exists("/etc/yunohost/installed"): From e46fe6b77b05704b3dab6f98de25722912a47a72 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Sat, 29 Jan 2022 18:05:23 +0100 Subject: [PATCH 350/619] Typo: self.hasattr is not a thing /o\ --- src/domain.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/domain.py b/src/domain.py index ad3eaaed2..594c18d27 100644 --- a/src/domain.py +++ b/src/domain.py @@ -500,7 +500,7 @@ class DomainConfigPanel(ConfigPanel): super()._load_current_values() # FIXME: Ugly hack to save the registar id/value and reinject it in _load_current_values ... - if self.hasattr("registrar_id"): + if hasattr(self, "registrar_id"): self.values["registrar"] = self.registar_id From adb0e67b25d8385dea8f1b2b319321b11157faf1 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Sat, 29 Jan 2022 18:28:07 +0100 Subject: [PATCH 351/619] Aaand hasattr not working as expected --- src/domain.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/domain.py b/src/domain.py index 594c18d27..338abc21b 100644 --- a/src/domain.py +++ b/src/domain.py @@ -500,7 +500,8 @@ class DomainConfigPanel(ConfigPanel): super()._load_current_values() # FIXME: Ugly hack to save the registar id/value and reinject it in _load_current_values ... - if hasattr(self, "registrar_id"): + filter_key = self.filter_key.split(".") if self.filter_key != "" else [] + if not filter_key or filter_key[0] == "dns": self.values["registrar"] = self.registar_id From e1ffe57282dc39a0ac9759011d68cb6ca086df1e Mon Sep 17 00:00:00 2001 From: yunohost-bot Date: Sat, 29 Jan 2022 17:48:05 +0000 Subject: [PATCH 352/619] [CI] Format code with Black --- src/app.py | 2 +- src/certificate.py | 12 +++--------- src/domain.py | 9 +++------ src/utils/config.py | 5 ++++- 4 files changed, 11 insertions(+), 17 deletions(-) diff --git a/src/app.py b/src/app.py index d7310c0ea..c200a66c6 100644 --- a/src/app.py +++ b/src/app.py @@ -680,7 +680,7 @@ def app_manifest(app): shutil.rmtree(extracted_app_folder) raw_questions = manifest.get("arguments", {}).get("install", []) - manifest['arguments']['install'] = hydrate_questions_with_choices(raw_questions) + manifest["arguments"]["install"] = hydrate_questions_with_choices(raw_questions) return manifest diff --git a/src/certificate.py b/src/certificate.py index 308b79f1c..2a9fb4ce9 100644 --- a/src/certificate.py +++ b/src/certificate.py @@ -111,9 +111,7 @@ def certificate_status(domains, full=False): return {"certificates": certificates} -def certificate_install( - domain_list, force=False, no_checks=False, self_signed=False -): +def certificate_install(domain_list, force=False, no_checks=False, self_signed=False): """ Install a Let's Encrypt certificate for given domains (all by default) @@ -231,9 +229,7 @@ def _certificate_install_selfsigned(domain_list, force=False): operation_logger.error(msg) -def _certificate_install_letsencrypt( - domains, force=False, no_checks=False -): +def _certificate_install_letsencrypt(domains, force=False, no_checks=False): from yunohost.domain import domain_list, _assert_domain_exists if not os.path.exists(ACCOUNT_KEY_FILE): @@ -297,9 +293,7 @@ def _certificate_install_letsencrypt( operation_logger.success() -def certificate_renew( - domains, force=False, no_checks=False, email=False -): +def certificate_renew(domains, force=False, no_checks=False, email=False): """ Renew Let's Encrypt certificate for given domains (all by default) diff --git a/src/domain.py b/src/domain.py index 338abc21b..ab6ce54a5 100644 --- a/src/domain.py +++ b/src/domain.py @@ -486,6 +486,7 @@ class DomainConfigPanel(ConfigPanel): filter_key = self.filter_key.split(".") if self.filter_key != "" else [] if not filter_key or filter_key[0] == "dns": from yunohost.dns import _get_registrar_config_section + toml["dns"]["registrar"] = _get_registrar_config_section(self.entity) # FIXME: Ugly hack to save the registar id/value and reinject it in _load_current_values ... @@ -535,17 +536,13 @@ def domain_cert_status(domain_list, full=False): return certificate_status(domain_list, full) -def domain_cert_install( - domain_list, force=False, no_checks=False, self_signed=False -): +def domain_cert_install(domain_list, force=False, no_checks=False, self_signed=False): from yunohost.certificate import certificate_install return certificate_install(domain_list, force, no_checks, self_signed) -def domain_cert_renew( - domain_list, force=False, no_checks=False, email=False -): +def domain_cert_renew(domain_list, force=False, no_checks=False, email=False): from yunohost.certificate import certificate_renew return certificate_renew(domain_list, force, no_checks, email) diff --git a/src/utils/config.py b/src/utils/config.py index f44fe5c22..ab18a19b0 100644 --- a/src/utils/config.py +++ b/src/utils/config.py @@ -1397,11 +1397,14 @@ def ask_questions_and_parse_answers( return out + def hydrate_questions_with_choices(raw_questions: List) -> List: out = [] for raw_question in raw_questions: - question = ARGUMENTS_TYPE_PARSERS[raw_question.get("type", "string")](raw_question) + question = ARGUMENTS_TYPE_PARSERS[raw_question.get("type", "string")]( + raw_question + ) if question.choices: raw_question["choices"] = question.choices raw_question["default"] = question.default From 0a59f863294ad6e57902387ea20cbf85933ebc55 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Sat, 29 Jan 2022 19:10:28 +0100 Subject: [PATCH 353/619] configpanel: oopsies, super()._apply() was only called when changing the default app :P --- src/domain.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/domain.py b/src/domain.py index 338abc21b..361536011 100644 --- a/src/domain.py +++ b/src/domain.py @@ -469,7 +469,13 @@ class DomainConfigPanel(ConfigPanel): other_app=app_map(raw=True)[self.entity]["/"]["id"], ) - super()._apply() + super()._apply() + + # Reload ssowat if default app changed + if ( + "default_app" in self.future_values + and self.future_values["default_app"] != self.values["default_app"] + ): app_ssowatconf() def _get_toml(self): From f0a01ba25db5c57f3efc86286012662b90e5aaed Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Sat, 29 Jan 2022 19:18:42 +0100 Subject: [PATCH 354/619] php73_to_php74: another search&replace for synapse --- src/migrations/0022_php73_to_php74_pools.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/migrations/0022_php73_to_php74_pools.py b/src/migrations/0022_php73_to_php74_pools.py index 3b6db919a..fd76adb77 100644 --- a/src/migrations/0022_php73_to_php74_pools.py +++ b/src/migrations/0022_php73_to_php74_pools.py @@ -17,6 +17,10 @@ NEWPHP_POOLS = "/etc/php/7.4/fpm/pool.d" OLDPHP_SOCKETS_PREFIX = "/run/php/php7.3-fpm" NEWPHP_SOCKETS_PREFIX = "/run/php/php7.4-fpm" +# Because of synapse é_è +OLDPHP_SOCKETS_PREFIX2 = "/run/php7.3-fpm" +NEWPHP_SOCKETS_PREFIX2 = "/run/php7.4-fpm" + MIGRATION_COMMENT = ( "; YunoHost note : this file was automatically moved from {}".format(OLDPHP_POOLS) ) @@ -50,6 +54,10 @@ class MyMigration(Migration): OLDPHP_SOCKETS_PREFIX, NEWPHP_SOCKETS_PREFIX, dest ) os.system(c) + c = "sed -i -e 's@{}@{}@g' {}".format( + OLDPHP_SOCKETS_PREFIX2, NEWPHP_SOCKETS_PREFIX2, dest + ) + os.system(c) # Also add a comment that it was automatically moved from php7.3 # (for human traceability and backward migration) @@ -69,6 +77,10 @@ class MyMigration(Migration): OLDPHP_SOCKETS_PREFIX, NEWPHP_SOCKETS_PREFIX, nf ) os.system(c) + c = "sed -i -e 's@{}@{}@g' {}".format( + OLDPHP_SOCKETS_PREFIX2, NEWPHP_SOCKETS_PREFIX2, nf + ) + os.system(c) os.system( "rm /etc/logrotate.d/php7.3-fpm" From 9ae7ec5930179f189d438b256347e456cb401caa Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Sat, 29 Jan 2022 19:19:19 +0100 Subject: [PATCH 355/619] php73_to_php74: stopping php7.3 before starting 7.4 should be more robust in case confs are conflicting --- src/migrations/0022_php73_to_php74_pools.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/migrations/0022_php73_to_php74_pools.py b/src/migrations/0022_php73_to_php74_pools.py index fd76adb77..a2e5eae54 100644 --- a/src/migrations/0022_php73_to_php74_pools.py +++ b/src/migrations/0022_php73_to_php74_pools.py @@ -87,10 +87,10 @@ class MyMigration(Migration): ) # We remove this otherwise the logrotate cron will be unhappy # Reload/restart the php pools - _run_service_command("restart", "php7.4-fpm") - _run_service_command("enable", "php7.4-fpm") os.system("systemctl stop php7.3-fpm") os.system("systemctl disable php7.3-fpm") + _run_service_command("restart", "php7.4-fpm") + _run_service_command("enable", "php7.4-fpm") # Reload nginx _run_service_command("reload", "nginx") From ab5580cb1197087292a7be8ad3a85b8d31ba292f Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Sat, 29 Jan 2022 19:23:07 +0100 Subject: [PATCH 356/619] Update changelof for 11.0.4 --- debian/changelog | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/debian/changelog b/debian/changelog index b0229fe8d..7e35024c8 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,20 @@ +yunohost (11.0.4) testing; urgency=low + + - [mod] certificate: drop unused 'staging' LE mode (4b78e8e3) + - [fix] cli: bash_completion was broken ([#1423](https://github.com/YunoHost/yunohost/pull/1423)) + - [enh] mdns: Wait for network to be fully up to start the service ([#1425](https://github.com/YunoHost/yunohost/pull/1425)) + - [fix] regenconf: make some systemctl enable/disable quiet (bccff1b4, 345e50ae) + - [fix] configpanels: Compute choices for the yunohost admin when installing an app ([#1427](https://github.com/YunoHost/yunohost/pull/1427)) + - [fix] configpanels: optimize _get_toml for domains to not load the whole DNS section stuff when just getting a simple info from another section (bf6252ac) + - [fix] configpanel: oopsies, could only change the default app for domain configs :P (0a59f863) + - [fix] php73_to_php74: another search&replace for synapse (f0a01ba2) + - [fix] php73_to_php74: stopping php7.3 before starting 7.4 should be more robust in case confs are conflicting (9ae7ec59) + - [i18n] Translations updated for French, Ukrainian + + Thanks to all contributors <3 ! (Éric Gaspar, Kay0u, Tagadda, tituspijean, Tymofii-Lytvynenko) + + -- Alexandre Aubin Sat, 29 Jan 2022 19:19:44 +0100 + yunohost (11.0.3) testing; urgency=low - [enh] mail: Add SNI support for postfix and dovecot ([#1413](https://github.com/YunoHost/yunohost/pull/1413)) From f2b95e5fbeabec1f4a99e81c6a93aac0b876223d Mon Sep 17 00:00:00 2001 From: Tagadda <36127788+Tagadda@users.noreply.github.com> Date: Sun, 30 Jan 2022 20:45:06 +0000 Subject: [PATCH 357/619] configpanel: filter as a simple_js_expression --- share/config_domain.toml | 2 +- src/utils/config.py | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/share/config_domain.toml b/share/config_domain.toml index b0131f1c1..65e755365 100644 --- a/share/config_domain.toml +++ b/share/config_domain.toml @@ -14,7 +14,7 @@ i18n = "domain_config" [feature.app] [feature.app.default_app] type = "app" - filters = ["is_webapp"] + filter = "is_webapp" default = "_none" [feature.mail] diff --git a/src/utils/config.py b/src/utils/config.py index ab18a19b0..1e4f4cd1e 100644 --- a/src/utils/config.py +++ b/src/utils/config.py @@ -440,7 +440,7 @@ class ConfigPanel: "step", "accept", "redact", - "filters", + "filter", ], "defaults": {}, }, @@ -706,7 +706,7 @@ class Question: self.ask = question.get("ask", {"en": self.name}) self.help = question.get("help") self.redact = question.get("redact", False) - self.filters = question.get("filters", []) + self.filter = question.get("filter", []) # .current_value is the currently stored value self.current_value = question.get("current_value") # .value is the "proposed" value which we got from the user @@ -1142,12 +1142,12 @@ class AppQuestion(Question): super().__init__(question, context, hooks) apps = app_list(full=True)["apps"] - for _filter in self.filters: - apps = [app for app in apps if _filter in app and app[_filter]] + + apps = [app for app in apps if evaluate_simple_js_expression(self.filter, context=app)] def _app_display(app): - domain_path = f" ({app['domain_path']})" if "domain_path" in app else "" - return app["label"] + domain_path + domain_path_or_id = f" ({app.get('domain_path', app['id'])})" + return app["label"] + domain_path_or_id self.choices = {"_none": "---"} self.choices.update({app["id"]: _app_display(app) for app in apps}) From 3de3205648cdfaf530148defc51b58460e03ea10 Mon Sep 17 00:00:00 2001 From: Tagadda <36127788+Tagadda@users.noreply.github.com> Date: Sun, 30 Jan 2022 22:39:26 +0000 Subject: [PATCH 358/619] set default filter to always return true --- src/utils/config.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/utils/config.py b/src/utils/config.py index 1e4f4cd1e..0b2aca414 100644 --- a/src/utils/config.py +++ b/src/utils/config.py @@ -706,7 +706,7 @@ class Question: self.ask = question.get("ask", {"en": self.name}) self.help = question.get("help") self.redact = question.get("redact", False) - self.filter = question.get("filter", []) + self.filter = question.get("filter", "true") # .current_value is the currently stored value self.current_value = question.get("current_value") # .value is the "proposed" value which we got from the user @@ -1142,8 +1142,9 @@ class AppQuestion(Question): super().__init__(question, context, hooks) apps = app_list(full=True)["apps"] - - apps = [app for app in apps if evaluate_simple_js_expression(self.filter, context=app)] + + if self.filter: + apps = [app for app in apps if evaluate_simple_js_expression(self.filter, context=app)] def _app_display(app): domain_path_or_id = f" ({app.get('domain_path', app['id'])})" From d28f725762f8d60b1bf772a4d492ed9affde95ab Mon Sep 17 00:00:00 2001 From: yunohost-bot Date: Mon, 31 Jan 2022 02:32:46 +0000 Subject: [PATCH 359/619] [CI] Format code with Black --- src/diagnosers/50-systemresources.py | 2 +- src/migrations/0021_migrate_to_bullseye.py | 2 +- src/tools.py | 2 +- src/utils/config.py | 6 +++++- 4 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/diagnosers/50-systemresources.py b/src/diagnosers/50-systemresources.py index 1096daebf..6ac7f0ec4 100644 --- a/src/diagnosers/50-systemresources.py +++ b/src/diagnosers/50-systemresources.py @@ -18,7 +18,7 @@ class MyDiagnoser(Diagnoser): def run(self): - MB = 1024 ** 2 + MB = 1024**2 GB = MB * 1024 # diff --git a/src/migrations/0021_migrate_to_bullseye.py b/src/migrations/0021_migrate_to_bullseye.py index f4361cb19..551a6f64b 100644 --- a/src/migrations/0021_migrate_to_bullseye.py +++ b/src/migrations/0021_migrate_to_bullseye.py @@ -293,7 +293,7 @@ class MyMigration(Migration): raise YunohostError("migration_0021_not_buster") # Have > 1 Go free space on /var/ ? - if free_space_in_directory("/var/") / (1024 ** 3) < 1.0: + if free_space_in_directory("/var/") / (1024**3) < 1.0: raise YunohostError("migration_0021_not_enough_free_space") # Check system is up to date diff --git a/src/tools.py b/src/tools.py index f85d0abdf..45163135f 100644 --- a/src/tools.py +++ b/src/tools.py @@ -226,7 +226,7 @@ def tools_postinstall( main_space = sum( psutil.disk_usage(d.mountpoint).total for d in main_disk_partitions ) - GB = 1024 ** 3 + GB = 1024**3 if not force_diskspace and main_space < 10 * GB: raise YunohostValidationError("postinstall_low_rootfsspace") diff --git a/src/utils/config.py b/src/utils/config.py index 0b2aca414..b8ea93589 100644 --- a/src/utils/config.py +++ b/src/utils/config.py @@ -1144,7 +1144,11 @@ class AppQuestion(Question): apps = app_list(full=True)["apps"] if self.filter: - apps = [app for app in apps if evaluate_simple_js_expression(self.filter, context=app)] + apps = [ + app + for app in apps + if evaluate_simple_js_expression(self.filter, context=app) + ] def _app_display(app): domain_path_or_id = f" ({app.get('domain_path', app['id'])})" From d6a6ca1db4360df44d039221ec6b6065b9d2b1a0 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Tue, 1 Feb 2022 12:52:40 +0100 Subject: [PATCH 360/619] security: Enable proc-hidepid by default --- hooks/conf_regen/01-yunohost | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/hooks/conf_regen/01-yunohost b/hooks/conf_regen/01-yunohost index ceab4b2f6..dc0bfc689 100755 --- a/hooks/conf_regen/01-yunohost +++ b/hooks/conf_regen/01-yunohost @@ -154,12 +154,7 @@ EOF cp yunohost-api.service ${pending_dir}/etc/systemd/system/yunohost-api.service cp yunohost-firewall.service ${pending_dir}/etc/systemd/system/yunohost-firewall.service cp yunoprompt.service ${pending_dir}/etc/systemd/system/yunoprompt.service - - if [[ "$(yunohost settings get 'security.experimental.enabled')" == "True" ]]; then - cp proc-hidepid.service ${pending_dir}/etc/systemd/system/proc-hidepid.service - else - touch ${pending_dir}/etc/systemd/system/proc-hidepid.service - fi + cp proc-hidepid.service ${pending_dir}/etc/systemd/system/proc-hidepid.service mkdir -p ${pending_dir}/etc/dpkg/origins/ cp dpkg-origins ${pending_dir}/etc/dpkg/origins/yunohost From de6844250f11952b13f706717e15260ada64f836 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Tue, 1 Feb 2022 15:43:03 +0100 Subject: [PATCH 361/619] postinstall: migrate_to_bullseye should be skipped on bullseye --- src/tools.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/tools.py b/src/tools.py index 45163135f..c6283e701 100644 --- a/src/tools.py +++ b/src/tools.py @@ -930,10 +930,6 @@ def _skip_all_migrations(): all_migrations = _get_migrations_list() new_states = {"migrations": {}} for migration in all_migrations: - # Don't skip bullseye migration while we're - # still on buster - if "migrate_to_bullseye" in migration.id: - continue new_states["migrations"][migration.id] = "skipped" write_to_yaml(MIGRATIONS_STATE_PATH, new_states) From 3c02fb7d4a9de9102774dcc089cf6498277371d7 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sun, 6 Feb 2022 12:40:00 +0100 Subject: [PATCH 362/619] Update nodejs --- helpers/nodejs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/helpers/nodejs b/helpers/nodejs index 962ac2a70..0b4457b1b 100644 --- a/helpers/nodejs +++ b/helpers/nodejs @@ -1,6 +1,6 @@ #!/bin/bash -n_version=8.0.1 +n_version=8.0.2 n_install_dir="/opt/node_n" node_version_path="$n_install_dir/n/versions/node" # N_PREFIX is the directory of n, it needs to be loaded as a environment variable. @@ -16,7 +16,7 @@ export N_PREFIX="$n_install_dir" ynh_install_n() { # Build an app.src for n echo "SOURCE_URL=https://github.com/tj/n/archive/v${n_version}.tar.gz -SOURCE_SUM=8703ae88fd06ce7f2d0f4018d68bfbab7b26859ed86a86ce4b8f25d2110aee2f" >"$YNH_APP_BASEDIR/conf/n.src" +SOURCE_SUM=1cdc34d3a53a13a23675797dd775d562e33e64877e367df9d1afe863719de973" >"$YNH_APP_BASEDIR/conf/n.src" # Download and extract n ynh_setup_source --dest_dir="$n_install_dir/git" --source_id=n # Install n From 8c7d57b4867142537a5f7224256969f9ffa935f3 Mon Sep 17 00:00:00 2001 From: tituspijean Date: Mon, 7 Feb 2022 21:58:49 +0100 Subject: [PATCH 363/619] Add n auto-updater --- .github/workflows/n_updater.sh | 75 +++++++++++++++++++++++++++++++++ .github/workflows/n_updater.yml | 46 ++++++++++++++++++++ 2 files changed, 121 insertions(+) create mode 100644 .github/workflows/n_updater.sh create mode 100644 .github/workflows/n_updater.yml diff --git a/.github/workflows/n_updater.sh b/.github/workflows/n_updater.sh new file mode 100644 index 000000000..0ea226888 --- /dev/null +++ b/.github/workflows/n_updater.sh @@ -0,0 +1,75 @@ +#!/bin/bash + +#================================================= +# N UPDATING HELPER +#================================================= + +# This script is meant to be run by GitHub Actions. +# It is derived from the Updater script from the YunoHost-Apps organization. +# It aims to automate the update of `n`, the Node version management system. + +#================================================= +# FETCHING LATEST RELEASE AND ITS ASSETS +#================================================= + +# Fetching information +source helpers/nodejs +current_version="$n_version" +repo="tj/n" +# Some jq magic is needed, because the latest upstream release is not always the latest version (e.g. security patches for older versions) +version=$(curl --silent "https://api.github.com/repos/$repo/releases" | jq -r '.[] | select( .prerelease != true ) | .tag_name' | sort -V | tail -1) + +# Later down the script, we assume the version has only digits and dots +# Sometimes the release name starts with a "v", so let's filter it out. +if [[ ${version:0:1} == "v" || ${version:0:1} == "V" ]]; then + version=${version:1} +fi + +# Setting up the environment variables +echo "Current version: $current_version" +echo "Latest release from upstream: $version" +echo "VERSION=$version" >> $GITHUB_ENV +# For the time being, let's assume the script will fail +echo "PROCEED=false" >> $GITHUB_ENV + +# Proceed only if the retrieved version is greater than the current one +if ! dpkg --compare-versions "$current_version" "lt" "$version" ; then + echo "::warning ::No new version available" + exit 0 +# Proceed only if a PR for this new version does not already exist +elif git ls-remote -q --exit-code --heads https://github.com/${GITHUB_REPOSITORY:-YunoHost/yunohost}.git ci-auto-update-n-v$version ; then + echo "::warning ::A branch already exists for this update" + exit 0 +fi + +#================================================= +# UPDATE SOURCE FILES +#================================================= + +asset_url="https://github.com/tj/n/archive/v${version}.tar.gz" + +echo "Handling asset at $asset_url" + +# Create the temporary directory +tempdir="$(mktemp -d)" + +# Download sources and calculate checksum +filename=${asset_url##*/} +curl --silent -4 -L $asset_url -o "$tempdir/$filename" +checksum=$(sha256sum "$tempdir/$filename" | head -c 64) + +# Delete temporary directory +rm -rf $tempdir + +echo "Calculated checksum for n v${version} is $checksum" + +#================================================= +# GENERIC FINALIZATION +#================================================= + +# Replace new version in helper +sed -i -E "s/^n_version=.*$/n_version=$version/" helpers/nodejs + +# The Action will proceed only if the PROCEED environment variable is set to true +echo "PROCEED=true" >> $GITHUB_ENV +exit 0 diff --git a/.github/workflows/n_updater.yml b/.github/workflows/n_updater.yml new file mode 100644 index 000000000..0253ca02d --- /dev/null +++ b/.github/workflows/n_updater.yml @@ -0,0 +1,46 @@ +# This workflow allows GitHub Actions to automagically update YunoHost NodeJS helper whenever a new release of n is detected. +name: Check for new n releases +on: + # Allow to manually trigger the workflow + workflow_dispatch: + # Run it every day at 5:00 UTC + schedule: + - cron: '0 5 * * *' +jobs: + updater: + runs-on: ubuntu-latest + steps: + - name: Fetch the source code + uses: actions/checkout@v2 + with: + token: ${{ secrets.GITHUB_TOKEN }} + - name: Run the updater script + id: run_updater + run: | + # Setting up Git user + git config --global user.name 'yunohost-bot' + git config --global user.email 'yunohost-bot@users.noreply.github.com' + # Run the updater script + /bin/bash .github/workflows/updater.sh + - name: Commit changes + id: commit + if: ${{ env.PROCEED == 'true' }} + run: | + git commit -am "Upgrade n to v$VERSION" + - name: Create Pull Request + id: cpr + if: ${{ env.PROCEED == 'true' }} + uses: peter-evans/create-pull-request@v3 + with: + token: ${{ secrets.GITHUB_TOKEN }} + commit-message: Update n to version ${{ env.VERSION }} + committer: 'yunohost-bot ' + author: 'yunohost-bot ' + signoff: false + base: testing + branch: ci-auto-update-n-v${{ env.VERSION }} + delete-branch: true + title: 'Upgrade n to version ${{ env.VERSION }}' + body: | + Upgrade `n` to v${{ env.VERSION }} + draft: false From 08be0ee0203be8c580f6550f390bf06213efac3f Mon Sep 17 00:00:00 2001 From: Kayou Date: Wed, 9 Feb 2022 13:33:22 +0100 Subject: [PATCH 364/619] [fix] postfix sni tls_server_chain_sni_maps -> tls_server_sni_maps --- conf/postfix/main.cf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/postfix/main.cf b/conf/postfix/main.cf index 4ccb81ce5..3e53714d0 100644 --- a/conf/postfix/main.cf +++ b/conf/postfix/main.cf @@ -27,7 +27,7 @@ smtpd_tls_chain_files = /etc/yunohost/certs/{{ main_domain }}/key.pem, /etc/yunohost/certs/{{ main_domain }}/crt.pem -tls_server_chain_sni_maps = hash:/etc/postfix/sni +tls_server_sni_maps = hash:/etc/postfix/sni {% if compatibility == "intermediate" %} # generated 2020-08-18, Mozilla Guideline v5.6, Postfix 3.4.14, OpenSSL 1.1.1d, intermediate configuration From 31d3719b480324c475cdd3886256e2026249450c Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Wed, 9 Feb 2022 17:52:23 +0100 Subject: [PATCH 365/619] php helpers: only trigger the legacy remove_apt_deps inside ynh_remove_fpm_config if we're in the remove string to prevent epic catastrophies when the app changes php version --- data/helpers.d/php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/data/helpers.d/php b/data/helpers.d/php index d6ccc52cd..8bc9fb8f3 100644 --- a/data/helpers.d/php +++ b/data/helpers.d/php @@ -281,7 +281,9 @@ ynh_remove_fpm_config() { fi # If the PHP version used is not the default version for YunoHost - if [ "$phpversion" != "$YNH_DEFAULT_PHP_VERSION" ]; then + # The second part with YNH_APP_PURGE is an ugly hack to guess that we're inside the remove script + # (we don't actually care about its value, we just check its not empty hence it exists) + if [ "$phpversion" != "$YNH_DEFAULT_PHP_VERSION" ] && [ -n "${YNH_APP_PURGE:-}" ]; then # Remove app dependencies ... but ideally should happen via an explicit call from packager ynh_remove_app_dependencies fi From ca8940b86021055f375b837aa40bd6580770eb05 Mon Sep 17 00:00:00 2001 From: ewilly Date: Sun, 13 Feb 2022 21:03:23 +0100 Subject: [PATCH 366/619] Avoid grep issue with vmstat command due to localized vmstat in bullseye --- helpers/hardware | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/helpers/hardware b/helpers/hardware index 9f276b806..337630fa8 100644 --- a/helpers/hardware +++ b/helpers/hardware @@ -30,8 +30,8 @@ ynh_get_ram() { ram=0 # Use the total amount of ram elif [ $free -eq 1 ]; then - local free_ram=$(vmstat --stats --unit M | grep "free memory" | awk '{print $1}') - local free_swap=$(vmstat --stats --unit M | grep "free swap" | awk '{print $1}') + local free_ram=$(LANG=C vmstat --stats --unit M | grep "free memory" | awk '{print $1}') + local free_swap=$(LANG=C vmstat --stats --unit M | grep "free swap" | awk '{print $1}') local free_ram_swap=$((free_ram + free_swap)) # Use the total amount of free ram @@ -44,8 +44,8 @@ ynh_get_ram() { ram=$free_swap fi elif [ $total -eq 1 ]; then - local total_ram=$(vmstat --stats --unit M | grep "total memory" | awk '{print $1}') - local total_swap=$(vmstat --stats --unit M | grep "total swap" | awk '{print $1}') + local total_ram=$(LANG=C vmstat --stats --unit M | grep "total memory" | awk '{print $1}') + local total_swap=$(LANG=C vmstat --stats --unit M | grep "total swap" | awk '{print $1}') local total_ram_swap=$((total_ram + total_swap)) local ram=$total_ram_swap From a51738f1c30359f35cf08f5d080cb0d508306cf7 Mon Sep 17 00:00:00 2001 From: Tagadda <36127788+Tagadda@users.noreply.github.com> Date: Wed, 16 Feb 2022 12:34:22 +0000 Subject: [PATCH 367/619] fix: YNH_MAIN_DOMAINS env variable in regenconf Also... `yunohost domain list --output-as plain` also print "#domain" and "#main" so this used to create wierd files in /var/lib/metronome/ --- hooks/conf_regen/12-metronome | 6 +----- src/regenconf.py | 1 + 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/hooks/conf_regen/12-metronome b/hooks/conf_regen/12-metronome index e0797e673..220d18d58 100755 --- a/hooks/conf_regen/12-metronome +++ b/hooks/conf_regen/12-metronome @@ -49,12 +49,8 @@ do_post_regen() { # retrieve variables main_domain=$(cat /etc/yunohost/current_host) - # FIXME : small optimization to do to avoid calling a yunohost command ... - # maybe another env variable like YNH_MAIN_DOMAINS idk - domain_list=$(yunohost domain list --exclude-subdomains --output-as plain --quiet) - # create metronome directories for domains - for domain in $domain_list; do + for domain in $YNH_MAIN_DOMAINS; do mkdir -p "/var/lib/metronome/${domain//./%2e}/pep" # http_upload directory must be writable by metronome and readable by nginx mkdir -p "/var/xmpp-upload/${domain}/upload" diff --git a/src/regenconf.py b/src/regenconf.py index 5922e6832..c763fb6b6 100644 --- a/src/regenconf.py +++ b/src/regenconf.py @@ -140,6 +140,7 @@ def regen_conf( # though kinda tight-coupled to the postinstall logic :s if os.path.exists("/etc/yunohost/installed"): env["YNH_DOMAINS"] = " ".join(domain_list()["domains"]) + env["YNH_MAIN_DOMAINS"] = " ".join(domain_list(exclude_subdomains=True)["domains"]) pre_result = hook_callback("conf_regen", names, pre_callback=_pre_call, env=env) From c99729d0629fcdad470310e5bb3cb0501eef3929 Mon Sep 17 00:00:00 2001 From: Tagadda <36127788+Tagadda@users.noreply.github.com> Date: Wed, 16 Feb 2022 12:42:31 +0000 Subject: [PATCH 368/619] fix: config.py: Question.filter as None by default make more sense --- src/utils/config.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/utils/config.py b/src/utils/config.py index b8ea93589..cf0fb3d8c 100644 --- a/src/utils/config.py +++ b/src/utils/config.py @@ -706,7 +706,7 @@ class Question: self.ask = question.get("ask", {"en": self.name}) self.help = question.get("help") self.redact = question.get("redact", False) - self.filter = question.get("filter", "true") + self.filter = question.get("filter", None) # .current_value is the currently stored value self.current_value = question.get("current_value") # .value is the "proposed" value which we got from the user From 0ff9818ebfac38eabef4475d7b7dbf86f73ae987 Mon Sep 17 00:00:00 2001 From: Tagadda <36127788+Tagadda@users.noreply.github.com> Date: Wed, 16 Feb 2022 13:46:50 +0000 Subject: [PATCH 369/619] fix: config.py: add more properties for config_get?full --- src/utils/config.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/utils/config.py b/src/utils/config.py index cf0fb3d8c..56f632b09 100644 --- a/src/utils/config.py +++ b/src/utils/config.py @@ -289,6 +289,8 @@ class ConfigPanel: question_class = ARGUMENTS_TYPE_PARSERS[option.get("type", "string")] # FIXME : maybe other properties should be taken from the question, not just choices ?. option["choices"] = question_class(option).choices + option["default"] = question_class(option).default + option["pattern"] = question_class(option).pattern else: result[key] = {"ask": ask} if "current_value" in option: @@ -603,7 +605,7 @@ class ConfigPanel: } @property - def future_values(self): # TODO put this in ConfigPanel ? + def future_values(self): return {**self.values, **self.new_values} def __getattr__(self, name): From d216d06c8cdb9d93d95942c5d48105ffd3b92fa8 Mon Sep 17 00:00:00 2001 From: Tagadda <36127788+Tagadda@users.noreply.github.com> Date: Wed, 16 Feb 2022 14:17:42 +0000 Subject: [PATCH 370/619] fix: move _list_upgradable_apps() logic from tools.py to apps.py --- share/actionsmap.yml | 4 ++++ src/app.py | 31 +++++++++++++++++++++++++------ src/tools.py | 43 +++---------------------------------------- 3 files changed, 32 insertions(+), 46 deletions(-) diff --git a/share/actionsmap.yml b/share/actionsmap.yml index 43b610a9d..89c6e914d 100644 --- a/share/actionsmap.yml +++ b/share/actionsmap.yml @@ -735,6 +735,10 @@ app: full: --full help: Display all details, including the app manifest and various other infos action: store_true + -u: + full: --upgradable + help: List only apps that can upgrade to a newer version + action: store_true ### app_info() info: diff --git a/src/app.py b/src/app.py index c200a66c6..e533489a3 100644 --- a/src/app.py +++ b/src/app.py @@ -95,7 +95,7 @@ APP_FILES_TO_COPY = [ ] -def app_list(full=False): +def app_list(full=False, upgradable=False): """ List installed apps """ @@ -103,17 +103,19 @@ def app_list(full=False): out = [] for app_id in sorted(_installed_apps()): try: - app_info_dict = app_info(app_id, full=full) + app_info_dict = app_info(app_id, full=full, upgradable=upgradable) except Exception as e: logger.error(f"Failed to read info for {app_id} : {e}") continue app_info_dict["id"] = app_id + if upgradable and app_info_dict.get("upgradable") != "yes": + continue out.append(app_info_dict) return {"apps": out} -def app_info(app, full=False): +def app_info(app, full=False, upgradable=False): """ Get info for a specific app """ @@ -139,6 +141,25 @@ def app_info(app, full=False): if "domain" in settings and "path" in settings: ret["domain_path"] = settings["domain"] + settings["path"] + if not upgradable and not full: + return ret + + absolute_app_name, _ = _parse_app_instance_name(app) + from_catalog = _load_apps_catalog()["apps"].get(absolute_app_name, {}) + + ret["upgradable"] = _app_upgradable({** ret, "from_catalog": from_catalog}) + + if ret["upgradable"] == "yes": + ret["current_version"] = ret.get("version", "?") + ret["new_version"] = from_catalog.get("manifest", {}).get("version", "?") + + if ret["current_version"] == ret["new_version"]: + current_revision = settings.get("current_revision", "?")[:7] + new_revision = from_catalog.get("git", {}).get("revision", "?")[:7] + + ret["current_version"] = " ({current_revision})" + ret["new_version"] = " ({new_revision})" + if not full: return ret @@ -149,9 +170,7 @@ def app_info(app, full=False): ) ret["settings"] = settings - absolute_app_name, _ = _parse_app_instance_name(app) - ret["from_catalog"] = _load_apps_catalog()["apps"].get(absolute_app_name, {}) - ret["upgradable"] = _app_upgradable(ret) + ret["from_catalog"] = from_catalog ret["is_webapp"] = "domain" in settings and "path" in settings diff --git a/src/tools.py b/src/tools.py index c6283e701..c642c65a5 100644 --- a/src/tools.py +++ b/src/tools.py @@ -37,8 +37,8 @@ from moulinette.utils.process import call_async_output from moulinette.utils.filesystem import read_yaml, write_to_yaml, cp, mkdir, rm from yunohost.app import ( - app_info, app_upgrade, + app_list ) from yunohost.app_catalog import ( _initialize_apps_catalog_system, @@ -56,8 +56,6 @@ from yunohost.utils.packages import ( from yunohost.utils.error import YunohostError, YunohostValidationError from yunohost.log import is_unit_operation, OperationLogger -# FIXME this is a duplicate from apps.py -APPS_SETTING_PATH = "/etc/yunohost/apps/" MIGRATIONS_STATE_PATH = "/etc/yunohost/migrations.yaml" logger = getActionLogger("yunohost.tools") @@ -391,7 +389,7 @@ def tools_update(target=None): except YunohostError as e: logger.error(str(e)) - upgradable_apps = list(_list_upgradable_apps()) + upgradable_apps = list(app_list(upgradable=True)["apps"]) if len(upgradable_apps) == 0 and len(upgradable_system_packages) == 0: logger.info(m18n.n("already_up_to_date")) @@ -399,41 +397,6 @@ def tools_update(target=None): return {"system": upgradable_system_packages, "apps": upgradable_apps} -def _list_upgradable_apps(): - - app_list_installed = os.listdir(APPS_SETTING_PATH) - for app_id in app_list_installed: - - app_dict = app_info(app_id, full=True) - - if app_dict["upgradable"] == "yes": - - # FIXME : would make more sense for these infos to be computed - # directly in app_info and used to check the upgradability of - # the app... - current_version = app_dict.get("manifest", {}).get("version", "?") - current_commit = app_dict.get("settings", {}).get("current_revision", "?")[ - :7 - ] - new_version = ( - app_dict.get("from_catalog", {}).get("manifest", {}).get("version", "?") - ) - new_commit = ( - app_dict.get("from_catalog", {}).get("git", {}).get("revision", "?")[:7] - ) - - if current_version == new_version: - current_version += " (" + current_commit + ")" - new_version += " (" + new_commit + ")" - - yield { - "id": app_id, - "label": app_dict["label"], - "current_version": current_version, - "new_version": new_version, - } - - @is_unit_operation() def tools_upgrade(operation_logger, target=None): """ @@ -466,7 +429,7 @@ def tools_upgrade(operation_logger, target=None): # Make sure there's actually something to upgrade - upgradable_apps = [app["id"] for app in _list_upgradable_apps()] + upgradable_apps = [app["id"] for app in app_list(upgradable=True)["apps"]] if not upgradable_apps: logger.info(m18n.n("apps_already_up_to_date")) From f3837bae79fd4b2b721f9f1bb1cbd3c614fa5305 Mon Sep 17 00:00:00 2001 From: Tagada <36127788+Tagadda@users.noreply.github.com> Date: Fri, 18 Feb 2022 15:57:28 +0100 Subject: [PATCH 371/619] fix ynh_exec_*: ensure the arg message is used --- helpers/logging | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/helpers/logging b/helpers/logging index 4ac116c26..6562f5e3c 100644 --- a/helpers/logging +++ b/helpers/logging @@ -95,10 +95,10 @@ ynh_exec_err() { # we detect this by checking that there's no 2nd arg, and $1 contains a space if [[ "$#" -eq 1 ]] && [[ "$1" == *" "* ]] then - ynh_print_err "$(eval $@)" + ynh_print_err --message="$(eval $@)" else # Note that "$@" is used and not $@, c.f. https://unix.stackexchange.com/a/129077 - ynh_print_err "$("$@")" + ynh_print_err --message="$("$@")" fi } @@ -116,10 +116,10 @@ ynh_exec_warn() { # we detect this by checking that there's no 2nd arg, and $1 contains a space if [[ "$#" -eq 1 ]] && [[ "$1" == *" "* ]] then - ynh_print_warn "$(eval $@)" + ynh_print_warn --message="$(eval $@)" else # Note that "$@" is used and not $@, c.f. https://unix.stackexchange.com/a/129077 - ynh_print_warn "$("$@")" + ynh_print_warn --message="$("$@")" fi } @@ -317,4 +317,4 @@ ynh_script_progression() { # Requires YunoHost version 3.6.0 or higher. ynh_return() { echo "$1" >>"$YNH_STDRETURN" -} \ No newline at end of file +} From 086a3d4fdac02fbd07f282ac0c6ef33ef5a6fe20 Mon Sep 17 00:00:00 2001 From: Tagada <36127788+Tagadda@users.noreply.github.com> Date: Mon, 28 Feb 2022 15:36:38 +0100 Subject: [PATCH 372/619] fix: extra extra lines o/ --- src/dns.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/dns.py b/src/dns.py index 8991aa742..27b60561e 100644 --- a/src/dns.py +++ b/src/dns.py @@ -90,6 +90,7 @@ def domain_dns_suggest(domain): result += "\n{name} {ttl} IN {type} {value}".format(**record) if dns_conf["extra"]: + result += "\n\n" result += "; Extra" for record in dns_conf["extra"]: result += "\n{name} {ttl} IN {type} {value}".format(**record) From 0f307d1fa7b02affbddf74167aefa9e33da22a30 Mon Sep 17 00:00:00 2001 From: Melchisedech Date: Wed, 2 Mar 2022 22:52:18 +0100 Subject: [PATCH 373/619] Always activate time when running inside CI tests MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This way, no need to specify the --time argument of ynh_script_progression if you’re testing your app package through Yunorunner and want to adjust weight. --- helpers/logging | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/helpers/logging b/helpers/logging index 6562f5e3c..0f2d7eece 100644 --- a/helpers/logging +++ b/helpers/logging @@ -248,7 +248,14 @@ ynh_script_progression() { # Re-disable xtrace, ynh_handle_getopts_args set it back set +o xtrace # set +x weight=${weight:-1} - time=${time:-0} + + # Always activate time when running inside CI tests + if [$PACKAGE_CHECK_EXEC -eq 1]; then + time=${time:-1} + else + time=${time:-0} + fi + last=${last:-0} # Get execution time since the last $base_time From bd6afe27eef3314544d15be5b466faa87c4689f1 Mon Sep 17 00:00:00 2001 From: Melchisedech Date: Wed, 2 Mar 2022 23:13:26 +0100 Subject: [PATCH 374/619] Put spaces between the brackets and values --- helpers/logging | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/helpers/logging b/helpers/logging index 0f2d7eece..e84a63e12 100644 --- a/helpers/logging +++ b/helpers/logging @@ -250,7 +250,7 @@ ynh_script_progression() { weight=${weight:-1} # Always activate time when running inside CI tests - if [$PACKAGE_CHECK_EXEC -eq 1]; then + if [ $PACKAGE_CHECK_EXEC -eq 1 ]; then time=${time:-1} else time=${time:-0} From 8828e1d8e2c61c4950dcb330523281412b03c83f Mon Sep 17 00:00:00 2001 From: yalh76 Date: Thu, 3 Mar 2022 01:59:43 +0100 Subject: [PATCH 375/619] Implement install and removal of YunoHost apps --- helpers/app | 92 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 92 insertions(+) create mode 100644 helpers/app diff --git a/helpers/app b/helpers/app new file mode 100644 index 000000000..310d7d25c --- /dev/null +++ b/helpers/app @@ -0,0 +1,92 @@ +#!/bin/bash + +# Install other YunoHost apps +# +# usage: ynh_install_apps --apps="a_ynh b_ynh?domain=DOMAIN&path=PATH&admin=USER&language=fr&is_public=1&password=pass&port=666" +# | arg: -a, --apps= - apps to install +# +# Requires YunoHost version *.*.* or higher. +ynh_install_apps() { + # Declare an array to define the options of this helper. + local legacy_args=a + local -A args_array=([a]=apps=) + local apps + # Manage arguments with getopts + ynh_handle_getopts_args "$@" + + # Split the list of apps in an array + local apps_list=($(echo $apps | tr " " "\n")) + + # For each app + for i in "${apps_list[@]}" + do + # Retrieve the name of the app (part before _ynh) + local oneapp=$(echo "$i" | awk -F'[_ynh]' '{print $1}') + [ -z "$oneapp" ] && ynh_die --message="You didn't provided a YunoHost app to install" + + # Retrieve the arguments of the app (part after ?) + local oneargument=$(echo "$i" | awk -F'[?]' '{print $2}') + [ ! -z "$oneargument" ] && oneargument="--args \"$oneargument\"" + + if ! yunohost app list | grep -q "$oneapp" + then + yunohost tools update + yunohost app install $oneapp $oneargument + else + yunohost tools update + yunohost app upgrade $oneapp $oneargument + fi + ynh_app_setting_set --app=$app --key=require_$oneapp --value="1" + done +} + +# Remove other YunoHost apps +# +# apps will be removed only if no other apps need them. +# +# usage: ynh_remove_apps --apps="a_ynh b_ynh?domain=DOMAIN&path=PATH&admin=USER&language=fr&is_public=1&password=pass&port=666" +# | arg: -a, --apps= - apps to install +# +# Requires YunoHost version *.*.* or higher. +ynh_remove_apps() { + # Declare an array to define the options of this helper. + local legacy_args=a + local -A args_array=([a]=app=) + local app + # Manage arguments with getopts + ynh_handle_getopts_args "$@" + + # Split the list of apps in an array + local apps_list=($(echo $apps | tr " " "\n")) + + # For each app + for i in "${apps_list[@]}" + do + # Retrieve the name of the app (part before _ynh) + local oneapp=$(echo "$i" | awk -F'[_ynh]' '{print $1}') + [ -z "$oneapp" ] && ynh_die --message="You didn't provided a YunoHost app to remove" + + ynh_app_setting_delete --app=$app --key=require_$oneapp + + # List apps requiring $oneapp + local installed_apps=$(yunohost app list | grep -oP 'id: \K.*$') + local required_by="" + local installed_app_required_by="" + for installed_app in $installed_apps + do + local installed_app_required_by=$(ynh_app_setting_get --app=$installed_app --key="require_$oneapp") + if [[ $installed_app_required_by ]] + then + required_by="${installed_app_required_by}" + fi + installed_app_required_by="" + done + + # If $oneapp is no more required + if [[ ! $required_by ]] + then + # Remove $oneapp + ynh_print_info --message="Removing of $oneapp" + yunohost app remove $oneapp --purge + done +} \ No newline at end of file From 676973a18efc0c2f88fbb4b24d0134a45661963b Mon Sep 17 00:00:00 2001 From: Kayou Date: Fri, 4 Mar 2022 10:03:20 +0100 Subject: [PATCH 376/619] Fix unbound variable in ynh_script_progression --- helpers/logging | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/helpers/logging b/helpers/logging index e84a63e12..4601e0b39 100644 --- a/helpers/logging +++ b/helpers/logging @@ -250,7 +250,7 @@ ynh_script_progression() { weight=${weight:-1} # Always activate time when running inside CI tests - if [ $PACKAGE_CHECK_EXEC -eq 1 ]; then + if [ ${PACKAGE_CHECK_EXEC:-0} -eq 1 ]; then time=${time:-1} else time=${time:-0} From 266e890c46de5c9559a3587eb319abc34333707f Mon Sep 17 00:00:00 2001 From: yalh76 Date: Sat, 5 Mar 2022 14:31:02 +0100 Subject: [PATCH 377/619] Update app --- helpers/app | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/helpers/app b/helpers/app index 310d7d25c..f327a4629 100644 --- a/helpers/app +++ b/helpers/app @@ -89,4 +89,4 @@ ynh_remove_apps() { ynh_print_info --message="Removing of $oneapp" yunohost app remove $oneapp --purge done -} \ No newline at end of file +} From 6d7e77b360d7157041a7f6960606dfb49a857a68 Mon Sep 17 00:00:00 2001 From: Tagadda <36127788+Tagadda@users.noreply.github.com> Date: Sun, 6 Mar 2022 08:34:12 +0000 Subject: [PATCH 378/619] the -W flag doesn't exist for ping6 --- src/diagnosers/10-ip.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/diagnosers/10-ip.py b/src/diagnosers/10-ip.py index 247c486fc..655c5d032 100644 --- a/src/diagnosers/10-ip.py +++ b/src/diagnosers/10-ip.py @@ -176,7 +176,7 @@ class MyDiagnoser(Diagnoser): def ping(protocol, target): return ( os.system( - "ping%s -c1 -W 3 %s >/dev/null 2>/dev/null" + "ping%s -c1 %s >/dev/null 2>/dev/null" % ("" if protocol == 4 else "6", target) ) == 0 From 0b17cf754d092e5ca3815005dfe68289299ce9c7 Mon Sep 17 00:00:00 2001 From: yalh76 Date: Sun, 6 Mar 2022 15:23:05 +0100 Subject: [PATCH 379/619] Update app --- helpers/app | 1 + 1 file changed, 1 insertion(+) diff --git a/helpers/app b/helpers/app index f327a4629..ed5ddcb59 100644 --- a/helpers/app +++ b/helpers/app @@ -88,5 +88,6 @@ ynh_remove_apps() { # Remove $oneapp ynh_print_info --message="Removing of $oneapp" yunohost app remove $oneapp --purge + fi done } From 7e0f280b6941e22a6242046fa96217157ab86050 Mon Sep 17 00:00:00 2001 From: yalh76 Date: Sun, 6 Mar 2022 15:32:39 +0100 Subject: [PATCH 380/619] fix awk --- helpers/app | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/helpers/app b/helpers/app index ed5ddcb59..35d97851c 100644 --- a/helpers/app +++ b/helpers/app @@ -21,11 +21,11 @@ ynh_install_apps() { for i in "${apps_list[@]}" do # Retrieve the name of the app (part before _ynh) - local oneapp=$(echo "$i" | awk -F'[_ynh]' '{print $1}') + local oneapp=$(echo "$i" | awk -F'_ynh' '{print $1}') [ -z "$oneapp" ] && ynh_die --message="You didn't provided a YunoHost app to install" # Retrieve the arguments of the app (part after ?) - local oneargument=$(echo "$i" | awk -F'[?]' '{print $2}') + local oneargument=$(echo "$i" | awk -F'?' '{print $2}') [ ! -z "$oneargument" ] && oneargument="--args \"$oneargument\"" if ! yunohost app list | grep -q "$oneapp" @@ -63,7 +63,7 @@ ynh_remove_apps() { for i in "${apps_list[@]}" do # Retrieve the name of the app (part before _ynh) - local oneapp=$(echo "$i" | awk -F'[_ynh]' '{print $1}') + local oneapp=$(echo "$i" | awk -F'_ynh' '{print $1}') [ -z "$oneapp" ] && ynh_die --message="You didn't provided a YunoHost app to remove" ynh_app_setting_delete --app=$app --key=require_$oneapp From 4db5da1fbe66a92b096270812d781a1ee3a658bb Mon Sep 17 00:00:00 2001 From: Tagadda <36127788+Tagadda@users.noreply.github.com> Date: Tue, 8 Mar 2022 11:54:18 +0000 Subject: [PATCH 381/619] Revert "the -W flag doesn't exist for ping6" This reverts commit 6d7e77b360d7157041a7f6960606dfb49a857a68. --- src/diagnosers/10-ip.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/diagnosers/10-ip.py b/src/diagnosers/10-ip.py index 655c5d032..247c486fc 100644 --- a/src/diagnosers/10-ip.py +++ b/src/diagnosers/10-ip.py @@ -176,7 +176,7 @@ class MyDiagnoser(Diagnoser): def ping(protocol, target): return ( os.system( - "ping%s -c1 %s >/dev/null 2>/dev/null" + "ping%s -c1 -W 3 %s >/dev/null 2>/dev/null" % ("" if protocol == 4 else "6", target) ) == 0 From 0a0350f50935e3d65ba50751f73a74fc684b5f6e Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Tue, 8 Mar 2022 13:04:24 +0100 Subject: [PATCH 382/619] Update changelog for 11.0.5 --- debian/changelog | 17 +++++++++++++++++ maintenance/make_changelog.sh | 2 +- 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/debian/changelog b/debian/changelog index 7e35024c8..855f39c33 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,20 @@ +yunohost (11.0.5) testing; urgency=low + + - [mod] configpanel: improve 'filter' mechanism in AppQuestion ([#1429](https://github.com/YunoHost/yunohost/pull/1429)) + - [fix] postinstall: migrate_to_bullseye should be skipped on bullseye (de684425) + - [enh] security: Enable proc-hidepid by default ([#1433](https://github.com/YunoHost/yunohost/pull/1433)) + - [enh] nodejs: Update n to 8.0.2 ([#1435](https://github.com/YunoHost/yunohost/pull/1435)) + - [fix] postfix: sni tls_server_chain_sni_maps -> tls_server_sni_maps ([#1438](https://github.com/YunoHost/yunohost/pull/1438)) + - [fix] ynh_get_ram: Avoid grep issue with vmstat command ([#1440](https://github.com/YunoHost/yunohost/pull/1440)) + - [fix] ynh_exec_*: ensure the arg message is used ([#1442](https://github.com/YunoHost/yunohost/pull/1442)) + - [enh] helpers: Always activate --time when running inside CI tests ([#1444](https://github.com/YunoHost/yunohost/pull/1444)) + - [fix] helpers: unbound variable in ynh_script_progression (676973a1) + - [mod] quality: Several FIXME fix ([#1441](https://github.com/YunoHost/yunohost/pull/1441)) + + Thanks to all contributors <3 ! (ericgaspar, ewilly, Kayou, Melchisedech, Tagadda) + + -- Alexandre Aubin Tue, 08 Mar 2022 13:01:06 +0100 + yunohost (11.0.4) testing; urgency=low - [mod] certificate: drop unused 'staging' LE mode (4b78e8e3) diff --git a/maintenance/make_changelog.sh b/maintenance/make_changelog.sh index 038d4741d..44171c5b6 100644 --- a/maintenance/make_changelog.sh +++ b/maintenance/make_changelog.sh @@ -5,7 +5,7 @@ REPO_URL=$(git remote get-url origin) ME=$(git config --global --get user.name) EMAIL=$(git config --global --get user.email) -LAST_RELEASE=$(git tag --list | grep debian | tail -n 1) +LAST_RELEASE=$(git tag --list 'debian/11.*' | tail -n 1) echo "$REPO ($VERSION) $RELEASE; urgency=low" echo "" From f13eec176cb9a498abf096eff8dea3dfe5581c23 Mon Sep 17 00:00:00 2001 From: yunohost-bot Date: Tue, 8 Mar 2022 12:15:46 +0000 Subject: [PATCH 383/619] [CI] Format code with Black --- src/app.py | 2 +- src/regenconf.py | 4 +++- src/tools.py | 5 +---- 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/src/app.py b/src/app.py index e533489a3..1bd45a4f9 100644 --- a/src/app.py +++ b/src/app.py @@ -147,7 +147,7 @@ def app_info(app, full=False, upgradable=False): absolute_app_name, _ = _parse_app_instance_name(app) from_catalog = _load_apps_catalog()["apps"].get(absolute_app_name, {}) - ret["upgradable"] = _app_upgradable({** ret, "from_catalog": from_catalog}) + ret["upgradable"] = _app_upgradable({**ret, "from_catalog": from_catalog}) if ret["upgradable"] == "yes": ret["current_version"] = ret.get("version", "?") diff --git a/src/regenconf.py b/src/regenconf.py index c763fb6b6..e513a1506 100644 --- a/src/regenconf.py +++ b/src/regenconf.py @@ -140,7 +140,9 @@ def regen_conf( # though kinda tight-coupled to the postinstall logic :s if os.path.exists("/etc/yunohost/installed"): env["YNH_DOMAINS"] = " ".join(domain_list()["domains"]) - env["YNH_MAIN_DOMAINS"] = " ".join(domain_list(exclude_subdomains=True)["domains"]) + env["YNH_MAIN_DOMAINS"] = " ".join( + domain_list(exclude_subdomains=True)["domains"] + ) pre_result = hook_callback("conf_regen", names, pre_callback=_pre_call, env=env) diff --git a/src/tools.py b/src/tools.py index c642c65a5..bb7ded03a 100644 --- a/src/tools.py +++ b/src/tools.py @@ -36,10 +36,7 @@ from moulinette.utils.log import getActionLogger from moulinette.utils.process import call_async_output from moulinette.utils.filesystem import read_yaml, write_to_yaml, cp, mkdir, rm -from yunohost.app import ( - app_upgrade, - app_list -) +from yunohost.app import app_upgrade, app_list from yunohost.app_catalog import ( _initialize_apps_catalog_system, _update_apps_catalog, From a6c64b78d622e06028fed142a7177f9acc8d06ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20M?= Date: Mon, 31 Jan 2022 07:50:03 +0000 Subject: [PATCH 384/619] Translated using Weblate (Galician) Currently translated at 100.0% (687 of 687 strings) Translation: YunoHost/core Translate-URL: https://translate.yunohost.org/projects/yunohost/core/gl/ --- locales/gl.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/locales/gl.json b/locales/gl.json index e25c698c0..bd7de38a3 100644 --- a/locales/gl.json +++ b/locales/gl.json @@ -684,5 +684,6 @@ "migration_description_0022_php73_to_php74_pools": "Migrar ficheiros de configuración de php7.3-fpm 'pool' a php7.4", "migration_description_0023_postgresql_11_to_13": "Migrar bases de datos de PostgreSQL 11 a 13", "service_description_postgresql": "Almacena datos da app (Base datos SQL)", - "tools_upgrade": "Actualizando paquetes do sistema" + "tools_upgrade": "Actualizando paquetes do sistema", + "domain_config_default_app": "App por defecto" } From df87baf38b453571ef1e475678e86fc63169b5cd Mon Sep 17 00:00:00 2001 From: Mico Hauataluoma Date: Sat, 5 Feb 2022 19:58:49 +0000 Subject: [PATCH 385/619] Translated using Weblate (Finnish) Currently translated at 0.4% (3 of 687 strings) Translation: YunoHost/core Translate-URL: https://translate.yunohost.org/projects/yunohost/core/fi/ --- locales/fi.json | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/locales/fi.json b/locales/fi.json index 9e26dfeeb..fb123352e 100644 --- a/locales/fi.json +++ b/locales/fi.json @@ -1 +1,5 @@ -{} \ No newline at end of file +{ + "aborting": "Keskeytetään.", + "password_too_simple_1": "Salasanan pitää olla ainakin 8 merkin pituinen", + "action_invalid": "Virheellinen toiminta '{action}'" +} From e85660acf27e9f4d376af43dcf85575c2cad07b0 Mon Sep 17 00:00:00 2001 From: Tagada Date: Thu, 10 Feb 2022 19:21:20 +0000 Subject: [PATCH 386/619] Translated using Weblate (French) Currently translated at 100.0% (687 of 687 strings) Translation: YunoHost/core Translate-URL: https://translate.yunohost.org/projects/yunohost/core/fr/ --- locales/fr.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/locales/fr.json b/locales/fr.json index a14850b8b..c9bb309ca 100644 --- a/locales/fr.json +++ b/locales/fr.json @@ -276,7 +276,7 @@ "log_tools_shutdown": "Éteindre votre serveur", "log_tools_reboot": "Redémarrer votre serveur", "mail_unavailable": "Cette adresse d'email est réservée et doit être automatiquement attribuée au tout premier utilisateur", - "good_practices_about_admin_password": "Vous êtes sur le point de définir un nouveau mot de passe d'administration. Le mot de passe doit comporter au moins 8 caractères, bien qu'il soit recommandé d'utiliser un mot de passe plus long (c'est-à-dire une phrase secrète) et/ou d'utiliser une combinaison de caractères (majuscules, minuscules, chiffres et caractères spéciaux).", + "good_practices_about_admin_password": "Vous êtes sur le point de définir un nouveau mot de passe administrateur. Le mot de passe doit comporter au moins 8 caractères, bien qu'il soit recommandé d'utiliser un mot de passe plus long (c'est-à-dire une phrase secrète) et/ou d'utiliser une combinaison de caractères (majuscules, minuscules, chiffres et caractères spéciaux).", "good_practices_about_user_password": "Vous êtes sur le point de définir un nouveau mot de passe utilisateur. Le mot de passe doit comporter au moins 8 caractères, bien qu'il soit recommandé d'utiliser un mot de passe plus long (c'est-à-dire une phrase secrète) et/ou une combinaison de caractères (majuscules, minuscules, chiffres et caractères spéciaux).", "password_listed": "Ce mot de passe fait partie des mots de passe les plus utilisés dans le monde. Veuillez en choisir un autre moins commun et plus robuste.", "password_too_simple_1": "Le mot de passe doit comporter au moins 8 caractères", From 04909c9c5800f4f291f4e2f872cac7be9e8f30a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20M?= Date: Fri, 18 Feb 2022 14:10:18 +0000 Subject: [PATCH 387/619] Translated using Weblate (Galician) Currently translated at 100.0% (687 of 687 strings) Translation: YunoHost/core Translate-URL: https://translate.yunohost.org/projects/yunohost/core/gl/ --- locales/gl.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/locales/gl.json b/locales/gl.json index bd7de38a3..91e7f30d5 100644 --- a/locales/gl.json +++ b/locales/gl.json @@ -509,7 +509,7 @@ "service_disable_failed": "Non se puido iniciar o servizo '{service}' ao inicio.\n\nRexistro recente do servizo: {logs}", "service_description_yunohost-firewall": "Xestiona, abre e pecha a conexións dos portos aos servizos", "service_description_yunohost-api": "Xestiona as interaccións entre a interface web de YunoHost e o sistema", - "service_description_ssh": "Permíteche conectar de xeito remoto co teu servidor a través dun terminal (protocolo SSH)", + "service_description_ssh": "Permíteche acceder de xeito remoto ao teu servidor a través dun terminal (protocolo SSH)", "service_description_slapd": "Almacena usuarias, dominios e info relacionada", "service_description_rspamd": "Filtra spam e outras características relacionadas co email", "service_description_redis-server": "Unha base de datos especial utilizada para o acceso rápido a datos, cola de tarefas e comunicación entre programas", From e157a94de9a217a0e3130f1290ee86d00596932b Mon Sep 17 00:00:00 2001 From: punkrockgirl Date: Sat, 5 Mar 2022 16:43:04 +0000 Subject: [PATCH 388/619] Translated using Weblate (Basque) Currently translated at 100.0% (687 of 687 strings) Translation: YunoHost/core Translate-URL: https://translate.yunohost.org/projects/yunohost/core/eu/ --- locales/eu.json | 34 +++++++++++++++++++++++++++++----- 1 file changed, 29 insertions(+), 5 deletions(-) diff --git a/locales/eu.json b/locales/eu.json index 6cf1ed9f6..772268113 100644 --- a/locales/eu.json +++ b/locales/eu.json @@ -90,7 +90,7 @@ "config_forbidden_keyword": "'{keyword}' etiketa sistemak bakarrik erabil dezake; ezin da ID hau daukan baliorik sortu edo erabili.", "config_unknown_filter_key": "'{filter_key}' filtroaren kakoa ez da zuzena.", "config_validate_color": "RGB hamaseitar kolore bat izan behar da", - "diagnosis_cant_run_because_of_dep": "Ezinezkoa da diagnosia abiaraztea {category} atalerako {dep}(r)i lotutako arazo garrantzitsuek dirauen artean.", + "diagnosis_cant_run_because_of_dep": "Ezinezkoa da diagnosia abiaraztea {category} atalerako {dep}(r)i lotutako arazo garrantzitsuak / garrantzitsuek dirau(t)en artean.", "diagnosis_dns_missing_record": "Proposatutako DNS konfigurazioaren arabera, ondorengo informazioa gehitu beharko zenuke DNS erregistroan:
Mota: {type}
Izena: {name}
Balioa: {value}", "diagnosis_http_nginx_conf_not_up_to_date": "Domeinu honen nginx ezarpenak eskuz moldatu direla dirudi eta YunoHostek ezin du egiaztatu HTTP bidez eskuragarri dagoenik.", "ask_new_admin_password": "Administrazio-pasahitz berria", @@ -123,7 +123,7 @@ "app_remove_after_failed_install": "Aplikazioa ezabatzen instalatzerakoan errorea dela-eta…", "diagnosis_basesystem_ynh_single_version": "{package} bertsioa: {version} ({repo})", "diagnosis_failed_for_category": "'{category}' ataleko diagnostikoak kale egin du: {error}", - "diagnosis_cache_still_valid": "(Cachea oraindik baliogarria da {category} (ar)en diagnosirako. Ez da berrabiaraziko!)", + "diagnosis_cache_still_valid": "(Cachea oraindik baliogarria da {category} ataleko diagnosirako. Ez da berrabiaraziko!)", "diagnosis_found_errors": "{category} atalari dago(z)kion {errors} arazo aurkitu d(ir)a!", "diagnosis_found_warnings": "{category} atalari dagokion eta hobetu daite(z)keen {warnings} abisu aurkitu d(ir)a.", "diagnosis_ip_connected_ipv6": "Zerbitzaria IPv6 bidez dago internetera konektatuta!", @@ -432,7 +432,7 @@ "domain_created": "Sortu da domeinua", "domain_dyndns_already_subscribed": "Dagoeneko izena eman duzu DynDNS domeinu batean", "domain_hostname_failed": "Ezinezkoa izan da hostname berria ezartzea. Honek arazoak ekar litzake etorkizunean (litekeena da ondo egotea).", - "domain_uninstall_app_first": "Honako aplikazio hauek domeinuan instalatuta daude:\n{apps}\n\nMesedez, desinstalatu 'yunohost app remove the_app_id' ezekutatuz edo alda itzazu beste domeinu batera 'yunohost app change-url the_app_id' erabiliz domeinua ezabatu baino lehen", + "domain_uninstall_app_first": "Honako aplikazio hauek domeinuan instalatuta daude:\n{apps}\n\nMesedez, desinstalatu 'yunohost app remove the_app_id' exekutatuz edo alda itzazu beste domeinu batera 'yunohost app change-url the_app_id' erabiliz domeinua ezabatu baino lehen", "file_does_not_exist": "{path} fitxategia ez da existitzen.", "firewall_rules_cmd_failed": "Suebakiko arau batzuen exekuzioak huts egin du. Informazio gehiago erregistroetan.", "log_app_remove": "Ezabatu '{}' aplikazioa", @@ -661,5 +661,29 @@ "service_description_redis-server": "Datuak bizkor atzitzeko, zereginak lerratzeko eta programen arteko komunikaziorako datubase berezi bat da", "service_description_rspamd": "Spama bahetu eta posta elektronikoarekin zerikusia duten bestelako futzioen ardura dauka", "service_description_slapd": "Erabiltzaileak, domeinuak eta hauei lotutako informazioa gordetzen du", - "service_description_yunohost-api": "YunoHosten web-atariaren eta sistemaren arteko hartuemana kudeatzen du" -} \ No newline at end of file + "service_description_yunohost-api": "YunoHosten web-atariaren eta sistemaren arteko hartuemana kudeatzen du", + "domain_config_default_app": "Lehenetsitako aplikazioa", + "tools_upgrade": "Sistemaren paketeak eguneratzen", + "tools_upgrade_failed": "Ezin izan dira paketeak eguneratu: {packages_list}", + "service_description_postgresql": "Aplikazioen datuak gordetzen ditu (SQL datubasea)", + "migration_0021_start": "Bullseye (e)rako migrazioa abiarazten", + "migration_0021_patching_sources_list": "sources.lists petatxatzen…", + "migration_0021_main_upgrade": "Eguneraketa nagusia abiarazten…", + "migration_0021_still_on_buster_after_main_upgrade": "Zerbaitek huts egin du eguneraketa nagusian, badirudi sistemak oraindik darabilela Debian Buster", + "migration_0021_yunohost_upgrade": "YunoHosten muineko eguneraketa abiarazten…", + "migration_0021_not_buster": "Uneko Debian ez da Buster!", + "migration_0021_not_enough_free_space": "/var/-enerabilgarri dagoen espazioa oso txikia da! Guxtienez GB 1 izan beharko zenuke erabilgarri migrazioari ekiteko.", + "migration_0021_system_not_fully_up_to_date": "Sistema ez dago erabat egunean. Mesedez, egizu eguneraketa arrunt bat Bullseye-(e)rako migrazioa abiarazi baino lehen.", + "migration_0021_general_warning": "Mesedez, kontuan hartu migrazio hau konplexua dela. YunoHost taldeak ahalegin handia egin du probatzeko, baina hala ere migrazioak sistemaren zatiren bat edo aplikazioak apurt litzake.\n\nHorregatik, gomendagarria da:\n\t- Datu edo aplikazio garrantzitsuen babeskopia egitea. Informazio gehiago: https://yunohost.org/backup;\n\t- Ez izan presarik migrazioa abiaraztean: zure internet eta hardwarearen arabera ordu batzuk ere iraun lezake eguneraketa prozesuak.", + "migration_0021_modified_files": "Mesedez, kontuan hartu ondorengo fitxategiak eskuz moldatu omen direla eta eguneraketak berridatziko dituela: {manually_modified_files}", + "migration_0021_cleaning_up": "Cachea eta erabilgarriak ez diren paketeak garbitzen…", + "migration_0021_patch_yunohost_conflicts": "Arazo gatazkatsu bati adabakia jartzen…", + "migration_description_0021_migrate_to_bullseye": "Eguneratu sistema Debian Bullseye eta Yunohost 11.x-ra", + "global_settings_setting_security_ssh_password_authentication": "Baimendu pasahitz bidezko autentikazioa SSHrako", + "migration_0021_problematic_apps_warning": "Mesedez, kontuan izan ziur asko gatazkatsuak izango diren odorengo aplikazioak aurkitu direla. Badirudi ez zirela YunoHost aplikazioen katalogotik instalatu, edo ez daude 'badabiltza' bezala etiketatuak. Ondorioz, ezin da bermatu eguneratu ondoren funtzionatzen jarraituko dutenik: {problematic_apps}", + "migration_0023_not_enough_space": "{path}-en ez dago toki nahikorik migrazioa abiarazteko.", + "migration_0023_postgresql_11_not_installed": "PostgreSQL ez zegoen zure isteman instalatuta. Ez dago egitekorik.", + "migration_0023_postgresql_13_not_installed": "PostgreSQL 11 dago instalatuta baina PostgreSQL 13 ez!? Zerbait arraroa gertatu omen zaio zure sistemari :( …", + "migration_description_0022_php73_to_php74_pools": "Migratu php7.3-fpm 'pool' ezarpen-fitxategiak php7.4ra", + "migration_description_0023_postgresql_11_to_13": "Migratu datubaseak PostgreSQL 11tik 13ra" +} From 5d64954ada850eb1687789fe96f65ce90e5340c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Garbiec?= Date: Mon, 7 Mar 2022 21:04:09 +0000 Subject: [PATCH 389/619] Translated using Weblate (Polish) Currently translated at 1.4% (10 of 687 strings) Translation: YunoHost/core Translate-URL: https://translate.yunohost.org/projects/yunohost/core/pl/ --- locales/pl.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/locales/pl.json b/locales/pl.json index caf108367..79b39dd3f 100644 --- a/locales/pl.json +++ b/locales/pl.json @@ -7,6 +7,6 @@ "admin_password_changed": "Hasło administratora zostało zmienione", "admin_password_change_failed": "Nie można zmienić hasła", "admin_password": "Hasło administratora", - "action_invalid": "Nieprawidłowa operacja '{action}'", + "action_invalid": "Nieprawidłowe działanie '{action:s}'", "aborting": "Przerywanie." -} \ No newline at end of file +} From 93ed8efb1783be8b5fb49deb1acb2ffb790ba36a Mon Sep 17 00:00:00 2001 From: Kay0u Date: Tue, 8 Mar 2022 17:48:27 +0100 Subject: [PATCH 390/619] fix tests --- src/app.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/app.py b/src/app.py index 1bd45a4f9..46e1dd0f0 100644 --- a/src/app.py +++ b/src/app.py @@ -157,8 +157,8 @@ def app_info(app, full=False, upgradable=False): current_revision = settings.get("current_revision", "?")[:7] new_revision = from_catalog.get("git", {}).get("revision", "?")[:7] - ret["current_version"] = " ({current_revision})" - ret["new_version"] = " ({new_revision})" + ret["current_version"] = f" ({current_revision})" + ret["new_version"] = f" ({new_revision})" if not full: return ret From 5e87f7d47941b2d1f511fed1eca44927c370cc05 Mon Sep 17 00:00:00 2001 From: Kay0u Date: Tue, 8 Mar 2022 18:04:47 +0100 Subject: [PATCH 391/619] Trying to fix the dpkg warning: "/etc/bash_completion.d/yunohost is not a plain file or symlink" --- debian/preinst | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 debian/preinst diff --git a/debian/preinst b/debian/preinst new file mode 100644 index 000000000..01499a102 --- /dev/null +++ b/debian/preinst @@ -0,0 +1,11 @@ +#!/bin/bash + +set -e + +if [ -e /etc/bash_completion.d/yunohost ] && [ ! -d /etc/bash_completion.d/yunohost ]; then + rm /etc/bash_completion.d/yunohost +fi + +#DEBHELPER# + +exit 0 From f53e6af69865c25c4171075dbc83e11ed0fac2bc Mon Sep 17 00:00:00 2001 From: yunohost-bot Date: Tue, 8 Mar 2022 17:14:37 +0000 Subject: [PATCH 392/619] [CI] Reformat / remove stale translated strings --- locales/ca.json | 1 - locales/da.json | 2 +- locales/de.json | 1 - locales/en.json | 1 - locales/eo.json | 1 - locales/es.json | 1 - locales/eu.json | 3 +-- locales/fa.json | 1 - locales/fi.json | 2 +- locales/fr.json | 3 +-- locales/gl.json | 3 +-- locales/it.json | 1 - locales/oc.json | 1 - locales/pl.json | 2 +- locales/pt.json | 1 - locales/uk.json | 3 +-- locales/zh_Hans.json | 1 - 17 files changed, 7 insertions(+), 21 deletions(-) diff --git a/locales/ca.json b/locales/ca.json index b8d7a6718..b660032d2 100644 --- a/locales/ca.json +++ b/locales/ca.json @@ -307,7 +307,6 @@ "service_stopped": "S'ha aturat el servei «{service}»", "service_unknown": "Servei «{service}» desconegut", "ssowat_conf_generated": "S'ha regenerat la configuració SSOwat", - "ssowat_conf_updated": "S'ha actualitzat la configuració SSOwat", "system_upgraded": "S'ha actualitzat el sistema", "system_username_exists": "El nom d'usuari ja existeix en la llista d'usuaris de sistema", "this_action_broke_dpkg": "Aquesta acció a trencat dpkg/APT (els gestors de paquets del sistema)... Podeu intentar resoldre el problema connectant-vos amb SSH i executant «sudo apt install --fix-broken» i/o «sudo dpkg --configure -a».", diff --git a/locales/da.json b/locales/da.json index 0967ef424..9e26dfeeb 100644 --- a/locales/da.json +++ b/locales/da.json @@ -1 +1 @@ -{} +{} \ No newline at end of file diff --git a/locales/de.json b/locales/de.json index c1b97104c..dc7fb6e1d 100644 --- a/locales/de.json +++ b/locales/de.json @@ -108,7 +108,6 @@ "service_stopped": "Der Dienst '{service}' wurde erfolgreich beendet", "service_unknown": "Unbekannter Dienst '{service}'", "ssowat_conf_generated": "Konfiguration von SSOwat neu erstellt", - "ssowat_conf_updated": "Die Konfiguration von SSOwat aktualisiert", "system_upgraded": "System aktualisiert", "system_username_exists": "Der Benutzername existiert bereits in der Liste der System-Benutzer", "unbackup_app": "'{app}' wird nicht gespeichert werden", diff --git a/locales/en.json b/locales/en.json index e902ecc2a..2b2f10179 100644 --- a/locales/en.json +++ b/locales/en.json @@ -645,7 +645,6 @@ "show_tile_cant_be_enabled_for_regex": "You cannot enable 'show_tile' right now, because the URL for the permission '{permission}' is a regex", "show_tile_cant_be_enabled_for_url_not_defined": "You cannot enable 'show_tile' right now, because you must first define an URL for the permission '{permission}'", "ssowat_conf_generated": "SSOwat configuration regenerated", - "ssowat_conf_updated": "SSOwat configuration updated", "system_upgraded": "System upgraded", "system_username_exists": "Username already exists in the list of system users", "this_action_broke_dpkg": "This action broke dpkg/APT (the system package managers)... You can try to solve this issue by connecting through SSH and running `sudo apt install --fix-broken` and/or `sudo dpkg --configure -a`.", diff --git a/locales/eo.json b/locales/eo.json index 255d873d8..8ac32d4ce 100644 --- a/locales/eo.json +++ b/locales/eo.json @@ -269,7 +269,6 @@ "regenconf_file_remove_failed": "Ne povis forigi la agordodosieron '{conf}'", "not_enough_disk_space": "Ne sufiĉe libera spaco sur '{path}'", "dyndns_ip_update_failed": "Ne povis ĝisdatigi IP-adreson al DynDNS", - "ssowat_conf_updated": "SSOwat-agordo ĝisdatigita", "log_link_to_failed_log": "Ne povis plenumi la operacion '{desc}'. Bonvolu provizi la plenan protokolon de ĉi tiu operacio per alklakante ĉi tie por akiri helpon", "user_home_creation_failed": "Ne povis krei dosierujon \"home\" por uzanto", "pattern_backup_archive_name": "Devas esti valida dosiernomo kun maksimume 30 signoj, alfanombraj kaj -_. signoj nur", diff --git a/locales/es.json b/locales/es.json index 62831fc1b..200057560 100644 --- a/locales/es.json +++ b/locales/es.json @@ -118,7 +118,6 @@ "service_stopped": "Servicio '{service}' detenido", "service_unknown": "Servicio desconocido '{service}'", "ssowat_conf_generated": "Generada la configuración de SSOwat", - "ssowat_conf_updated": "Actualizada la configuración de SSOwat", "system_upgraded": "Sistema actualizado", "system_username_exists": "El nombre de usuario ya existe en la lista de usuarios del sistema", "unbackup_app": "La aplicación '{app}' no se guardará", diff --git a/locales/eu.json b/locales/eu.json index 772268113..e0ce226d5 100644 --- a/locales/eu.json +++ b/locales/eu.json @@ -517,7 +517,6 @@ "service_restart_failed": "Ezin izan da '{service}' zerbitzua berrabiarazi\n\nZerbitzuen azken erregistroak: {logs}", "service_restarted": "'{service}' zerbitzua berrabiarazi da", "service_start_failed": "Ezin izan da '{service}' zerbitzua abiarazi\n\nZerbitzuen azken erregistroak: {logs}", - "ssowat_conf_updated": "SSOwat ezarpenak eguneratu dira", "update_apt_cache_failed": "Ezin da APT Debian-en pakete kudeatzailearen cachea eguneratu. Hemen dituzu sources.list fitxategiaren lerroak, arazoa identifikatzeko baliagarria izan dezakezuna:\n{sourceslist}", "update_apt_cache_warning": "Zerbaitek huts egin du APT Debian-en pakete kudeatzailearen cachea eguneratzean. Hemen dituzu sources.list fitxategiaren lerroak, arazoa identifikatzeko baliagarria izan dezakezuna:\n{sourceslist}", "user_created": "Erabiltzailea sortu da", @@ -686,4 +685,4 @@ "migration_0023_postgresql_13_not_installed": "PostgreSQL 11 dago instalatuta baina PostgreSQL 13 ez!? Zerbait arraroa gertatu omen zaio zure sistemari :( …", "migration_description_0022_php73_to_php74_pools": "Migratu php7.3-fpm 'pool' ezarpen-fitxategiak php7.4ra", "migration_description_0023_postgresql_11_to_13": "Migratu datubaseak PostgreSQL 11tik 13ra" -} +} \ No newline at end of file diff --git a/locales/fa.json b/locales/fa.json index fa5045fbb..599ab1ea7 100644 --- a/locales/fa.json +++ b/locales/fa.json @@ -499,7 +499,6 @@ "this_action_broke_dpkg": "این اقدام dpkg/APT (مدیران بسته های سیستم) را خراب کرد... می توانید با اتصال از طریق SSH و اجرای فرمان `sudo apt install --fix -break` و/یا` sudo dpkg --configure -a` این مشکل را حل کنید.", "system_username_exists": "نام کاربری قبلاً در لیست کاربران سیستم وجود دارد", "system_upgraded": "سیستم ارتقا یافت", - "ssowat_conf_updated": "پیکربندی SSOwat به روزرسانی شد", "ssowat_conf_generated": "پیکربندی SSOwat بازسازی شد", "show_tile_cant_be_enabled_for_regex": "شما نمی توانید \"show_tile\" را درست فعال کنید ، چرا که آدرس اینترنتی مجوز '{permission}' یک عبارت منظم است", "show_tile_cant_be_enabled_for_url_not_defined": "شما نمی توانید \"show_tile\" را در حال حاضر فعال کنید ، زیرا ابتدا باید یک آدرس اینترنتی برای مجوز '{permission}' تعریف کنید", diff --git a/locales/fi.json b/locales/fi.json index fb123352e..05fe2e9a1 100644 --- a/locales/fi.json +++ b/locales/fi.json @@ -2,4 +2,4 @@ "aborting": "Keskeytetään.", "password_too_simple_1": "Salasanan pitää olla ainakin 8 merkin pituinen", "action_invalid": "Virheellinen toiminta '{action}'" -} +} \ No newline at end of file diff --git a/locales/fr.json b/locales/fr.json index c9bb309ca..833d9554b 100644 --- a/locales/fr.json +++ b/locales/fr.json @@ -120,7 +120,6 @@ "service_stopped": "Le service '{service}' a été arrêté", "service_unknown": "Le service '{service}' est inconnu", "ssowat_conf_generated": "La configuration de SSOwat a été regénérée", - "ssowat_conf_updated": "La configuration de SSOwat a été mise à jour", "system_upgraded": "Système mis à jour", "system_username_exists": "Ce nom d'utilisateur existe déjà dans les utilisateurs système", "unbackup_app": "'{app}' ne sera pas sauvegardée", @@ -686,4 +685,4 @@ "tools_upgrade_failed": "Impossible de mettre à jour les paquets : {packages_list}", "migration_0023_not_enough_space": "Prévoyez suffisamment d'espace disponible dans {path} pour exécuter la migration.", "migration_0023_postgresql_11_not_installed": "PostgreSQL n'a pas été installé sur votre système. Il n'y a rien à faire." -} +} \ No newline at end of file diff --git a/locales/gl.json b/locales/gl.json index 91e7f30d5..4a77645d6 100644 --- a/locales/gl.json +++ b/locales/gl.json @@ -573,7 +573,6 @@ "this_action_broke_dpkg": "Esta acción rachou dpkg/APT (xestores de paquetes do sistema)... Podes intentar resolver o problema conectando a través de SSH e executando `sudo apt install --fix-broken`e/ou `sudo dpkg --configure -a`.", "system_username_exists": "Xa existe este nome de usuaria na lista de usuarias do sistema", "system_upgraded": "Sistema actualizado", - "ssowat_conf_updated": "Actualizada a configuración SSOwat", "ssowat_conf_generated": "Rexenerada a configuración para SSOwat", "show_tile_cant_be_enabled_for_regex": "Non podes activar 'show_tile' neste intre, porque o URL para o permiso '{permission}' é un regex", "show_tile_cant_be_enabled_for_url_not_defined": "Non podes activar 'show_tile' neste intre, primeiro tes que definir un URL para o permiso '{permission}'", @@ -686,4 +685,4 @@ "service_description_postgresql": "Almacena datos da app (Base datos SQL)", "tools_upgrade": "Actualizando paquetes do sistema", "domain_config_default_app": "App por defecto" -} +} \ No newline at end of file diff --git a/locales/it.json b/locales/it.json index 5c4a19df7..844b756ea 100644 --- a/locales/it.json +++ b/locales/it.json @@ -125,7 +125,6 @@ "service_stopped": "Servizio '{service}' fermato", "service_unknown": "Servizio '{service}' sconosciuto", "ssowat_conf_generated": "La configurazione SSOwat rigenerata", - "ssowat_conf_updated": "Configurazione SSOwat aggiornata", "system_upgraded": "Sistema aggiornato", "unbackup_app": "{app} non verrà salvata", "unexpected_error": "È successo qualcosa di inatteso: {error}", diff --git a/locales/oc.json b/locales/oc.json index 6901b0f0b..a6afa32e6 100644 --- a/locales/oc.json +++ b/locales/oc.json @@ -172,7 +172,6 @@ "service_started": "Lo servici « {service} » es aviat", "service_stop_failed": "Impossible d’arrestar lo servici « {service} »↵\n\nJornals recents : {logs}", "ssowat_conf_generated": "La configuracion SSowat es generada", - "ssowat_conf_updated": "La configuracion SSOwat es estada actualizada", "system_upgraded": "Lo sistèma es estat actualizat", "system_username_exists": "Lo nom d’utilizaire existís ja dins los utilizaires sistèma", "unexpected_error": "Una error inesperada s’es producha", diff --git a/locales/pl.json b/locales/pl.json index 79b39dd3f..01cd71471 100644 --- a/locales/pl.json +++ b/locales/pl.json @@ -9,4 +9,4 @@ "admin_password": "Hasło administratora", "action_invalid": "Nieprawidłowe działanie '{action:s}'", "aborting": "Przerywanie." -} +} \ No newline at end of file diff --git a/locales/pt.json b/locales/pt.json index 681bafb73..6b462bb6f 100644 --- a/locales/pt.json +++ b/locales/pt.json @@ -72,7 +72,6 @@ "service_stopped": "O serviço '{service}' foi parado com êxito", "service_unknown": "Serviço desconhecido '{service}'", "ssowat_conf_generated": "Configuração SSOwat gerada com êxito", - "ssowat_conf_updated": "Configuração persistente SSOwat atualizada com êxito", "system_upgraded": "Sistema atualizado com êxito", "system_username_exists": "O utilizador já existe no registo do sistema", "unexpected_error": "Ocorreu um erro inesperado", diff --git a/locales/uk.json b/locales/uk.json index ae363bd35..9a32a597b 100644 --- a/locales/uk.json +++ b/locales/uk.json @@ -405,7 +405,6 @@ "this_action_broke_dpkg": "Ця дія порушила dpkg/APT (системні менеджери пакетів)... Ви можете спробувати вирішити цю проблему, під'єднавшись по SSH і запустивши `sudo apt install --fix-broken` та/або `sudo dpkg --configure -a`.", "system_username_exists": "Ім'я користувача вже існує в списку користувачів системи", "system_upgraded": "Систему оновлено", - "ssowat_conf_updated": "Конфігурацію SSOwat оновлено", "ssowat_conf_generated": "Конфігурацію SSOwat перестворено", "show_tile_cant_be_enabled_for_regex": "Ви не можете увімкнути 'show_tile' прямо зараз, тому що URL для дозволу '{permission}' являє собою регулярний вираз", "show_tile_cant_be_enabled_for_url_not_defined": "Ви не можете увімкнути 'show_tile' прямо зараз, тому що спочатку ви повинні визначити URL для дозволу '{permission}'", @@ -686,4 +685,4 @@ "migration_0023_not_enough_space": "Звільніть достатньо місця в {path} для виконання міграції.", "migration_0023_postgresql_11_not_installed": "PostgreSQL не було встановлено у вашій системі. Нічого робити.", "migration_description_0022_php73_to_php74_pools": "Перенесення конфігураційних файлів php7.3-fpm 'pool' на php7.4" -} +} \ No newline at end of file diff --git a/locales/zh_Hans.json b/locales/zh_Hans.json index a05a44437..2daf45483 100644 --- a/locales/zh_Hans.json +++ b/locales/zh_Hans.json @@ -240,7 +240,6 @@ "this_action_broke_dpkg": "此操作破坏了dpkg / APT(系统软件包管理器)...您可以尝试通过SSH连接并运行`sudo apt install --fix-broken`和/或`sudo dpkg --configure -a`来解决此问题。", "system_username_exists": "用户名已存在于系统用户列表中", "system_upgraded": "系统升级", - "ssowat_conf_updated": "SSOwat配置已更新", "ssowat_conf_generated": "SSOwat配置已重新生成", "show_tile_cant_be_enabled_for_regex": "你不能启用'show_tile',因为权限'{permission}'的URL是一个重合词", "show_tile_cant_be_enabled_for_url_not_defined": "您现在无法启用 'show_tile' ,因为您必须先为权限'{permission}'定义一个URL", From 33bf3b2a3a8f87af090d9b0427c6bf230f450b2f Mon Sep 17 00:00:00 2001 From: Kay0u Date: Tue, 8 Mar 2022 19:49:16 +0100 Subject: [PATCH 393/619] Trying to fix the dpkg warning 2nd attempt --- debian/preinst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/debian/preinst b/debian/preinst index 01499a102..7a70f15d0 100644 --- a/debian/preinst +++ b/debian/preinst @@ -2,8 +2,8 @@ set -e -if [ -e /etc/bash_completion.d/yunohost ] && [ ! -d /etc/bash_completion.d/yunohost ]; then - rm /etc/bash_completion.d/yunohost +if [ -d /etc/bash_completion.d/yunohost ]; then + rm -fr /etc/bash_completion.d/yunohost fi #DEBHELPER# From 756f561ddda1e2ebfccea9a730cd7ba73adec3ca Mon Sep 17 00:00:00 2001 From: yalh76 Date: Wed, 16 Mar 2022 22:45:34 +0100 Subject: [PATCH 394/619] Update helpers/app Co-authored-by: Alexandre Aubin --- helpers/app | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/helpers/app b/helpers/app index 35d97851c..9d183cb2d 100644 --- a/helpers/app +++ b/helpers/app @@ -2,7 +2,7 @@ # Install other YunoHost apps # -# usage: ynh_install_apps --apps="a_ynh b_ynh?domain=DOMAIN&path=PATH&admin=USER&language=fr&is_public=1&password=pass&port=666" +# usage: ynh_install_apps --apps="appfoo appbar?domain=DOMAIN&path=PATH&admin=USER&language=fr&is_public=1&password=pass&port=666" # | arg: -a, --apps= - apps to install # # Requires YunoHost version *.*.* or higher. From fb53a69dd0a8cd88efb31a1d0f1596ae6446858b Mon Sep 17 00:00:00 2001 From: yalh76 Date: Wed, 16 Mar 2022 22:45:42 +0100 Subject: [PATCH 395/619] Update helpers/app Co-authored-by: Alexandre Aubin --- helpers/app | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/helpers/app b/helpers/app index 9d183cb2d..8745e2363 100644 --- a/helpers/app +++ b/helpers/app @@ -18,14 +18,14 @@ ynh_install_apps() { local apps_list=($(echo $apps | tr " " "\n")) # For each app - for i in "${apps_list[@]}" + for oneapp_and_its_args in "${apps_list[@]}" do # Retrieve the name of the app (part before _ynh) - local oneapp=$(echo "$i" | awk -F'_ynh' '{print $1}') + local oneapp=$(echo "$oneapp_and_its_args" | awk -F'?' '{print $1}') [ -z "$oneapp" ] && ynh_die --message="You didn't provided a YunoHost app to install" # Retrieve the arguments of the app (part after ?) - local oneargument=$(echo "$i" | awk -F'?' '{print $2}') + local oneargument=$(echo "$oneapp_and_its_args" | awk -F'?' '{print $2}') [ ! -z "$oneargument" ] && oneargument="--args \"$oneargument\"" if ! yunohost app list | grep -q "$oneapp" From 1386466d7e22c7299ced142fe9c1feaf74e2c3d9 Mon Sep 17 00:00:00 2001 From: yalh76 Date: Wed, 16 Mar 2022 22:46:25 +0100 Subject: [PATCH 396/619] Update helpers/app Co-authored-by: Alexandre Aubin --- helpers/app | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/helpers/app b/helpers/app index 8745e2363..9d2af2455 100644 --- a/helpers/app +++ b/helpers/app @@ -63,7 +63,7 @@ ynh_remove_apps() { for i in "${apps_list[@]}" do # Retrieve the name of the app (part before _ynh) - local oneapp=$(echo "$i" | awk -F'_ynh' '{print $1}') + local oneapp=$(echo "$i" | awk -F'?' '{print $1}') [ -z "$oneapp" ] && ynh_die --message="You didn't provided a YunoHost app to remove" ynh_app_setting_delete --app=$app --key=require_$oneapp From 756e3b292b6e03d4ff23fb028801e9a66356e801 Mon Sep 17 00:00:00 2001 From: yalh76 Date: Wed, 16 Mar 2022 22:47:33 +0100 Subject: [PATCH 397/619] Update helpers/app Co-authored-by: Alexandre Aubin --- helpers/app | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/helpers/app b/helpers/app index 9d2af2455..6a646571d 100644 --- a/helpers/app +++ b/helpers/app @@ -83,7 +83,7 @@ ynh_remove_apps() { done # If $oneapp is no more required - if [[ ! $required_by ]] + if [[ -z "$required_by" ]] then # Remove $oneapp ynh_print_info --message="Removing of $oneapp" From 3bb8ca2e21c9cf8fe8da90bea589bb1102e3f75e Mon Sep 17 00:00:00 2001 From: yalh76 Date: Wed, 16 Mar 2022 22:47:43 +0100 Subject: [PATCH 398/619] Update helpers/app Co-authored-by: Alexandre Aubin --- helpers/app | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/helpers/app b/helpers/app index 6a646571d..6ad8e20c9 100644 --- a/helpers/app +++ b/helpers/app @@ -75,7 +75,7 @@ ynh_remove_apps() { for installed_app in $installed_apps do local installed_app_required_by=$(ynh_app_setting_get --app=$installed_app --key="require_$oneapp") - if [[ $installed_app_required_by ]] + if [[ -n "$installed_app_required_by" ]] then required_by="${installed_app_required_by}" fi From 5736aadd10098bdc108cab524a6a5c4204e8176b Mon Sep 17 00:00:00 2001 From: yalh76 Date: Wed, 16 Mar 2022 23:45:09 +0100 Subject: [PATCH 399/619] typo --- helpers/app | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/helpers/app b/helpers/app index 6ad8e20c9..0908a1236 100644 --- a/helpers/app +++ b/helpers/app @@ -44,7 +44,7 @@ ynh_install_apps() { # # apps will be removed only if no other apps need them. # -# usage: ynh_remove_apps --apps="a_ynh b_ynh?domain=DOMAIN&path=PATH&admin=USER&language=fr&is_public=1&password=pass&port=666" +# usage: ynh_remove_apps --apps="appfoo appbar?domain=DOMAIN&path=PATH&admin=USER&language=fr&is_public=1&password=pass&port=666" # | arg: -a, --apps= - apps to install # # Requires YunoHost version *.*.* or higher. From 700f671527bccf004eccbd2eef106355140e1f46 Mon Sep 17 00:00:00 2001 From: yalh76 Date: Wed, 16 Mar 2022 23:45:43 +0100 Subject: [PATCH 400/619] better yunohost app list --- helpers/app | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/helpers/app b/helpers/app index 0908a1236..4b7628acc 100644 --- a/helpers/app +++ b/helpers/app @@ -28,7 +28,7 @@ ynh_install_apps() { local oneargument=$(echo "$oneapp_and_its_args" | awk -F'?' '{print $2}') [ ! -z "$oneargument" ] && oneargument="--args \"$oneargument\"" - if ! yunohost app list | grep -q "$oneapp" + if ! yunohost app list --output-as json --quiet | jq -e --arg id $oneapp '.apps[] | select(.id == $id)' >/dev/null then yunohost tools update yunohost app install $oneapp $oneargument From ca54e3a61d74b360d00274f0df4c6f9ec03583c5 Mon Sep 17 00:00:00 2001 From: yalh76 Date: Wed, 16 Mar 2022 23:48:47 +0100 Subject: [PATCH 401/619] Better yunohost tools update --- helpers/app | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/helpers/app b/helpers/app index 4b7628acc..70243550b 100644 --- a/helpers/app +++ b/helpers/app @@ -28,12 +28,12 @@ ynh_install_apps() { local oneargument=$(echo "$oneapp_and_its_args" | awk -F'?' '{print $2}') [ ! -z "$oneargument" ] && oneargument="--args \"$oneargument\"" + # Installing or upgrading the app + yunohost tools update apps if ! yunohost app list --output-as json --quiet | jq -e --arg id $oneapp '.apps[] | select(.id == $id)' >/dev/null then - yunohost tools update yunohost app install $oneapp $oneargument else - yunohost tools update yunohost app upgrade $oneapp $oneargument fi ynh_app_setting_set --app=$app --key=require_$oneapp --value="1" From 85ddb4a8a0c36650dd3ebbae902ece000af2d89a Mon Sep 17 00:00:00 2001 From: yalh76 Date: Thu, 17 Mar 2022 00:03:38 +0100 Subject: [PATCH 402/619] better yunohost app list --- helpers/app | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/helpers/app b/helpers/app index 70243550b..67479ec09 100644 --- a/helpers/app +++ b/helpers/app @@ -69,7 +69,7 @@ ynh_remove_apps() { ynh_app_setting_delete --app=$app --key=require_$oneapp # List apps requiring $oneapp - local installed_apps=$(yunohost app list | grep -oP 'id: \K.*$') + local installed_apps=$(yunohost app list --output-as json --quiet | jq -r .apps[].id) local required_by="" local installed_app_required_by="" for installed_app in $installed_apps From a07328c99ddd4a2162df77df93cb2bb1263d872c Mon Sep 17 00:00:00 2001 From: yalh76 Date: Thu, 17 Mar 2022 19:24:03 +0100 Subject: [PATCH 403/619] removal simplification --- helpers/app | 126 ++++++++++++++++++++++++++++++---------------------- 1 file changed, 72 insertions(+), 54 deletions(-) diff --git a/helpers/app b/helpers/app index 67479ec09..d272194af 100644 --- a/helpers/app +++ b/helpers/app @@ -1,6 +1,6 @@ #!/bin/bash -# Install other YunoHost apps +# Install other YunoHost apps when they are not multi-instance # # usage: ynh_install_apps --apps="appfoo appbar?domain=DOMAIN&path=PATH&admin=USER&language=fr&is_public=1&password=pass&port=666" # | arg: -a, --apps= - apps to install @@ -16,78 +16,96 @@ ynh_install_apps() { # Split the list of apps in an array local apps_list=($(echo $apps | tr " " "\n")) + local apps_dependencies="" # For each app - for oneapp_and_its_args in "${apps_list[@]}" + for one_app_and_its_args in "${apps_list[@]}" do - # Retrieve the name of the app (part before _ynh) - local oneapp=$(echo "$oneapp_and_its_args" | awk -F'?' '{print $1}') - [ -z "$oneapp" ] && ynh_die --message="You didn't provided a YunoHost app to install" + # Retrieve the name of the app (part before ?) + local one_app=$(echo "$one_app_and_its_args" | awk -F'?' '{print $1}') + [ -z "$one_app" ] && ynh_die --message="You didn't provided a YunoHost app to install" - # Retrieve the arguments of the app (part after ?) - local oneargument=$(echo "$oneapp_and_its_args" | awk -F'?' '{print $2}') - [ ! -z "$oneargument" ] && oneargument="--args \"$oneargument\"" - - # Installing or upgrading the app yunohost tools update apps - if ! yunohost app list --output-as json --quiet | jq -e --arg id $oneapp '.apps[] | select(.id == $id)' >/dev/null + + # Installing or upgrading the app depending if it's installed or not + if ! yunohost app list --output-as json --quiet | jq -e --arg id $one_app '.apps[] | select(.id == $id)' >/dev/null then - yunohost app install $oneapp $oneargument + # Retrieve the arguments of the app (part after ?) + local one_argument=$(echo "$one_app_and_its_args" | awk -F'?' '{print $2}') + [ ! -z "$one_argument" ] && one_argument="--args \"$one_argument\"" + + # Install the app with its arguments + yunohost app install $one_app $one_argument else - yunohost app upgrade $oneapp $oneargument + # Upgrade the app + yunohost app upgrade $one_app + fi + + if [ ! -z "$apps_dependencies" ] + then + apps_dependencies="$apps_dependencies, $one_app" + else + apps_dependencies="$one_app" fi - ynh_app_setting_set --app=$app --key=require_$oneapp --value="1" done + + ynh_app_setting_set --app=$app --key=apps_dependencies --value="$apps_dependencies" } # Remove other YunoHost apps # -# apps will be removed only if no other apps need them. +# Other YunoHost apps will be removed only if no other apps need them. # -# usage: ynh_remove_apps --apps="appfoo appbar?domain=DOMAIN&path=PATH&admin=USER&language=fr&is_public=1&password=pass&port=666" -# | arg: -a, --apps= - apps to install +# usage: ynh_remove_apps # # Requires YunoHost version *.*.* or higher. ynh_remove_apps() { - # Declare an array to define the options of this helper. - local legacy_args=a - local -A args_array=([a]=app=) - local app - # Manage arguments with getopts - ynh_handle_getopts_args "$@" - # Split the list of apps in an array - local apps_list=($(echo $apps | tr " " "\n")) - - # For each app - for i in "${apps_list[@]}" - do - # Retrieve the name of the app (part before _ynh) - local oneapp=$(echo "$i" | awk -F'?' '{print $1}') - [ -z "$oneapp" ] && ynh_die --message="You didn't provided a YunoHost app to remove" + # Retrieve the apps dependencies of the app + local apps_dependencies=$(ynh_app_setting_get --app=$app --key=apps_dependencies) || true + ynh_app_setting_delete --app=$app --key=apps_dependencies || true - ynh_app_setting_delete --app=$app --key=require_$oneapp - - # List apps requiring $oneapp - local installed_apps=$(yunohost app list --output-as json --quiet | jq -r .apps[].id) - local required_by="" - local installed_app_required_by="" - for installed_app in $installed_apps + if [ ! -z "$apps_dependencies" ] + then + # Split the list of apps dependencies in an array + local apps_dependencies_list=($(echo $apps_dependencies | tr ", " "\n")) + + # For each apps dependencies + for one_app in "${apps_dependencies_list[@]}" do - local installed_app_required_by=$(ynh_app_setting_get --app=$installed_app --key="require_$oneapp") - if [[ -n "$installed_app_required_by" ]] - then - required_by="${installed_app_required_by}" - fi - installed_app_required_by="" - done + # Retrieve the list of installed apps + local installed_apps_list=$(yunohost app list --output-as json --quiet | jq -r .apps[].id) + local required_by="" + local installed_app_required_by="" - # If $oneapp is no more required - if [[ -z "$required_by" ]] - then - # Remove $oneapp - ynh_print_info --message="Removing of $oneapp" - yunohost app remove $oneapp --purge - fi - done + # For each other installed app + for one_installed_app in $installed_apps_list + do + # Retrieve the other apps dependencies + one_installed_apps_dependencies=$(ynh_app_setting_get --app=$one_installed_app --key=apps_dependencies) + if [ ! -z "$one_installed_apps_dependencies" ] + then + one_installed_apps_dependencies_list=($(echo $one_installed_apps_dependencies | tr ", " "\n")) + + # For each dependency of the other apps + for one_installed_app_dependency in "${one_installed_apps_dependencies_list[@]}" + do + if [[ $one_installed_app_dependency == $one_app ]]; then + required_by="$required_by $one_installed_app" + fi + done + fi + done + + # If $one_app is no more required + if [[ -z "$required_by" ]] + then + # Remove $one_app + ynh_print_info --message="Removing of $one_app" + yunohost app remove $one_app --purge + else + ynh_print_info --message="$one_app was not removed because it's still required by${required_by}" + fi + done + fi } From 1b047ba04973c3bd83dbd0b165fb99029555873b Mon Sep 17 00:00:00 2001 From: ljf Date: Wed, 23 Mar 2022 01:05:21 +0100 Subject: [PATCH 404/619] [fix] Config Panel edits partially config of the first instance --- src/app.py | 45 +++++++++++++++++++++++---------------------- 1 file changed, 23 insertions(+), 22 deletions(-) diff --git a/src/app.py b/src/app.py index 46e1dd0f0..3b60deb6c 100644 --- a/src/app.py +++ b/src/app.py @@ -293,8 +293,8 @@ def app_map(app=None, raw=False, user=None): permissions = user_permission_list(full=True, absolute_urls=True, apps=apps)[ "permissions" ] - for app_id in apps: - app_settings = _get_app_settings(app_id) + for app in apps: + app_settings = _get_app_settings(app) if not app_settings: continue if "domain" not in app_settings: @@ -310,19 +310,19 @@ def app_map(app=None, raw=False, user=None): continue # Users must at least have access to the main permission to have access to extra permissions if user: - if not app_id + ".main" in permissions: + if not app + ".main" in permissions: logger.warning( - f"Uhoh, no main permission was found for app {app_id} ... sounds like an app was only partially removed due to another bug :/" + f"Uhoh, no main permission was found for app {app} ... sounds like an app was only partially removed due to another bug :/" ) continue - main_perm = permissions[app_id + ".main"] + main_perm = permissions[app + ".main"] if user not in main_perm["corresponding_users"]: continue this_app_perms = { p: i for p, i in permissions.items() - if p.startswith(app_id + ".") and (i["url"] or i["additional_urls"]) + if p.startswith(app + ".") and (i["url"] or i["additional_urls"]) } for perm_name, perm_info in this_app_perms.items(): @@ -362,7 +362,7 @@ def app_map(app=None, raw=False, user=None): perm_path = "/" if perm_domain not in result: result[perm_domain] = {} - result[perm_domain][perm_path] = {"label": perm_label, "id": app_id} + result[perm_domain][perm_path] = {"label": perm_label, "id": app} return result @@ -1592,15 +1592,16 @@ ynh_app_config_run $1 # Call config script to extract current values logger.debug(f"Calling '{action}' action from config script") - app_id, app_instance_nb = _parse_app_instance_name(self.entity) - settings = _get_app_settings(app_id) + app = self.entity + app_id, app_instance_nb = _parse_app_instance_name(app) + settings = _get_app_settings(app) env.update( { "app_id": app_id, - "app": self.entity, + "app": app, "app_instance_nb": str(app_instance_nb), "final_path": settings.get("final_path", ""), - "YNH_APP_BASEDIR": os.path.join(APPS_SETTING_PATH, self.entity), + "YNH_APP_BASEDIR": os.path.join(APPS_SETTING_PATH, app), } ) @@ -1698,20 +1699,20 @@ def _get_app_actions(app_id): return None -def _get_app_settings(app_id): +def _get_app_settings(app): """ Get settings of an installed app Keyword arguments: - app_id -- The app id + app -- The app id (like nextcloud__2) """ - if not _is_installed(app_id): + if not _is_installed(app): raise YunohostValidationError( - "app_not_installed", app=app_id, all_apps=_get_all_installed_apps_id() + "app_not_installed", app=app, all_apps=_get_all_installed_apps_id() ) try: - with open(os.path.join(APPS_SETTING_PATH, app_id, "settings.yml")) as f: + with open(os.path.join(APPS_SETTING_PATH, app, "settings.yml")) as f: settings = yaml.safe_load(f) # If label contains unicode char, this may later trigger issues when building strings... # FIXME: this should be propagated to read_yaml so that this fix applies everywhere I think... @@ -1729,25 +1730,25 @@ def _get_app_settings(app_id): or not settings.get("path", "/").startswith("/") ): settings["path"] = "/" + settings["path"].strip("/") - _set_app_settings(app_id, settings) + _set_app_settings(app, settings) - if app_id == settings["id"]: + if app == settings["id"]: return settings except (IOError, TypeError, KeyError): - logger.error(m18n.n("app_not_correctly_installed", app=app_id)) + logger.error(m18n.n("app_not_correctly_installed", app=app)) return {} -def _set_app_settings(app_id, settings): +def _set_app_settings(app, settings): """ Set settings of an app Keyword arguments: - app_id -- The app id + app_id -- The app id (like nextcloud__2) settings -- Dict with app settings """ - with open(os.path.join(APPS_SETTING_PATH, app_id, "settings.yml"), "w") as f: + with open(os.path.join(APPS_SETTING_PATH, app, "settings.yml"), "w") as f: yaml.safe_dump(settings, f, default_flow_style=False) From 8296e354355af0f3d68354c498d992d28a5568d6 Mon Sep 17 00:00:00 2001 From: ljf Date: Wed, 23 Mar 2022 01:06:40 +0100 Subject: [PATCH 405/619] Revert "[fix] Config Panel edits partially config of the first instance" This reverts commit 1b047ba04973c3bd83dbd0b165fb99029555873b. --- src/app.py | 45 ++++++++++++++++++++++----------------------- 1 file changed, 22 insertions(+), 23 deletions(-) diff --git a/src/app.py b/src/app.py index 3b60deb6c..46e1dd0f0 100644 --- a/src/app.py +++ b/src/app.py @@ -293,8 +293,8 @@ def app_map(app=None, raw=False, user=None): permissions = user_permission_list(full=True, absolute_urls=True, apps=apps)[ "permissions" ] - for app in apps: - app_settings = _get_app_settings(app) + for app_id in apps: + app_settings = _get_app_settings(app_id) if not app_settings: continue if "domain" not in app_settings: @@ -310,19 +310,19 @@ def app_map(app=None, raw=False, user=None): continue # Users must at least have access to the main permission to have access to extra permissions if user: - if not app + ".main" in permissions: + if not app_id + ".main" in permissions: logger.warning( - f"Uhoh, no main permission was found for app {app} ... sounds like an app was only partially removed due to another bug :/" + f"Uhoh, no main permission was found for app {app_id} ... sounds like an app was only partially removed due to another bug :/" ) continue - main_perm = permissions[app + ".main"] + main_perm = permissions[app_id + ".main"] if user not in main_perm["corresponding_users"]: continue this_app_perms = { p: i for p, i in permissions.items() - if p.startswith(app + ".") and (i["url"] or i["additional_urls"]) + if p.startswith(app_id + ".") and (i["url"] or i["additional_urls"]) } for perm_name, perm_info in this_app_perms.items(): @@ -362,7 +362,7 @@ def app_map(app=None, raw=False, user=None): perm_path = "/" if perm_domain not in result: result[perm_domain] = {} - result[perm_domain][perm_path] = {"label": perm_label, "id": app} + result[perm_domain][perm_path] = {"label": perm_label, "id": app_id} return result @@ -1592,16 +1592,15 @@ ynh_app_config_run $1 # Call config script to extract current values logger.debug(f"Calling '{action}' action from config script") - app = self.entity - app_id, app_instance_nb = _parse_app_instance_name(app) - settings = _get_app_settings(app) + app_id, app_instance_nb = _parse_app_instance_name(self.entity) + settings = _get_app_settings(app_id) env.update( { "app_id": app_id, - "app": app, + "app": self.entity, "app_instance_nb": str(app_instance_nb), "final_path": settings.get("final_path", ""), - "YNH_APP_BASEDIR": os.path.join(APPS_SETTING_PATH, app), + "YNH_APP_BASEDIR": os.path.join(APPS_SETTING_PATH, self.entity), } ) @@ -1699,20 +1698,20 @@ def _get_app_actions(app_id): return None -def _get_app_settings(app): +def _get_app_settings(app_id): """ Get settings of an installed app Keyword arguments: - app -- The app id (like nextcloud__2) + app_id -- The app id """ - if not _is_installed(app): + if not _is_installed(app_id): raise YunohostValidationError( - "app_not_installed", app=app, all_apps=_get_all_installed_apps_id() + "app_not_installed", app=app_id, all_apps=_get_all_installed_apps_id() ) try: - with open(os.path.join(APPS_SETTING_PATH, app, "settings.yml")) as f: + with open(os.path.join(APPS_SETTING_PATH, app_id, "settings.yml")) as f: settings = yaml.safe_load(f) # If label contains unicode char, this may later trigger issues when building strings... # FIXME: this should be propagated to read_yaml so that this fix applies everywhere I think... @@ -1730,25 +1729,25 @@ def _get_app_settings(app): or not settings.get("path", "/").startswith("/") ): settings["path"] = "/" + settings["path"].strip("/") - _set_app_settings(app, settings) + _set_app_settings(app_id, settings) - if app == settings["id"]: + if app_id == settings["id"]: return settings except (IOError, TypeError, KeyError): - logger.error(m18n.n("app_not_correctly_installed", app=app)) + logger.error(m18n.n("app_not_correctly_installed", app=app_id)) return {} -def _set_app_settings(app, settings): +def _set_app_settings(app_id, settings): """ Set settings of an app Keyword arguments: - app_id -- The app id (like nextcloud__2) + app_id -- The app id settings -- Dict with app settings """ - with open(os.path.join(APPS_SETTING_PATH, app, "settings.yml"), "w") as f: + with open(os.path.join(APPS_SETTING_PATH, app_id, "settings.yml"), "w") as f: yaml.safe_dump(settings, f, default_flow_style=False) From 7c0914295350de35f856ed54f6f7ecef949df1a9 Mon Sep 17 00:00:00 2001 From: ljf Date: Wed, 23 Mar 2022 01:08:28 +0100 Subject: [PATCH 406/619] [fix] Config Panel edits partially config of the first instance --- src/app.py | 45 +++++++++++++++++++++++---------------------- 1 file changed, 23 insertions(+), 22 deletions(-) diff --git a/src/app.py b/src/app.py index 46e1dd0f0..3b60deb6c 100644 --- a/src/app.py +++ b/src/app.py @@ -293,8 +293,8 @@ def app_map(app=None, raw=False, user=None): permissions = user_permission_list(full=True, absolute_urls=True, apps=apps)[ "permissions" ] - for app_id in apps: - app_settings = _get_app_settings(app_id) + for app in apps: + app_settings = _get_app_settings(app) if not app_settings: continue if "domain" not in app_settings: @@ -310,19 +310,19 @@ def app_map(app=None, raw=False, user=None): continue # Users must at least have access to the main permission to have access to extra permissions if user: - if not app_id + ".main" in permissions: + if not app + ".main" in permissions: logger.warning( - f"Uhoh, no main permission was found for app {app_id} ... sounds like an app was only partially removed due to another bug :/" + f"Uhoh, no main permission was found for app {app} ... sounds like an app was only partially removed due to another bug :/" ) continue - main_perm = permissions[app_id + ".main"] + main_perm = permissions[app + ".main"] if user not in main_perm["corresponding_users"]: continue this_app_perms = { p: i for p, i in permissions.items() - if p.startswith(app_id + ".") and (i["url"] or i["additional_urls"]) + if p.startswith(app + ".") and (i["url"] or i["additional_urls"]) } for perm_name, perm_info in this_app_perms.items(): @@ -362,7 +362,7 @@ def app_map(app=None, raw=False, user=None): perm_path = "/" if perm_domain not in result: result[perm_domain] = {} - result[perm_domain][perm_path] = {"label": perm_label, "id": app_id} + result[perm_domain][perm_path] = {"label": perm_label, "id": app} return result @@ -1592,15 +1592,16 @@ ynh_app_config_run $1 # Call config script to extract current values logger.debug(f"Calling '{action}' action from config script") - app_id, app_instance_nb = _parse_app_instance_name(self.entity) - settings = _get_app_settings(app_id) + app = self.entity + app_id, app_instance_nb = _parse_app_instance_name(app) + settings = _get_app_settings(app) env.update( { "app_id": app_id, - "app": self.entity, + "app": app, "app_instance_nb": str(app_instance_nb), "final_path": settings.get("final_path", ""), - "YNH_APP_BASEDIR": os.path.join(APPS_SETTING_PATH, self.entity), + "YNH_APP_BASEDIR": os.path.join(APPS_SETTING_PATH, app), } ) @@ -1698,20 +1699,20 @@ def _get_app_actions(app_id): return None -def _get_app_settings(app_id): +def _get_app_settings(app): """ Get settings of an installed app Keyword arguments: - app_id -- The app id + app -- The app id (like nextcloud__2) """ - if not _is_installed(app_id): + if not _is_installed(app): raise YunohostValidationError( - "app_not_installed", app=app_id, all_apps=_get_all_installed_apps_id() + "app_not_installed", app=app, all_apps=_get_all_installed_apps_id() ) try: - with open(os.path.join(APPS_SETTING_PATH, app_id, "settings.yml")) as f: + with open(os.path.join(APPS_SETTING_PATH, app, "settings.yml")) as f: settings = yaml.safe_load(f) # If label contains unicode char, this may later trigger issues when building strings... # FIXME: this should be propagated to read_yaml so that this fix applies everywhere I think... @@ -1729,25 +1730,25 @@ def _get_app_settings(app_id): or not settings.get("path", "/").startswith("/") ): settings["path"] = "/" + settings["path"].strip("/") - _set_app_settings(app_id, settings) + _set_app_settings(app, settings) - if app_id == settings["id"]: + if app == settings["id"]: return settings except (IOError, TypeError, KeyError): - logger.error(m18n.n("app_not_correctly_installed", app=app_id)) + logger.error(m18n.n("app_not_correctly_installed", app=app)) return {} -def _set_app_settings(app_id, settings): +def _set_app_settings(app, settings): """ Set settings of an app Keyword arguments: - app_id -- The app id + app_id -- The app id (like nextcloud__2) settings -- Dict with app settings """ - with open(os.path.join(APPS_SETTING_PATH, app_id, "settings.yml"), "w") as f: + with open(os.path.join(APPS_SETTING_PATH, app, "settings.yml"), "w") as f: yaml.safe_dump(settings, f, default_flow_style=False) From 4d814126b09c6a0cc892f846a1b8ce4d5653358a Mon Sep 17 00:00:00 2001 From: Kay0u Date: Tue, 29 Mar 2022 13:07:06 +0200 Subject: [PATCH 407/619] fix openssl conflict --- debian/control | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/debian/control b/debian/control index 6e059231a..d0f134c60 100644 --- a/debian/control +++ b/debian/control @@ -43,7 +43,7 @@ Conflicts: iptables-persistent , apache2 , bind9 , nginx-extras (>= 1.19) - , openssl (>= 1.1.1l-1) + , openssl (>= 1.1.1m-0) , slapd (>= 2.4.58) , dovecot-core (>= 1:2.3.14) , redis-server (>= 5:6.1) From ec41b697dce9110b42b460d2a86d5b9e9700c580 Mon Sep 17 00:00:00 2001 From: Kay0u Date: Tue, 29 Mar 2022 13:19:49 +0200 Subject: [PATCH 408/619] fix openssl conflict (oups) --- debian/control | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/debian/control b/debian/control index d0f134c60..0760e2cde 100644 --- a/debian/control +++ b/debian/control @@ -43,7 +43,7 @@ Conflicts: iptables-persistent , apache2 , bind9 , nginx-extras (>= 1.19) - , openssl (>= 1.1.1m-0) + , openssl (>= 1.1.1o-0) , slapd (>= 2.4.58) , dovecot-core (>= 1:2.3.14) , redis-server (>= 5:6.1) From 15a060bfbf02271b5453ab4cf564a18c617e8d59 Mon Sep 17 00:00:00 2001 From: Weblate Date: Mon, 14 Mar 2022 07:43:27 +0000 Subject: [PATCH 409/619] Added translation using Weblate (Kabyle) --- locales/kab.json | 1 + 1 file changed, 1 insertion(+) create mode 100644 locales/kab.json diff --git a/locales/kab.json b/locales/kab.json new file mode 100644 index 000000000..0967ef424 --- /dev/null +++ b/locales/kab.json @@ -0,0 +1 @@ +{} From cb795dd32df6ee06c25300c5d48ffb984fc397bd Mon Sep 17 00:00:00 2001 From: Baloo Date: Mon, 14 Mar 2022 18:35:34 +0000 Subject: [PATCH 410/619] Translated using Weblate (Arabic) Currently translated at 10.2% (70 of 686 strings) Translation: YunoHost/core Translate-URL: https://translate.yunohost.org/projects/yunohost/core/ar/ --- locales/ar.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/locales/ar.json b/locales/ar.json index 487091995..c440e442f 100644 --- a/locales/ar.json +++ b/locales/ar.json @@ -2,9 +2,9 @@ "action_invalid": "إجراء غير صالح '{action}'", "admin_password": "كلمة السر الإدارية", "admin_password_change_failed": "لا يمكن تعديل الكلمة السرية", - "admin_password_changed": "تم تعديل الكلمة السرية الإدارية", + "admin_password_changed": "عُدلت كلمة السر الإدارية", "app_already_installed": "{app} تم تنصيبه مِن قبل", - "app_already_up_to_date": "{app} تم تحديثه مِن قَبل", + "app_already_up_to_date": "{app} حديثٌ", "app_argument_required": "المُعامِل '{name}' مطلوب", "app_extraction_failed": "تعذر فك الضغط عن ملفات التنصيب", "app_install_files_invalid": "ملفات التنصيب خاطئة", @@ -38,7 +38,7 @@ "domain_created": "تم إنشاء النطاق", "domain_creation_failed": "تعذرت عملية إنشاء النطاق", "domain_deleted": "تم حذف النطاق", - "domain_exists": "اسم النطاق موجود مِن قبل", + "domain_exists": "اسم النطاق موجود سلفًا", "domains_available": "النطاقات المتوفرة :", "done": "تم", "downloading": "عملية التنزيل جارية …", @@ -159,4 +159,4 @@ "diagnosis_description_dnsrecords": "تسجيلات خدمة DNS", "diagnosis_description_ip": "الإتصال بالإنترنت", "diagnosis_description_basesystem": "النظام الأساسي" -} \ No newline at end of file +} From 06f1c03c4b45bcd885af5bffa0a17aaf783b66f6 Mon Sep 17 00:00:00 2001 From: 3ole Date: Sat, 19 Mar 2022 13:59:54 +0000 Subject: [PATCH 411/619] Translated using Weblate (German) Currently translated at 100.0% (686 of 686 strings) Translation: YunoHost/core Translate-URL: https://translate.yunohost.org/projects/yunohost/core/de/ --- locales/de.json | 207 +++++++++++++++++++++++++----------------------- 1 file changed, 108 insertions(+), 99 deletions(-) diff --git a/locales/de.json b/locales/de.json index dc7fb6e1d..23b44cbfb 100644 --- a/locales/de.json +++ b/locales/de.json @@ -36,20 +36,20 @@ "backup_output_directory_not_empty": "Der gewählte Ausgabeordner sollte leer sein", "backup_output_directory_required": "Für die Datensicherung muss ein Zielverzeichnis angegeben werden", "backup_running_hooks": "Datensicherunghook wird ausgeführt...", - "custom_app_url_required": "Sie müssen eine URL angeben, um Ihre benutzerdefinierte App {app} zu aktualisieren", + "custom_app_url_required": "Du musst eine URL angeben, um deine benutzerdefinierte App {app} zu aktualisieren", "domain_cert_gen_failed": "Zertifikat konnte nicht erzeugt werden", "domain_created": "Domäne erstellt", "domain_creation_failed": "Konnte Domäne nicht erzeugen", "domain_deleted": "Domain wurde gelöscht", "domain_deletion_failed": "Domain {domain}: {error} konnte nicht gelöscht werden", - "domain_dyndns_already_subscribed": "Sie haben sich schon für eine DynDNS-Domäne registriert", + "domain_dyndns_already_subscribed": "Du hast dich schon für eine DynDNS-Domäne registriert", "domain_dyndns_root_unknown": "Unbekannte DynDNS Hauptdomain", "domain_exists": "Die Domäne existiert bereits", - "domain_uninstall_app_first": "Diese Applikationen sind noch auf Ihrer Domäne installiert; \n{apps}\n\nBitte deinstallieren Sie sie mit dem Befehl 'yunohost app remove the_app_id' oder verschieben Sie sie mit 'yunohost app change-url the_app_id'", + "domain_uninstall_app_first": "Diese Applikationen sind noch auf deiner Domäne installiert; \n{apps}\n\nBitte deinstalliere sie mit dem Befehl 'yunohost app remove the_app_id' oder verschiebe sie mit 'yunohost app change-url the_app_id'", "done": "Erledigt", "downloading": "Wird heruntergeladen...", "dyndns_ip_update_failed": "Konnte die IP-Adresse für DynDNS nicht aktualisieren", - "dyndns_ip_updated": "Aktualisierung Ihrer IP-Adresse bei DynDNS", + "dyndns_ip_updated": "Deine IP-Adresse wurde bei DynDNS aktualisiert", "dyndns_key_generating": "Generierung des DNS-Schlüssels..., das könnte eine Weile dauern.", "dyndns_registered": "DynDNS Domain registriert", "dyndns_registration_failed": "DynDNS Domain konnte nicht registriert werden: {error}", @@ -87,7 +87,7 @@ "restore_complete": "Vollständig wiederhergestellt", "restore_confirm_yunohost_installed": "Möchtest du die Wiederherstellung wirklich starten? [{answers}]", "restore_failed": "Das System konnte nicht wiederhergestellt werden", - "restore_hook_unavailable": "Das Wiederherstellungsskript für '{part}' steht weder in Ihrem System noch im Archiv zur Verfügung", + "restore_hook_unavailable": "Das Wiederherstellungsskript für '{part}' steht weder in deinem System noch im Archiv zur Verfügung", "restore_nothings_done": "Nichts wurde wiederhergestellt", "restore_running_app_script": "App '{app}' wird wiederhergestellt...", "restore_running_hooks": "Wiederherstellung wird gestartet...", @@ -144,26 +144,26 @@ "domains_available": "Verfügbare Domains:", "dyndns_key_not_found": "DNS-Schlüssel für die Domain wurde nicht gefunden", "dyndns_no_domain_registered": "Keine Domain mit DynDNS registriert", - "mailbox_used_space_dovecot_down": "Der Dovecot-Mailbox-Dienst muss aktiv sein, wenn Sie den von der Mailbox belegten Speicher abrufen wollen", + "mailbox_used_space_dovecot_down": "Der Dovecot-Mailbox-Dienst muss aktiv sein, wenn du den von der Mailbox belegten Speicher abrufen willst", "certmanager_attempt_to_replace_valid_cert": "Du versuchst gerade eine richtiges und gültiges Zertifikat der Domain {domain} zu überschreiben! (Benutze --force , um diese Nachricht zu umgehen)", - "certmanager_domain_cert_not_selfsigned": "Das Zertifikat der Domain {domain} ist kein selbstsigniertes Zertifikat. Sind Sie sich sicher, dass Sie es ersetzen wollen? (Benutzen Sie dafür '--force')", + "certmanager_domain_cert_not_selfsigned": "Das Zertifikat der Domain {domain} ist kein selbstsigniertes Zertifikat. Bist du sich sicher, dass du es ersetzen willst? (Benutze dafür '--force')", "certmanager_certificate_fetching_or_enabling_failed": "Die Aktivierung des neuen Zertifikats für die {domain} ist fehlgeschlagen...", "certmanager_attempt_to_renew_nonLE_cert": "Das Zertifikat der Domain '{domain}' wurde nicht von Let's Encrypt ausgestellt. Es kann nicht automatisch erneuert werden!", "certmanager_attempt_to_renew_valid_cert": "Das Zertifikat der Domain {domain} läuft nicht in Kürze ab! (Benutze --force um diese Nachricht zu umgehen)", - "certmanager_domain_http_not_working": "Es scheint, als ob die Domäne {domain} nicht über HTTP erreicht werden kann. Bitte überprüfen Sie, ob Ihre DNS- und nginx-Konfiguration in Ordnung ist. (Wenn Sie wissen was Sie tun, nutzen Sie \"--no-checks\" um die Überprüfung zu überspringen.)", - "certmanager_domain_dns_ip_differs_from_public_ip": "Der DNS-A-Eintrag der Domain {domain} unterscheidet sich von dieser Server-IP. Für weitere Informationen überprüfen Sie bitte die 'DNS records' (basic) Kategorie in der Diagnose. Wenn Sie gerade Ihren A-Eintrag verändert haben, warten Sie bitte etwas, damit die Änderungen wirksam werden (Sie können die DNS-Propagation mittels Website überprüfen) (Wenn Sie wissen was Sie tun, können Sie --no-checks benutzen, um diese Überprüfung zu überspringen.)", + "certmanager_domain_http_not_working": "Es scheint, als ob die Domäne {domain} nicht über HTTP erreicht werden kann. Bitte überprüfe, ob deine DNS- und nginx-Konfiguration in Ordnung ist. (Wenn du weißt, was du tust, nutze '--no-checks' um die Überprüfung zu überspringen.)", + "certmanager_domain_dns_ip_differs_from_public_ip": "Der DNS-A-Eintrag der Domain {domain} unterscheidet sich von dieser Server-IP. Für weitere Informationen überprüfe bitte die 'DNS records' (basic) Kategorie in der Diagnose. Wenn du kürzlich deinen A-Eintrag verändert hast, warte bitte etwas, damit die Änderungen wirksam werden (Du kannst die DNS-Propagation mittels Website überprüfen) (Wenn du weißt, was du tust, kannst du '--no-checks' benutzen, um diese Überprüfung zu überspringen.)", "certmanager_cannot_read_cert": "Es ist ein Fehler aufgetreten, als es versucht wurde das aktuelle Zertifikat für die Domain {domain} zu öffnen (Datei: {file}), Grund: {reason}", "certmanager_cert_install_success_selfsigned": "Das selbstsignierte Zertifikat für die Domäne '{domain}' wurde erfolgreich installiert", "certmanager_cert_install_success": "Let's-Encrypt-Zertifikat für die Domäne {domain} ist jetzt installiert", "certmanager_cert_renew_success": "Das Let's Encrypt Zertifikat für die Domain {domain} wurde erfolgreich erneuert", - "certmanager_hit_rate_limit": "Es wurden innerhalb kurzer Zeit zu viele Zertifikate für dieselbe Domäne {domain} ausgestellt. Bitte versuchen Sie es später nochmal. Besuchen Sie https://letsencrypt.org/docs/rate-limits/ für mehr Informationen", + "certmanager_hit_rate_limit": "Es wurden innerhalb kurzer Zeit zu viele Zertifikate für dieselbe Domäne {domain} ausgestellt. Bitte versuche es später nochmal. Besuche https://letsencrypt.org/docs/rate-limits/ für mehr Informationen", "certmanager_cert_signing_failed": "Das neue Zertifikat konnte nicht signiert werden", "certmanager_no_cert_file": "Die Zertifikatsdatei für die Domain {domain} (Datei: {file}) konnte nicht gelesen werden", - "domain_cannot_remove_main": "Die primäre Domain konnten nicht entfernt werden. Lege zuerst einen neue primäre Domain Sie können die Domäne '{domain}' nicht entfernen, weil Sie die Hauptdomäne ist. Sie müssen zuerst eine andere Domäne als Hauptdomäne festlegen. Sie können das mit dem Befehl 'yunohost domain main-domain -n tun. Hier ist eine Liste der möglichen Domänen: {other_domains}", + "domain_cannot_remove_main": "Die Domäne '{domain}' konnten nicht entfernt werden, weil es die Haupt-Domäne ist. Du musst zuerst eine andere Domäne zur Haupt-Domäne machen. Dies ist über den Befehl 'yunohost domain main-domain -n ' möglich. Hier ist eine Liste möglicher Domänen: {other_domains}", "certmanager_self_ca_conf_file_not_found": "Die Konfigurationsdatei der Zertifizierungsstelle für selbstsignierte Zertifikate wurde nicht gefunden (Datei {file})", - "certmanager_acme_not_configured_for_domain": "Die ACME Challenge kann im Moment nicht für {domain} ausgeführt werden, weil in ihrer nginx conf das entsprechende Code-Snippet fehlt... Bitte stellen Sie sicher, dass Ihre nginx-Konfiguration mit 'yunohost tools regen-conf nginx --dry-run --with-diff' auf dem neuesten Stand ist.", + "certmanager_acme_not_configured_for_domain": "Die ACME Challenge kann im Moment nicht für {domain} ausgeführt werden, weil in deiner nginx-Konfiguration das entsprechende Code-Snippet fehlt... Bitte stelle sicher, dass deine nginx-Konfiguration mit 'yunohost tools regen-conf nginx --dry-run --with-diff' auf dem neuesten Stand ist.", "certmanager_unable_to_parse_self_CA_name": "Der Name der Zertifizierungsstelle für selbstsignierte Zertifikate konnte nicht aufgelöst werden (Datei: {file})", - "domain_hostname_failed": "Sie können keinen neuen Hostnamen verwenden. Das kann zukünftige Probleme verursachen (es kann auch sein, dass es funktioniert).", + "domain_hostname_failed": "Neuer Hostname wurde nicht gesetzt. Das kann zukünftige Probleme verursachen (es kann auch sein, dass es funktioniert).", "app_already_installed_cant_change_url": "Diese Applikation ist bereits installiert. Die URL kann durch diese Funktion nicht modifiziert werden. Überprüfe ob `app changeurl` verfügbar ist.", "app_change_url_identical_domains": "Die alte und neue domain/url_path sind identisch: ('{domain} {path}'). Es gibt nichts zu tun.", "app_already_up_to_date": "{app} ist bereits aktuell", @@ -177,22 +177,22 @@ "backup_archive_writing_error": "Die Dateien '{source} (im Ordner '{dest}') konnten nicht in das komprimierte Archiv-Backup '{archive}' hinzugefügt werden", "app_change_url_success": "{app} URL ist nun {domain}{path}", "global_settings_bad_type_for_setting": "Falscher Typ der Einstellung {setting}. Empfangen: {received_type}, aber erwarteter Typ: {expected_type}", - "global_settings_bad_choice_for_enum": "Wert des Einstellungsparameters {setting} ungültig. Der Wert den Sie eingegeben haben: '{choice}', die gültigen Werte für diese Einstellung: {available_choices}", + "global_settings_bad_choice_for_enum": "Wert des Einstellungsparameters {setting} ungültig. Du hast '{choice}' eingegeben. Aber nur folgende Werte sind gültig: {available_choices}", "file_does_not_exist": "Die Datei {path} existiert nicht.", - "experimental_feature": "Warnung: Der Maintainer hat diese Funktion als experimentell gekennzeichnet. Sie ist nicht stabil. Sie sollten sie nur verwenden, wenn Sie wissen, was Sie tun.", + "experimental_feature": "Warnung: Der Maintainer hat diese Funktion als experimentell gekennzeichnet. Sie ist nicht stabil. Du solltest sie nur verwenden, wenn du weißt, was du tust.", "dyndns_domain_not_provided": "Der DynDNS-Anbieter {provider} kann die Domäne(n) {domain} nicht bereitstellen.", "dyndns_could_not_check_available": "Konnte nicht überprüfen, ob {domain} auf {provider} verfügbar ist.", "domain_dns_conf_is_just_a_recommendation": "Dieser Befehl zeigt dir die *empfohlene* Konfiguration. Er konfiguriert *nicht* das DNS für dich. Es liegt in deiner Verantwortung, die DNS-Zone bei deinem DNS-Registrar nach dieser Empfehlung zu konfigurieren.", "dpkg_lock_not_available": "Dieser Befehl kann momentan nicht ausgeführt werden, da anscheinend ein anderes Programm die Sperre von dpkg (dem Systempaket-Manager) verwendet", - "confirm_app_install_thirdparty": "WARNUNG! Diese Applikation ist nicht Teil des YunoHost-Applikationskatalogs. Das Installieren von Drittanbieterapplikationen könnte die Sicherheit und Integrität Ihres Systems beeinträchtigen. Sie sollten wahrscheinlich NICHT fortfahren, es sei denn, Sie wissen, was Sie tun. Es wird KEIN SUPPORT angeboten, wenn die Applikation nicht funktionieren oder Ihr System beschädigen sollte... Wenn Sie das Risiko trotzdem eingehen möchten, tippen Sie '{answers}'", - "confirm_app_install_danger": "WARNUNG! Diese Applikation ist noch experimentell (wenn nicht ausdrücklich nicht funktionsfähig)! Sie sollten Sie wahrscheinlich NICHT installieren, es sei denn, Sie wissen, was Sie tun. Es wird keine Unterstützung angeboten, falls diese Applikation nicht funktionieren oder Ihr System beschädigen sollte... Falls Sie bereit sind, dieses Risiko einzugehen, tippen Sie '{answers}'", + "confirm_app_install_thirdparty": "WARNUNG! Diese Applikation ist nicht Teil des YunoHost-Applikationskatalogs. Das Installieren von Drittanbieterapplikationen könnte die Sicherheit und Integrität deines Systems beeinträchtigen. Du solltest wahrscheinlich NICHT fortfahren, es sei denn, du weißt, was du tust. Es wird KEINE UNTERSTÜTZUNG angeboten, wenn die Applikation nicht funktionieren oder dein System beschädigen sollte... Wenn du das Risiko trotzdem eingehen möchrst, tippe '{answers}'", + "confirm_app_install_danger": "WARNUNG! Diese Applikation ist noch experimentell (wenn nicht sogar ausdrücklich nicht funktionsfähig)! Du solltest sie wahrscheinlich NICHT installieren, es sei denn, du weißt, was du tust. Es wird keine Unterstützung angeboten, falls diese Applikation nicht funktionieren oder dein System beschädigen sollte... Falls du bereit bist, dieses Risiko einzugehen, tippe '{answers}'", "confirm_app_install_warning": "Warnung: Diese Applikation funktioniert möglicherweise, ist jedoch nicht gut in YunoHost integriert. Einige Funktionen wie Single Sign-On und Backup / Restore sind möglicherweise nicht verfügbar. Trotzdem installieren? [{answers}] ", "backup_with_no_restore_script_for_app": "{app} hat kein Wiederherstellungsskript. Das Backup dieser App kann nicht automatisch wiederhergestellt werden.", "backup_with_no_backup_script_for_app": "Die App {app} hat kein Sicherungsskript. Ignoriere es.", "backup_unable_to_organize_files": "Dateien im Archiv konnten nicht mit der schnellen Methode organisiert werden", "backup_system_part_failed": "Der Systemteil '{part}' konnte nicht gesichert werden", "backup_permission": "Sicherungsberechtigung für {app}", - "backup_output_symlink_dir_broken": "Ihr Archivverzeichnis '{path}' ist ein fehlerhafter Symlink. Vielleicht haben Sie vergessen, das Speichermedium, auf das er verweist, neu zu mounten oder einzustecken.", + "backup_output_symlink_dir_broken": "Dein Archivverzeichnis '{path}' ist ein fehlerhafter Symlink. Vielleicht hast du vergessen, das Speichermedium, auf das er verweist, neu zu mounten oder einzustecken.", "backup_mount_archive_for_restore": "Archiv für Wiederherstellung vorbereiten...", "backup_method_tar_finished": "Tar-Backup-Archiv erstellt", "backup_method_custom_finished": "Benutzerdefinierte Sicherungsmethode '{method}' beendet", @@ -201,7 +201,7 @@ "backup_custom_backup_error": "Bei der benutzerdefinierten Sicherungsmethode ist beim Arbeitsschritt \"Sicherung\" ein Fehler aufgetreten", "backup_csv_creation_failed": "Die zur Wiederherstellung erforderliche CSV-Datei kann nicht erstellt werden", "backup_couldnt_bind": "{src} konnte nicht an {dest} angebunden werden.", - "backup_ask_for_copying_if_needed": "Möchten Sie die Sicherung mit {size}MB temporär durchführen? (Dieser Weg wird verwendet, da einige Dateien nicht mit einer effizienteren Methode vorbereitet werden konnten.)", + "backup_ask_for_copying_if_needed": "Möchtest du die Sicherung mit {size}MB temporär durchführen? (Dieser Weg wird verwendet, da einige Dateien nicht mit einer effizienteren Methode vorbereitet werden konnten.)", "backup_actually_backuping": "Erstellt ein Backup-Archiv aus den gesammelten Dateien...", "ask_new_path": "Neuer Pfad", "ask_new_domain": "Neue Domain", @@ -215,7 +215,7 @@ "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 \"{other_app}\" verwendet", "aborting": "Breche ab.", - "app_action_cannot_be_ran_because_required_services_down": "Diese erforderlichen Dienste sollten zur Durchführung dieser Aktion laufen: {services}. Versuchen Sie, sie neu zu starten, um fortzufahren (und möglicherweise zu untersuchen, warum sie nicht verfügbar sind).", + "app_action_cannot_be_ran_because_required_services_down": "Diese erforderlichen Dienste sollten zur Durchführung dieser Aktion laufen: {services}. Versuche, sie neu zu starten, um fortzufahren (und möglicherweise zu untersuchen, warum sie nicht verfügbar sind).", "already_up_to_date": "Nichts zu tun. Alles ist bereits auf dem neusten Stand.", "admin_password_too_long": "Bitte ein Passwort kürzer als 127 Zeichen wählen", "app_action_broke_system": "Diese Aktion scheint diese wichtigen Dienste unterbrochen zu haben: {services}", @@ -224,7 +224,7 @@ "global_settings_setting_security_ssh_compatibility": "Kompatibilitäts- vs. Sicherheits-Kompromiss für den SSH-Server. Betrifft die Ciphers (und andere sicherheitsrelevante Aspekte)", "group_deleted": "Gruppe '{group}' gelöscht", "group_deletion_failed": "Konnte Gruppe '{group}' nicht löschen: {error}", - "dyndns_provider_unreachable": "DynDNS-Anbieter {provider} kann nicht erreicht werden: Entweder ist Ihr YunoHost nicht korrekt mit dem Internet verbunden oder der Dynette-Server ist ausgefallen.", + "dyndns_provider_unreachable": "DynDNS-Anbieter {provider} kann nicht erreicht werden: Entweder ist dein YunoHost nicht korrekt mit dem Internet verbunden oder der Dynette-Server ist ausgefallen.", "group_created": "Gruppe '{group}' angelegt", "group_creation_failed": "Konnte Gruppe '{group}' nicht anlegen", "group_unknown": "Die Gruppe '{group}' ist unbekannt", @@ -237,7 +237,7 @@ "dpkg_is_broken": "Du kannst das gerade nicht tun, weil dpkg/APT (der Systempaketmanager) in einem defekten Zustand zu sein scheint... Du kannst versuchen, dieses Problem zu lösen, indem du dich über SSH verbindest und `sudo apt install --fix-broken` sowie/oder `sudo dpkg --configure -a` ausführst.", "global_settings_unknown_setting_from_settings_file": "Unbekannter Schlüssel in den Einstellungen: '{setting_key}', verwerfen und speichern in /etc/yunohost/settings-unknown.json", "log_link_to_log": "Vollständiges Log dieser Operation: '{desc}'", - "log_help_to_get_log": "Um das Protokoll der Operation '{desc}' anzuzeigen, verwenden Sie den Befehl 'yunohost log show {name}'", + "log_help_to_get_log": "Um das Protokoll der Operation '{desc}' anzuzeigen, verwende den Befehl 'yunohost log show {name}'", "global_settings_setting_security_nginx_compatibility": "Kompatibilitäts- vs. Sicherheits-Kompromiss für den Webserver NGINX. Betrifft die Ciphers (und andere sicherheitsrelevante Aspekte)", "global_settings_setting_service_ssh_allow_deprecated_dsa_hostkey": "Erlaubt die Verwendung eines (veralteten) DSA-Hostkeys für die SSH-Daemon-Konfiguration", "log_app_remove": "Entferne die Applikation '{}'", @@ -270,7 +270,7 @@ "diagnosis_basesystem_kernel": "Server läuft unter Linux-Kernel {kernel_version}", "diagnosis_basesystem_ynh_single_version": "{package} Version: {version} ({repo})", "diagnosis_basesystem_ynh_main_version": "Server läuft YunoHost {main_version} ({repo})", - "diagnosis_basesystem_ynh_inconsistent_versions": "Sie verwenden inkonsistente Versionen der YunoHost-Pakete... wahrscheinlich wegen eines fehlgeschlagenen oder teilweisen Upgrades.", + "diagnosis_basesystem_ynh_inconsistent_versions": "Du verwendest inkonsistente Versionen der YunoHost-Pakete... wahrscheinlich wegen eines fehlgeschlagenen oder teilweisen Upgrades.", "apps_catalog_init_success": "App-Katalogsystem initialisiert!", "apps_catalog_updating": "Aktualisierung des Applikationskatalogs...", "apps_catalog_failed_to_download": "Der {apps_catalog} App-Katalog kann nicht heruntergeladen werden: {error}", @@ -291,89 +291,89 @@ "diagnosis_found_errors_and_warnings": "Habe {errors} erhebliche(s) Problem(e) (und {warnings} Warnung(en)) in Verbindung mit {category} gefunden!", "diagnosis_ip_broken_dnsresolution": "Domänen-Namens-Auflösung scheint aus einem bestimmten Grund nicht zu funktionieren... Blockiert eine Firewall die DNS Anfragen?", "diagnosis_ip_broken_resolvconf": "Domänen-Namensauflösung scheint nicht zu funktionieren, was daran liegen könnte, dass in /etc/resolv.conf kein Eintrag auf 127.0.0.1 zeigt.", - "diagnosis_ip_weird_resolvconf_details": "Die Datei /etc/resolv.conf muss ein Symlink auf /etc/resolvconf/run/resolv.conf sein, welcher auf 127.0.0.1 (dnsmasq) zeigt. Falls Sie die DNS-Resolver manuell konfigurieren möchten, bearbeiten Sie bitte /etc/resolv.dnsmasq.conf.", + "diagnosis_ip_weird_resolvconf_details": "Die Datei /etc/resolv.conf muss ein Symlink auf /etc/resolvconf/run/resolv.conf sein, welcher auf 127.0.0.1 (dnsmasq) zeigt. Falls du die DNS-Resolver manuell konfigurieren möchtest, bearbeite bitte /etc/resolv.dnsmasq.conf.", "diagnosis_dns_good_conf": "DNS Einträge korrekt konfiguriert für die Domäne {domain} (Kategorie {category})", "diagnosis_ignored_issues": "(+ {nb_ignored} ignorierte(s) Problem(e))", "diagnosis_basesystem_hardware": "Server Hardware Architektur ist {virt} {arch}", "diagnosis_found_errors": "Habe {errors} erhebliche(s) Problem(e) in Verbindung mit {category} gefunden!", "diagnosis_found_warnings": "Habe {warnings} Ding(e) gefunden, die verbessert werden könnten für {category}.", "diagnosis_ip_dnsresolution_working": "Domänen-Namens-Auflösung funktioniert!", - "diagnosis_ip_weird_resolvconf": "DNS Auflösung scheint zu funktionieren, aber seien Sie vorsichtig wenn Sie Ihren eigenen /etc/resolv.conf verwenden.", - "diagnosis_display_tip": "Um die gefundenen Probleme zu sehen, können Sie zum Diagnose-Bereich des webadmin gehen, oder 'yunohost diagnosis show --issues --human-readable' in der Kommandozeile ausführen.", + "diagnosis_ip_weird_resolvconf": "DNS Auflösung scheint zu funktionieren, aber sei vorsichtig wenn du deine eigene /etc/resolv.conf verwendest.", + "diagnosis_display_tip": "Um die gefundenen Probleme zu sehen, kannst du zum Diagnose-Bereich des webadmin gehen, oder 'yunohost diagnosis show --issues --human-readable' in der Kommandozeile ausführen.", "backup_archive_corrupted": "Das Backup-Archiv '{archive}' scheint beschädigt: {error}", "backup_archive_cant_retrieve_info_json": "Die Informationen für das Archiv '{archive}' konnten nicht geladen werden... Die Datei info.json wurde nicht gefunden (oder ist kein gültiges json).", - "app_packaging_format_not_supported": "Diese App kann nicht installiert werden da das Paketformat nicht von der YunoHost-Version unterstützt wird. Denken Sie darüber nach das System zu aktualisieren.", + "app_packaging_format_not_supported": "Diese App kann nicht installiert werden da das Paketformat nicht von der YunoHost-Version unterstützt wird. Am besten solltest du dein System aktualisieren.", "certmanager_domain_not_diagnosed_yet": "Für die Domain {domain} gibt es noch keine Diagnose-Resultate. Bitte widerhole die Diagnose für die Kategorien 'DNS records' und 'Web' im Diagnose-Bereich um zu überprüfen ob die Domain für Let's Encrypt bereit ist. (Wenn du weißt was du tust, kannst du --no-checks benutzen, um diese Überprüfung zu überspringen.)", "mail_unavailable": "Diese E-Mail Adresse ist reserviert und wird dem/der ersten Benutzer:in automatisch zugewiesen", "diagnosis_services_conf_broken": "Die Konfiguration für den Dienst {service} ist fehlerhaft!", "diagnosis_services_running": "Dienst {service} läuft!", "diagnosis_domain_expires_in": "{domain} läuft in {days} Tagen ab.", "diagnosis_domain_expiration_error": "Einige Domänen werden SEHR BALD ablaufen!", - "diagnosis_domain_expiration_success": "Ihre Domänen sind registriert und werden in nächster Zeit nicht ablaufen.", + "diagnosis_domain_expiration_success": "Deine Domänen sind registriert und werden in nächster Zeit nicht ablaufen.", "diagnosis_domain_not_found_details": "Die Domäne {domain} existiert nicht in der WHOIS-Datenbank oder sie ist abgelaufen!", "diagnosis_domain_expiration_not_found": "Das Ablaufdatum einiger Domains kann nicht überprüft werden", "diagnosis_dns_try_dyndns_update_force": "Die DNS-Konfiguration dieser Domäne sollte automatisch von YunoHost verwaltet werden. Andernfalls könntest Du mittels yunohost dyndns update --force ein Update erzwingen.", - "diagnosis_dns_point_to_doc": "Bitte schauen Sie in der Dokumentation unter https://yunohost.org/dns_config nach, wenn Sie Hilfe bei der Konfiguration der DNS-Einträge brauchen.", + "diagnosis_dns_point_to_doc": "Bitte schaue in der Dokumentation unter https://yunohost.org/dns_config nach, wenn du Hilfe bei der Konfiguration der DNS-Einträge benötigst.", "diagnosis_dns_discrepancy": "Der folgende DNS Eintrag scheint nicht den empfohlenen Einstellungen zu entsprechen:
Typ: {type}
Name: {name}
Aktueller Wert: {current}
Erwarteter Wert: {value}", - "diagnosis_dns_missing_record": "Gemäß der empfohlenen DNS-Konfiguration sollten Sie einen DNS-Eintrag mit den folgenden Informationen hinzufügen.
Typ: {type}
Name: {name}
Wert: {value}", + "diagnosis_dns_missing_record": "Gemäß der empfohlenen DNS-Konfiguration solltest du einen DNS-Eintrag mit den folgenden Informationen hinzufügen.
Typ: {type}
Name: {name}
Wert: {value}", "diagnosis_dns_bad_conf": "Einige DNS-Einträge für die Domäne {domain} fehlen oder sind nicht korrekt (Kategorie {category})", "diagnosis_ip_local": "Lokale IP: {local}", "diagnosis_ip_global": "Globale IP: {global}", - "diagnosis_ip_no_ipv6_tip": "Die Verwendung von IPv6 ist nicht Voraussetzung für das Funktionieren Ihres Servers, trägt aber zur Gesundheit des Internet als Ganzes bei. IPv6 sollte normalerweise automatisch von Ihrem Server oder Ihrem Provider konfiguriert werden, sofern verfügbar. Andernfalls müßen Sie einige Dinge manuell konfigurieren. Weitere Informationen finden Sie hier: https://yunohost.org/#/ipv6. Wenn Sie IPv6 nicht aktivieren können oder Ihnen das zu technisch ist, können Sie diese Warnung gefahrlos ignorieren.", - "diagnosis_services_bad_status_tip": "Sie können versuchen, den Dienst neu zu starten, und wenn das nicht funktioniert, schauen Sie sich die (Dienst-)Logs in der Verwaltung an (In der Kommandozeile können Sie dies mit yunohost service restart {service} und yunohost service log {service} tun).", + "diagnosis_ip_no_ipv6_tip": "Die Verwendung von IPv6 ist nicht Voraussetzung für das Funktionieren deines Servers, trägt aber zur Gesundheit des Internet als Ganzes bei. IPv6 sollte normalerweise automatisch von deinem Server oder deinem Provider konfiguriert werden, sofern verfügbar. Andernfalls musst du einige Dinge manuell konfigurieren. Weitere Informationen findest du hier: https://yunohost.org/#/ipv6. Wenn du IPv6 nicht aktivieren kannst oder dir das zu technisch ist, kannst du diese Warnung gefahrlos ignorieren.", + "diagnosis_services_bad_status_tip": "Du kannst versuchen, den Dienst neu zu starten, und wenn das nicht funktioniert, schaue dir die (Dienst-)Logs in der Verwaltung an (In der Kommandozeile kannst du dies mit yunohost service restart {service} und yunohost service log {service} tun).", "diagnosis_services_bad_status": "Der Dienst {service} ist {status} :(", - "diagnosis_diskusage_verylow": "Der Speicher {mountpoint} (auf Gerät {device}) hat nur noch {free} ({free_percent}%) freien Speicherplatz (von ingesamt {total}). Sie sollten sich ernsthaft überlegen, einigen Seicherplatz frei zu machen!", + "diagnosis_diskusage_verylow": "Der Speicher {mountpoint} (auf Gerät {device}) hat nur noch {free} ({free_percent}%) freien Speicherplatz (von ingesamt {total}). Du solltest ernsthaft in Betracht ziehen, etwas Seicherplatz frei zu machen!", "diagnosis_http_ok": "Die Domäne {domain} ist über HTTP von außerhalb des lokalen Netzwerks erreichbar.", - "diagnosis_mail_outgoing_port_25_blocked_relay_vpn": "Einige Hosting-Anbieter werden es Ihnen nicht gestatten, den ausgehenden Port 25 zu öffnen, da diese sich nicht um die Netzneutralität kümmern.
- Einige davon bieten als Alternative an, ein Mailserver-Relay zu verwenden, was jedoch bedeutet, dass das Relay Ihren E-Mail-Verkehr ausspionieren kann.
- Eine die Privatsphäre berücksichtigende Alternative ist die Verwendung eines VPN *mit einer dedizierten öffentlichen IP* um solche Einschränkungen zu umgehen. Schauen Sie unter https://yunohost.org/#/vpn_advantage nach.
- Sie können auch in Betracht ziehen, zu einem netzneutralitätfreundlicheren Anbieter zu wechseln", - "diagnosis_http_timeout": "Wartezeit wurde beim Versuch, von außen eine Verbindung zum Server aufzubauen, überschritten. Er scheint nicht erreichbar zu sein.
1. Die häufigste Ursache für dieses Problem ist daß der Port 80 (und 433) nicht richtig zu Ihrem Server weitergeleitet werden.
2. Sie sollten auch sicherstellen, daß der Dienst nginx läuft.
3. In komplexeren Umgebungen: Stellen Sie sicher, daß keine Firewall oder Reverse-Proxy stört.", + "diagnosis_mail_outgoing_port_25_blocked_relay_vpn": "Einige Hosting-Anbieter werden es dir nicht gestatten, den ausgehenden Port 25 zu öffnen, da diese sich nicht um die Netzneutralität kümmern.
- Einige davon bieten als Alternative an, ein Mailserver-Relay zu verwenden, was jedoch bedeutet, dass das Relay Ihren E-Mail-Verkehr ausspionieren kann.
- Eine, die Privatsphäre berücksichtigende, Alternative ist die Verwendung eines VPN *mit einer dedizierten öffentlichen IP* um solche Einschränkungen zu umgehen. Schaue unter https://yunohost.org/#/vpn_advantage nach.
- Du kannst auch in Betracht ziehen, zu einem netzneutralitätfreundlicheren Anbieter zu wechseln", + "diagnosis_http_timeout": "Wartezeit wurde beim Versuch, von außen eine Verbindung zum Server aufzubauen, überschritten. Er scheint nicht erreichbar zu sein.
1. Die häufigste Ursache für dieses Problem ist daß der Port 80 (und 433) nicht richtig zu deinem Server weitergeleitet werden.
2. Du solltest auch sicherstellen, daß der Dienst nginx läuft.
3. In komplexeren Umgebungen: Stelle sicher, daß keine Firewall oder Reverse-Proxy stört.", "service_reloaded_or_restarted": "Der Dienst '{service}' wurde erfolgreich neu geladen oder gestartet", "service_restarted": "Der Dienst '{service}' wurde neu gestartet", "certmanager_warning_subdomain_dns_record": "Die Subdomäne \"{subdomain}\" löst nicht zur gleichen IP Adresse auf wie \"{domain}\". Einige Funktionen sind nicht verfügbar bis du dies behebst und die Zertifikate neu erzeugst.", "diagnosis_ports_ok": "Port {port} ist von außen erreichbar.", "diagnosis_ram_verylow": "Das System hat nur {available} ({available_percent}%) RAM zur Verfügung! (von insgesamt {total})", - "diagnosis_mail_outgoing_port_25_blocked_details": "Sie sollten zuerst versuchen den ausgehenden Port 25 auf Ihrer Router-Konfigurationsoberfläche oder Ihrer Hosting-Anbieter-Konfigurationsoberfläche zu öffnen. (Bei einigen Hosting-Anbieter kann es sein, daß Sie verlangen, daß man dafür ein Support-Ticket sendet).", + "diagnosis_mail_outgoing_port_25_blocked_details": "Du solltest zuerst versuchen den ausgehenden Port 25 auf deiner Router-Konfigurationsoberfläche oder deiner Hosting-Anbieter-Konfigurationsoberfläche zu öffnen. (Bei einigen Hosting-Anbietern kann es sein, daß sie verlangen, daß man dafür ein Support-Ticket sendet).", "diagnosis_mail_ehlo_ok": "Der SMTP-Server ist von von außen erreichbar und darum auch in der Lage E-Mails zu empfangen!", "diagnosis_mail_ehlo_bad_answer": "Ein nicht-SMTP-Dienst antwortete auf Port 25 per IPv{ipversion}", - "diagnosis_swap_notsomuch": "Das System hat nur {total} Swap. Sie sollten sich überlegen mindestens {recommended} an Swap einzurichten, um Situationen zu verhindern, in welchen der RAM des Systems knapp wird.", + "diagnosis_swap_notsomuch": "Das System hat nur {total} Swap. Du solltest dir überlegen mindestens {recommended} an Swap einzurichten, um Situationen zu verhindern, in welchen der RAM des Systems knapp wird.", "diagnosis_swap_ok": "Das System hat {total} Swap!", - "diagnosis_swap_tip": "Wir sind Ihnen sehr dankbar dafür, daß Sie behutsam und sich bewußt sind, dass das Betreiben einer Swap-Partition auf einer SD-Karte oder einem SSD-Speicher das Risiko einer drastischen Verkürzung der Lebenserwartung dieser Platte nach sich zieht.", + "diagnosis_swap_tip": "Bitte beachte, dass das Betreiben der Swap-Partition auf einer SD-Karte oder SSD die Lebenszeit dieser drastisch reduziert.", "diagnosis_mail_outgoing_port_25_ok": "Der SMTP-Server ist in der Lage E-Mails zu versenden (der ausgehende Port 25 ist nicht blockiert).", - "diagnosis_mail_outgoing_port_25_blocked": "Der SMTP-Server kann keine E-Mails an andere Server senden, weil der ausgehende Port 25 per IPv{ipversion} blockiert ist. Sie können versuchen diesen in der Konfigurations-Oberfläche Ihres Internet-Anbieters (oder Hosters) zu öffnen.", + "diagnosis_mail_outgoing_port_25_blocked": "Der SMTP-Server kann keine E-Mails an andere Server senden, weil der ausgehende Port 25 per IPv{ipversion} blockiert ist. Du kannst versuchen, diesen in der Konfigurations-Oberfläche deines Internet-Anbieters (oder Hosters) zu öffnen.", "diagnosis_mail_ehlo_unreachable": "Der SMTP-Server ist von außen nicht erreichbar per IPv{ipversion}. Er wird nicht in der Lage sein E-Mails zu empfangen.", - "diagnosis_diskusage_low": "Der Speicher {mountpoint} (auf Gerät {device}) hat nur noch {free} ({free_percent}%) freien Speicherplatz (von insgesamt {total}). Seien Sie vorsichtig.", - "diagnosis_ram_low": "Das System hat nur {available} ({available_percent}%) RAM zur Verfügung! (von insgesamt {total}). Seien Sie vorsichtig.", + "diagnosis_diskusage_low": "Der Speicher {mountpoint} (auf Gerät {device}) hat nur noch {free} ({free_percent}%) freien Speicherplatz (von insgesamt {total}). Sei vorsichtig.", + "diagnosis_ram_low": "Das System hat nur {available} ({available_percent}%) RAM zur Verfügung! (von insgesamt {total}). Sei vorsichtig.", "service_reload_or_restart_failed": "Der Dienst '{service}' konnte nicht erneut geladen oder gestartet werden.\n\nKürzlich erstellte Logs des Dienstes: {logs}", "diagnosis_domain_expiration_not_found_details": "Die WHOIS-Informationen für die Domäne {domain} scheinen keine Informationen über das Ablaufdatum zu enthalten. Stimmt das?", "diagnosis_domain_expiration_warning": "Einige Domänen werden bald ablaufen!", "diagnosis_diskusage_ok": "Der Speicher {mountpoint} (auf Gerät {device}) hat immer noch {free} ({free_percent}%) freien Speicherplatz übrig(von insgesamt {total})!", "diagnosis_ram_ok": "Das System hat immer noch {available} ({available_percent}%) RAM zu Verfügung von {total}.", - "diagnosis_swap_none": "Das System hat gar keinen Swap. Sie sollten sich überlegen mindestens {recommended} an Swap einzurichten, um Situationen zu verhindern, in welchen der RAM des Systems knapp wird.", - "diagnosis_mail_ehlo_unreachable_details": "Konnte keine Verbindung zu Ihrem Server auf dem Port 25 herzustellen per IPv{ipversion}. Er scheint nicht erreichbar zu sein.
1. Das häufigste Problem ist, dass der Port 25 nicht richtig zu Ihrem Server weitergeleitet ist.
2. Sie sollten auch sicherstellen, dass der Postfix-Dienst läuft.
3. In komplexeren Umgebungen: Stellen Sie sicher, daß keine Firewall oder Reverse-Proxy stört.", - "diagnosis_mail_ehlo_wrong": "Ein anderer SMTP-Server antwortet auf IPv{ipversion}. Ihr Server wird wahrscheinlich nicht in der Lage sein, E-Mails zu empfangen.", + "diagnosis_swap_none": "Das System hat gar keinen Swap. Du solltest überlegen mindestens {recommended} an Swap einzurichten, um Situationen zu verhindern, in welchen der RAM des Systems knapp wird.", + "diagnosis_mail_ehlo_unreachable_details": "Konnte keine Verbindung zu deinem Server auf dem Port 25 herzustellen über IPv{ipversion}. Er scheint nicht erreichbar zu sein.
1. Das häufigste Problem ist, dass der Port 25 nicht richtig zu deinem Server weitergeleitet ist.
2. Du solltest auch sicherstellen, dass der Postfix-Dienst läuft.
3. In komplexeren Umgebungen: Stelle sicher, daß keine Firewall oder Reverse-Proxy stört.", + "diagnosis_mail_ehlo_wrong": "Ein anderer SMTP-Server antwortet auf IPv{ipversion}. Dein Server wird wahrscheinlich nicht in der Lage sein, E-Mails zu empfangen.", "service_reload_failed": "Der Dienst '{service}' konnte nicht erneut geladen werden.\n\nKürzlich erstellte Logs des Dienstes: {logs}", "service_reloaded": "Der Dienst '{service}' wurde erneut geladen", "service_restart_failed": "Der Dienst '{service}' konnte nicht erneut gestartet werden.\n\nKürzlich erstellte Logs des Dienstes: {logs}", - "app_manifest_install_ask_password": "Wählen Sie ein Verwaltungspasswort für diese Applikation", - "app_manifest_install_ask_domain": "Wählen Sie die Domäne, auf welcher die Applikation installiert werden soll", + "app_manifest_install_ask_password": "Wähle ein Verwaltungspasswort für diese Applikation", + "app_manifest_install_ask_domain": "Wähle die Domäne, auf welcher die Applikation installiert werden soll", "log_letsencrypt_cert_renew": "Erneuern des Let's Encrypt-Zeritifikates von '{}'", "log_selfsigned_cert_install": "Das selbstsignierte Zertifikat auf der Domäne '{}' installieren", "log_letsencrypt_cert_install": "Das Let’s Encrypt auf der Domäne '{}' installieren", - "diagnosis_mail_fcrdns_nok_details": "Sie sollten zuerst versuchen, in Ihrer Internet-Router-Oberfläche oder in Ihrer Hosting-Anbieter-Oberfläche den Reverse-DNS-Eintrag mit {ehlo_domain}zu konfigurieren. (Gewisse Hosting-Anbieter können dafür möglicherweise verlangen, dass Sie dafür ein Support-Ticket erstellen).", + "diagnosis_mail_fcrdns_nok_details": "Du solltest zuerst versuchen, in deiner Internet-Router-Oberfläche oder in deiner Hosting-Anbieter-Oberfläche den Reverse-DNS-Eintrag mit {ehlo_domain}zu konfigurieren. (Gewisse Hosting-Anbieter können dafür möglicherweise verlangen, dass du dafür ein Support-Ticket erstellst).", "diagnosis_mail_fcrdns_dns_missing": "Es wurde kein Reverse-DNS-Eintrag definiert für IPv{ipversion}. Einige E-Mails könnten möglicherweise zurückgewiesen oder als Spam markiert werden.", - "diagnosis_mail_fcrdns_ok": "Ihr Reverse-DNS-Eintrag ist korrekt konfiguriert!", + "diagnosis_mail_fcrdns_ok": "Dein Reverse-DNS-Eintrag ist korrekt konfiguriert!", "diagnosis_mail_ehlo_could_not_diagnose_details": "Fehler: {error}", "diagnosis_mail_ehlo_could_not_diagnose": "Konnte nicht überprüfen, ob der Postfix-Mail-Server von aussen per IPv{ipversion} erreichbar ist.", - "diagnosis_mail_ehlo_wrong_details": "Die vom Remote-Diagnose-Server per IPv{ipversion} empfangene EHLO weicht von der Domäne Ihres Servers ab.
Empfangene EHLO: {wrong_ehlo}
Erwartet: {right_ehlo}
Die geläufigste Ursache für dieses Problem ist, dass der Port 25 nicht korrekt auf Ihren Server weitergeleitet wird. Sie können sich zusätzlich auch versichern, dass keine Firewall oder Reverse-Proxy interferiert.", - "diagnosis_mail_ehlo_bad_answer_details": "Das könnte daran liegen, dass anstelle Ihres Servers eine andere Maschine antwortet.", + "diagnosis_mail_ehlo_wrong_details": "Die vom Remote-Diagnose-Server per IPv{ipversion} empfangene EHLO weicht von der Domäne deines Servers ab.
Empfangene EHLO: {wrong_ehlo}
Erwartet: {right_ehlo}
Die geläufigste Ursache für dieses Problem ist, dass der Port 25 nicht korrekt auf deinem Server weitergeleitet wird. Du kannst zusätzlich auch prüfen, dass keine Firewall oder Reverse-Proxy stört.", + "diagnosis_mail_ehlo_bad_answer_details": "Das könnte daran liegen, dass anstelle deines Servers eine andere Maschine antwortet.", "ask_user_domain": "Domäne, welche für die E-Mail-Adresse und den XMPP-Account des Benutzers verwendet werden soll", "app_manifest_install_ask_is_public": "Soll diese Applikation für anonyme Benutzer:innen sichtbar sein?", - "app_manifest_install_ask_admin": "Wählen Sie einen Administrator für diese Applikation", - "app_manifest_install_ask_path": "Wählen Sie den URL-Pfad (nach der Domäne), unter dem die Applikation installiert werden soll", - "diagnosis_mail_blacklist_listed_by": "Ihre IP-Adresse oder Domäne {item} ist auf der Blacklist auf {blacklist_name}", + "app_manifest_install_ask_admin": "Wähle einen Administrator für diese Applikation", + "app_manifest_install_ask_path": "Wähle den URL-Pfad (nach der Domäne), unter dem die Applikation installiert werden soll", + "diagnosis_mail_blacklist_listed_by": "Deine IP-Adresse oder Domäne {item} ist auf der Blacklist auf {blacklist_name}", "diagnosis_mail_blacklist_ok": "Die IP-Adressen und die Domänen, welche von diesem Server verwendet werden, scheinen nicht auf einer Blacklist zu sein", "diagnosis_mail_fcrdns_different_from_ehlo_domain_details": "Aktueller Reverse-DNS-Eintrag: {rdns_domain}
Erwarteter Wert: {ehlo_domain}", "diagnosis_mail_fcrdns_different_from_ehlo_domain": "Der Reverse-DNS-Eintrag für IPv{ipversion} ist nicht korrekt konfiguriert. Einige E-Mails könnten abgewiesen oder als Spam markiert werden.", - "diagnosis_mail_fcrdns_nok_alternatives_6": "Einige Provider werden es Ihnen nicht erlauben, Ihren Reverse-DNS-Eintrag zu konfigurieren (oder ihre Funktionalität könnte defekt sein ...). Falls Ihr Reverse-DNS-Eintrag für IPv4 korrekt konfiguiert ist, können Sie versuchen, die Verwendung von IPv6 für das Versenden von E-Mails auszuschalten, indem Sie den Befehl yunohost settings set smtp.allow_ipv6 -v off ausführen. Bemerkung: Die Folge dieser letzten Lösung ist, dass Sie mit Servern, welche ausschliesslich über IPv6 verfügen, keine E-Mails mehr versenden oder empfangen können.", + "diagnosis_mail_fcrdns_nok_alternatives_6": "Einige Provider werden es dir nicht erlauben, deinen Reverse-DNS-Eintrag zu konfigurieren (oder ihre Funktionalität könnte defekt sein ...). Falls du deinen Reverse-DNS-Eintrag für IPv4 korrekt konfiguiert ist, kannst du versuchen, die Verwendung von IPv6 für das Versenden von E-Mails auszuschalten, indem du den Befehl yunohost settings set smtp.allow_ipv6 -v off ausführst. Bemerkung: Die Folge dieser letzten Lösung ist, dass du mit Servern, welche ausschliesslich über IPv6 verfügen, keine E-Mails mehr versenden oder empfangen kannst.", "diagnosis_mail_fcrdns_nok_alternatives_4": "Einige Anbieter werden es dir nicht erlauben, deinen Reverse-DNS zu konfigurieren (oder deren Funktionalität ist defekt...). Falls du deswegen auf Probleme stoßen solltest, ziehe folgende Lösungen in Betracht:
- Manche ISPs stellen als Alternative die Benutzung eines Mail-Server-Relays zur Verfügung, was jedoch mit sich zieht, dass das Relay Ihren E-Mail-Verkehr ausspionieren kann.
- Eine privatsphärenfreundlichere Alternative ist die Benutzung eines VPN *mit einer dedizierten öffentlichen IP* um Einschränkungen dieser Art zu umgehen. Schaue hier nach https://yunohost.org/#/vpn_advantage
- Schließlich ist es auch möglich zu einem anderen Anbieter zu wechseln", "diagnosis_mail_queue_unavailable_details": "Fehler: {error}", "diagnosis_mail_queue_unavailable": "Die Anzahl der anstehenden Nachrichten in der Warteschlange kann nicht abgefragt werden", @@ -389,7 +389,7 @@ "diagnosis_ports_partially_unreachable": "Port {port} ist von aussen per IPv{failed} nicht erreichbar.", "diagnosis_ports_unreachable": "Port {port} ist von aussen nicht erreichbar.", "diagnosis_ports_could_not_diagnose_details": "Fehler: {error}", - "diagnosis_security_vulnerable_to_meltdown_details": "Um dieses Problem zu beheben, sollten Sie Ihr System upgraden und neustarten um den neuen Linux-Kernel zu laden (oder Ihren Server-Anbieter kontaktieren, falls das nicht funktionieren sollte). Besuchen Sie https://meltdownattack.com/ für weitere Informationen.", + "diagnosis_security_vulnerable_to_meltdown_details": "Um dieses Problem zu beheben, solltest du dein System upgraden und neustarten um den neuen Linux-Kernel zu laden (oder deinen Server-Anbieter kontaktieren, falls das nicht funktionieren sollte). Besuche https://meltdownattack.com/ für weitere Informationen.", "diagnosis_ports_could_not_diagnose": "Konnte nicht diagnostizieren, ob die Ports von aussen per IPv{ipversion} erreichbar sind.", "diagnosis_description_regenconf": "Systemkonfiguration", "diagnosis_description_mail": "E-Mail", @@ -399,18 +399,18 @@ "diagnosis_description_dnsrecords": "DNS-Einträge", "diagnosis_description_ip": "Internetkonnektivität", "diagnosis_description_basesystem": "Grundsystem", - "diagnosis_security_vulnerable_to_meltdown": "Es scheint, als ob Sie durch die kritische Meltdown-Sicherheitslücke verwundbar sind", + "diagnosis_security_vulnerable_to_meltdown": "Es scheint, als ob du durch die kritische Meltdown-Sicherheitslücke verwundbar bist", "diagnosis_regenconf_manually_modified": "Die Konfigurationsdatei {file} scheint manuell verändert worden zu sein.", "diagnosis_regenconf_allgood": "Alle Konfigurationsdateien stimmen mit der empfohlenen Konfiguration überein!", "diagnosis_package_installed_from_sury": "Einige System-Pakete sollten gedowngradet werden", - "diagnosis_ports_forwarding_tip": "Um dieses Problem zu beheben, müssen Sie höchst wahrscheinlich die Port-Weiterleitung auf Ihrem Internet-Router einrichten wie in https://yunohost.org/isp_box_config beschrieben", - "diagnosis_regenconf_manually_modified_details": "Das ist wahrscheinlich OK wenn Sie wissen, was Sie tun! YunoHost wird in Zukunft diese Datei nicht mehr automatisch updaten... Aber seien Sie bitte vorsichtig, da die zukünftigen Upgrades von YunoHost wichtige empfohlene Änderungen enthalten könnten. Falls Sie möchten, können Sie die Unterschiede mit yunohost tools regen-conf {category} --dry-run --with-diff inspizieren und mit yunohost tools regen-conf {category} --force auf das Zurücksetzen die empfohlene Konfiguration erzwingen", - "diagnosis_mail_blacklist_website": "Nachdem Sie herausgefunden haben, weshalb Sie auf die Blacklist gesetzt wurden und dies behoben haben, zögern Sie nicht, nachzufragen, ob Ihre IP-Adresse oder Ihre Domäne von auf {blacklist_website} entfernt wird", + "diagnosis_ports_forwarding_tip": "Um dieses Problem zu beheben, musst du höchstwahrscheinlich die Port-Weiterleitung auf deinem Internet-Router einrichten wie in https://yunohost.org/isp_box_config beschrieben", + "diagnosis_regenconf_manually_modified_details": "Das ist wahrscheinlich OK wenn du weißt, was du tust! YunoHost wird in Zukunft diese Datei nicht mehr automatisch updaten... Aber sei bitte vorsichtig, da die zukünftigen Upgrades von YunoHost wichtige empfohlene Änderungen enthalten könnten. Wenn du möchtest, kannst du die Unterschiede mit yunohost tools regen-conf {category} --dry-run --with-diff inspizieren und mit yunohost tools regen-conf {category} --force auf das Zurücksetzen die empfohlene Konfiguration erzwingen", + "diagnosis_mail_blacklist_website": "Nachdem du herausgefunden hast, weshalb du auf die Blacklist gesetzt wurdest und dies behoben hast, zögere nicht, nachzufragen, ob deine IP-Adresse oder Ihre Domäne von auf {blacklist_website} entfernt wird", "diagnosis_unknown_categories": "Folgende Kategorien sind unbekannt: {categories}", - "diagnosis_http_hairpinning_issue": "In Ihrem lokalen Netzwerk scheint Hairpinning nicht aktiviert zu sein.", + "diagnosis_http_hairpinning_issue": "In deinem lokalen Netzwerk scheint Hairpinning nicht aktiviert zu sein.", "diagnosis_ports_needed_by": "Diesen Port zu öffnen ist nötig, um die Funktionalität des Typs {category} (service {service}) zu gewährleisten", "diagnosis_mail_queue_too_big": "Zu viele anstehende Nachrichten in der Warteschlange ({nb_pending} emails)", - "diagnosis_package_installed_from_sury_details": "Einige Pakete wurden unbeabsichtigterweise aus einem Drittanbieter-Repository, genannt Sury, installiert. Das YunoHost-Team hat die Strategie, um diese Pakete zu handhaben, verbessert, aber es wird erwartet, dass einige Setups, welche PHP7.3-Applikationen installiert haben und immer noch auf Strech laufen, ein paar Inkonsistenzen aufweisen. Um diese Situation zu beheben, sollten Sie versuchen, den folgenden Befehl auszuführen: {cmd_to_fix}", + "diagnosis_package_installed_from_sury_details": "Einige Pakete wurden unbeabsichtigterweise aus einem Drittanbieter-Repository, genannt Sury, installiert. Das YunoHost-Team hat die Strategie, um diese Pakete zu handhaben, verbessert, aber es wird erwartet, dass einige Setups, welche PHP7.3-Applikationen installiert haben und immer noch auf Strech laufen, ein paar Inkonsistenzen aufweisen. Um diese Situation zu beheben, solltest du versuchen, den folgenden Befehl auszuführen: {cmd_to_fix}", "domain_cannot_add_xmpp_upload": "Eine hinzugefügte Domain darf nicht mit 'xmpp-upload.' beginnen. Dieser Name ist für das XMPP-Upload-Feature von YunoHost reserviert.", "group_cannot_be_deleted": "Die Gruppe {group} kann nicht manuell entfernt werden.", "group_cannot_edit_primary_group": "Die Gruppe '{group}' kann nicht manuell bearbeitet werden. Es ist die primäre Gruppe, welche dazu gedacht ist, nur einen spezifischen Benutzer zu enthalten.", @@ -418,13 +418,13 @@ "diagnosis_description_ports": "Geöffnete Ports", "additional_urls_already_added": "Zusätzliche URL '{url}' bereits hinzugefügt in der zusätzlichen URL für Berechtigung '{permission}'", "additional_urls_already_removed": "Zusätzliche URL '{url}' bereits entfernt in der zusätzlichen URL für Berechtigung '{permission}'", - "app_label_deprecated": "Dieser Befehl ist veraltet! Bitte nutzen Sie den neuen Befehl 'yunohost user permission update' um das Applabel zu verwalten.", - "diagnosis_http_hairpinning_issue_details": "Das ist wahrscheinlich aufgrund Ihrer ISP Box / Router. Als Konsequenz können Personen von ausserhalb Ihres Netzwerkes aber nicht von innerhalb Ihres lokalen Netzwerkes (wie wahrscheinlich Sie selber?) wie gewohnt auf Ihren Server zugreifen, wenn Sie ihre Domäne oder Ihre öffentliche IP verwenden. Sie können die Situation wahrscheinlich verbessern, indem Sie ein einen Blick in https://yunohost.org/dns_local_network werfen", + "app_label_deprecated": "Dieser Befehl ist veraltet! Bitte nutze den neuen Befehl 'yunohost user permission update' um das Applabel zu verwalten.", + "diagnosis_http_hairpinning_issue_details": "Das liegt wahrscheinlich an deinem Router. Dadurch können Personen von ausserhalb deines Netzwerkes, aber nicht von innerhalb deines lokalen Netzwerkes (wie wahrscheinlich du selbst), auf deinen Server zugreifen, wenn dazu die Domäne oder öffentliche IP verwendet wird. Du kannst das Problem eventuell beheben, indem du ein einen Blick auf https://yunohost.org/dns_local_network wirfst", "diagnosis_http_nginx_conf_not_up_to_date": "Die Konfiguration von Nginx scheint für diese Domäne manuell geändert worden zu sein. Dies hindert YunoHost daran festzustellen, ob es über HTTP erreichbar ist.", "diagnosis_http_bad_status_code": "Es sieht so aus als ob ein anderes Gerät (vielleicht dein Router/Modem) anstelle deines Servers antwortet.
1. Der häufigste Grund hierfür ist, dass Port 80 (und 443) nicht korrekt zu deinem Server weiterleiten.
2. Bei komplexeren Setups: prüfe ob deine Firewall oder Reverse-Proxy die Verbindung stören.", - "diagnosis_never_ran_yet": "Sie haben kürzlich einen neuen YunoHost-Server installiert aber es gibt davon noch keinen Diagnosereport. Sie sollten eine Diagnose anstossen. Sie können das entweder vom Webadmin aus oder in der Kommandozeile machen. In der Kommandozeile verwenden Sie dafür den Befehl 'yunohost diagnosis run'.", - "diagnosis_http_nginx_conf_not_up_to_date_details": "Um dieses Problem zu beheben, geben Sie in der Kommandozeile yunohost tools regen-conf nginx --dry-run --with-diff ein. Dieses Tool zeigt ihnen den Unterschied an. Wenn Sie damit einverstanden sind, können Sie mit yunohost tools regen-conf nginx --force die Änderungen übernehmen.", - "diagnosis_backports_in_sources_list": "Sie haben anscheinend apt (den Paketmanager) für das Backports-Repository konfiguriert. Wir raten strikte davon ab, Pakete aus dem Backports-Repository zu installieren. Diese würden wahrscheinlich zu Instabilitäten und Konflikten führen. Es sei denn, Sie wissen was Sie tun.", + "diagnosis_never_ran_yet": "Du hast kürzlich einen neuen YunoHost-Server installiert aber es gibt davon noch keinen Diagnosereport. Du solltest eine Diagnose anstossen. Du kannst das entweder vom Webadmin aus oder in der Kommandozeile machen. In der Kommandozeile verwendest du dafür den Befehl 'yunohost diagnosis run'.", + "diagnosis_http_nginx_conf_not_up_to_date_details": "Um dieses Problem zu beheben, gebe in der Kommandozeile yunohost tools regen-conf nginx --dry-run --with-diff ein. Dieses Tool zeigt dir den Unterschied an. Wenn du damit einverstanden bist, kannst du mit yunohost tools regen-conf nginx --force die Änderungen übernehmen.", + "diagnosis_backports_in_sources_list": "Du hast anscheinend apt (den Paketmanager) für das Backports-Repository konfiguriert. Wir raten strikte davon ab, Pakete aus dem Backports-Repository zu installieren. Diese würden wahrscheinlich zu Instabilitäten und Konflikten führen. Es sei denn, du weißt, was du tust.", "diagnosis_basesystem_hardware_model": "Das Servermodell ist {model}", "group_user_not_in_group": "Benutzer:in {user} ist nicht in der Gruppe {group}", "group_user_already_in_group": "Benutzer:in {user} ist bereits in der Gruppe {group}", @@ -438,10 +438,10 @@ "global_settings_setting_smtp_relay_port": "SMTP Relay Port", "global_settings_setting_smtp_allow_ipv6": "Erlaube die Nutzung von IPv6 um Mails zu empfangen und zu versenden", "global_settings_setting_pop3_enabled": "Aktiviere das POP3 Protokoll für den Mailserver", - "domain_cannot_remove_main_add_new_one": "Sie können '{domain}' nicht entfernen, weil es die Hauptdomäne und gleichzeitig Ihre einzige Domäne ist. Zuerst müssen Sie eine andere Domäne hinzufügen, indem Sie \"yunohost domain add another-domain.com>\" eingeben. Bestimmen Sie diese dann als Ihre Hauptdomain indem Sie 'yunohost domain main-domain -n ' eingeben. Nun können Sie die Domäne \"{domain}\" enfernen, indem Sie 'yunohost domain remove {domain}' eingeben.'", + "domain_cannot_remove_main_add_new_one": "Du kannst '{domain}' nicht entfernen, weil es die Haupt-Domäne und gleichzeitig deine einzige Domäne ist. Zuerst musst du eine andere Domäne hinzufügen, indem du 'yunohost domain add another-domain.com>' eingibst. Mache diese dann zu deiner Haupt-Domäne indem du 'yunohost domain main-domain -n ' eingibst. Nun kannst du die Domäne '{domain}' enfernen, indem du 'yunohost domain remove {domain}' eingibst.'", "diagnosis_rootfstotalspace_critical": "Das Root-Filesystem hat noch freien Speicher von {space}. Das ist besorngiserregend! Der Speicher wird schnell aufgebraucht sein. 16 GB für das Root-Filesystem werden empfohlen.", "diagnosis_rootfstotalspace_warning": "Das Root-Filesystem hat noch freien Speicher von {space}. Möglich, dass das in Ordnung ist. Vielleicht ist er aber auch schneller aufgebraucht. 16 GB für das Root-Filesystem werden empfohlen.", - "global_settings_setting_smtp_relay_host": "Zu verwendender SMTP-Relay-Host um E-Mails zu versenden. Er wird anstelle dieser YunoHost-Instanz verwendet. Nützlich, wenn Sie in einer der folgenden Situationen sind: Ihr ISP- oder VPS-Provider hat Ihren Port 25 geblockt, eine Ihrer residentiellen IPs ist auf DUHL gelistet, Sie können keinen Reverse-DNS konfigurieren oder dieser Server ist nicht direkt mit dem Internet verbunden und Sie möchten einen anderen verwenden, um E-Mails zu versenden.", + "global_settings_setting_smtp_relay_host": "Zu verwendender SMTP-Relay-Host um E-Mails zu versenden. Er wird anstelle dieser YunoHost-Instanz verwendet. Nützlich, wenn du in einer der folgenden Situationen bist: Dein ISP- oder VPS-Provider hat deinen Port 25 geblockt, eine deinen residentiellen IPs ist auf DUHL gelistet, du kannst keinen Reverse-DNS konfigurieren oder dieser Server ist nicht direkt mit dem Internet verbunden und du möchtest einen anderen verwenden, um E-Mails zu versenden.", "global_settings_setting_backup_compress_tar_archives": "Beim Erstellen von Backups die Archive komprimieren (.tar.gz) anstelle von unkomprimierten Archiven (.tar). N.B. : Diese Option ergibt leichtere Backup-Archive, aber das initiale Backupprozedere wird länger dauern und mehr CPU brauchen.", "log_remove_on_failed_restore": "'{}' entfernen nach einer fehlerhaften Wiederherstellung aus einem Backup-Archiv", "log_backup_restore_app": "'{}' aus einem Backup-Archiv wiederherstellen", @@ -472,18 +472,18 @@ "log_domain_remove": "Entfernen der Domäne '{}' aus der Systemkonfiguration", "log_domain_add": "Hinzufügen der Domäne '{}' zur Systemkonfiguration", "log_remove_on_failed_install": "Entfernen von '{}' nach einer fehlgeschlagenen Installation", - "domain_remove_confirm_apps_removal": "Wenn Sie diese Domäne löschen, werden folgende Applikationen entfernt:\n{apps}\n\nSind Sie sicher? [{answers}]", + "domain_remove_confirm_apps_removal": "Wenn du diese Domäne löschst, werden folgende Applikationen entfernt:\n{apps}\n\nBist du sicher? [{answers}]", "migrations_pending_cant_rerun": "Diese Migrationen sind immer noch anstehend und können deshalb nicht erneut durchgeführt werden: {ids}", "migrations_not_pending_cant_skip": "Diese Migrationen sind nicht anstehend und können deshalb nicht übersprungen werden: {ids}", "migrations_success_forward": "Migration {id} abgeschlossen", - "migrations_dependencies_not_satisfied": "Führen Sie diese Migrationen aus: '{dependencies_id}', vor der Migration {id}.", + "migrations_dependencies_not_satisfied": "Führe diese Migrationen aus: '{dependencies_id}', bevor du {id} migrierst.", "migrations_failed_to_load_migration": "Konnte Migration nicht laden {id}: {error}", - "migrations_list_conflict_pending_done": "Sie können nicht '--previous' und '--done' gleichzeitig benützen.", + "migrations_list_conflict_pending_done": "Du kannst '--previous' und '--done' nicht gleichzeitig benützen.", "migrations_already_ran": "Diese Migrationen wurden bereits durchgeführt: {ids}", "migrations_loading_migration": "Lade Migrationen {id}...", "migrations_migration_has_failed": "Migration {id} gescheitert mit der Ausnahme {exception}: Abbruch", - "migrations_must_provide_explicit_targets": "Sie müssen konkrete Ziele angeben, wenn Sie '--skip' oder '--force-rerun' verwenden", - "migrations_need_to_accept_disclaimer": "Um die Migration {id} durchzuführen, müssen Sie den Disclaimer akzeptieren.\n---\n{disclaimer}\n---\n Wenn Sie bestätigen, dass Sie die Migration durchführen wollen, wiederholen Sie bitte den Befehl mit der Option '--accept-disclaimer'.", + "migrations_must_provide_explicit_targets": "Du musst konkrete Ziele angeben, wenn du '--skip' oder '--force-rerun' verwendest", + "migrations_need_to_accept_disclaimer": "Um die Migration {id} durchzuführen, musst du folgenden Hinweis akzeptieren:\n---\n{disclaimer}\n---\nWenn du nach dem Lesen die Migration durchführen möchtest, wiederhole bitte den Befehl mit der Option '--accept-disclaimer'.", "migrations_no_migrations_to_run": "Keine Migrationen durchzuführen", "migrations_exclusive_options": "'--auto', '--skip' und '--force-rerun' sind Optionen, die sich gegenseitig ausschliessen.", "migrations_no_such_migration": "Es existiert keine Migration genannt '{id}'", @@ -493,12 +493,12 @@ "password_listed": "Dieses Passwort zählt zu den meistgenutzten Passwörtern der Welt. Bitte wähle ein anderes, einzigartigeres Passwort.", "operation_interrupted": "Wurde die Operation manuell unterbrochen?", "invalid_number": "Muss eine Zahl sein", - "migrations_to_be_ran_manually": "Die Migration {id} muss manuell durchgeführt werden. Bitte gehen Sie zu Werkzeuge → Migrationen auf der Webadmin-Seite oder führen Sie 'yunohost tools migrations run' aus.", + "migrations_to_be_ran_manually": "Die Migration {id} muss manuell durchgeführt werden. Bitte gehe zu Werkzeuge → Migrationen auf der Webadmin-Seite oder führe 'yunohost tools migrations run' aus.", "permission_already_up_to_date": "Die Berechtigung wurde nicht aktualisiert, weil die Anfragen für Hinzufügen/Entfernen bereits mit dem aktuellen Status übereinstimmen.", "permission_already_exist": "Berechtigung '{permission}' existiert bereits", "permission_already_disallowed": "Für die Gruppe '{group}' wurde die Berechtigung '{permission}' deaktiviert", "permission_already_allowed": "Die Gruppe '{group}' hat die Berechtigung '{permission}' bereits erhalten", - "pattern_password_app": "Entschuldigen Sie bitte! Passwörter dürfen folgende Zeichen nicht enthalten: {forbidden_chars}", + "pattern_password_app": "Entschuldige Bitte! Passwörter dürfen folgende Zeichen nicht enthalten: {forbidden_chars}", "pattern_email_forward": "Es muss sich um eine gültige E-Mail-Adresse handeln. Das Symbol '+' wird akzeptiert (zum Beispiel : maxmuster@beispiel.com oder maxmuster+yunohost@beispiel.com)", "password_too_simple_4": "Das Passwort muss mindestens 12 Zeichen lang sein und Grossbuchstaben, Kleinbuchstaben, Zahlen und Sonderzeichen enthalten", "password_too_simple_3": "Das Passwort muss mindestens 8 Zeichen lang sein und Grossbuchstaben, Kleinbuchstaben, Zahlen und Sonderzeichen enthalten", @@ -508,20 +508,20 @@ "regenconf_file_copy_failed": "Die neue Konfigurationsdatei '{new}' kann nicht nach '{conf}' kopiert werden", "regenconf_file_backed_up": "Die Konfigurationsdatei '{conf}' wurde unter '{backup}' gespeichert", "permission_require_account": "Berechtigung {permission} ist nur für Benutzer:innen mit einem Konto sinnvoll und kann daher nicht für Besucher:innen aktiviert werden.", - "permission_protected": "Die Berechtigung ist geschützt. Sie können die Besuchergruppe nicht zu dieser Berechtigung hinzufügen oder daraus entfernen.", + "permission_protected": "Die Berechtigung ist geschützt. Du kannst die Besuchergruppe nicht zu dieser Berechtigung hinzufügen oder daraus entfernen.", "permission_updated": "Berechtigung '{permission}' aktualisiert", "permission_update_failed": "Die Berechtigung '{permission}' kann nicht aktualisiert werden : {error}", "permission_not_found": "Berechtigung '{permission}' nicht gefunden", "permission_deletion_failed": "Entfernung der Berechtigung nicht möglich '{permission}': {error}", "permission_deleted": "Berechtigung '{permission}' gelöscht", - "permission_currently_allowed_for_all_users": "Diese Berechtigung wird derzeit allen Benutzer:innen zusätzlich zu anderen Gruppen erteilt. Möglicherweise möchten Sie entweder die Berechtigung 'all_users' entfernen oder die anderen Gruppen entfernen, für die sie derzeit zulässig sind.", + "permission_currently_allowed_for_all_users": "Diese Berechtigung wird derzeit allen Benutzer:innen zusätzlich zu anderen Gruppen erteilt. Möglicherweise möchtest du entweder die Berechtigung 'all_users' entfernen oder die anderen Gruppen entfernen, für die sie derzeit zulässig sind.", "permission_creation_failed": "Berechtigungserstellung nicht möglich '{permission}' : {error}", "permission_created": "Berechtigung '{permission}' erstellt", "permission_cannot_remove_main": "Entfernung einer Hauptberechtigung nicht genehmigt", "regenconf_file_updated": "Konfigurationsdatei '{conf}' aktualisiert", "regenconf_file_removed": "Konfigurationsdatei '{conf}' entfernt", "regenconf_file_remove_failed": "Konnte die Konfigurationsdatei '{conf}' nicht entfernen", - "postinstall_low_rootfsspace": "Das Root-Filesystem hat insgesamt weniger als 10GB freien Speicherplatz zur Verfügung, was ziemlich besorgniserregend ist! Sie werden sehr bald keinen freien Speicherplatz mehr haben! Für das Root-Filesystem werden mindestens 16GB empfohlen. Wenn Sie YunoHost trotz dieser Warnung installieren wollen, wiederholen Sie den Befehl mit --force-diskspace", + "postinstall_low_rootfsspace": "Das Root-Filesystem hat insgesamt weniger als 10GB freien Speicherplatz zur Verfügung, was ziemlich besorgniserregend ist! Du wirst sehr bald keinen freien Speicherplatz mehr haben! Für das Root-Filesystem werden mindestens 16GB empfohlen. Wenn du YunoHost trotz dieser Warnung installieren willst, wiederhole den Befehl mit --force-diskspace", "regenconf_up_to_date": "Die Konfiguration ist bereits aktuell für die Kategorie '{category}'", "regenconf_now_managed_by_yunohost": "Die Konfigurationsdatei '{conf}' wird jetzt von YunoHost (Kategorie {category}) verwaltet.", "regenconf_updated": "Konfiguration aktualisiert für '{category}'", @@ -532,12 +532,12 @@ "restore_system_part_failed": "Die Systemteile '{part}' konnten nicht wiederhergestellt werden", "restore_removing_tmp_dir_failed": "Ein altes, temporäres Directory konnte nicht entfernt werden", "restore_not_enough_disk_space": "Nicht genug Speicher (Speicher: {free_space} B, benötigter Speicher: {needed_space} B, Sicherheitspuffer: {margin} B)", - "restore_may_be_not_enough_disk_space": "Ihr System scheint nicht genug Speicherplatz zu haben (frei: {free_space} B, benötigter Platz: {needed_space} B, Sicherheitspuffer: {margin} B)", + "restore_may_be_not_enough_disk_space": "Dein System scheint nicht genug Speicherplatz zu haben (frei: {free_space} B, benötigter Platz: {needed_space} B, Sicherheitspuffer: {margin} B)", "restore_extracting": "Packe die benötigten Dateien aus dem Archiv aus...", "restore_already_installed_apps": "Folgende Apps können nicht wiederhergestellt werden, weil sie schon installiert sind: {apps}", "regex_with_only_domain": "Du kannst regex nicht als Domain verwenden, sondern nur als Pfad", "root_password_desynchronized": "Das Admin-Passwort wurde verändert, aber das Root-Passwort ist immer noch das alte!", - "regenconf_need_to_explicitly_specify_ssh": "Die SSH-Konfiguration wurde manuell modifiziert, aber Sie müssen explizit die Kategorie 'SSH' mit --force spezifizieren, um die Änderungen tatsächlich anzuwenden.", + "regenconf_need_to_explicitly_specify_ssh": "Die SSH-Konfiguration wurde manuell modifiziert, aber du musst explizit die Kategorie 'SSH' mit --force spezifizieren, um die Änderungen tatsächlich anzuwenden.", "log_backup_create": "Erstelle ein Backup-Archiv", "diagnosis_sshd_config_inconsistent": "Es sieht aus, als ob der SSH-Port manuell geändert wurde in /etc/ssh/ssh_config. Seit YunoHost 4.2 ist eine neue globale Einstellung 'security.ssh.port' verfügbar um zu verhindern, dass die Konfiguration manuell verändert wird.", "diagnosis_sshd_config_insecure": "Die SSH-Konfiguration wurde scheinbar manuell geändert und ist unsicher, weil sie keine 'AllowGroups'- oder 'AllowUsers' -Direktiven für die Beschränkung des Zugriffs durch autorisierte Benutzer enthält.", @@ -549,8 +549,8 @@ "migration_ldap_backup_before_migration": "Vor der eigentlichen Migration ein Backup der LDAP-Datenbank und der Applikations-Einstellungen erstellen.", "global_settings_setting_ssowat_panel_overlay_enabled": "Das SSOwat-Overlay-Panel aktivieren", "global_settings_setting_security_ssh_port": "SSH-Port", - "diagnosis_sshd_config_inconsistent_details": "Bitte führen Sie yunohost settings set security.ssh.port -v YOUR_SSH_PORT aus, um den SSH-Port festzulegen, und prüfen Sie yunohost tools regen-conf ssh --dry-run --with-diff und yunohost tools regen-conf ssh --force um Ihre conf auf die YunoHost-Empfehlung zurückzusetzen.", - "regex_incompatible_with_tile": "/!\\ Packagers! Für Berechtigung '{permission}' ist show_tile auf 'true' gesetzt und deshalb können Sie keine regex-URL als Hauptdomäne setzen", + "diagnosis_sshd_config_inconsistent_details": "Bitte führe yunohost settings set security.ssh.port -v YOUR_SSH_PORT aus, um den SSH-Port festzulegen, und prüfe yunohost tools regen-conf ssh --dry-run --with-diff und yunohost tools regen-conf ssh --force um deine Konfiguration auf die YunoHost-Empfehlung zurückzusetzen.", + "regex_incompatible_with_tile": "/!\\ Packagers! Für Berechtigung '{permission}' ist show_tile auf 'true' gesetzt und deshalb kannst du keine regex-URL als Hauptdomäne setzen", "permission_cant_add_to_all_users": "Die Berechtigung {permission} konnte nicht allen Benutzer:innen gegeben werden.", "migration_ldap_can_not_backup_before_migration": "Das System-Backup konnte nicht abgeschlossen werden, bevor die Migration fehlschlug. Fehler: {error}", "service_description_fail2ban": "Schützt gegen Brute-Force-Angriffe und andere Angriffe aus dem Internet", @@ -566,15 +566,15 @@ "service_description_metronome": "XMPP Sofortnachrichtenkonten verwalten", "service_description_yunohost-firewall": "Verwaltet offene und geschlossene Ports zur Verbindung mit Diensten", "service_description_yunohost-api": "Verwaltet die Interaktionen zwischen der Weboberfläche von YunoHost und dem System", - "service_description_ssh": "Ermöglicht die Verbindung zu Ihrem Server über ein Terminal (SSH-Protokoll)", - "server_reboot_confirm": "Der Server wird sofort heruntergefahren, sind Sie sicher? [{answers}]", + "service_description_ssh": "Ermöglicht die Verbindung zu deinem Server über ein Terminal (SSH-Protokoll)", + "server_reboot_confirm": "Der Server wird sofort heruntergefahren, bist du sicher? [{answers}]", "server_reboot": "Der Server wird neu gestartet", - "server_shutdown_confirm": "Der Server wird sofort heruntergefahren, sind Sie sicher? [{answers}]", + "server_shutdown_confirm": "Der Server wird sofort heruntergefahren, bist du sicher? [{answers}]", "server_shutdown": "Der Server wird heruntergefahren", - "root_password_replaced_by_admin_password": "Ihr Root Passwort wurde durch Ihr Admin Passwort ersetzt.", + "root_password_replaced_by_admin_password": "Dein Root Passwort wurde durch dein Admin Passwort ersetzt.", "show_tile_cant_be_enabled_for_regex": "Du kannst 'show_tile' momentan nicht aktivieren, weil die URL für die Berechtigung '{permission}' ein regulärer Ausdruck ist", - "show_tile_cant_be_enabled_for_url_not_defined": "Momentan können Sie 'show_tile' nicht aktivieren, weil Sie zuerst eine URL für die Berechtigung '{permission}' definieren müssen", - "this_action_broke_dpkg": "Diese Aktion hat unkonfigurierte Pakete verursacht, welche durch dpkg/apt (die Paketverwaltungen dieses Systems) zurückgelassen wurden... Sie können versuchen dieses Problem zu lösen, indem Sie 'sudo apt install --fix-broken' und/oder 'sudo dpkg --configure -a' ausführen.", + "show_tile_cant_be_enabled_for_url_not_defined": "Momentan kannst du 'show_tile' nicht aktivieren, weil du zuerst eine URL für die Berechtigung '{permission}' definieren musst", + "this_action_broke_dpkg": "Diese Aktion hat unkonfigurierte Pakete verursacht, welche durch dpkg/apt (die Paketverwaltungen dieses Systems) zurückgelassen wurden... Du kannst versuchen dieses Problem zu lösen, indem du 'sudo apt install --fix-broken' und/oder 'sudo dpkg --configure -a' ausführst.", "update_apt_cache_failed": "Kann den Cache von APT (Debians Paketmanager) nicht aktualisieren. Hier ist ein Auszug aus den sources.list-Zeilen, die helfen könnten, das Problem zu identifizieren:\n{sourceslist}", "unknown_main_domain_path": "Unbekannte:r Domain oder Pfad für '{app}'. Du musst eine Domain und einen Pfad setzen, um die URL für Berechtigungen zu setzen.", "yunohost_postinstall_end_tip": "Post-install ist fertig! Um das Setup abzuschliessen, wird empfohlen:\n - einen ersten Benutzer über den Bereich 'Benutzer:in' im Adminbereich hinzuzufügen (oder mit 'yunohost user create ' in der Kommandezeile);\n - mögliche Fehler zu diagnostizieren über den Bereich 'Diagnose' im Adminbereich (oder mit 'yunohost diagnosis run' in der Kommandozeile;\n - Die Abschnitte 'Install YunoHost' und 'Geführte Tour' im Administratorenhandbuch zu lesen: https://yunohost.org/admindoc.", @@ -582,7 +582,7 @@ "update_apt_cache_warning": "Beim Versuch den Cache für APT (Debians Paketmanager) zu aktualisieren, ist etwas schief gelaufen. Hier ist ein Dump der Zeilen aus sources.list, die Ihnen vielleicht dabei helfen, das Problem zu identifizieren:\n{sourceslist}", "global_settings_setting_security_webadmin_allowlist": "IP-Adressen, die auf die Verwaltungsseite zugreifen dürfen. Kommasepariert.", "global_settings_setting_security_webadmin_allowlist_enabled": "Erlaube nur bestimmten IP-Adressen den Zugriff auf die Verwaltungsseite.", - "disk_space_not_sufficient_update": "Es ist nicht genügend Speicherplatz frei, um diese Applikation zu aktuallisieren", + "disk_space_not_sufficient_update": "Es ist nicht genügend Speicherplatz frei, um diese Applikation zu aktualisieren", "disk_space_not_sufficient_install": "Es ist nicht genügend Speicherplatz frei, um diese Applikation zu installieren", "danger": "Warnung:", "diagnosis_apps_bad_quality": "Diese App ist im YunoHost-Applikationskatalog momentan als defekt gekennzeichnet. Es könnte sich dabei um einen vorübergehendes Problem handeln. Während der/die Betreuer:in versucht das Problem zu beheben, ist die Upgrade-Funktion für diese App gesperrt.", @@ -598,11 +598,11 @@ "config_version_not_supported": "Konfigurationspanel Versionen '{version}' sind nicht unterstützt.", "diagnosis_apps_allgood": "Alle installierten Apps berücksichtigen die grundlegenden Paketierungspraktiken", "diagnosis_apps_broken": "Diese App ist im YunoHost-Applikationskatalog momentan als defekt gekennzeichnet. Es könnte sich dabei um einen vorübergehendes Problem handeln. Während der/die Betreuer:in versucht das Problem zu beheben, ist die Upgrade-Funktion für diese App gesperrt.", - "diagnosis_apps_not_in_app_catalog": "Diese App fehlt im Applikationskatalog von YunoHost oder wird in diesem nicht mehr angezeigt. Sie müssen im Betracht ziehen, sie zu deinstallieren, weil sie keine Aktualisierungen mehr erhält und die Integrität und die Sicherheit Ihres Systems kompromittieren könnte.", - "diagnosis_apps_outdated_ynh_requirement": "Die installierte Version dieser App erfordert nur YunoHost >=2.x, was darauf hinweist, dass die App nicht mehr auf dem Stand der guten Paketierungspraktiken und der empfohlenen Helper ist. Sie sollten wirklich in Betracht ziehen, sie zu aktualisieren.", + "diagnosis_apps_not_in_app_catalog": "Diese App fehlt im Applikationskatalog von YunoHost oder wird in diesem nicht mehr angezeigt. Du solltest in Betracht ziehen, sie zu deinstallieren, weil sie keine Aktualisierungen mehr erhält und die Integrität und die Sicherheit deines Systems kompromittieren könnte.", + "diagnosis_apps_outdated_ynh_requirement": "Die installierte Version dieser App erfordert nur YunoHost >=2.x, was darauf hinweist, dass die App nicht nach aktuell empfohlenen Paketierungspraktiken und mit aktuellen Helpern erstellt worden ist. Du solltest wirklich in Betracht ziehen, sie zu aktualisieren.", "diagnosis_description_apps": "Applikationen", - "config_cant_set_value_on_section": "Sie können nicht einen einzelnen Wert auf einen gesamten Konfigurationsbereich anwenden.", - "diagnosis_apps_deprecated_practices": "Die installierte Version dieser App verwendet immer noch gewisse veraltete Paketierungspraktiken. Sie sollten die App wirklich aktualisieren.", + "config_cant_set_value_on_section": "Du kannst einen einzelnen Wert nicht auf einen gesamten Konfigurationsbereich anwenden.", + "diagnosis_apps_deprecated_practices": "Die installierte Version dieser App verwendet immer noch gewisse veraltete Paketierungspraktiken. Du solltest die App wirklich aktualisieren.", "app_config_unable_to_apply": "Konnte die Werte des Konfigurations-Panels nicht anwenden.", "app_config_unable_to_read": "Konnte die Werte des Konfigurations-Panels nicht auslesen.", "config_unknown_filter_key": "Der Filterschlüssel '{filter_key}' ist inkorrekt.", @@ -667,13 +667,22 @@ "migration_0021_still_on_buster_after_main_upgrade": "Irgendetwas ist während des Haupt-Upgrades schief gelaufen, das System scheint immer noch auf Debian Buster zu laufen", "migration_0021_yunohost_upgrade": "Start des YunoHost Kern-Upgrades...", "migration_0021_not_buster": "Die aktuelle Debian-Distribution ist nicht Buster!", - "migration_0021_not_enough_free_space": "Der freie Speicherplatz in /var/ ist ziemlich gering! Sie sollten mindestens 1 GB frei haben, um diese Migration durchzuführen.", - "migration_0021_system_not_fully_up_to_date": "Ihr System ist nicht ganz aktuell. Bitte führen Sie ein reguläres Update durch, bevor Sie die Migration zu Bullseye durchführen.", - "migration_0021_problematic_apps_warning": "Bitte beachten Sie, dass die folgenden möglicherweise problematischen installierten Anwendungen erkannt wurden. Es sieht so aus, als ob diese nicht aus dem YunoHost-App-Katalog installiert wurden oder nicht als \"funktionierend\" gekennzeichnet sind. Es kann daher nicht garantiert werden, dass sie nach dem Update noch funktionieren werden: {problematic_apps}", - "migration_0021_modified_files": "Bitte beachten Sie, dass die folgenden Dateien manuell geändert wurden und nach dem Update möglicherweise überschrieben werden: {manually_modified_files}", + "migration_0021_not_enough_free_space": "Der freie Speicherplatz in /var/ ist ziemlich gering! Du solltest mindestens 1 GB frei haben, um diese Migration durchzuführen.", + "migration_0021_system_not_fully_up_to_date": "Dein System ist nicht ganz aktuell. Bitte führe ein reguläres Upgrade durch, bevor du die Migration zu Bullseye durchführst.", + "migration_0021_problematic_apps_warning": "Bitte beachte, dass die folgenden, möglicherweise problematischen installierten Anwendungen erkannt wurden. Es sieht so aus, als ob diese nicht aus dem YunoHost-Applikations-Katalog installiert wurden oder nicht als \"funktionierend\" gekennzeichnet sind. Es kann daher nicht garantiert werden, dass sie nach dem Upgrade noch funktionieren werden: {problematic_apps}", + "migration_0021_modified_files": "Bitte beachte, dass die folgenden Dateien manuell geändert wurden und nach dem Update möglicherweise überschrieben werden: {manually_modified_files}", "migration_0021_cleaning_up": "Bereinigung von Cache und Paketen nicht mehr nötig...", "migration_0021_patch_yunohost_conflicts": "Patch anwenden, um das Konfliktproblem zu umgehen...", "global_settings_setting_security_ssh_password_authentication": "Passwort-Authentifizierung für SSH zulassen", "migration_description_0021_migrate_to_bullseye": "Upgrade des Systems auf Debian Bullseye und YunoHost 11.x", - "migration_0021_general_warning": "Bitte beachten Sie, dass diese Migration ein heikler Vorgang ist. Das YunoHost-Team hat sein Bestes getan, um sie zu überprüfen und zu testen, aber die Migration könnte immer noch Teile des Systems oder seiner Anwendungen beschädigen.\n\nEs wird daher empfohlen,:\n - Führen Sie ein Backup aller kritischen Daten oder Anwendungen durch. Mehr Informationen unter https://yunohost.org/backup;\n - Haben Sie Geduld, nachdem Sie die Migration gestartet haben: Je nach Internetverbindung und Hardware kann es bis zu ein paar Stunden dauern, bis alles aktualisiert ist." -} \ No newline at end of file + "migration_0021_general_warning": "Bitte beachte, dass diese Migration ein heikler Vorgang ist. Das YunoHost-Team hat sein Bestes getan, um sie zu überprüfen und zu testen, aber die Migration könnte immer noch Teile des Systems oder seiner Anwendungen beschädigen.\n\nEs wird daher empfohlen,:\n - Führe eine Sicherung aller kritischen Daten oder Applikationen durch. Mehr Informationen unter https://yunohost.org/backup;\n - Habe Geduld, nachdem du die Migration gestartet hast: Je nach Internetverbindung und Hardware kann es bis zu ein paar Stunden dauern, bis alles aktualisiert ist.", + "tools_upgrade": "Upgrade Systempakete", + "tools_upgrade_failed": "Pakete konnten nicht aktualisiert werden: {packages_list}", + "domain_config_default_app": "Standard-Applikation", + "migration_0023_postgresql_11_not_installed": "PostgreSQL war auf deinem System nicht installiert. Es gibt nichts zu tun.", + "migration_0023_postgresql_13_not_installed": "PostgreSQL 11 ist installiert, PostgreSQL 13 allerdings nicht? Mit deinem System scheint etwas seltsam zu sein :(...", + "migration_description_0022_php73_to_php74_pools": "Migriere php7.3-fpm 'pool' conf Dateien auf php7.4", + "migration_description_0023_postgresql_11_to_13": "Migriere Datenbanken von PostgreSQL 11 auf 13", + "service_description_postgresql": "Speichert Applikations-Daten (SQL Datenbank)", + "migration_0023_not_enough_space": "Stelle sicher, dass unter {path} genug Speicherplatz zur Verfügung steht, um die Migration auszuführen." +} From b136a4ab9a02612acecfb27eff8e3a28211e872c Mon Sep 17 00:00:00 2001 From: Selyan Slimane Amiri Date: Thu, 24 Mar 2022 08:15:38 +0000 Subject: [PATCH 412/619] Translated using Weblate (Kabyle) Currently translated at 1.7% (12 of 686 strings) Translation: YunoHost/core Translate-URL: https://translate.yunohost.org/projects/yunohost/core/kab/ --- locales/kab.json | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/locales/kab.json b/locales/kab.json index 0967ef424..5daa7cef0 100644 --- a/locales/kab.json +++ b/locales/kab.json @@ -1 +1,14 @@ -{} +{ + "ask_firstname": "Isem", + "ask_lastname": "Isem n tmagit", + "ask_password": "Awal n uɛeddi", + "diagnosis_description_apps": "Isnasen", + "diagnosis_description_mail": "Imayl", + "domain_deleted": "Taɣult tettwakkes", + "done": "Immed", + "invalid_password": "Yir awal uffir", + "user_created": "Aseqdac yettwarna", + "diagnosis_description_dnsrecords": "Ikalasen DNS", + "diagnosis_description_web": "Réseau", + "domain_created": "Taɣult tettwarna" +} From b7530ab230e88783a5e6b994f849db5f1d75834c Mon Sep 17 00:00:00 2001 From: 3ole Date: Sun, 27 Mar 2022 11:21:59 +0000 Subject: [PATCH 413/619] Translated using Weblate (German) Currently translated at 100.0% (686 of 686 strings) Translation: YunoHost/core Translate-URL: https://translate.yunohost.org/projects/yunohost/core/de/ --- locales/de.json | 64 ++++++++++++++++++++++++------------------------- 1 file changed, 32 insertions(+), 32 deletions(-) diff --git a/locales/de.json b/locales/de.json index 23b44cbfb..686eb9251 100644 --- a/locales/de.json +++ b/locales/de.json @@ -109,7 +109,7 @@ "service_unknown": "Unbekannter Dienst '{service}'", "ssowat_conf_generated": "Konfiguration von SSOwat neu erstellt", "system_upgraded": "System aktualisiert", - "system_username_exists": "Der Benutzername existiert bereits in der Liste der System-Benutzer", + "system_username_exists": "Der Anmeldename existiert bereits in der Liste der System-Konten", "unbackup_app": "'{app}' wird nicht gespeichert werden", "unexpected_error": "Etwas Unerwartetes ist passiert: {error}", "unlimit": "Kein Kontingent", @@ -121,14 +121,14 @@ "upnp_disabled": "UPnP deaktiviert", "upnp_enabled": "UPnP aktiviert", "upnp_port_open_failed": "Port konnte nicht via UPnP geöffnet werden", - "user_created": "Benutzer:in erstellt", - "user_creation_failed": "Benutzer:in konnte nicht erstellt werden {user}: {error}", - "user_deleted": "Benutzer:in gelöscht", - "user_deletion_failed": "Benutzer:in konnte nicht gelöscht werden {user}: {error}", - "user_home_creation_failed": "Persönlicher Ordner '{home}' des/der Benutzers:in konnte nicht erstellt werden", - "user_unknown": "Unbekannte:r Benutzer:in : {user}", - "user_update_failed": "Benutzer:in konnte nicht aktualisiert werden {user}: {error}", - "user_updated": "Benutzerinformationen wurden aktualisiert", + "user_created": "Konto erstellt", + "user_creation_failed": "Konto konnte nicht erstellt werden {user}: {error}", + "user_deleted": "Konto gelöscht", + "user_deletion_failed": "Konto konnte nicht gelöscht werden {user}: {error}", + "user_home_creation_failed": "Persönlicher Ordner '{home}' für dieses Konto konnte nicht erstellt werden", + "user_unknown": "Unbekanntes Konto: {user}", + "user_update_failed": "Konto konnte nicht aktualisiert werden {user}: {error}", + "user_updated": "Kontoinformationen wurden aktualisiert", "yunohost_already_installed": "YunoHost ist bereits installiert", "yunohost_configured": "YunoHost ist nun konfiguriert", "yunohost_installing": "YunoHost wird installiert...", @@ -252,7 +252,7 @@ "log_help_to_get_failed_log": "Der Vorgang'{desc}' konnte nicht abgeschlossen werden. Bitte teile das vollständige Protokoll dieser Operation mit dem Befehl 'yunohost log share {name}', um Hilfe zu erhalten", "backup_no_uncompress_archive_dir": "Dieses unkomprimierte Archivverzeichnis gibt es nicht", "log_app_change_url": "Ändere die URL der Applikation '{}'", - "global_settings_setting_security_password_user_strength": "Stärke des Benutzerpassworts", + "global_settings_setting_security_password_user_strength": "Stärke des Anmeldepassworts", "good_practices_about_user_password": "Du bist nun dabei, ein neues Nutzerpasswort zu definieren. Das Passwort sollte mindestens 8 Zeichen lang sein - es ist jedoch empfehlenswert, ein längeres Passwort (z.B. eine Passphrase) und/oder verschiedene Arten von Zeichen (Groß- und Kleinschreibung, Ziffern und Sonderzeichen) zu verwenden.", "log_link_to_failed_log": "Der Vorgang konnte nicht abgeschlossen werden '{desc}'. Bitte gib das vollständige Protokoll dieser Operation mit Klicken Sie hier an, um Hilfe zu erhalten", "backup_cant_mount_uncompress_archive": "Das unkomprimierte Archiv konnte nicht als schreibgeschützt gemountet werden", @@ -304,7 +304,7 @@ "backup_archive_cant_retrieve_info_json": "Die Informationen für das Archiv '{archive}' konnten nicht geladen werden... Die Datei info.json wurde nicht gefunden (oder ist kein gültiges json).", "app_packaging_format_not_supported": "Diese App kann nicht installiert werden da das Paketformat nicht von der YunoHost-Version unterstützt wird. Am besten solltest du dein System aktualisieren.", "certmanager_domain_not_diagnosed_yet": "Für die Domain {domain} gibt es noch keine Diagnose-Resultate. Bitte widerhole die Diagnose für die Kategorien 'DNS records' und 'Web' im Diagnose-Bereich um zu überprüfen ob die Domain für Let's Encrypt bereit ist. (Wenn du weißt was du tust, kannst du --no-checks benutzen, um diese Überprüfung zu überspringen.)", - "mail_unavailable": "Diese E-Mail Adresse ist reserviert und wird dem/der ersten Benutzer:in automatisch zugewiesen", + "mail_unavailable": "Diese E-Mail Adresse ist reserviert und wird dem ersten Konto automatisch zugewiesen", "diagnosis_services_conf_broken": "Die Konfiguration für den Dienst {service} ist fehlerhaft!", "diagnosis_services_running": "Dienst {service} läuft!", "diagnosis_domain_expires_in": "{domain} läuft in {days} Tagen ab.", @@ -365,8 +365,8 @@ "diagnosis_mail_ehlo_could_not_diagnose": "Konnte nicht überprüfen, ob der Postfix-Mail-Server von aussen per IPv{ipversion} erreichbar ist.", "diagnosis_mail_ehlo_wrong_details": "Die vom Remote-Diagnose-Server per IPv{ipversion} empfangene EHLO weicht von der Domäne deines Servers ab.
Empfangene EHLO: {wrong_ehlo}
Erwartet: {right_ehlo}
Die geläufigste Ursache für dieses Problem ist, dass der Port 25 nicht korrekt auf deinem Server weitergeleitet wird. Du kannst zusätzlich auch prüfen, dass keine Firewall oder Reverse-Proxy stört.", "diagnosis_mail_ehlo_bad_answer_details": "Das könnte daran liegen, dass anstelle deines Servers eine andere Maschine antwortet.", - "ask_user_domain": "Domäne, welche für die E-Mail-Adresse und den XMPP-Account des Benutzers verwendet werden soll", - "app_manifest_install_ask_is_public": "Soll diese Applikation für anonyme Benutzer:innen sichtbar sein?", + "ask_user_domain": "Domäne, welche für die E-Mail-Adresse und den XMPP-Account des Kontos verwendet werden soll", + "app_manifest_install_ask_is_public": "Soll diese Applikation für Gäste sichtbar sein?", "app_manifest_install_ask_admin": "Wähle einen Administrator für diese Applikation", "app_manifest_install_ask_path": "Wähle den URL-Pfad (nach der Domäne), unter dem die Applikation installiert werden soll", "diagnosis_mail_blacklist_listed_by": "Deine IP-Adresse oder Domäne {item} ist auf der Blacklist auf {blacklist_name}", @@ -413,7 +413,7 @@ "diagnosis_package_installed_from_sury_details": "Einige Pakete wurden unbeabsichtigterweise aus einem Drittanbieter-Repository, genannt Sury, installiert. Das YunoHost-Team hat die Strategie, um diese Pakete zu handhaben, verbessert, aber es wird erwartet, dass einige Setups, welche PHP7.3-Applikationen installiert haben und immer noch auf Strech laufen, ein paar Inkonsistenzen aufweisen. Um diese Situation zu beheben, solltest du versuchen, den folgenden Befehl auszuführen: {cmd_to_fix}", "domain_cannot_add_xmpp_upload": "Eine hinzugefügte Domain darf nicht mit 'xmpp-upload.' beginnen. Dieser Name ist für das XMPP-Upload-Feature von YunoHost reserviert.", "group_cannot_be_deleted": "Die Gruppe {group} kann nicht manuell entfernt werden.", - "group_cannot_edit_primary_group": "Die Gruppe '{group}' kann nicht manuell bearbeitet werden. Es ist die primäre Gruppe, welche dazu gedacht ist, nur einen spezifischen Benutzer zu enthalten.", + "group_cannot_edit_primary_group": "Die Gruppe '{group}' kann nicht manuell bearbeitet werden. Es ist die primäre Gruppe, welche dazu gedacht ist, nur ein spezifisches Konto zu enthalten.", "diagnosis_processes_killed_by_oom_reaper": "Das System hat einige Prozesse beendet, weil ihm der Arbeitsspeicher ausgegangen ist. Das passiert normalerweise, wenn das System ingesamt nicht genügend Arbeitsspeicher zur Verfügung hat oder wenn ein einzelner Prozess zu viel Speicher verbraucht. Zusammenfassung der beendeten Prozesse: \n{kills_summary}", "diagnosis_description_ports": "Geöffnete Ports", "additional_urls_already_added": "Zusätzliche URL '{url}' bereits hinzugefügt in der zusätzlichen URL für Berechtigung '{permission}'", @@ -426,10 +426,10 @@ "diagnosis_http_nginx_conf_not_up_to_date_details": "Um dieses Problem zu beheben, gebe in der Kommandozeile yunohost tools regen-conf nginx --dry-run --with-diff ein. Dieses Tool zeigt dir den Unterschied an. Wenn du damit einverstanden bist, kannst du mit yunohost tools regen-conf nginx --force die Änderungen übernehmen.", "diagnosis_backports_in_sources_list": "Du hast anscheinend apt (den Paketmanager) für das Backports-Repository konfiguriert. Wir raten strikte davon ab, Pakete aus dem Backports-Repository zu installieren. Diese würden wahrscheinlich zu Instabilitäten und Konflikten führen. Es sei denn, du weißt, was du tust.", "diagnosis_basesystem_hardware_model": "Das Servermodell ist {model}", - "group_user_not_in_group": "Benutzer:in {user} ist nicht in der Gruppe {group}", - "group_user_already_in_group": "Benutzer:in {user} ist bereits in der Gruppe {group}", + "group_user_not_in_group": "Konto {user} ist nicht in der Gruppe {group}", + "group_user_already_in_group": "Konto {user} ist bereits in der Gruppe {group}", "group_cannot_edit_visitors": "Die Gruppe \"Besucher\" kann nicht manuell editiert werden. Sie ist eine Sondergruppe und repräsentiert anonyme Besucher", - "group_cannot_edit_all_users": "Die Gruppe \"all_users\" kann nicht manuell editiert werden. Sie ist eine Sondergruppe die dafür gedacht ist alle Benutzer in YunoHost zu halten", + "group_cannot_edit_all_users": "Die Gruppe \"all_users\" kann nicht manuell editiert werden. Sie ist eine Sondergruppe die dafür gedacht ist alle Konten in YunoHost zu halten", "group_already_exist_on_system_but_removing_it": "Die Gruppe {group} existiert bereits in den Systemgruppen, aber YunoHost wird sie entfernen...", "group_already_exist_on_system": "Die Gruppe {group} existiert bereits in den Systemgruppen", "group_already_exist": "Die Gruppe {group} existiert bereits", @@ -449,7 +449,7 @@ "log_available_on_yunopaste": "Das Protokoll ist nun via {url} verfügbar", "log_app_action_run": "Führe Aktion der Applikation '{}' aus", "invalid_regex": "Ungültige Regex:'{regex}'", - "mailbox_disabled": "E-Mail für Benutzer:in {user} deaktiviert", + "mailbox_disabled": "E-Mail für Konto {user} deaktiviert", "log_tools_reboot": "Server neustarten", "log_tools_shutdown": "Server ausschalten", "log_tools_upgrade": "Systempakete aktualisieren", @@ -458,12 +458,12 @@ "log_domain_main_domain": "Mache '{}' zur Hauptdomäne", "log_user_permission_reset": "Zurücksetzen der Berechtigung '{}'", "log_user_permission_update": "Aktualisiere Zugriffe für Berechtigung '{}'", - "log_user_update": "Aktualisiere Information für Benutzer:in '{}'", + "log_user_update": "Aktualisiere Information für Konto '{}'", "log_user_group_update": "Aktualisiere Gruppe '{}'", "log_user_group_delete": "Lösche Gruppe '{}'", "log_user_group_create": "Erstelle Gruppe '{}'", - "log_user_delete": "Lösche Benutzer:in '{}'", - "log_user_create": "Füge Benutzer:in '{}' hinzu", + "log_user_delete": "Lösche Konto '{}'", + "log_user_create": "Füge Konto '{}' hinzu", "log_permission_url": "Aktualisiere URL, die mit der Berechtigung '{}' verknüpft ist", "log_permission_delete": "Lösche Berechtigung '{}'", "log_permission_create": "Erstelle Berechtigung '{}'", @@ -507,14 +507,14 @@ "regenconf_file_kept_back": "Die Konfigurationsdatei '{conf}' sollte von \"regen-conf\" (Kategorie {category}) gelöscht werden, wurde aber beibehalten.", "regenconf_file_copy_failed": "Die neue Konfigurationsdatei '{new}' kann nicht nach '{conf}' kopiert werden", "regenconf_file_backed_up": "Die Konfigurationsdatei '{conf}' wurde unter '{backup}' gespeichert", - "permission_require_account": "Berechtigung {permission} ist nur für Benutzer:innen mit einem Konto sinnvoll und kann daher nicht für Besucher:innen aktiviert werden.", + "permission_require_account": "Berechtigung {permission} ist nur für Personen mit Konto sinnvoll und kann daher nicht für Gäste aktiviert werden.", "permission_protected": "Die Berechtigung ist geschützt. Du kannst die Besuchergruppe nicht zu dieser Berechtigung hinzufügen oder daraus entfernen.", "permission_updated": "Berechtigung '{permission}' aktualisiert", "permission_update_failed": "Die Berechtigung '{permission}' kann nicht aktualisiert werden : {error}", "permission_not_found": "Berechtigung '{permission}' nicht gefunden", "permission_deletion_failed": "Entfernung der Berechtigung nicht möglich '{permission}': {error}", "permission_deleted": "Berechtigung '{permission}' gelöscht", - "permission_currently_allowed_for_all_users": "Diese Berechtigung wird derzeit allen Benutzer:innen zusätzlich zu anderen Gruppen erteilt. Möglicherweise möchtest du entweder die Berechtigung 'all_users' entfernen oder die anderen Gruppen entfernen, für die sie derzeit zulässig sind.", + "permission_currently_allowed_for_all_users": "Diese Berechtigung wird derzeit allen Konten zusätzlich zu anderen Gruppen erteilt. Möglicherweise möchtest du entweder die Berechtigung 'all_users' entfernen oder die anderen Gruppen entfernen, für die sie derzeit zulässig sind.", "permission_creation_failed": "Berechtigungserstellung nicht möglich '{permission}' : {error}", "permission_created": "Berechtigung '{permission}' erstellt", "permission_cannot_remove_main": "Entfernung einer Hauptberechtigung nicht genehmigt", @@ -551,13 +551,13 @@ "global_settings_setting_security_ssh_port": "SSH-Port", "diagnosis_sshd_config_inconsistent_details": "Bitte führe yunohost settings set security.ssh.port -v YOUR_SSH_PORT aus, um den SSH-Port festzulegen, und prüfe yunohost tools regen-conf ssh --dry-run --with-diff und yunohost tools regen-conf ssh --force um deine Konfiguration auf die YunoHost-Empfehlung zurückzusetzen.", "regex_incompatible_with_tile": "/!\\ Packagers! Für Berechtigung '{permission}' ist show_tile auf 'true' gesetzt und deshalb kannst du keine regex-URL als Hauptdomäne setzen", - "permission_cant_add_to_all_users": "Die Berechtigung {permission} konnte nicht allen Benutzer:innen gegeben werden.", + "permission_cant_add_to_all_users": "Die Berechtigung {permission} konnte nicht allen Konten gegeben werden.", "migration_ldap_can_not_backup_before_migration": "Das System-Backup konnte nicht abgeschlossen werden, bevor die Migration fehlschlug. Fehler: {error}", "service_description_fail2ban": "Schützt gegen Brute-Force-Angriffe und andere Angriffe aus dem Internet", "service_description_dovecot": "Ermöglicht es E-Mail-Clients auf Konten zuzugreifen (IMAP und POP3)", "service_description_dnsmasq": "Verarbeitet die Auflösung des Domainnamens (DNS)", "restore_backup_too_old": "Dieses Backup kann nicht wieder hergestellt werden, weil es von einer zu alten YunoHost Version stammt.", - "service_description_slapd": "Speichert Benutzer:innen, Domänen und verbundene Informationen", + "service_description_slapd": "Speichert Konten, Domänen und verbundene Informationen", "service_description_rspamd": "Spamfilter und andere E-Mail-Merkmale", "service_description_redis-server": "Eine spezialisierte Datenbank für den schnellen Datenzugriff, die Aufgabenwarteschlange und die Kommunikation zwischen Programmen", "service_description_postfix": "Wird benutzt, um E-Mails zu senden und zu empfangen", @@ -577,8 +577,8 @@ "this_action_broke_dpkg": "Diese Aktion hat unkonfigurierte Pakete verursacht, welche durch dpkg/apt (die Paketverwaltungen dieses Systems) zurückgelassen wurden... Du kannst versuchen dieses Problem zu lösen, indem du 'sudo apt install --fix-broken' und/oder 'sudo dpkg --configure -a' ausführst.", "update_apt_cache_failed": "Kann den Cache von APT (Debians Paketmanager) nicht aktualisieren. Hier ist ein Auszug aus den sources.list-Zeilen, die helfen könnten, das Problem zu identifizieren:\n{sourceslist}", "unknown_main_domain_path": "Unbekannte:r Domain oder Pfad für '{app}'. Du musst eine Domain und einen Pfad setzen, um die URL für Berechtigungen zu setzen.", - "yunohost_postinstall_end_tip": "Post-install ist fertig! Um das Setup abzuschliessen, wird empfohlen:\n - einen ersten Benutzer über den Bereich 'Benutzer:in' im Adminbereich hinzuzufügen (oder mit 'yunohost user create ' in der Kommandezeile);\n - mögliche Fehler zu diagnostizieren über den Bereich 'Diagnose' im Adminbereich (oder mit 'yunohost diagnosis run' in der Kommandozeile;\n - Die Abschnitte 'Install YunoHost' und 'Geführte Tour' im Administratorenhandbuch zu lesen: https://yunohost.org/admindoc.", - "user_already_exists": "Benutzer:in '{user}' ist bereits vorhanden", + "yunohost_postinstall_end_tip": "Post-install ist fertig! Um das Setup abzuschliessen, wird empfohlen:\n - ein erstes Konto über den Bereich 'Konto' im Adminbereich hinzuzufügen (oder mit 'yunohost user create ' in der Kommandezeile);\n - mögliche Fehler zu diagnostizieren über den Bereich 'Diagnose' im Adminbereich (oder mit 'yunohost diagnosis run' in der Kommandozeile;\n - Die Abschnitte 'Install YunoHost' und 'Geführte Tour' im Administratorenhandbuch zu lesen: https://yunohost.org/admindoc.", + "user_already_exists": "Konto '{user}' ist bereits vorhanden", "update_apt_cache_warning": "Beim Versuch den Cache für APT (Debians Paketmanager) zu aktualisieren, ist etwas schief gelaufen. Hier ist ein Dump der Zeilen aus sources.list, die Ihnen vielleicht dabei helfen, das Problem zu identifizieren:\n{sourceslist}", "global_settings_setting_security_webadmin_allowlist": "IP-Adressen, die auf die Verwaltungsseite zugreifen dürfen. Kommasepariert.", "global_settings_setting_security_webadmin_allowlist_enabled": "Erlaube nur bestimmten IP-Adressen den Zugriff auf die Verwaltungsseite.", @@ -621,8 +621,8 @@ "global_settings_setting_security_experimental_enabled": "Aktiviere experimentelle Sicherheitsfunktionen (nur aktivieren, wenn Du weißt was Du tust!)", "global_settings_setting_security_nginx_redirect_to_https": "HTTP-Anfragen standardmäßig auf HTTPs umleiten (NICHT AUSSCHALTEN, sofern Du nicht weißt was Du tust!)", "user_import_missing_columns": "Die folgenden Spalten fehlen: {columns}", - "user_import_nothing_to_do": "Es muss kein:e Benutzer:in importiert werden", - "user_import_partial_failed": "Der Import von Benutzer:innen ist teilweise fehlgeschlagen", + "user_import_nothing_to_do": "Es muss kein Konto importiert werden", + "user_import_partial_failed": "Der Import von Konten ist teilweise fehlgeschlagen", "user_import_bad_line": "Ungültige Zeile {line}: {details}", "other_available_options": "… und {n} weitere verfügbare Optionen, die nicht angezeigt werden", "domain_dns_conf_special_use_tld": "Diese Domäne basiert auf einer Top-Level-Domäne (TLD) für besondere Zwecke wie .local oder .test und wird daher vermutlich keine eigenen DNS-Einträge haben.", @@ -630,7 +630,7 @@ "domain_dns_registrar_not_supported": "YunoHost konnte den Registrar, der diese Domäne verwaltet, nicht automatisch erkennen. Du solltest die DNS-Einträge, wie unter https://yunohost.org/dns beschrieben, manuell konfigurieren.", "domain_dns_registrar_supported": "YunoHost hat automatisch erkannt, dass diese Domäne von dem Registrar **{registrar}** verwaltet wird. Wenn Du möchtest, konfiguriert YunoHost diese DNS-Zone automatisch, wenn Du die entsprechenden API-Zugangsdaten zur Verfügung stellst. Auf dieser Seite erfährst Du, wie Du deine API-Anmeldeinformationen erhältst: https://yunohost.org/registar_api_{registrar}. (Du kannst deine DNS-Einträge auch, wie unter https://yunohost.org/dns beschrieben, manuell konfigurieren)", "service_not_reloading_because_conf_broken": "Der Dienst '{name}' wird nicht neu geladen/gestartet, da seine Konfiguration fehlerhaft ist: {errors}", - "user_import_failed": "Der Import von Benutzer:innen ist komplett fehlgeschlagen", + "user_import_failed": "Der Import von Konten ist komplett fehlgeschlagen", "domain_dns_push_failed_to_list": "Auflistung der aktuellen Einträge über die API des Registrars fehlgeschlagen: {error}", "domain_dns_pushing": "DNS-Einträge übertragen…", "domain_dns_push_record_failed": "{action} für Eintrag {type}/{name} fehlgeschlagen: {error}", @@ -642,7 +642,7 @@ "domain_config_mail_out": "Ausgehende E-Mails", "domain_config_xmpp": "Instant Messaging (XMPP)", "log_app_config_set": "Konfiguration auf die Applikation '{}' anwenden", - "log_user_import": "Benutzer:innen importieren", + "log_user_import": "Konten importieren", "diagnosis_high_number_auth_failures": "In letzter Zeit gab es eine verdächtig hohe Anzahl von Authentifizierungsfehlern. Stelle sicher, dass fail2ban läuft und korrekt konfiguriert ist, oder verwende einen benutzerdefinierten Port für SSH, wie unter https://yunohost.org/security beschrieben.", "domain_dns_registrar_yunohost": "Dies ist eine nohost.me / nohost.st / ynh.fr Domäne, ihre DNS-Konfiguration wird daher automatisch von YunoHost ohne weitere Konfiguration übernommen. (siehe Befehl 'yunohost dyndns update')", "domain_config_auth_entrypoint": "API-Einstiegspunkt", @@ -653,7 +653,7 @@ "invalid_number_max": "Muss kleiner sein als {max}", "invalid_password": "Ungültiges Passwort", "ldap_attribute_already_exists": "LDAP-Attribut '{attribute}' existiert bereits mit dem Wert '{value}'", - "user_import_success": "Benutzer:innen erfolgreich importiert", + "user_import_success": "Konten erfolgreich importiert", "domain_registrar_is_not_configured": "Der DNS-Registrar ist noch nicht für die Domäne '{domain}' konfiguriert.", "domain_dns_push_not_applicable": "Die automatische DNS-Konfiguration ist nicht auf die Domäne {domain} anwendbar. Konfiguriere die DNS-Einträge manuell, wie unter https://yunohost.org/dns_config beschrieben.", "domain_dns_registrar_experimental": "Bislang wurde die Schnittstelle zur API von **{registrar}** noch nicht außreichend von der YunoHost-Community getestet und geprüft. Der Support ist **sehr experimentell** – sei vorsichtig!", From 8bddd5fb4b6cb1f776aea78b0c633c7209c65420 Mon Sep 17 00:00:00 2001 From: Kay0u Date: Tue, 29 Mar 2022 13:39:08 +0200 Subject: [PATCH 414/619] fix openssl conflict --- debian/control | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/debian/control b/debian/control index f99fe25a9..1e2d139bc 100644 --- a/debian/control +++ b/debian/control @@ -42,7 +42,7 @@ Conflicts: iptables-persistent , apache2 , bind9 , nginx-extras (>= 1.16) - , openssl (>= 1.1.1g) + , openssl (>= 1.1.1o) , slapd (>= 2.4.49) , dovecot-core (>= 1:2.3.7) , redis-server (>= 5:5.1) From 1693c83181201b05572f66a5a79dc613fb12c538 Mon Sep 17 00:00:00 2001 From: Kay0u Date: Tue, 29 Mar 2022 13:51:16 +0200 Subject: [PATCH 415/619] backport fix for openssl conflict --- debian/control | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/debian/control b/debian/control index f99fe25a9..1e2d139bc 100644 --- a/debian/control +++ b/debian/control @@ -42,7 +42,7 @@ Conflicts: iptables-persistent , apache2 , bind9 , nginx-extras (>= 1.16) - , openssl (>= 1.1.1g) + , openssl (>= 1.1.1o) , slapd (>= 2.4.49) , dovecot-core (>= 1:2.3.7) , redis-server (>= 5:5.1) From 6fc6a2ba4c17434803cea2553a3dc7c51cedd338 Mon Sep 17 00:00:00 2001 From: Kay0u Date: Tue, 29 Mar 2022 13:54:08 +0200 Subject: [PATCH 416/619] Update changelog for 4.3.6.3 --- debian/changelog | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/debian/changelog b/debian/changelog index 066fcbe9d..11a0b3c9a 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,11 @@ +yunohost (4.3.6.3) stable; urgency=low + + - backport fix for openssl conflict (1693c831) + + Thanks to all contributors <3 ! (Kay0u) + + -- Kay0u Tue, 29 Mar 2022 13:52:58 +0200 + yunohost (4.3.6.2) stable; urgency=low - [fix] apt helpers: fix bug when var is empty... (7920cc62) From 1e1b0ddbbb0f4fdc0d0e2c9805651bb48fa64f09 Mon Sep 17 00:00:00 2001 From: Kay0u Date: Tue, 29 Mar 2022 14:05:43 +0200 Subject: [PATCH 417/619] Update changelog for 4.4.1 --- debian/changelog | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/debian/changelog b/debian/changelog index 3875c7ceb..10bf04dc3 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,11 @@ +yunohost (4.4.1) testing; urgency=low + + - [fix] php helpers: prevent epic catastrophies when the app changes php version (31d3719b) + + Thanks to all contributors <3 ! (Alexandre Aubin) + + -- Kay0u Tue, 29 Mar 2022 14:03:52 +0200 + yunohost (4.4.0) testing; urgency=low - [enh] Add buster->bullseye migration @@ -6,7 +14,7 @@ yunohost (4.4.0) testing; urgency=low yunohost (4.3.6.3) stable; urgency=low - - backport fix for openssl conflict (1693c831) + - [fix] debian package: backport fix for openssl conflict (1693c831) Thanks to all contributors <3 ! (Kay0u) From 7a5d6d67e6d5e895603aadc0401c9be1833525fb Mon Sep 17 00:00:00 2001 From: Kay0u Date: Tue, 29 Mar 2022 14:12:51 +0200 Subject: [PATCH 418/619] Revert the attempt to fix the dpkg warning because I have no idea how to do it --- debian/preinst | 11 ----------- 1 file changed, 11 deletions(-) delete mode 100644 debian/preinst diff --git a/debian/preinst b/debian/preinst deleted file mode 100644 index 7a70f15d0..000000000 --- a/debian/preinst +++ /dev/null @@ -1,11 +0,0 @@ -#!/bin/bash - -set -e - -if [ -d /etc/bash_completion.d/yunohost ]; then - rm -fr /etc/bash_completion.d/yunohost -fi - -#DEBHELPER# - -exit 0 From e4369274fa3379c279de4c8b6a19a85e06040805 Mon Sep 17 00:00:00 2001 From: Kay0u Date: Tue, 29 Mar 2022 14:22:54 +0200 Subject: [PATCH 419/619] Update changelog for 11.0.6 --- debian/changelog | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/debian/changelog b/debian/changelog index 0fbcc7a02..fc43389f4 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,13 @@ +yunohost (11.0.6) testing; urgency=low + + - [fix] configpanel: the config panel was not modifying the configuration of the correct app in certain situations ([#1449](http://github.com/YunoHost/yunohost/pull/1449)) + - [fix] debian package: fix for openssl conflict (ec41b697) + - [i18n] Translations updated for Arabic, Basque, Finnish, French, Galician, German, Kabyle, Polish + + Thanks to all contributors <3 ! (3ole, Alexandre Aubin, Baloo, Bartłomiej Garbiec, José M, Kayou, ljf, Mico Hauataluoma, punkrockgirl, Selyan Slimane Amiri, Tagada) + + -- Kay0u Tue, 29 Mar 2022 14:13:40 +0200 + yunohost (11.0.5) testing; urgency=low - [mod] configpanel: improve 'filter' mechanism in AppQuestion ([#1429](https://github.com/YunoHost/yunohost/pull/1429)) From 1bcaa934ee9f60b475302cae9eee68ff80a56ace Mon Sep 17 00:00:00 2001 From: yalh76 Date: Thu, 31 Mar 2022 20:40:32 +0200 Subject: [PATCH 420/619] Better resilience to `?` used in password --- helpers/app | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/helpers/app b/helpers/app index d272194af..7bbf351c0 100644 --- a/helpers/app +++ b/helpers/app @@ -1,8 +1,8 @@ #!/bin/bash -# Install other YunoHost apps when they are not multi-instance +# Install others YunoHost apps # -# usage: ynh_install_apps --apps="appfoo appbar?domain=DOMAIN&path=PATH&admin=USER&language=fr&is_public=1&password=pass&port=666" +# usage: ynh_install_apps --apps="appfoo?domain=domain.foo&path=/foo appbar?domain=domain.bar&path=/bar&admin=USER&language=fr&is_public=1&pass?word=pass&port=666" # | arg: -a, --apps= - apps to install # # Requires YunoHost version *.*.* or higher. @@ -22,7 +22,7 @@ ynh_install_apps() { for one_app_and_its_args in "${apps_list[@]}" do # Retrieve the name of the app (part before ?) - local one_app=$(echo "$one_app_and_its_args" | awk -F'?' '{print $1}') + local one_app=$(cut -d "?" -f1 <<< "$str") [ -z "$one_app" ] && ynh_die --message="You didn't provided a YunoHost app to install" yunohost tools update apps @@ -31,7 +31,7 @@ ynh_install_apps() { if ! yunohost app list --output-as json --quiet | jq -e --arg id $one_app '.apps[] | select(.id == $id)' >/dev/null then # Retrieve the arguments of the app (part after ?) - local one_argument=$(echo "$one_app_and_its_args" | awk -F'?' '{print $2}') + local one_argument=$(cut -d "?" -f2- <<< "$one_app_and_its_args") [ ! -z "$one_argument" ] && one_argument="--args \"$one_argument\"" # Install the app with its arguments From 8810561825591b4954d3243ebf98e09aa010e3a8 Mon Sep 17 00:00:00 2001 From: yalh76 Date: Thu, 31 Mar 2022 20:41:53 +0200 Subject: [PATCH 421/619] renaming helper file --- helpers/{app => apps} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename helpers/{app => apps} (100%) diff --git a/helpers/app b/helpers/apps similarity index 100% rename from helpers/app rename to helpers/apps From 244b31f07f7d8706e15c7201a2d7c1983cb014be Mon Sep 17 00:00:00 2001 From: yalh76 Date: Fri, 1 Apr 2022 02:04:30 +0200 Subject: [PATCH 422/619] typo --- helpers/apps | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/helpers/apps b/helpers/apps index 7bbf351c0..72b2c27e0 100644 --- a/helpers/apps +++ b/helpers/apps @@ -22,7 +22,7 @@ ynh_install_apps() { for one_app_and_its_args in "${apps_list[@]}" do # Retrieve the name of the app (part before ?) - local one_app=$(cut -d "?" -f1 <<< "$str") + local one_app=$(cut -d "?" -f1 <<< "$one_app_and_its_args") [ -z "$one_app" ] && ynh_die --message="You didn't provided a YunoHost app to install" yunohost tools update apps From c34bd72ef695bf16fb56105abf5c2fba7411cbd2 Mon Sep 17 00:00:00 2001 From: yalh76 Date: Tue, 5 Apr 2022 22:43:57 +0200 Subject: [PATCH 423/619] remove not needed true --- helpers/apps | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/helpers/apps b/helpers/apps index 72b2c27e0..d44143db3 100644 --- a/helpers/apps +++ b/helpers/apps @@ -62,8 +62,8 @@ ynh_install_apps() { ynh_remove_apps() { # Retrieve the apps dependencies of the app - local apps_dependencies=$(ynh_app_setting_get --app=$app --key=apps_dependencies) || true - ynh_app_setting_delete --app=$app --key=apps_dependencies || true + local apps_dependencies=$(ynh_app_setting_get --app=$app --key=apps_dependencies) + ynh_app_setting_delete --app=$app --key=apps_dependencies if [ ! -z "$apps_dependencies" ] then From c749c441107e7a7791cff32f4e5c760cc8940b93 Mon Sep 17 00:00:00 2001 From: yalh76 Date: Tue, 5 Apr 2022 22:49:14 +0200 Subject: [PATCH 424/619] typo --- helpers/apps | 1 - 1 file changed, 1 deletion(-) diff --git a/helpers/apps b/helpers/apps index d44143db3..0ab557542 100644 --- a/helpers/apps +++ b/helpers/apps @@ -60,7 +60,6 @@ ynh_install_apps() { # # Requires YunoHost version *.*.* or higher. ynh_remove_apps() { - # Retrieve the apps dependencies of the app local apps_dependencies=$(ynh_app_setting_get --app=$app --key=apps_dependencies) ynh_app_setting_delete --app=$app --key=apps_dependencies From 5ca18c53f903a9c5c9874fb7fcb1dea5e3b58aea Mon Sep 17 00:00:00 2001 From: Kay0u Date: Fri, 8 Apr 2022 20:54:30 +0200 Subject: [PATCH 425/619] merge the specific php version section in the same place in ynh_install_app_dependencies (by doing this, we avoid calling ynh_remove_app_dependencies in ynh_remove_fpm_config function just after installing the new dependencies) --- helpers/apt | 50 ++++++++++++++++++++++---------------------------- 1 file changed, 22 insertions(+), 28 deletions(-) diff --git a/helpers/apt b/helpers/apt index 61f3c0c2d..5ddcba381 100644 --- a/helpers/apt +++ b/helpers/apt @@ -260,6 +260,27 @@ ynh_install_app_dependencies() { || ynh_die --message="Inconsistent php versions in dependencies ... found : $specific_php_version" dependencies+=", php${specific_php_version}, php${specific_php_version}-fpm, php${specific_php_version}-common" + + local old_phpversion=$(ynh_app_setting_get --app=$app --key=phpversion) + + # If the PHP version changed, remove the old fpm conf + if [ -n "$old_phpversion" ] && [ "$old_phpversion" != "$specific_php_version" ]; then + local old_php_fpm_config_dir=$(ynh_app_setting_get --app=$app --key=fpm_config_dir) + local old_php_finalphpconf="$old_php_fpm_config_dir/pool.d/$app.conf" + + if [[ -f "$old_php_finalphpconf" ]] + then + ynh_backup_if_checksum_is_different --file="$old_php_finalphpconf" + ynh_remove_fpm_config + fi + fi + # Store phpversion into the config of this app + ynh_app_setting_set --app=$app --key=phpversion --value=$specific_php_version + + # Set the default php version back as the default version for php-cli. + update-alternatives --set php /usr/bin/php$YNH_DEFAULT_PHP_VERSION + elif grep --quiet 'php' <<< "$dependencies"; then + ynh_app_setting_set --app=$app --key=phpversion --value=$YNH_DEFAULT_PHP_VERSION fi local psql_installed="$(ynh_package_is_installed "postgresql-$PSQL_VERSION" && echo yes || echo no)" @@ -292,38 +313,11 @@ Architecture: all Description: Fake package for ${app} (YunoHost app) dependencies This meta-package is only responsible of installing its dependencies. EOF + ynh_package_install_from_equivs /tmp/${dep_app}-ynh-deps.control \ || ynh_die --message="Unable to install dependencies" # Install the fake package and its dependencies rm /tmp/${dep_app}-ynh-deps.control - if [[ -n "$specific_php_version" ]] - then - # Set the default php version back as the default version for php-cli. - update-alternatives --set php /usr/bin/php$YNH_DEFAULT_PHP_VERSION - - local old_phpversion=$(ynh_app_setting_get --app=$app --key=phpversion) - - # If the PHP version changed, remove the old fpm conf - if [ -n "$old_phpversion" ] && [ "$old_phpversion" != "$specific_php_version" ]; then - local old_php_fpm_config_dir=$(ynh_app_setting_get --app=$app --key=fpm_config_dir) - local old_php_finalphpconf="$old_php_fpm_config_dir/pool.d/$app.conf" - - if [[ -f "$old_php_finalphpconf" ]] - then - ynh_backup_if_checksum_is_different --file="$old_php_finalphpconf" - ynh_remove_fpm_config - fi - fi - - # Store phpversion into the config of this app - ynh_app_setting_set --app=$app --key=phpversion --value=$specific_php_version - - # Set the default php version back as the default version for php-cli. - update-alternatives --set php /usr/bin/php$YNH_DEFAULT_PHP_VERSION - elif grep --quiet 'php' <<< "$dependencies"; then - ynh_app_setting_set --app=$app --key=phpversion --value=$YNH_DEFAULT_PHP_VERSION - fi - # Trigger postgresql regenconf if we may have just installed postgresql local psql_installed2="$(ynh_package_is_installed "postgresql-$PSQL_VERSION" && echo yes || echo no)" if [[ "$psql_installed" != "$psql_installed2" ]] From 57a8cb6e1a0896c10da20d5c1e670a6380f260e2 Mon Sep 17 00:00:00 2001 From: tituspijean Date: Mon, 18 Apr 2022 11:39:42 +0200 Subject: [PATCH 426/619] Improve ynh_string_random Allows to select which characters can be returned by the helper --- helpers/string | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/helpers/string b/helpers/string index e063628b0..4dd5c0b4b 100644 --- a/helpers/string +++ b/helpers/string @@ -4,6 +4,7 @@ # # usage: ynh_string_random [--length=string_length] # | arg: -l, --length= - the string length to generate (default: 24) +# | arg: -f, --filter= - the kind of characters accepted in the output (default: 'A-Za-z0-9') # | ret: the generated string # # example: pwd=$(ynh_string_random --length=8) @@ -11,15 +12,17 @@ # Requires YunoHost version 2.2.4 or higher. ynh_string_random() { # Declare an array to define the options of this helper. - local legacy_args=l - local -A args_array=([l]=length=) + local legacy_args=lf + local -A args_array=([l]=length= [f]=filter=) local length + local filter # Manage arguments with getopts ynh_handle_getopts_args "$@" length=${length:-24} + filter=${filter:-'A-Za-z0-9'} dd if=/dev/urandom bs=1 count=1000 2>/dev/null \ - | tr --complement --delete 'A-Za-z0-9' \ + | tr --complement --delete "$filter" \ | sed --quiet 's/\(.\{'"$length"'\}\).*/\1/p' } From d4007484f3f86adb95b42a686a54b2af6c059aba Mon Sep 17 00:00:00 2001 From: tituspijean Date: Wed, 20 Apr 2022 21:32:46 +0200 Subject: [PATCH 427/619] Fix n auto-updater --- .github/workflows/n_updater.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/n_updater.yml b/.github/workflows/n_updater.yml index 0253ca02d..8e48c4cc0 100644 --- a/.github/workflows/n_updater.yml +++ b/.github/workflows/n_updater.yml @@ -21,7 +21,7 @@ jobs: git config --global user.name 'yunohost-bot' git config --global user.email 'yunohost-bot@users.noreply.github.com' # Run the updater script - /bin/bash .github/workflows/updater.sh + /bin/bash .github/workflows/n_updater.sh - name: Commit changes id: commit if: ${{ env.PROCEED == 'true' }} From 3f9fd913342d339502e43cdb7a703d673f60c144 Mon Sep 17 00:00:00 2001 From: tituspijean Date: Wed, 20 Apr 2022 21:37:49 +0200 Subject: [PATCH 428/619] Fix n auto-updater base branch --- .github/workflows/n_updater.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/n_updater.yml b/.github/workflows/n_updater.yml index 8e48c4cc0..35afd8ae7 100644 --- a/.github/workflows/n_updater.yml +++ b/.github/workflows/n_updater.yml @@ -37,7 +37,7 @@ jobs: committer: 'yunohost-bot ' author: 'yunohost-bot ' signoff: false - base: testing + base: dev branch: ci-auto-update-n-v${{ env.VERSION }} delete-branch: true title: 'Upgrade n to version ${{ env.VERSION }}' From c0e9b3ba8e49441ed1ba5f09a7744bff8e29d606 Mon Sep 17 00:00:00 2001 From: yunohost-bot Date: Wed, 20 Apr 2022 19:38:22 +0000 Subject: [PATCH 429/619] Upgrade n to v8.2.0 --- helpers/nodejs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/helpers/nodejs b/helpers/nodejs index 0b4457b1b..68220c0af 100644 --- a/helpers/nodejs +++ b/helpers/nodejs @@ -1,6 +1,6 @@ #!/bin/bash -n_version=8.0.2 +n_version=8.2.0 n_install_dir="/opt/node_n" node_version_path="$n_install_dir/n/versions/node" # N_PREFIX is the directory of n, it needs to be loaded as a environment variable. From 1af8f9969bc76e079589e8bf14ef4c856d7b15b3 Mon Sep 17 00:00:00 2001 From: yalh76 Date: Wed, 20 Apr 2022 23:40:24 +0200 Subject: [PATCH 430/619] Fix argument --- helpers/apps | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/helpers/apps b/helpers/apps index 0ab557542..0faad863c 100644 --- a/helpers/apps +++ b/helpers/apps @@ -32,7 +32,7 @@ ynh_install_apps() { then # Retrieve the arguments of the app (part after ?) local one_argument=$(cut -d "?" -f2- <<< "$one_app_and_its_args") - [ ! -z "$one_argument" ] && one_argument="--args \"$one_argument\"" + [ ! -z "$one_argument" ] && one_argument="--args $one_argument" # Install the app with its arguments yunohost app install $one_app $one_argument From 19769d83480c593c34cb750c2e2b4552350a79d5 Mon Sep 17 00:00:00 2001 From: ljf Date: Wed, 27 Apr 2022 14:59:55 +0200 Subject: [PATCH 431/619] [fix] Bad DNS conf suggestion --- src/diagnosers/12-dnsrecords.py | 8 ++++++-- src/dns.py | 30 ++++++++++++++++++------------ 2 files changed, 24 insertions(+), 14 deletions(-) diff --git a/src/diagnosers/12-dnsrecords.py b/src/diagnosers/12-dnsrecords.py index 91fcf10fa..caa1c8fdf 100644 --- a/src/diagnosers/12-dnsrecords.py +++ b/src/diagnosers/12-dnsrecords.py @@ -17,7 +17,11 @@ from yunohost.utils.dns import ( ) from yunohost.diagnosis import Diagnoser from yunohost.domain import domain_list, _get_maindomain -from yunohost.dns import _build_dns_conf, _get_dns_zone_for_domain +from yunohost.dns import ( + _build_dns_conf, + _get_dns_zone_for_domain, + _get_relative_name_for_dns_zone +) logger = log.getActionLogger("yunohost.diagnosis") @@ -68,7 +72,7 @@ class MyDiagnoser(Diagnoser): return base_dns_zone = _get_dns_zone_for_domain(domain) - basename = domain.replace(base_dns_zone, "").rstrip(".") or "@" + basename = _get_relative_name_for_dns_zone(domain, base_dns_zone) expected_configuration = _build_dns_conf( domain, include_empty_AAAA_if_no_ipv6=True diff --git a/src/dns.py b/src/dns.py index 27b60561e..d9108ce05 100644 --- a/src/dns.py +++ b/src/dns.py @@ -183,8 +183,7 @@ def _build_dns_conf(base_domain, include_empty_AAAA_if_no_ipv6=False): # foo.sub.domain.tld # domain.tld # foo.sub # .foo.sub # # sub.domain.tld # sub.domain.tld # @ # # # foo.sub.domain.tld # sub.domain.tld # foo # .foo # - - basename = domain.replace(base_dns_zone, "").rstrip(".") or "@" + basename = _get_relative_name_for_dns_zone(domain, base_dns_zone) suffix = f".{basename}" if basename != "@" else "" # ttl = settings["ttl"] @@ -467,10 +466,17 @@ def _get_dns_zone_for_domain(domain): # Until we find the first one that has a NS record parent_list = [domain.split(".", i)[-1] for i, _ in enumerate(domain.split("."))] - for parent in parent_list: + # We don't wan't to do A NS request on the tld + for parent in parent_list[0:-1]: # Check if there's a NS record for that domain answer = dig(parent, rdtype="NS", full_answers=True, resolvers="force_external") + + if answer[0] != "ok": + # Some domains have a SOA configured but NO NS record !!! + # See https://github.com/YunoHost/issues/issues/1980 + answer = dig(parent, rdtype="SOA", full_answers=True, resolvers="force_external") + if answer[0] == "ok": mkdir(cache_folder, parents=True, force=True) write_to_file(cache_file, parent) @@ -482,11 +488,15 @@ def _get_dns_zone_for_domain(domain): zone = parent_list[-1] logger.warning( - f"Could not identify the dns zone for domain {domain}, returning {zone}" + f"Could not identify correctly the dns zone for domain {domain}, returning {zone}" ) return zone +def _get_relative_name_for_dns_zone(domain, base_dns_zone): + return re.sub("\.?" + base_dns_zone.replace(".", "\.") + "$", "", domain.strip(".")) or "@" + + def _get_registrar_config_section(domain): from lexicon.providers.auto import _relevant_provider_for_domain @@ -837,14 +847,10 @@ def domain_dns_push(operation_logger, domain, dry_run=False, force=False, purge= for record in current: changes["delete"].append(record) - def relative_name(name): - name = name.strip(".") - name = name.replace("." + base_dns_zone, "") - name = name.replace(base_dns_zone, "@") - return name def human_readable_record(action, record): - name = relative_name(record["name"]) + name = (record["name"]) + name = _get_relative_name_for_dns_zone(record['name'], base_dns_zone) name = name[:20] t = record["type"] @@ -877,7 +883,7 @@ def domain_dns_push(operation_logger, domain, dry_run=False, force=False, purge= if Moulinette.interface.type == "api": for records in changes.values(): for record in records: - record["name"] = relative_name(record["name"]) + record["name"] = _get_relative_name_for_dns_zone(record["name"], base_dns_zone) return changes else: out = {"delete": [], "create": [], "update": [], "unchanged": []} @@ -926,7 +932,7 @@ def domain_dns_push(operation_logger, domain, dry_run=False, force=False, purge= for record in changes[action]: - relative_name = record["name"].replace(base_dns_zone, "").rstrip(".") or "@" + relative_name = _get_relative_name_for_dns_zone(record['name'], base_dns_zone) progress( f"{action} {record['type']:^5} / {relative_name}" ) # FIXME: i18n but meh From b928dd12227e18f4106b74ee36559db73e23d184 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Wed, 27 Apr 2022 16:25:14 +0200 Subject: [PATCH 432/619] migrate_to_bullseye: /etc/apt/sources.list may not exist --- src/yunohost/data_migrations/0021_migrate_to_bullseye.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/yunohost/data_migrations/0021_migrate_to_bullseye.py b/src/yunohost/data_migrations/0021_migrate_to_bullseye.py index 77797c63f..e8ed6bc4d 100644 --- a/src/yunohost/data_migrations/0021_migrate_to_bullseye.py +++ b/src/yunohost/data_migrations/0021_migrate_to_bullseye.py @@ -299,7 +299,7 @@ class MyMigration(Migration): # Check system is up to date # (but we don't if 'bullseye' is already in the sources.list ... # which means maybe a previous upgrade crashed and we're re-running it) - if " bullseye " not in read_file("/etc/apt/sources.list"): + if os.path.exists("/etc/apt/sources.list") and " bullseye " not in read_file("/etc/apt/sources.list"): tools_update(target="system") upgradable_system_packages = list(_list_upgradable_apt_packages()) if upgradable_system_packages: @@ -355,7 +355,8 @@ class MyMigration(Migration): def patch_apt_sources_list(self): sources_list = glob.glob("/etc/apt/sources.list.d/*.list") - sources_list.append("/etc/apt/sources.list") + if os.path.exists("/etc/apt/sources.list"): + sources_list.append("/etc/apt/sources.list") # This : # - replace single 'buster' occurence by 'bulleye' From 398f882ac215d02c45764b1ee85ffc408c0d1b9c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jimmy=20Angel=20P=C3=A9rez=20D=C3=ADaz?= Date: Tue, 5 Apr 2022 01:47:33 +0000 Subject: [PATCH 433/619] Translated using Weblate (Spanish) Currently translated at 87.3% (599 of 686 strings) Translation: YunoHost/core Translate-URL: https://translate.yunohost.org/projects/yunohost/core/es/ --- locales/es.json | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/locales/es.json b/locales/es.json index 200057560..d8c58de20 100644 --- a/locales/es.json +++ b/locales/es.json @@ -593,5 +593,25 @@ "domain_dns_conf_special_use_tld": "Este dominio se basa en un dominio de primer nivel (TLD) de usos especiales como .local o .test y no debería tener entradas DNS reales.", "diagnosis_sshd_config_insecure": "Parece que la configuración SSH ha sido modificada manualmente, y es insegura porque no tiene ninguna instrucción 'AllowGroups' o 'AllowUsers' para limitar el acceso a los usuarios autorizados.", "domain_dns_push_not_applicable": "La configuración automática de los registros DNS no puede realizarse en el dominio {domain}. Deberìas configurar manualmente los registros DNS siguiendo la documentación.", - "domain_dns_push_managed_in_parent_domain": "La configuración automática de los registros DNS es administrada desde el dominio superior {parent_domain}." -} \ No newline at end of file + "domain_dns_push_managed_in_parent_domain": "La configuración automática de los registros DNS es administrada desde el dominio superior {parent_domain}.", + "domain_config_auth_application_secret": "LLave de aplicación secreta", + "domain_config_auth_consumer_key": "Llave de consumidor", + "domain_config_default_app": "App predeterminada", + "domain_dns_push_success": "¡Registros DNS actualizados!", + "domain_dns_push_failed_to_authenticate": "No se pudo autenticar en la API del registrador para el dominio '{domain}'. ¿Lo más probable es que las credenciales sean incorrectas? (Error: {error})", + "domain_dns_registrar_experimental": "Hasta ahora, la comunidad de YunoHost no ha probado ni revisado correctamente la interfaz con la API de **{registrar}**. El soporte es **muy experimental**. ¡Ten cuidado!", + "domain_dns_push_record_failed": "No se pudo {acción} registrar {tipo}/{nombre}: {error}", + "domain_config_features_disclaimer": "Hasta ahora, habilitar/deshabilitar las funciones de correo o XMPP solo afecta la configuración de DNS recomendada y automática, ¡no las configuraciones del sistema!", + "domain_config_mail_in": "Correos entrantes", + "domain_config_mail_out": "Correos salientes", + "domain_config_xmpp": "Mensajería instantánea (XMPP)", + "domain_config_auth_token": "Token de autenticación", + "domain_dns_push_failed_to_list": "Error al enumerar los registros actuales mediante la API del registrador: {error}", + "domain_dns_push_already_up_to_date": "Registros ya al día, nada que hacer.", + "domain_dns_pushing": "Empujando registros DNS...", + "domain_config_auth_key": "Llave de autenticación", + "domain_config_auth_secret": "Secreto de autenticación", + "domain_config_api_protocol": "Protocolo de API", + "domain_config_auth_entrypoint": "Punto de entrada de la API", + "domain_config_auth_application_key": "LLave de Aplicación" +} From 4a871943b81111c244d66236f9822b3902085c01 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jimmy=20Angel=20P=C3=A9rez=20D=C3=ADaz?= Date: Tue, 5 Apr 2022 02:12:09 +0000 Subject: [PATCH 434/619] Translated using Weblate (Spanish) Currently translated at 88.0% (604 of 686 strings) Translation: YunoHost/core Translate-URL: https://translate.yunohost.org/projects/yunohost/core/es/ --- locales/es.json | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/locales/es.json b/locales/es.json index d8c58de20..b41be4171 100644 --- a/locales/es.json +++ b/locales/es.json @@ -613,5 +613,9 @@ "domain_config_auth_secret": "Secreto de autenticación", "domain_config_api_protocol": "Protocolo de API", "domain_config_auth_entrypoint": "Punto de entrada de la API", - "domain_config_auth_application_key": "LLave de Aplicación" + "domain_config_auth_application_key": "LLave de Aplicación", + "domain_dns_registrar_supported": "YunoHost detectó automáticamente que este dominio es manejado por el registrador **{registrar}**. Si lo desea, YunoHost configurará automáticamente esta zona DNS, si le proporciona las credenciales de API adecuadas. Puede encontrar documentación sobre cómo obtener sus credenciales de API en esta página: https://yunohost.org/registar_api_{registrar}. (También puede configurar manualmente sus registros DNS siguiendo la documentación en https://yunohost.org/dns)", + "domain_dns_registrar_managed_in_parent_domain": "Este dominio es un subdominio de {parent_domain_link}. La configuración del registrador de DNS debe administrarse en el panel de configuración de {parent_domain}.", + "domain_dns_registrar_yunohost": "Este dominio es un nohost.me / nohost.st / ynh.fr y, por lo tanto, YunoHost maneja automáticamente su configuración de DNS sin ninguna configuración adicional. (vea el comando 'yunohost dyndns update')", + "domain_dns_registrar_not_supported": "YunoHost no pudo detectar automáticamente el registrador que maneja este dominio. Debe configurar manualmente sus registros DNS siguiendo la documentación en https://yunohost.org/dns." } From 481aac5f80634fe5f813af2ebec2326ec14b323c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jimmy=20Angel=20P=C3=A9rez=20D=C3=ADaz?= Date: Tue, 5 Apr 2022 02:14:51 +0000 Subject: [PATCH 435/619] Translated using Weblate (Spanish) Currently translated at 95.3% (654 of 686 strings) Translation: YunoHost/core Translate-URL: https://translate.yunohost.org/projects/yunohost/core/es/ --- locales/es.json | 52 +++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 50 insertions(+), 2 deletions(-) diff --git a/locales/es.json b/locales/es.json index b41be4171..afbb5f4cb 100644 --- a/locales/es.json +++ b/locales/es.json @@ -234,7 +234,7 @@ "restore_extracting": "Extrayendo los archivos necesarios para el archivo…", "regenconf_pending_applying": "Aplicando la configuración pendiente para la categoría '{category}'...", "regenconf_failed": "No se pudo regenerar la configuración para la(s) categoría(s): {categories}", - "regenconf_dry_pending_applying": "Comprobando la configuración pendiente que habría sido aplicada para la categoría «{category}»…", + "regenconf_dry_pending_applying": "Comprobando la configuración pendiente que habría sido aplicada para la categoría «{category}»...", "regenconf_would_be_updated": "La configuración habría sido actualizada para la categoría «{category}»", "regenconf_updated": "Configuración actualizada para '{category}'", "regenconf_up_to_date": "Ya está actualizada la configuración para la categoría «{category}»", @@ -617,5 +617,53 @@ "domain_dns_registrar_supported": "YunoHost detectó automáticamente que este dominio es manejado por el registrador **{registrar}**. Si lo desea, YunoHost configurará automáticamente esta zona DNS, si le proporciona las credenciales de API adecuadas. Puede encontrar documentación sobre cómo obtener sus credenciales de API en esta página: https://yunohost.org/registar_api_{registrar}. (También puede configurar manualmente sus registros DNS siguiendo la documentación en https://yunohost.org/dns)", "domain_dns_registrar_managed_in_parent_domain": "Este dominio es un subdominio de {parent_domain_link}. La configuración del registrador de DNS debe administrarse en el panel de configuración de {parent_domain}.", "domain_dns_registrar_yunohost": "Este dominio es un nohost.me / nohost.st / ynh.fr y, por lo tanto, YunoHost maneja automáticamente su configuración de DNS sin ninguna configuración adicional. (vea el comando 'yunohost dyndns update')", - "domain_dns_registrar_not_supported": "YunoHost no pudo detectar automáticamente el registrador que maneja este dominio. Debe configurar manualmente sus registros DNS siguiendo la documentación en https://yunohost.org/dns." + "domain_dns_registrar_not_supported": "YunoHost no pudo detectar automáticamente el registrador que maneja este dominio. Debe configurar manualmente sus registros DNS siguiendo la documentación en https://yunohost.org/dns.", + "global_settings_setting_security_nginx_redirect_to_https": "Redirija las solicitudes HTTP a HTTPs de forma predeterminada (¡NO LO DESACTIVE a menos que realmente sepa lo que está haciendo!)", + "global_settings_setting_security_webadmin_allowlist": "Direcciones IP permitidas para acceder al webadmin. Separado por comas.", + "migration_ldap_backup_before_migration": "Creación de una copia de seguridad de la base de datos LDAP y la configuración de las aplicaciones antes de la migración real.", + "global_settings_setting_security_ssh_port": "Puerto SSH", + "invalid_number": "Debe ser un miembro", + "ldap_server_is_down_restart_it": "El servicio LDAP está inactivo, intente reiniciarlo...", + "invalid_password": "Contraseña inválida", + "permission_cant_add_to_all_users": "El permiso {permission} no se puede agregar a todos los usuarios.", + "log_domain_dns_push": "Enviar registros DNS para el dominio '{}'", + "log_user_import": "Importar usuarios", + "postinstall_low_rootfsspace": "El sistema de archivos raíz tiene un espacio total inferior a 10 GB, ¡lo cual es bastante preocupante! ¡Es probable que se quede sin espacio en disco muy rápidamente! Se recomienda tener al menos 16 GB para el sistema de archivos raíz. Si desea instalar YunoHost a pesar de esta advertencia, vuelva a ejecutar la instalación posterior con --force-diskspace", + "migration_ldap_rollback_success": "Sistema revertido.", + "permission_protected": "Permiso {permission} está protegido. No puede agregar o quitar el grupo de visitantes a/desde este permiso.", + "global_settings_setting_ssowat_panel_overlay_enabled": "Habilitar la superposición del panel SSOwat", + "migration_0021_start": "Iniciando migración a Bullseye", + "migration_0021_patching_sources_list": "Parcheando los sources.lists...", + "migration_0021_main_upgrade": "Iniciando actualización principal...", + "migration_0021_still_on_buster_after_main_upgrade": "Algo salió mal durante la actualización principal, el sistema parece estar todavía en Debian Buster", + "migration_0021_yunohost_upgrade": "Iniciando la actualización principal de YunoHost...", + "migration_0021_not_buster": "¡La distribución actual de Debian no es Buster!", + "migration_0021_not_enough_free_space": "¡El espacio libre es bastante bajo en /var/! Debe tener al menos 1 GB libre para ejecutar esta migración.", + "migration_0021_system_not_fully_up_to_date": "Su sistema no está completamente actualizado. Realice una actualización regular antes de ejecutar la migración a Bullseye.", + "migration_0021_general_warning": "Tenga en cuenta que esta migración es una operación delicada. El equipo de YunoHost hizo todo lo posible para revisarlo y probarlo, pero la migración aún podría romper partes del sistema o sus aplicaciones.\n\nPor lo tanto, se recomienda:\n - Realice una copia de seguridad de cualquier dato o aplicación crítica. Más información en https://yunohost.org/backup;\n - Sea paciente después de iniciar la migración: dependiendo de su conexión a Internet y hardware, puede tomar algunas horas para que todo se actualice.", + "migration_0021_problematic_apps_warning": "Tenga en cuenta que se detectaron las siguientes aplicaciones instaladas posiblemente problemáticas. Parece que no se instalaron desde el catálogo de aplicaciones de YunoHost o no están marcados como 'en funcionamiento'. En consecuencia, no se puede garantizar que seguirán funcionando después de la actualización: {problematic_apps}", + "migration_0021_modified_files": "Tenga en cuenta que se encontró que los siguientes archivos se modificaron manualmente y podrían sobrescribirse después de la actualización: {manually_modified_files}", + "invalid_number_min": "Debe ser mayor que {min}", + "pattern_email_forward": "Debe ser una dirección de correo electrónico válida, se acepta el símbolo '+' (por ejemplo, alguien+etiqueta@ejemplo.com)", + "global_settings_setting_security_ssh_password_authentication": "Permitir autenticación de contraseña para SSH", + "invalid_number_max": "Debe ser menor que {max}", + "ldap_attribute_already_exists": "El atributo LDAP '{attribute}' ya existe con el valor '{value}'", + "log_app_config_set": "Aplicar configuración a la aplicación '{}'", + "log_domain_config_set": "Actualizar la configuración del dominio '{}'", + "migration_0021_cleaning_up": "Limpiar el caché y los paquetes que ya no son útiles...", + "migration_0021_patch_yunohost_conflicts": "Aplicando parche para resolver el problema de conflicto...", + "migration_description_0021_migrate_to_bullseye": "Actualice el sistema a Debian Bullseye y YunoHost 11.x", + "regenconf_need_to_explicitly_specify_ssh": "La configuración de ssh se modificó manualmente, pero debe especificar explícitamente la categoría 'ssh' con --force para aplicar los cambios.", + "ldap_server_down": "No se puede conectar con el servidor LDAP", + "log_backup_create": "Crear un archivo de copia de seguridad", + "migration_ldap_can_not_backup_before_migration": "La copia de seguridad del sistema no se pudo completar antes de que fallara la migración. Error: {error}", + "global_settings_setting_security_experimental_enabled": "Habilite las funciones de seguridad experimentales (¡no habilite esto si no sabe lo que está haciendo!)", + "global_settings_setting_security_webadmin_allowlist_enabled": "Permita que solo algunas IP accedan al administrador web.", + "migration_ldap_migration_failed_trying_to_rollback": "No se pudo migrar... intentando revertir el sistema.", + "migration_0023_not_enough_space": "Deje suficiente espacio disponible en {path} para ejecutar la migración.", + "migration_0023_postgresql_11_not_installed": "PostgreSQL no estaba instalado en su sistema. Nada que hacer.", + "migration_0023_postgresql_13_not_installed": "¿PostgreSQL 11 está instalado, pero no PostgreSQL 13? Algo extraño podría haber sucedido en su sistema :(...", + "migration_description_0022_php73_to_php74_pools": "Migrar archivos conf 'pool' de php7.3-fpm a php7.4", + "migration_description_0023_postgresql_11_to_13": "Migrar bases de datos de PostgreSQL 11 a 13", + "other_available_options": "... y {n} otras opciones disponibles no mostradas" } From ce93067229815568da26243be3f22cda53925841 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jimmy=20Angel=20P=C3=A9rez=20D=C3=ADaz?= Date: Tue, 5 Apr 2022 02:49:56 +0000 Subject: [PATCH 436/619] Translated using Weblate (Spanish) Currently translated at 100.0% (686 of 686 strings) Translation: YunoHost/core Translate-URL: https://translate.yunohost.org/projects/yunohost/core/es/ --- locales/es.json | 45 ++++++++++++++++++++++++++++++++------------- 1 file changed, 32 insertions(+), 13 deletions(-) diff --git a/locales/es.json b/locales/es.json index afbb5f4cb..aebb959a8 100644 --- a/locales/es.json +++ b/locales/es.json @@ -94,13 +94,13 @@ "restore_already_installed_app": "Una aplicación con el ID «{app}» ya está instalada", "app_restore_failed": "No se pudo restaurar la aplicación «{app}»: {error}", "restore_cleaning_failed": "No se pudo limpiar el directorio temporal de restauración", - "restore_complete": "Restaurada", + "restore_complete": "Restauración completada", "restore_confirm_yunohost_installed": "¿Realmente desea restaurar un sistema ya instalado? [{answers}]", "restore_failed": "No se pudo restaurar el sistema", "restore_hook_unavailable": "El script de restauración para «{part}» no está disponible en su sistema y tampoco en el archivo", "restore_nothings_done": "No se ha restaurado nada", - "restore_running_app_script": "Restaurando la aplicación «{app}»…", - "restore_running_hooks": "Ejecutando los ganchos de restauración…", + "restore_running_app_script": "Restaurando la aplicación «{app}»...", + "restore_running_hooks": "Ejecutando los ganchos de restauración...", "service_add_failed": "No se pudo añadir el servicio «{service}»", "service_added": "Se agregó el servicio '{service}'", "service_already_started": "El servicio «{service}» ya está funcionando", @@ -117,16 +117,16 @@ "service_stop_failed": "Imposible detener el servicio '{service}'\n\nRegistro recientes del servicio:{logs}", "service_stopped": "Servicio '{service}' detenido", "service_unknown": "Servicio desconocido '{service}'", - "ssowat_conf_generated": "Generada la configuración de SSOwat", + "ssowat_conf_generated": "Regenerada la configuración de SSOwat", "system_upgraded": "Sistema actualizado", "system_username_exists": "El nombre de usuario ya existe en la lista de usuarios del sistema", - "unbackup_app": "La aplicación '{app}' no se guardará", + "unbackup_app": "{app} no se guardará", "unexpected_error": "Algo inesperado salió mal: {error}", "unlimit": "Sin cuota", - "unrestore_app": "La aplicación '{app}' no será restaurada", - "updating_apt_cache": "Obteniendo las actualizaciones disponibles para los paquetes del sistema…", + "unrestore_app": "{app} no será restaurada", + "updating_apt_cache": "Obteniendo las actualizaciones disponibles para los paquetes del sistema...", "upgrade_complete": "Actualización finalizada", - "upgrading_packages": "Actualizando paquetes…", + "upgrading_packages": "Actualizando paquetes...", "upnp_dev_not_found": "No se encontró ningún dispositivo UPnP", "upnp_disabled": "UPnP desactivado", "upnp_enabled": "UPnP activado", @@ -135,13 +135,13 @@ "user_creation_failed": "No se pudo crear el usuario {user}: {error}", "user_deleted": "Usuario eliminado", "user_deletion_failed": "No se pudo eliminar el usuario {user}: {error}", - "user_home_creation_failed": "No se pudo crear la carpeta «home» para el usuario", + "user_home_creation_failed": "No se pudo crear la carpeta de inicio '{home}' para el usuario", "user_unknown": "Usuario desconocido: {user}", "user_update_failed": "No se pudo actualizar el usuario {user}: {error}", "user_updated": "Cambiada la información de usuario", "yunohost_already_installed": "YunoHost ya está instalado", "yunohost_configured": "YunoHost está ahora configurado", - "yunohost_installing": "Instalando YunoHost…", + "yunohost_installing": "Instalando YunoHost...", "yunohost_not_installed": "YunoHost no está correctamente instalado. Ejecute «yunohost tools postinstall»", "mailbox_used_space_dovecot_down": "El servicio de buzón Dovecot debe estar activo si desea recuperar el espacio usado del buzón", "certmanager_attempt_to_replace_valid_cert": "Está intentando sobrescribir un certificado correcto y válido para el dominio {domain}! (Use --force para omitir este mensaje)", @@ -231,7 +231,7 @@ "restore_removing_tmp_dir_failed": "No se pudo eliminar un directorio temporal antiguo", "restore_not_enough_disk_space": "Espacio insuficiente (espacio: {free_space} B, espacio necesario: {needed_space} B, margen de seguridad: {margin} B)", "restore_may_be_not_enough_disk_space": "Parece que su sistema no tiene suficiente espacio (libre: {free_space} B, espacio necesario: {needed_space} B, margen de seguridad: {margin} B)", - "restore_extracting": "Extrayendo los archivos necesarios para el archivo…", + "restore_extracting": "Extrayendo los archivos necesarios para el archivo...", "regenconf_pending_applying": "Aplicando la configuración pendiente para la categoría '{category}'...", "regenconf_failed": "No se pudo regenerar la configuración para la(s) categoría(s): {categories}", "regenconf_dry_pending_applying": "Comprobando la configuración pendiente que habría sido aplicada para la categoría «{category}»...", @@ -478,7 +478,7 @@ "diagnosis_ports_forwarding_tip": "Para solucionar este incidente, lo más seguro deberías configurar la redirección de los puertos en el router como se especifica en https://yunohost.org/isp_box_config", "certmanager_warning_subdomain_dns_record": "El subdominio '{subdomain}' no se resuelve en la misma dirección IP que '{domain}'. Algunas funciones no estarán disponibles hasta que solucione esto y regenere el certificado.", "domain_cannot_add_xmpp_upload": "No puede agregar dominios que comiencen con 'xmpp-upload'. Este tipo de nombre está reservado para la función de carga XMPP integrada en YunoHost.", - "yunohost_postinstall_end_tip": "¡La post-instalación completada! Para finalizar su configuración, considere:\n - agregar un primer usuario a través de la sección 'Usuarios' del webadmin (o 'yunohost user create ' en la línea de comandos);\n - diagnostique problemas potenciales a través de la sección 'Diagnóstico' de webadmin (o 'ejecución de diagnóstico yunohost' en la línea de comandos);\n - leyendo las partes 'Finalizando su configuración' y 'Conociendo a Yunohost' en la documentación del administrador: https://yunohost.org/admindoc.", + "yunohost_postinstall_end_tip": "¡La post-instalación completada! Para finalizar su configuración, por favor considere:\n - agregar un primer usuario a través de la sección 'Usuarios' del administrador web (o 'yunohost user create ' en la línea de comandos);\n - diagnosticar problemas potenciales a través de la sección 'Diagnóstico' del administrador web (o 'yunohost diagnosis run' en la línea de comandos);\n - leyendo las partes 'Finalizando su configuración' y 'Conociendo YunoHost' en la documentación del administrador: https://yunohost.org/admindoc.", "diagnosis_dns_point_to_doc": "Por favor, consulta la documentación en https://yunohost.org/dns_config si necesitas ayuda para configurar los registros DNS.", "diagnosis_ip_global": "IP Global: {global}", "diagnosis_mail_outgoing_port_25_ok": "El servidor de email SMTP puede mandar emails (puerto saliente 25 no está bloqueado).", @@ -665,5 +665,24 @@ "migration_0023_postgresql_13_not_installed": "¿PostgreSQL 11 está instalado, pero no PostgreSQL 13? Algo extraño podría haber sucedido en su sistema :(...", "migration_description_0022_php73_to_php74_pools": "Migrar archivos conf 'pool' de php7.3-fpm a php7.4", "migration_description_0023_postgresql_11_to_13": "Migrar bases de datos de PostgreSQL 11 a 13", - "other_available_options": "... y {n} otras opciones disponibles no mostradas" + "other_available_options": "... y {n} otras opciones disponibles no mostradas", + "regex_with_only_domain": "No puede usar una expresión regular para el dominio, solo para la ruta", + "service_description_postgresql": "Almacena datos de aplicaciones (base de datos SQL)", + "tools_upgrade_failed": "No se pudieron actualizar los paquetes: {packages_list}", + "tools_upgrade": "Actualizando paquetes del sistema", + "user_import_nothing_to_do": "Ningún usuario necesita ser importado", + "user_import_missing_columns": "Faltan las siguientes columnas: {columns}", + "service_not_reloading_because_conf_broken": "No recargar/reiniciar el servicio '{name}' porque su configuración está rota: {errors}", + "restore_backup_too_old": "Este archivo de copia de seguridad no se puede restaurar porque proviene de una versión de YunoHost demasiado antigua.", + "unknown_main_domain_path": "Dominio o ruta desconocidos para '{app}'. Debe especificar un dominio y una ruta para poder especificar una URL para el permiso.", + "restore_already_installed_apps": "Las siguientes aplicaciones no se pueden restaurar porque ya están instaladas: {apps}", + "user_import_bad_file": "Su archivo CSV no tiene el formato correcto, se ignorará para evitar una posible pérdida de datos", + "user_import_bad_line": "Línea incorrecta {line}: {details}", + "user_import_failed": "La operación de importación de usuarios falló por completo", + "user_import_partial_failed": "La operación de importación de usuarios falló parcialmente", + "user_import_success": "Usuarios importados exitosamente", + "service_description_yunomdns": "Le permite llegar a su servidor usando 'yunohost.local' en su red local", + "show_tile_cant_be_enabled_for_regex": "No puede habilitar 'show_tile' en este momento porque la URL para el permiso '{permission}' es una expresión regular", + "show_tile_cant_be_enabled_for_url_not_defined": "No puede habilitar 'show_tile' en este momento, porque primero debe definir una URL para el permiso '{permission}'", + "regex_incompatible_with_tile": "/!\\ Empaquetadores! El permiso '{permission}' tiene show_tile establecido en 'true' y, por lo tanto, no puede definir una URL de expresión regular como la URL principal" } From 9c804d1ca2b7b09f10897cde8dacaede1d00664f Mon Sep 17 00:00:00 2001 From: tituspijean Date: Thu, 28 Apr 2022 21:39:23 +0200 Subject: [PATCH 437/619] Update n checksum with autoupdater --- .github/workflows/n_updater.sh | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/n_updater.sh b/.github/workflows/n_updater.sh index 0ea226888..1dc3531a1 100644 --- a/.github/workflows/n_updater.sh +++ b/.github/workflows/n_updater.sh @@ -70,6 +70,9 @@ echo "Calculated checksum for n v${version} is $checksum" # Replace new version in helper sed -i -E "s/^n_version=.*$/n_version=$version/" helpers/nodejs +# Replace checksum in helper +sed -i -E "s/^n_checksum=.*$/n_checksum=$checksum\"/" helpers/nodejs + # The Action will proceed only if the PROCEED environment variable is set to true echo "PROCEED=true" >> $GITHUB_ENV exit 0 From d05f192a4f4d5b511577213302e541d7c62fb0dc Mon Sep 17 00:00:00 2001 From: tituspijean Date: Thu, 28 Apr 2022 21:42:19 +0200 Subject: [PATCH 438/619] Update n checksum with autoupdater --- .github/workflows/n_updater.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/n_updater.sh b/.github/workflows/n_updater.sh index 1dc3531a1..a8b0b0eec 100644 --- a/.github/workflows/n_updater.sh +++ b/.github/workflows/n_updater.sh @@ -71,7 +71,7 @@ echo "Calculated checksum for n v${version} is $checksum" sed -i -E "s/^n_version=.*$/n_version=$version/" helpers/nodejs # Replace checksum in helper -sed -i -E "s/^n_checksum=.*$/n_checksum=$checksum\"/" helpers/nodejs +sed -i -E "s/^n_checksum=.*$/n_checksum=$checksum/" helpers/nodejs # The Action will proceed only if the PROCEED environment variable is set to true echo "PROCEED=true" >> $GITHUB_ENV From 437c9670983cd3ff4c5b9d656fb5b733fd8b0e1f Mon Sep 17 00:00:00 2001 From: tituspijean Date: Thu, 28 Apr 2022 21:42:46 +0200 Subject: [PATCH 439/619] Update nodejs helper for autoupdater --- helpers/nodejs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/helpers/nodejs b/helpers/nodejs index 68220c0af..42c25e51f 100644 --- a/helpers/nodejs +++ b/helpers/nodejs @@ -1,6 +1,7 @@ #!/bin/bash n_version=8.2.0 +n_checksum=75efd9e583836f3e6cc6d793df1501462fdceeb3460d5a2dbba99993997383b9 n_install_dir="/opt/node_n" node_version_path="$n_install_dir/n/versions/node" # N_PREFIX is the directory of n, it needs to be loaded as a environment variable. @@ -16,7 +17,7 @@ export N_PREFIX="$n_install_dir" ynh_install_n() { # Build an app.src for n echo "SOURCE_URL=https://github.com/tj/n/archive/v${n_version}.tar.gz -SOURCE_SUM=1cdc34d3a53a13a23675797dd775d562e33e64877e367df9d1afe863719de973" >"$YNH_APP_BASEDIR/conf/n.src" +SOURCE_SUM=${n_checksum}" >"$YNH_APP_BASEDIR/conf/n.src" # Download and extract n ynh_setup_source --dest_dir="$n_install_dir/git" --source_id=n # Install n From 76661a3e6c9344f8cedd0b751742228576fb278c Mon Sep 17 00:00:00 2001 From: "ljf (zamentur)" Date: Fri, 6 May 2022 15:31:12 +0200 Subject: [PATCH 440/619] Add comment Co-authored-by: Alexandre Aubin --- src/dns.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/dns.py b/src/dns.py index d9108ce05..89d76f5f1 100644 --- a/src/dns.py +++ b/src/dns.py @@ -494,6 +494,12 @@ def _get_dns_zone_for_domain(domain): def _get_relative_name_for_dns_zone(domain, base_dns_zone): + # Strip the base dns zone name from a domain such that it's suitable for DNS manipulation relative to a defined zone + # For example, assuming base_dns_zone is "example.tld": + # example.tld -> @ + # foo.example.tld -> foo + # .foo.example.tld -> foo + # bar.foo.example.tld -> bar.foo return re.sub("\.?" + base_dns_zone.replace(".", "\.") + "$", "", domain.strip(".")) or "@" From 6f5bb03b2d095e701937ec2239d77cdd41c30744 Mon Sep 17 00:00:00 2001 From: "ljf (zamentur)" Date: Fri, 6 May 2022 15:36:28 +0200 Subject: [PATCH 441/619] [fix] depreciation warning about unicode Co-authored-by: Alexandre Aubin --- src/dns.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/dns.py b/src/dns.py index 89d76f5f1..0bee3d639 100644 --- a/src/dns.py +++ b/src/dns.py @@ -500,7 +500,7 @@ def _get_relative_name_for_dns_zone(domain, base_dns_zone): # foo.example.tld -> foo # .foo.example.tld -> foo # bar.foo.example.tld -> bar.foo - return re.sub("\.?" + base_dns_zone.replace(".", "\.") + "$", "", domain.strip(".")) or "@" + return re.sub(r"\.?" + base_dns_zone.replace(".", r"\.") + "$", "", domain.strip(".")) or "@" def _get_registrar_config_section(domain): From ea5bfd1693b004ac29c6ab3175ce920f195cb1d2 Mon Sep 17 00:00:00 2001 From: "ljf (zamentur)" Date: Fri, 6 May 2022 16:25:54 +0200 Subject: [PATCH 442/619] [fix] Allow lime2 to upgrade even if kernel is hold (#1452) * [fix] Allow lime2 to upgrade even if kernel is hold * [fix] Bad set operation --- src/migrations/0021_migrate_to_bullseye.py | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/migrations/0021_migrate_to_bullseye.py b/src/migrations/0021_migrate_to_bullseye.py index 551a6f64b..38454542b 100644 --- a/src/migrations/0021_migrate_to_bullseye.py +++ b/src/migrations/0021_migrate_to_bullseye.py @@ -302,7 +302,19 @@ class MyMigration(Migration): if " bullseye " not in read_file("/etc/apt/sources.list"): tools_update(target="system") upgradable_system_packages = list(_list_upgradable_apt_packages()) - if upgradable_system_packages: + upgradable_system_packages = [package["name"] for package in upgradable_system_packages] + upgradable_system_packages = set(upgradable_system_packages) + # Lime2 have hold packages to avoid ethernet instability + # See https://github.com/YunoHost/arm-images/commit/b4ef8c99554fd1a122a306db7abacc4e2f2942df + lime2_hold_packages = set([ + "armbian-firmware", + "armbian-bsp-cli-lime2", + "linux-dtb-current-sunxi", + "linux-image-current-sunxi", + "linux-u-boot-lime2-current", + "linux-image-next-sunxi" + ]) + if upgradable_system_packages - lime2_hold_packages: raise YunohostError("migration_0021_system_not_fully_up_to_date") @property From cc5649cfb245fa08fc4611659137c3e5b0ab8098 Mon Sep 17 00:00:00 2001 From: "ljf (zamentur)" Date: Fri, 6 May 2022 16:25:54 +0200 Subject: [PATCH 443/619] [fix] Allow lime2 to upgrade even if kernel is hold (#1452) * [fix] Allow lime2 to upgrade even if kernel is hold * [fix] Bad set operation --- .../data_migrations/0021_migrate_to_bullseye.py | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/yunohost/data_migrations/0021_migrate_to_bullseye.py b/src/yunohost/data_migrations/0021_migrate_to_bullseye.py index e8ed6bc4d..6b08f5792 100644 --- a/src/yunohost/data_migrations/0021_migrate_to_bullseye.py +++ b/src/yunohost/data_migrations/0021_migrate_to_bullseye.py @@ -302,7 +302,19 @@ class MyMigration(Migration): if os.path.exists("/etc/apt/sources.list") and " bullseye " not in read_file("/etc/apt/sources.list"): tools_update(target="system") upgradable_system_packages = list(_list_upgradable_apt_packages()) - if upgradable_system_packages: + upgradable_system_packages = [package["name"] for package in upgradable_system_packages] + upgradable_system_packages = set(upgradable_system_packages) + # Lime2 have hold packages to avoid ethernet instability + # See https://github.com/YunoHost/arm-images/commit/b4ef8c99554fd1a122a306db7abacc4e2f2942df + lime2_hold_packages = set([ + "armbian-firmware", + "armbian-bsp-cli-lime2", + "linux-dtb-current-sunxi", + "linux-image-current-sunxi", + "linux-u-boot-lime2-current", + "linux-image-next-sunxi" + ]) + if upgradable_system_packages - lime2_hold_packages: raise YunohostError("migration_0021_system_not_fully_up_to_date") @property From 158dc7ae14dcb937695f43b96cccfdf5b67c6965 Mon Sep 17 00:00:00 2001 From: yunohost-bot Date: Fri, 6 May 2022 14:40:24 +0000 Subject: [PATCH 444/619] [CI] Format code with Black --- src/migrations/0021_migrate_to_bullseye.py | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/src/migrations/0021_migrate_to_bullseye.py b/src/migrations/0021_migrate_to_bullseye.py index 38454542b..72dab1c4d 100644 --- a/src/migrations/0021_migrate_to_bullseye.py +++ b/src/migrations/0021_migrate_to_bullseye.py @@ -302,18 +302,22 @@ class MyMigration(Migration): if " bullseye " not in read_file("/etc/apt/sources.list"): tools_update(target="system") upgradable_system_packages = list(_list_upgradable_apt_packages()) - upgradable_system_packages = [package["name"] for package in upgradable_system_packages] + upgradable_system_packages = [ + package["name"] for package in upgradable_system_packages + ] upgradable_system_packages = set(upgradable_system_packages) # Lime2 have hold packages to avoid ethernet instability # See https://github.com/YunoHost/arm-images/commit/b4ef8c99554fd1a122a306db7abacc4e2f2942df - lime2_hold_packages = set([ - "armbian-firmware", - "armbian-bsp-cli-lime2", - "linux-dtb-current-sunxi", - "linux-image-current-sunxi", - "linux-u-boot-lime2-current", - "linux-image-next-sunxi" - ]) + lime2_hold_packages = set( + [ + "armbian-firmware", + "armbian-bsp-cli-lime2", + "linux-dtb-current-sunxi", + "linux-image-current-sunxi", + "linux-u-boot-lime2-current", + "linux-image-next-sunxi", + ] + ) if upgradable_system_packages - lime2_hold_packages: raise YunohostError("migration_0021_system_not_fully_up_to_date") From 106e1fa80145d777a63ca1ed2d29d134edd8c2f7 Mon Sep 17 00:00:00 2001 From: yalh76 Date: Mon, 9 May 2022 19:50:58 +0200 Subject: [PATCH 445/619] ynh_add_config template --- helpers/utils | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/helpers/utils b/helpers/utils index 8ae68fad5..60cbedb5c 100644 --- a/helpers/utils +++ b/helpers/utils @@ -311,8 +311,7 @@ ynh_local_curl() { # | arg: -d, --destination= - Destination of the config file # # examples: -# ynh_add_config --template=".env" --destination="$final_path/.env" -# ynh_add_config --template="../conf/.env" --destination="$final_path/.env" +# ynh_add_config --template=".env" --destination="$final_path/.env" use the template file "../conf/.env" # ynh_add_config --template="/etc/nginx/sites-available/default" --destination="etc/nginx/sites-available/mydomain.conf" # # The template can be by default the name of a file in the conf directory From b32bc3a03431ea81fdeec51c0b8dd43f88ece049 Mon Sep 17 00:00:00 2001 From: Keoma Brun Date: Sun, 15 May 2022 18:33:44 +0200 Subject: [PATCH 446/619] Content Security Policies Report and Websockets MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add the `wss:` field so that Nginx does not create warning when using Websocket over TLS. This modification only affects the `Report-Only` part of the CSP, that takes care of creating warnings in the logs. Warning ex (fr only sorry): ``` Content Security Policy: Les paramètres de la page ont empêché le chargement d’une ressource à wss://your.website.tld (« default-src »). Un rapport CSP est en cours d’envoi. ``` --- conf/nginx/security.conf.inc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/nginx/security.conf.inc b/conf/nginx/security.conf.inc index 8eb8c8ae2..a35bb566e 100644 --- a/conf/nginx/security.conf.inc +++ b/conf/nginx/security.conf.inc @@ -29,7 +29,7 @@ ssl_dhparam /usr/share/yunohost/ffdhe2048.pem; more_set_headers "Content-Security-Policy : upgrade-insecure-requests; default-src https: data: blob: ; object-src https: data: 'unsafe-inline'; style-src https: data: 'unsafe-inline' ; script-src https: data: 'unsafe-inline' 'unsafe-eval'"; {% else %} more_set_headers "Content-Security-Policy : upgrade-insecure-requests"; -more_set_headers "Content-Security-Policy-Report-Only : default-src https: data: blob: ; object-src https: data: 'unsafe-inline'; style-src https: data: 'unsafe-inline' ; script-src https: data: 'unsafe-inline' 'unsafe-eval'"; +more_set_headers "Content-Security-Policy-Report-Only : default-src https: wss: data: blob: ; object-src https: data: 'unsafe-inline'; style-src https: data: 'unsafe-inline' ; script-src https: data: 'unsafe-inline' 'unsafe-eval'"; {% endif %} more_set_headers "X-Content-Type-Options : nosniff"; more_set_headers "X-XSS-Protection : 1; mode=block"; From 866d3dbd07fdababf8712d99fbb5b29a008c3e61 Mon Sep 17 00:00:00 2001 From: ppr Date: Fri, 29 Apr 2022 13:16:32 +0000 Subject: [PATCH 447/619] Translated using Weblate (French) Currently translated at 99.8% (685 of 686 strings) Translation: YunoHost/core Translate-URL: https://translate.yunohost.org/projects/yunohost/core/fr/ --- locales/fr.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/locales/fr.json b/locales/fr.json index 833d9554b..2773d0bee 100644 --- a/locales/fr.json +++ b/locales/fr.json @@ -210,7 +210,7 @@ "restore_system_part_failed": "Impossible de restaurer la partie '{part}' du système", "backup_couldnt_bind": "Impossible de lier {src} avec {dest}.", "domain_dns_conf_is_just_a_recommendation": "Cette commande vous montre la configuration *recommandée*. Elle ne configure pas le DNS pour vous. Il est de votre ressort de configurer votre zone DNS chez votre registrar/fournisseur conformément à cette recommandation.", - "migrations_loading_migration": "Chargement de la migration {id}...", + "migrations_loading_migration": "Chargement de la migration {id} ...", "migrations_migration_has_failed": "La migration {id} a échoué avec l'exception {exception} : annulation", "migrations_no_migrations_to_run": "Aucune migration à lancer", "migrations_skip_migration": "Ignorer et passer la migration {id}...", @@ -571,7 +571,7 @@ "diagnosis_rootfstotalspace_warning": "Le système de fichiers racine n'est que de {space}. Cela peut suffire, mais faites attention car vous risquez de les remplir rapidement... Il est recommandé d'avoir au moins 16 GB pour ce système de fichiers.", "app_restore_script_failed": "Une erreur s'est produite dans le script de restauration de l'application", "restore_backup_too_old": "Cette sauvegarde ne peut pas être restaurée car elle provient d'une version de YunoHost trop ancienne.", - "log_backup_create": "Créer une archive de sauvegarde", + "log_backup_create": "Création d'une archive de sauvegarde", "global_settings_setting_ssowat_panel_overlay_enabled": "Activer la superposition de la vignette SSOwat", "migration_ldap_rollback_success": "Système rétabli dans son état initial.", "permission_cant_add_to_all_users": "L'autorisation {permission} ne peut pas être ajoutée à tous les utilisateurs.", @@ -685,4 +685,4 @@ "tools_upgrade_failed": "Impossible de mettre à jour les paquets : {packages_list}", "migration_0023_not_enough_space": "Prévoyez suffisamment d'espace disponible dans {path} pour exécuter la migration.", "migration_0023_postgresql_11_not_installed": "PostgreSQL n'a pas été installé sur votre système. Il n'y a rien à faire." -} \ No newline at end of file +} From 660c77d0d51179b11d8b4f25579ffd0ee1b8723f Mon Sep 17 00:00:00 2001 From: Ilya Date: Tue, 10 May 2022 21:27:17 +0000 Subject: [PATCH 448/619] Translated using Weblate (Russian) Currently translated at 32.0% (220 of 686 strings) Translation: YunoHost/core Translate-URL: https://translate.yunohost.org/projects/yunohost/core/ru/ --- locales/ru.json | 64 ++++++++++++++++++++++++++++++++++++------------- 1 file changed, 47 insertions(+), 17 deletions(-) diff --git a/locales/ru.json b/locales/ru.json index 9c857f7a6..cc78caebd 100644 --- a/locales/ru.json +++ b/locales/ru.json @@ -32,7 +32,7 @@ "admin_password_too_long": "Пожалуйста, выберите пароль короче 127 символов", "password_listed": "Этот пароль является одним из наиболее часто используемых паролей в мире. Пожалуйста, выберите что-то более уникальное.", "backup_applying_method_copy": "Копирование всех файлов в резервную копию...", - "domain_dns_conf_is_just_a_recommendation": "Эта страница показывает вам *рекомендуемую* конфигурацию. Она *не* создаёт для вас конфигурацию DNS. Вы должны сами конфигурировать зону вашего DNS у вашего регистратора в соответствии с этой рекомендацией.", + "domain_dns_conf_is_just_a_recommendation": "Эта страница показывает вам *рекомендуемую* конфигурацию. Она не создаёт для вас конфигурацию DNS. Вы должны сами конфигурировать DNS у вашего регистратора в соответствии с этой рекомендацией.", "good_practices_about_user_password": "Выберите пароль пользователя длиной не менее 8 символов, хотя рекомендуется использовать более длинные (например, парольную фразу) и / или использовать символы различного типа (прописные, строчные буквы, цифры и специальные символы).", "password_too_simple_3": "Пароль должен содержать не менее 8 символов и содержать цифры, заглавные и строчные буквы и специальные символы", "upnp_enabled": "UPnP включен", @@ -106,21 +106,21 @@ "config_unknown_filter_key": "Ключ фильтра '{filter_key}' неверен.", "config_validate_date": "Должна быть правильная дата в формате YYYY-MM-DD", "config_validate_email": "Должен быть правильный email", - "config_validate_time": "Должно быть правильное время формата HH:MM", + "config_validate_time": "Должно быть правильное время формата ЧЧ:ММ", "backup_ask_for_copying_if_needed": "Хотите ли вы временно выполнить резервное копирование с использованием {size}MB? (Этот способ используется, поскольку некоторые файлы не могут быть подготовлены более эффективным методом.)", "backup_permission": "Разрешить резервное копирование для {app}", "certmanager_domain_dns_ip_differs_from_public_ip": "DNS-записи для домена '{domain}' отличаются от IP этого сервера. Пожалуйста, проверьте категорию 'DNS-записи' (основные) в диагностике для получения дополнительной информации. Если вы недавно изменили свою A-запись, пожалуйста, подождите, пока она распространится (некоторые программы проверки распространения DNS доступны в интернете). (Если вы знаете, что делаете, используйте '--no-checks', чтобы отключить эти проверки.)", - "certmanager_domain_not_diagnosed_yet": "Для домена {domain} еще нет результатов диагностики. Пожалуйста, перезапустите диагностику для категорий 'DNS-записи' и 'Web', чтобы проверить, готов ли домен к Let's Encrypt. (Или, если вы знаете, что делаете, используйте '--no-checks', чтобы отключить эти проверки.)", + "certmanager_domain_not_diagnosed_yet": "Для домена {domain} еще нет результатов диагностики. Пожалуйста, перезапустите диагностику для категорий 'DNS-записи' и 'Домены', чтобы проверить, готов ли домен к Let's Encrypt. (Или, если вы знаете, что делаете, используйте '--no-checks', чтобы отключить эти проверки.)", "config_validate_url": "Должна быть правильная ссылка", "config_version_not_supported": "Версии конфигурационной панели '{version}' не поддерживаются.", - "confirm_app_install_danger": "ОПАСНО! Это приложение все еще является экспериментальным (если не сказать, что оно явно не работает)! Вам не следует устанавливать его, если вы не знаете, что делаете. Если это приложение не будет работать или сломает вашу систему, мы не будем оказывать техническую поддержку... Если вы все равно готовы рискнуть, введите '{answers}'", - "confirm_app_install_thirdparty": "ВАЖНО! Это приложение не входит в каталог приложений YunoHost. Установка сторонних приложений может нарушить целостность и безопасность вашей системы. Вам не следует устанавливать его, если вы не знаете, что делаете. ТЕХНИЧЕСКОЙ ПОДДЕРЖКИ НЕ БУДЕТ, если это приложение не будет работать или сломает вашу систему... Если вы все равно готовы рискнуть, введите '{answers}'", + "confirm_app_install_danger": "ОПАСНО! Это приложение все еще является экспериментальным (если не сказать, что оно явно не работает)! Вам НЕ следует устанавливать его, если вы НЕ знаете, что делаете. Если это приложение не будет работать или сломает вашу систему, мы НЕ будем оказывать техническую поддержку... Если вы все равно готовы рискнуть, введите '{answers}'", + "confirm_app_install_thirdparty": "ВАЖНО! Это приложение не входит в каталог приложений YunoHost. Установка сторонних приложений может нарушить целостность и безопасность вашей системы. Вам НЕ следует устанавливать его, если вы НЕ знаете, что делаете. Если это приложение не будет работать или сломает вашу систему, мы НЕ будем оказывать техническую поддержку... Если вы все равно готовы рискнуть, введите '{answers}'", "config_apply_failed": "Не удалось применить новую конфигурацию: {error}", "config_cant_set_value_on_section": "Вы не можете установить одно значение на весь раздел конфигурации.", "config_forbidden_keyword": "Ключевое слово '{keyword}' зарезервировано, вы не можете создать или использовать панель конфигурации с вопросом с таким id.", "config_no_panel": "Панель конфигурации не найдена.", "danger": "Опасно:", - "certmanager_warning_subdomain_dns_record": "Субдомен '{subdomain}' не соответствует IP-адресу основного домена '{domain}'. Некоторые функции будут недоступны, пока вы не исправите это и не перегенерируете сертификат.", + "certmanager_warning_subdomain_dns_record": "Субдомен '{subdomain}' не соответствует IP-адресу основного домена '{domain}'. Некоторые функции будут недоступны, пока вы не исправите это и не сгенерируете сертификат снова.", "app_argument_password_no_default": "Ошибка при парсинге аргумента пароля '{name}': аргумент пароля не может иметь значение по умолчанию по причинам безопасности", "custom_app_url_required": "Вы должны указать URL для обновления вашего пользовательского приложения {app}", "backup_creation_failed": "Не удалось создать резервную копию", @@ -137,8 +137,8 @@ "backup_system_part_failed": "Не удалось создать резервную копию системной части '{part}'", "certmanager_cert_renew_success": "Обновлен сертификат Let's Encrypt для домена '{domain}'", "certmanager_cert_signing_failed": "Не удалось подписать новый сертификат", - "diagnosis_apps_bad_quality": "В настоящее время это приложение отмечено как неработающее в каталоге приложений YunoHost. Это может быть временной проблемой, пока мэинтейнеры пытаются исправить проблему. Пока что обновление этого приложения отключено.", - "diagnosis_apps_broken": "В настоящее время это приложение отмечено как неработающее в каталоге приложений YunoHost. Это может быть временной проблемой, пока мэинтейнеры пытаются исправить проблему. Пока что обновления для этого приложения отключены.", + "diagnosis_apps_bad_quality": "В настоящее время это приложение отмечено как неработающее в каталоге приложений YunoHost. Это может быть временной проблемой, пока сопровождающий пытается исправить проблему. Пока что обновление этого приложения отключено.", + "diagnosis_apps_broken": "В настоящее время это приложение отмечено как неработающее в каталоге приложений YunoHost. Это может быть временной проблемой, пока сопровождающие пытаются исправить проблему. Пока что обновления для этого приложения отключены.", "diagnosis_apps_allgood": "Все установленные приложения соблюдают основные правила упаковки", "diagnosis_apps_issue": "Обнаружена проблема для приложения {app}", "diagnosis_apps_not_in_app_catalog": "Этого приложения нет в каталоге приложений YunoHost. Если оно было там раньше, а теперь удалено, вам стоит подумать об удалении этого приложения, так как оно больше не получит обновлений и может нарушить целостность и безопасность вашей системы.", @@ -157,14 +157,14 @@ "backup_with_no_backup_script_for_app": "Приложение '{app}' не имеет сценария резервного копирования. Оно будет проигнорировано.", "certmanager_attempt_to_renew_nonLE_cert": "Сертификат для домена '{domain}' не выпущен Let's Encrypt. Невозможно продлить его автоматически!", "certmanager_attempt_to_renew_valid_cert": "Срок действия сертификата для домена '{domain}' НЕ истекает! (Вы можете использовать --force, если знаете, что делаете)", - "certmanager_cannot_read_cert": "При попытке открыть текущий сертификат для домена {domain} произошло что-то неправильное (файл: {file}), причина: {reason}", + "certmanager_cannot_read_cert": "При попытке открыть текущий сертификат для домена {domain}что-то пошло не так (файл: {file}), причина: {reason}", "certmanager_cert_install_success": "Сертификат Let's Encrypt для домена '{domain}' установлен", "certmanager_domain_cert_not_selfsigned": "Сертификат для домена {domain} не самоподписанный. Вы уверены, что хотите заменить его? (Для этого используйте '--force'.)", "certmanager_certificate_fetching_or_enabling_failed": "Попытка использовать новый сертификат для {domain} не сработала...", - "certmanager_domain_http_not_working": "Похоже, домен {domain} не доступен через HTTP. Пожалуйста, проверьте категорию 'Web' в диагностике для получения дополнительной информации. (Если вы знаете, что делаете, используйте '--no-checks', чтобы отключить эти проверки.)", + "certmanager_domain_http_not_working": "Похоже, домен {domain} не доступен через HTTP. Пожалуйста, проверьте категорию 'Домены' в диагностике для получения дополнительной информации. (Если вы знаете, что делаете, используйте '--no-checks', чтобы отключить эти проверки.)", "certmanager_hit_rate_limit": "Для этого набора доменов {domain} в последнее время было выпущено слишком много сертификатов. Пожалуйста, повторите попытку позже. См. https://letsencrypt.org/docs/rate-limits/ для получения более подробной информации", "certmanager_no_cert_file": "Не удалось прочитать файл сертификата для домена {domain} (файл: {file})", - "confirm_app_install_warning": "Предупреждение: Это приложение может работать, но пока еще недостаточно интегрировано в YunoHost. Некоторые функции, такие как единая регистрация и резервное копирование/восстановление, могут быть недоступны. Все равно устанавливать? [{answers}] ", + "confirm_app_install_warning": "Предупреждение: Это приложение может работать, но пока еще недостаточно интегрировано в YunoHost. Некоторые функции, такие как единая регистрация и резервное копирование/восстановление, могут быть недоступны. Все равно установить? [{answers}] ", "yunohost_not_installed": "YunoHost установлен неправильно. Пожалуйста, запустите 'yunohost tools postinstall'", "backup_cleaning_failed": "Не удалось очистить временную папку резервного копирования", "certmanager_attempt_to_replace_valid_cert": "Вы пытаетесь перезаписать хороший и действительный сертификат для домена {domain}! (Используйте --force для обхода)", @@ -173,20 +173,50 @@ "diagnosis_description_services": "Проверка статусов сервисов", "config_validate_color": "Должен быть правильный hex цвета RGB", "diagnosis_basesystem_hardware": "Аппаратная архитектура сервера – {virt} {arch}", - "certmanager_acme_not_configured_for_domain": "Задача ACME не может быть запущена для {domain} прямо сейчас, потому что в его nginx conf отсутствует соответствующий фрагмент кода... Пожалуйста, убедитесь, что конфигурация вашего nginx обновлена, используя `yunohost tools regen-conf nginx --dry-run --with-diff`.", + "certmanager_acme_not_configured_for_domain": "Задача ACME не может быть запущена для {domain} прямо сейчас, потому что в его nginx conf отсутствует соответствующий фрагмент кода... Пожалуйста, убедитесь, что конфигурация вашего nginx обновлена, используя 'yunohost tools regen-conf nginx --dry-run --with-diff'.", "diagnosis_basesystem_ynh_single_version": "{package} версия: {version} ({repo})", - "diagnosis_description_mail": "Email", + "diagnosis_description_mail": "Электронная почта", "diagnosis_basesystem_kernel": "Версия ядра Linux на сервере {kernel_version}", "diagnosis_description_apps": "Приложения", "diagnosis_diskusage_low": "В хранилище {mountpoint} (на устройстве {device}) осталось {free} ({free_percent}%) места (из {total}). Будьте осторожны.", - "diagnosis_description_dnsrecords": "DNS записи", + "diagnosis_description_dnsrecords": "DNS-записи", "diagnosis_description_ip": "Интернет-соединение", "diagnosis_description_basesystem": "Основная система", - "diagnosis_description_web": "Web", + "diagnosis_description_web": "Доступность доменов", "diagnosis_basesystem_host": "На сервере запущен Debian {debian_version}", "diagnosis_dns_bad_conf": "Некоторые записи DNS для домена {domain} (категория {category}) отсутствуют или неверны", "diagnosis_description_systemresources": "Системные ресурсы", "backup_with_no_restore_script_for_app": "{app} не имеет сценария восстановления, вы не сможете автоматически восстановить это приложение из резервной копии.", "diagnosis_description_ports": "Открытые порты", - "diagnosis_basesystem_hardware_model": "Модель сервера {model}" -} \ No newline at end of file + "diagnosis_basesystem_hardware_model": "Модель сервера {model}", + "domain_config_mail_in": "Входящие письма", + "domain_config_mail_out": "Исходящие письма", + "domain_config_xmpp": "Мгновенный обмен сообщениями (XMPP)", + "domain_config_auth_token": "Токен аутентификации", + "domain_deletion_failed": "Невозможно удалить домен {domain}: {error}", + "domain_config_default_app": "Приложение по умолчанию", + "domain_dns_push_failed_to_authenticate": "Не удалось пройти аутентификацию на API регистратора для домена '{domain}'. Возможно учетные данные неверны? (Ошибка: {error})", + "domain_dns_push_already_up_to_date": "Записи уже обновлены, ничего делать не нужно.", + "domain_dns_push_failed": "Обновление записей DNS потерпело неудачу.", + "backup_custom_mount_error": "Пользовательский метод резервного копирования не смог пройти этап 'mount'", + "diagnosis_diskusage_ok": "Хранилище {mountpoint} (на устройстве {device}) имеет еще {free} ({free_percent}%) свободного места (всего {total})!", + "domain_dns_conf_special_use_tld": "Этот домен основан на домене верхнего уровня специального назначения (TLD), таком как .local или .test, и поэтому не предполагает наличия реальных записей DNS.", + "diagnosis_basesystem_ynh_main_version": "Сервер работает под управлением YunoHost {main_version} ({repo})", + "domain_creation_failed": "Невозможно создать домен {domain}: {error}", + "domain_deleted": "Домен удален", + "backup_custom_backup_error": "Пользовательский метод резервного копирования не смог пройти этап 'backup'", + "diagnosis_apps_outdated_ynh_requirement": "Установленная версия этого приложения требует только yunohost >= 2.x, что указывает на то, что оно не соответствует рекомендуемым практикам упаковки и помощникам. Вам следует рассмотреть возможность его обновления.", + "diagnosis_basesystem_ynh_inconsistent_versions": "Вы используете несовместимые версии пакетов YunoHost... скорее всего, из-за неудачного или частичного обновления.", + "diagnosis_failed_for_category": "Не удалось провести диагностику для категории '{category}': {error}", + "diagnosis_cache_still_valid": "(Кэш еще действителен для диагностики {category}. Повторная диагностика пока не проводится!)", + "diagnosis_cant_run_because_of_dep": "Невозможно выполнить диагностику для {category}, пока есть важные проблемы, связанные с {dep}.", + "diagnosis_found_errors": "Есть {errors} существенная проблема(ы), связанная с {category}!", + "diagnosis_everything_ok": "Все выглядит отлично для {category}!", + "diagnosis_dns_good_conf": "DNS-записи правильно настроены для домена {domain} (категория {category})", + "diagnosis_display_tip": "Чтобы увидеть найденные проблемы, вы можете перейти в раздел Диагностика в веб-интерфейсе или выполнить команду 'yunohost diagnosis show --issues --human-readable' из командной строки.", + "diagnosis_dns_point_to_doc": "Если вам нужна помощь по настройке DNS-записей, обратитесь к документации на сайте https://yunohost.org/dns_config.", + "diagnosis_domain_expiration_error": "Срок действия некоторых доменов истекает ОЧЕНЬ СКОРО!", + "diagnosis_failed": "Не удалось получить результат диагностики для категории '{category}': {error}", + "domain_created": "Домен создан", + "diagnosis_backports_in_sources_list": "Похоже, что apt (менеджер пакетов) настроен на использование репозитория backports. Если вы не знаете, что делаете, мы настоятельно не рекомендуем устанавливать пакеты из backports, потому что это может привести к нестабильности или конфликтам в вашей системе." +} From af343ed6cee0abb8567d21d5a71ced7871a04297 Mon Sep 17 00:00:00 2001 From: Ilya Date: Thu, 12 May 2022 22:06:42 +0000 Subject: [PATCH 449/619] Translated using Weblate (Russian) Currently translated at 48.9% (336 of 686 strings) Translation: YunoHost/core Translate-URL: https://translate.yunohost.org/projects/yunohost/core/ru/ --- locales/ru.json | 122 ++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 119 insertions(+), 3 deletions(-) diff --git a/locales/ru.json b/locales/ru.json index cc78caebd..1546c4d6e 100644 --- a/locales/ru.json +++ b/locales/ru.json @@ -34,7 +34,7 @@ "backup_applying_method_copy": "Копирование всех файлов в резервную копию...", "domain_dns_conf_is_just_a_recommendation": "Эта страница показывает вам *рекомендуемую* конфигурацию. Она не создаёт для вас конфигурацию DNS. Вы должны сами конфигурировать DNS у вашего регистратора в соответствии с этой рекомендацией.", "good_practices_about_user_password": "Выберите пароль пользователя длиной не менее 8 символов, хотя рекомендуется использовать более длинные (например, парольную фразу) и / или использовать символы различного типа (прописные, строчные буквы, цифры и специальные символы).", - "password_too_simple_3": "Пароль должен содержать не менее 8 символов и содержать цифры, заглавные и строчные буквы и специальные символы", + "password_too_simple_3": "Пароль должен содержать не менее 8 символов и содержать цифры, заглавные и строчные буквы, а также специальные символы", "upnp_enabled": "UPnP включен", "user_deleted": "Пользователь удалён", "ask_lastname": "Фамилия", @@ -68,7 +68,7 @@ "app_start_restore": "Восстановление {app}...", "app_upgrade_several_apps": "Будут обновлены следующие приложения: {apps}", "password_too_simple_2": "Пароль должен содержать не менее 8 символов и включать цифры, заглавные и строчные буквы", - "password_too_simple_4": "Пароль должен содержать не менее 12 символов и включать цифры, заглавные и строчные буквы и специальные символы", + "password_too_simple_4": "Пароль должен содержать не менее 12 символов и включать цифры, заглавные и строчные буквы, а также специальные символы", "upgrade_complete": "Обновление завершено", "user_unknown": "Неизвестный пользователь: {user}", "yunohost_already_installed": "YunoHost уже установлен", @@ -218,5 +218,121 @@ "diagnosis_domain_expiration_error": "Срок действия некоторых доменов истекает ОЧЕНЬ СКОРО!", "diagnosis_failed": "Не удалось получить результат диагностики для категории '{category}': {error}", "domain_created": "Домен создан", - "diagnosis_backports_in_sources_list": "Похоже, что apt (менеджер пакетов) настроен на использование репозитория backports. Если вы не знаете, что делаете, мы настоятельно не рекомендуем устанавливать пакеты из backports, потому что это может привести к нестабильности или конфликтам в вашей системе." + "diagnosis_backports_in_sources_list": "Похоже, что apt (менеджер пакетов) настроен на использование репозитория backports. Если вы не знаете, что делаете, мы настоятельно не рекомендуем устанавливать пакеты из backports, потому что это может привести к нестабильности или конфликтам в вашей системе.", + "group_updated": "Группа '{group}' обновлена", + "invalid_number_min": "Должно быть больше, чем {min}", + "invalid_number_max": "Должно быть меньше, чем {max}", + "ldap_attribute_already_exists": "Атрибут LDAP '{attribute}' уже существует со значением '{value}'", + "regenconf_up_to_date": "Конфигурация уже актуальна для категории '{category}'", + "pattern_password": "Должно быть не менее 3 символов", + "hook_exec_failed": "Не удалось запустить скрипт: {path}", + "group_deleted": "Группа '{group}' удалена", + "group_user_not_in_group": "Пользователь {user} не входит в группу {group}", + "permission_protected": "Разрешение {permission} защищено. Вы не можете добавить или удалить группу посетителей в/из этого разрешения.", + "log_domain_config_set": "Обновление конфигурации для домена '{}'", + "log_domain_dns_push": "Сделать DNS-записи для домена '{}'", + "other_available_options": "... и {n} других не показанных доступных опций", + "permission_cannot_remove_main": "Удаление основного разрешения не допускается", + "permission_require_account": "Разрешение {permission} имеет смысл только для пользователей, имеющих учетную запись, и поэтому не может быть включено для посетителей.", + "permission_update_failed": "Не удалось обновить разрешение '{permission}': {error}", + "regenconf_file_removed": "Файл конфигурации '{conf}' удален", + "permission_not_found": "Разрешение '{permission}' не найдено", + "group_cannot_edit_all_users": "Группа 'all_users' не может быть отредактирована вручную. Это специальная группа, предназначенная для всех пользователей, зарегистрированных в YunoHost", + "global_settings_setting_smtp_allow_ipv6": "Разрешить использование IPv6 для получения и отправки почты", + "log_dyndns_subscribe": "Подписаться на субдомен YunoHost '{}'", + "pattern_firstname": "Должно быть настоящее имя", + "migrations_pending_cant_rerun": "Эти миграции еще не завершены, поэтому не могут быть запущены снова: {ids}", + "migrations_running_forward": "Запуск миграции {id}...", + "regenconf_file_backed_up": "Файл конфигурации '{conf}' сохранен в '{backup}'", + "regenconf_file_copy_failed": "Не удалось скопировать новый файл конфигурации '{new}' в '{conf}'", + "regenconf_file_manually_modified": "Конфигурационный файл '{conf}' был изменен вручную и не будет обновлен", + "regenconf_file_updated": "Файл конфигурации '{conf}' обновлен", + "regenconf_now_managed_by_yunohost": "Конфигурационный файл '{conf}' теперь управляется YunoHost (категория {category}).", + "migrations_to_be_ran_manually": "Миграция {id} должна быть запущена вручную. Пожалуйста, перейдите в раздел Инструменты → Миграции на вэб-странице администратора или выполните команду `yunohost tools migrations run`.", + "port_already_opened": "Порт {port} уже открыт для {ip_version} подключений", + "postinstall_low_rootfsspace": "Общий размер корневой файловой системы составляет менее 10 ГБ, что вызывает беспокойство! Скорее всего, свободное место очень быстро закончится! Рекомендуется иметь не менее 16 ГБ для корневой файловой системы. Если вы хотите установить YunoHost, несмотря на это предупреждение, повторно запустите пост-установку с параметром --force-diskspace", + "diagnosis_services_running": "Служба {service} запущена!", + "diagnosis_swap_none": "Система вообще не имеет свопа. Вы должны рассмотреть возможность добавления по крайней мере {recommended} объема подкачки, чтобы избежать ситуаций, когда в системе заканчивается память.", + "diagnosis_swap_notsomuch": "В системе имеется только {total} своп. Вам следует иметь не менее {recommended}, чтобы избежать ситуаций, когда в системе заканчивается память.", + "group_creation_failed": "Не удалось создать группу '{group}': {error}", + "group_cannot_edit_visitors": "Группу \"посетители\" нельзя редактировать вручную. Это специальная группа, представляющая анонимных посетителей", + "ldap_server_down": "Невозможно подключиться к серверу LDAP", + "permission_updated": "Разрешение '{permission}' обновлено", + "regenconf_file_remove_failed": "Не удалось удалить файл конфигурации '{conf}'", + "group_created": "Группа '{group}' создана", + "group_deletion_failed": "Не удалось удалить группу '{group}': {error}", + "log_backup_create": "Создание резервной копии", + "group_update_failed": "Не удалось обновить группу '{group}': {error}", + "permission_already_allowed": "В группе '{group}' уже включено разрешение '{permission}'", + "invalid_password": "Неверный пароль", + "group_already_exist": "Группа {group} уже существует", + "group_cannot_be_deleted": "Группа {group} не может быть удалена вручную.", + "log_app_config_set": "Примените конфигурацию приложения '{}'", + "log_backup_restore_app": "Восстановление '{}' из резервной копии", + "global_settings_setting_security_webadmin_allowlist": "IP-адреса, разрешенные для доступа к веб-интерфейсу администратора. Разделенные запятыми.", + "global_settings_setting_security_webadmin_allowlist_enabled": "Разрешите доступ к веб-интерфейсу администратора только некоторым IP-адресам.", + "log_domain_remove": "Удалить домен '{}' из конфигурации системы", + "user_import_success": "Пользователи успешно импортированы", + "group_user_already_in_group": "Пользователь {user} уже входит в группу {group}", + "diagnosis_swap_ok": "Система имеет {total} свопа!", + "permission_already_exist": "Разрешение '{permission}' уже существует", + "permission_cant_add_to_all_users": "Разрешение {permission} не может быть добавлено всем пользователям.", + "permission_created": "Разрешение '{permission}' создано", + "log_app_makedefault": "Сделайте '{}' приложением по умолчанию", + "log_app_upgrade": "Обновите приложение '{}'", + "migrations_no_migrations_to_run": "Нет миграций для запуска", + "diagnosis_sshd_config_inconsistent_details": "Пожалуйста, выполните yunohost settings set security.ssh.port -v YOUR_SSH_PORT, чтобы определить порт SSH, и проверьте yunohost tools regen-conf ssh --dry-run --with-diff и yunohost tools regen-conf ssh --force, чтобы сбросить ваш conf в соответствии с рекомендациями YunoHost.", + "log_domain_main_domain": "Сделать '{}' основным доменом", + "diagnosis_sshd_config_insecure": "Похоже, что конфигурация SSH была изменена вручную, и она небезопасна, поскольку не содержит директив 'AllowGroups' или 'AllowUsers' для ограничения доступа авторизованных пользователей.", + "global_settings_setting_security_ssh_port": "SSH порт", + "group_already_exist_on_system": "Группа {group} уже существует в системных группах", + "group_already_exist_on_system_but_removing_it": "Группа {group} уже существует в системных группах, но YunoHost удалит ее...", + "group_unknown": "Группа '{group}' неизвестна", + "log_app_action_run": "Запуск действия приложения '{}'", + "log_available_on_yunopaste": "Эти логи теперь доступны через {url}", + "permission_deleted": "Разрешение '{permission}' удалено", + "regenconf_file_kept_back": "Конфигурационный файл '{conf}' должен был быть удален regen-conf (категория {category}), но был сохранен.", + "regenconf_updated": "Обновлена конфигурация для '{category}'", + "global_settings_setting_smtp_relay_port": "Порт ретрансляции SMTP", + "global_settings_setting_smtp_relay_password": "Пароль узла ретрансляции SMTP", + "invalid_regex": "Неверный regex:'{regex}'", + "regenconf_file_manually_removed": "Конфигурационный файл '{conf}' был удален вручную и не будет создан", + "migrations_not_pending_cant_skip": "Эти миграции не ожидаются, поэтому не могут быть пропущены: {ids}", + "migrations_skip_migration": "Пропуск миграции {id}...", + "invalid_number": "Должна быть цифра", + "regenconf_failed": "Не удалось восстановить конфигурацию для категории(й): {categories}", + "diagnosis_services_conf_broken": "Конфигурация нарушена для службы {service}!", + "diagnosis_sshd_config_inconsistent": "Похоже, что порт SSH был вручную изменен в /etc/ssh/sshd_config. Начиная с версии YunoHost 4.2, доступен новый глобальный параметр 'security.ssh.port', позволяющий избежать ручного редактирования конфигурации.", + "global_settings_setting_service_ssh_allow_deprecated_dsa_hostkey": "Разрешить использование (устаревшего) ключа хоста DSA для конфигурации демона SSH", + "hook_exec_not_terminated": "Скрипт не завершился должным образом: {path}", + "ip6tables_unavailable": "Вы не можете играть с ip6tables здесь. Либо Вы находитесь в контейнере, либо ваше ядро это не поддерживает", + "iptables_unavailable": "Вы не можете играть с ip6tables здесь. Либо Вы находитесь в контейнере, либо ваше ядро это не поддерживает", + "log_corrupted_md_file": "Файл метаданных YAML, связанный с логами, поврежден: '{md_file}\nОшибка: {error}'", + "log_does_exists": "Нет логов с именем '{log}', используйте 'yunohost log list' для просмотра всех доступных логов", + "log_app_change_url": "Измените URL приложения '{}'", + "log_app_install": "Установите приложение '{}'", + "log_backup_restore_system": "Восстановление системы из резервной копии", + "log_domain_add": "Добавьте домен '{}' в конфигурацию системы", + "pattern_backup_archive_name": "Должно быть действительное имя файла, содержащее не более 30 символов: только буквы, цифры и символы -_.", + "pattern_domain": "Должно быть существующее доменное имя (например, my-domain.org)", + "pattern_email": "Должен быть правильный адрес электронной почты, без символа \"+\" (например, someone@example.com)", + "pattern_lastname": "Должна быть настоящая фамилия", + "pattern_port_or_range": "Должен быть корректный номер порта (т.е. 0-65535) или диапазон портов (например, 100:200)", + "pattern_password_app": "Извините, пароли не могут содержать следующие символы: {forbidden_chars}", + "port_already_closed": "Порт {port} уже закрыт для подключений {ip_version}", + "user_update_failed": "Не удалось обновить пользователя {user}: {error}", + "migrations_success_forward": "Миграция {id} завершена", + "pattern_mailbox_quota": "Должен быть размер с суффиксом b/k/M/G/T или 0, что значит без ограничений", + "permission_already_disallowed": "У группы '{group}' уже отключено разрешение '{permission}'", + "permission_creation_failed": "Не удалось создать разрешение '{permission}': {error}", + "regenconf_pending_applying": "Применение ожидающей конфигурации для категории '{category}'...", + "user_updated": "Информация о пользователе изменена", + "regenconf_need_to_explicitly_specify_ssh": "Конфигурация ssh была изменена вручную, но Вам нужно явно указать категорию 'ssh' с --force, чтобы применить изменения.", + "ldap_server_is_down_restart_it": "Служба LDAP не работает, попытайтесь перезапустить ее...", + "permission_already_up_to_date": "Разрешение не было обновлено, потому что запросы на добавление/удаление уже соответствуют текущему состоянию.", + "group_cannot_edit_primary_group": "Группа '{group}' не может быть отредактирована вручную. Это основная группа, предназначенная для содержания только одного конкретного пользователя.", + "log_app_remove": "Удалите приложение '{}'", + "not_enough_disk_space": "Недостаточно свободного места в '{путь}'", + "pattern_email_forward": "Должен быть корректный адрес электронной почты, символ '+' допустим (например, someone+tag@example.com)", + "permission_deletion_failed": "Не удалось удалить разрешение '{permission}': {error}" } From 4155aa748637d5ee83aaab1442f667b5da9ce115 Mon Sep 17 00:00:00 2001 From: yunohost-bot Date: Mon, 16 May 2022 14:13:45 +0000 Subject: [PATCH 450/619] [CI] Format code with Black --- src/diagnosers/12-dnsrecords.py | 2 +- src/dns.py | 22 +++++++++++++++------- 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/src/diagnosers/12-dnsrecords.py b/src/diagnosers/12-dnsrecords.py index caa1c8fdf..4d30bb1a7 100644 --- a/src/diagnosers/12-dnsrecords.py +++ b/src/diagnosers/12-dnsrecords.py @@ -20,7 +20,7 @@ from yunohost.domain import domain_list, _get_maindomain from yunohost.dns import ( _build_dns_conf, _get_dns_zone_for_domain, - _get_relative_name_for_dns_zone + _get_relative_name_for_dns_zone, ) logger = log.getActionLogger("yunohost.diagnosis") diff --git a/src/dns.py b/src/dns.py index 0bee3d639..c8bebed41 100644 --- a/src/dns.py +++ b/src/dns.py @@ -475,7 +475,9 @@ def _get_dns_zone_for_domain(domain): if answer[0] != "ok": # Some domains have a SOA configured but NO NS record !!! # See https://github.com/YunoHost/issues/issues/1980 - answer = dig(parent, rdtype="SOA", full_answers=True, resolvers="force_external") + answer = dig( + parent, rdtype="SOA", full_answers=True, resolvers="force_external" + ) if answer[0] == "ok": mkdir(cache_folder, parents=True, force=True) @@ -500,7 +502,10 @@ def _get_relative_name_for_dns_zone(domain, base_dns_zone): # foo.example.tld -> foo # .foo.example.tld -> foo # bar.foo.example.tld -> bar.foo - return re.sub(r"\.?" + base_dns_zone.replace(".", r"\.") + "$", "", domain.strip(".")) or "@" + return ( + re.sub(r"\.?" + base_dns_zone.replace(".", r"\.") + "$", "", domain.strip(".")) + or "@" + ) def _get_registrar_config_section(domain): @@ -853,10 +858,9 @@ def domain_dns_push(operation_logger, domain, dry_run=False, force=False, purge= for record in current: changes["delete"].append(record) - def human_readable_record(action, record): - name = (record["name"]) - name = _get_relative_name_for_dns_zone(record['name'], base_dns_zone) + name = record["name"] + name = _get_relative_name_for_dns_zone(record["name"], base_dns_zone) name = name[:20] t = record["type"] @@ -889,7 +893,9 @@ def domain_dns_push(operation_logger, domain, dry_run=False, force=False, purge= if Moulinette.interface.type == "api": for records in changes.values(): for record in records: - record["name"] = _get_relative_name_for_dns_zone(record["name"], base_dns_zone) + record["name"] = _get_relative_name_for_dns_zone( + record["name"], base_dns_zone + ) return changes else: out = {"delete": [], "create": [], "update": [], "unchanged": []} @@ -938,7 +944,9 @@ def domain_dns_push(operation_logger, domain, dry_run=False, force=False, purge= for record in changes[action]: - relative_name = _get_relative_name_for_dns_zone(record['name'], base_dns_zone) + relative_name = _get_relative_name_for_dns_zone( + record["name"], base_dns_zone + ) progress( f"{action} {record['type']:^5} / {relative_name}" ) # FIXME: i18n but meh From 8a0a33a0de8846d478675acbd3d7a0ba1bbb065b Mon Sep 17 00:00:00 2001 From: tituspijean Date: Tue, 17 May 2022 23:26:18 +0200 Subject: [PATCH 451/619] Update changelog for 11.0.7 --- debian/changelog | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/debian/changelog b/debian/changelog index fc43389f4..6a945f739 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,20 @@ +yunohost (11.0.7) testing; urgency=low + + - [fix] Allow lime2 to upgrade even if kernel is hold ([#1452](https://github.com/YunoHost/yunohost/pull/1452)) + - [fix] Some DNS suggestions for specific domains are incorrect ([#1460](https://github.com/YunoHost/yunohost/pull/1460)) + - [enh] Reorganize PHP-specific code in apt helper (5ca18c5) + - [enh] Implement install and removal of YunoHost apps ([#1445](https://github.com/YunoHost/yunohost/pull/1445)) + - [enh] Add n auto-updater ([#1437](https://github.com/YunoHost/yunohost/pull/1437)) + - [enh] nodejs: Upgrade n to v8.2.0 ([#1456](https://github.com/YunoHost/yunohost/pull/1456)) + - [enh] Improve ynh_string_random to output various ranges of characters ([#1455](https://github.com/YunoHost/yunohost/pull/1455)) + - [enh] Avoid alert for Content Security Policies Report-Only and Websockets ((#1464)[https://github.com/YunoHost/yunohost/pull/1464]) + - [doc] Improve ynh_add_config template doc ([#1463](https://github.com/YunoHost/yunohost/pull/1463)) + - [i18n] Translations updated for Russian and French + + Thanks to all contributors <3 ! (DiesDasJenes, ljf, kayou, yalh, aleks, tituspijean, keomabrun, pp-r, cheredin) + + -- tituspijean Tue, 17 May 2022 23:20:00 +0200 + yunohost (11.0.6) testing; urgency=low - [fix] configpanel: the config panel was not modifying the configuration of the correct app in certain situations ([#1449](http://github.com/YunoHost/yunohost/pull/1449)) From 19ed83100d1900cccb25dba72bda20156f0ba3c9 Mon Sep 17 00:00:00 2001 From: yalh76 Date: Sun, 29 May 2022 14:50:00 +0200 Subject: [PATCH 452/619] better example --- helpers/user | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/helpers/user b/helpers/user index aecbd740e..1d7cc95d9 100644 --- a/helpers/user +++ b/helpers/user @@ -27,7 +27,7 @@ ynh_user_exists() { # | arg: -k, --key= - the key to retrieve # | ret: the value associate to that key # -# example: mail=$(ynh_user_get_info 'toto' 'mail') +# example: mail=$(ynh_user_get_info --username="toto" --key=mail) # # Requires YunoHost version 2.2.4 or higher. ynh_user_get_info() { From 638a3e8b1caea998c2f0628f758f7f76571b062e Mon Sep 17 00:00:00 2001 From: tituspijean Date: Thu, 2 Jun 2022 13:33:28 +0200 Subject: [PATCH 453/619] Escape username for ynh_user_exists --- helpers/user | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/helpers/user b/helpers/user index 1d7cc95d9..f5f3ec7bd 100644 --- a/helpers/user +++ b/helpers/user @@ -17,7 +17,7 @@ ynh_user_exists() { # Manage arguments with getopts ynh_handle_getopts_args "$@" - yunohost user list --output-as json --quiet | jq -e ".users.${username}" >/dev/null + yunohost user list --output-as json --quiet | jq -e ".users.\"${username}\"" >/dev/null } # Retrieve a YunoHost user information From 745aae208bc291f994138cb0d89a8eb25864ded3 Mon Sep 17 00:00:00 2001 From: Jose Riha Date: Sun, 12 Jun 2022 22:53:24 +0200 Subject: [PATCH 454/619] Fix typo (indefinite article in plural) --- src/utils/legacy.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/utils/legacy.py b/src/utils/legacy.py index 85898f28d..e6e1e8815 100644 --- a/src/utils/legacy.py +++ b/src/utils/legacy.py @@ -302,5 +302,5 @@ def _patch_legacy_helpers(app_folder): if show_warning: # And complain about those damn deprecated helpers logger.error( - r"/!\ Packagers ! This app uses a very old deprecated helpers ... Yunohost automatically patched the helpers to use the new recommended practice, but please do consider fixing the upstream code right now ..." + r"/!\ Packagers ! This app uses very old deprecated helpers ... Yunohost automatically patched the helpers to use the new recommended practice, but please do consider fixing the upstream code right now ..." ) From ea0c8e916298ee291d155e716552ff3f628487f2 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Tue, 21 Jun 2022 23:30:31 +0200 Subject: [PATCH 455/619] Typo MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Éric Gaspar <46165813+ericgaspar@users.noreply.github.com> --- src/utils/legacy.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/utils/legacy.py b/src/utils/legacy.py index e6e1e8815..5e5d15fe8 100644 --- a/src/utils/legacy.py +++ b/src/utils/legacy.py @@ -302,5 +302,5 @@ def _patch_legacy_helpers(app_folder): if show_warning: # And complain about those damn deprecated helpers logger.error( - r"/!\ Packagers ! This app uses very old deprecated helpers ... Yunohost automatically patched the helpers to use the new recommended practice, but please do consider fixing the upstream code right now ..." + r"/!\ Packagers! This app uses very old deprecated helpers... YunoHost automatically patched the helpers to use the new recommended practice, but please do consider fixing the upstream code right now..." ) From 60883773f6f8d238e4a856b67fa48bd990808d86 Mon Sep 17 00:00:00 2001 From: Weblate Date: Mon, 23 May 2022 20:11:31 +0000 Subject: [PATCH 456/619] Added translation using Weblate (Slovak) --- locales/sk.json | 1 + 1 file changed, 1 insertion(+) create mode 100644 locales/sk.json diff --git a/locales/sk.json b/locales/sk.json new file mode 100644 index 000000000..0967ef424 --- /dev/null +++ b/locales/sk.json @@ -0,0 +1 @@ +{} From fe0b3203973676a6c7fa0a12c1b812efcd4fa316 Mon Sep 17 00:00:00 2001 From: Weblate Date: Mon, 6 Jun 2022 21:18:54 +0000 Subject: [PATCH 457/619] Added translation using Weblate (Telugu) --- locales/te.json | 1 + 1 file changed, 1 insertion(+) create mode 100644 locales/te.json diff --git a/locales/te.json b/locales/te.json new file mode 100644 index 000000000..0967ef424 --- /dev/null +++ b/locales/te.json @@ -0,0 +1 @@ +{} From 921b4d9b7798f16c4f3b51608fd4eb68153be65d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Gaspar?= Date: Fri, 10 Jun 2022 14:24:13 +0000 Subject: [PATCH 458/619] Translated using Weblate (Telugu) Currently translated at 0.1% (1 of 686 strings) Translation: YunoHost/core Translate-URL: https://translate.yunohost.org/projects/yunohost/core/te/ --- locales/te.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/locales/te.json b/locales/te.json index 0967ef424..0c7366740 100644 --- a/locales/te.json +++ b/locales/te.json @@ -1 +1,3 @@ -{} +{ + "aborting": "రద్దు చేస్తోంది." +} From 206401855a2fbb83956344b1684045d960ac7aac Mon Sep 17 00:00:00 2001 From: Alice Kile Date: Sun, 12 Jun 2022 01:08:59 +0000 Subject: [PATCH 459/619] Translated using Weblate (Telugu) Currently translated at 2.3% (16 of 686 strings) Translation: YunoHost/core Translate-URL: https://translate.yunohost.org/projects/yunohost/core/te/ --- locales/te.json | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/locales/te.json b/locales/te.json index 0c7366740..fa6ac91c8 100644 --- a/locales/te.json +++ b/locales/te.json @@ -1,3 +1,18 @@ { - "aborting": "రద్దు చేస్తోంది." + "aborting": "రద్దు చేస్తోంది.", + "action_invalid": "చెల్లని చర్య '{action}'", + "additional_urls_already_removed": "'{permission}' అనుమతి కొరకు అదనపు URLలో అదనంగా URL '{url}' ఇప్పటికే జోడించబడింది", + "admin_password": "అడ్మినిస్ట్రేషన్ పాస్వర్డ్", + "admin_password_changed": "అడ్మినిస్ట్రేషన్ పాస్వర్డ్ మార్చబడింది", + "already_up_to_date": "చేయడానికి ఏమీ లేదు. ప్రతిదీ ఎప్పటికప్పుడు తాజాగా ఉంది.", + "app_already_installed": "{app} ఇప్పటికే ఇన్స్టాల్ చేయబడింది", + "app_already_up_to_date": "{app} ఇప్పటికే అప్-టూ-డేట్గా ఉంది", + "app_argument_invalid": "ఆర్గ్యుమెంట్ '{name}' కొరకు చెల్లుబాటు అయ్యే వైల్యూ ఎంచుకోండి: {error}", + "additional_urls_already_added": "'{permission}' అనుమతి కొరకు అదనపు URLలో అదనంగా URL '{url}' ఇప్పటికే జోడించబడింది", + "admin_password_change_failed": "అనుమతిపదాన్ని మార్చడం సాధ్యం కాదు", + "admin_password_too_long": "దయచేసి 127 క్యారెక్టర్ల కంటే చిన్న పాస్వర్డ్ ఎంచుకోండి", + "app_action_broke_system": "ఈ చర్య ఈ ముఖ్యమైన సేవలను విచ్ఛిన్నం చేసినట్లుగా కనిపిస్తోంది: {services}", + "app_action_cannot_be_ran_because_required_services_down": "ఈ చర్యను అమలు చేయడానికి ఈ అవసరమైన సేవలు అమలు చేయబడాలి: {services}. కొనసాగడం కొరకు వాటిని పునఃప్రారంభించడానికి ప్రయత్నించండి (మరియు అవి ఎందుకు పనిచేయడం లేదో పరిశోధించవచ్చు).", + "app_argument_choice_invalid": "ఆర్గ్యుమెంట్ '{name}' కొరకు చెల్లుబాటు అయ్యే వైల్యూ ఎంచుకోండి: '{value}' అనేది లభ్యం అవుతున్న ఎంపికల్లో ({Choices}) లేదు", + "app_argument_password_no_default": "పాస్వర్డ్ ఆర్గ్యుమెంట్ '{name}'ని పార్సింగ్ చేసేటప్పుడు దోషం: భద్రతా కారణం కొరకు పాస్వర్డ్ ఆర్గ్యుమెంట్ డిఫాల్ట్ విలువను కలిగి ఉండరాదు" } From ae996b80f8246b10864750990041e0b0768ee115 Mon Sep 17 00:00:00 2001 From: Jose Riha Date: Tue, 21 Jun 2022 10:28:05 +0000 Subject: [PATCH 460/619] Translated using Weblate (Slovak) Currently translated at 2.9% (20 of 686 strings) Translation: YunoHost/core Translate-URL: https://translate.yunohost.org/projects/yunohost/core/sk/ --- locales/sk.json | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/locales/sk.json b/locales/sk.json index 0967ef424..481c77e42 100644 --- a/locales/sk.json +++ b/locales/sk.json @@ -1 +1,22 @@ -{} +{ + "additional_urls_already_removed": "Dodatočná URL adresa '{url}' už bola odstránená pre oprávnenie '{permission}'", + "admin_password": "Heslo pre správu", + "admin_password_change_failed": "Nebolo možné zmeniť heslo", + "admin_password_changed": "Heslo pre správu bolo zmenené", + "app_action_broke_system": "Vyzerá, že táto akcia spôsobila nefunkčnosť nasledovných dôležitých služieb: {services}", + "app_already_installed": "{app} je už nainštalovaný/á", + "app_already_installed_cant_change_url": "Táto aplikácia je už nainštalovaná. Adresa URL nemôže byť touto akciou zmenená. Skontrolujte `app changeurl`, ak je dostupné.", + "app_already_up_to_date": "{app} aplikácia je/sú aktuálna/e", + "app_argument_choice_invalid": "Vyberte platnú hodnotu pre argument '{name}': '{value}' nie je medzi dostupnými možnosťami ({choices})", + "app_argument_invalid": "Vyberte platnú hodnotu pre argument '{name}': {error}", + "app_argument_required": "Argument '{name}' je vyžadovaný", + "app_change_url_identical_domains": "Stará a nová doména/url_cesta sú identické ('{domain}{path}'), nebudú vykonané žiadne zmeny.", + "password_too_simple_1": "Heslo sa musí skladať z aspoň 8 znakov", + "aborting": "Zrušené.", + "action_invalid": "Nesprávna akcia '{action}'", + "additional_urls_already_added": "Dodatočná URL adresa '{url}' už bola pridaná pre oprávnenie '{permission}'", + "admin_password_too_long": "Prosím, vyberte heslo kratšie ako 127 znakov", + "already_up_to_date": "Nič netreba robiť. Všetko je už aktuálne.", + "app_action_cannot_be_ran_because_required_services_down": "Pre vykonanie tejto akcie by mali byť spustené nasledovné služby: {services}. Skúste ich reštartovať, prípadne zistite, prečo nebežia.", + "app_argument_password_no_default": "Chyba pri spracovaní obsahu hesla '{name}': z bezpečnostných dôvodov nemôže obsahovať predvolenú hodnotu" +} From ab4cb2c29dced1a9e18b146cd51c469d1aaa7950 Mon Sep 17 00:00:00 2001 From: Jose Riha Date: Thu, 23 Jun 2022 09:09:33 +0000 Subject: [PATCH 461/619] Translated using Weblate (Slovak) Currently translated at 9.7% (67 of 686 strings) Translation: YunoHost/core Translate-URL: https://translate.yunohost.org/projects/yunohost/core/sk/ --- locales/sk.json | 49 ++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 48 insertions(+), 1 deletion(-) diff --git a/locales/sk.json b/locales/sk.json index 481c77e42..070d21e14 100644 --- a/locales/sk.json +++ b/locales/sk.json @@ -18,5 +18,52 @@ "admin_password_too_long": "Prosím, vyberte heslo kratšie ako 127 znakov", "already_up_to_date": "Nič netreba robiť. Všetko je už aktuálne.", "app_action_cannot_be_ran_because_required_services_down": "Pre vykonanie tejto akcie by mali byť spustené nasledovné služby: {services}. Skúste ich reštartovať, prípadne zistite, prečo nebežia.", - "app_argument_password_no_default": "Chyba pri spracovaní obsahu hesla '{name}': z bezpečnostných dôvodov nemôže obsahovať predvolenú hodnotu" + "app_argument_password_no_default": "Chyba pri spracovaní obsahu hesla '{name}': z bezpečnostných dôvodov nemôže obsahovať predvolenú hodnotu", + "app_change_url_success": "URL adresa {app} je teraz {domain}{path}", + "app_config_unable_to_apply": "Nepodarilo sa použiť hodnoty z panela s nastaveniami.", + "app_config_unable_to_read": "Nepodarilo sa prečítať hodnoty z panela s nastaveniami.", + "app_extraction_failed": "Chyba pri rozbaľovaní inštalačných súborov", + "app_id_invalid": "Neplatné ID aplikácie", + "app_install_failed": "Nedá sa nainštalovať {app}: {error}", + "app_install_files_invalid": "Tieto súbory sa nedajú nainštalovať", + "app_install_script_failed": "Objavila sa chyba vo vnútri inštalačného skriptu aplikácie", + "app_location_unavailable": "Táto adresa URL je buď nedostupná alebo koliduje s už nainštalovanou aplikáciou(ami):\n{apps}", + "app_make_default_location_already_used": "Nepodarilo sa nastaviť '{app}' ako predvolenú aplikáciu na doméne, doménu '{domain}' už využíva aplikácia '{other_app}'", + "app_manifest_install_ask_admin": "Vyberte používateľa, ktorý bude spravovať túto aplikáciu", + "app_manifest_install_ask_domain": "Vyberte doménu, kam bude táto aplikácia nainštalovaná", + "app_manifest_install_ask_is_public": "Má byť táto aplikácia viditeľná pre anonymných návštevníkov?", + "app_manifest_install_ask_password": "Vyberte heslo pre správu tejto aplikácie", + "app_manifest_install_ask_path": "Vyberte cestu adresy URL (po názve domény), kde bude táto aplikácia nainštalovaná", + "app_not_correctly_installed": "Zdá sa, že {app} nie je správne nainštalovaná", + "app_not_properly_removed": "{app} nebola správne odstránená", + "app_packaging_format_not_supported": "Túto aplikáciu nie je možné nainštalovať, pretože formát balíčkov, ktorý používa, nie je podporovaný Vašou verziou YunoHost. Mali by ste zvážiť aktualizovanie Vášho systému.", + "app_remove_after_failed_install": "Aplikácia sa po chybe počas inštalácie odstraňuje…", + "app_removed": "{app} bola odinštalovaná", + "app_requirements_checking": "Kontrolujem programy vyžadované aplikáciou {app}…", + "app_restore_failed": "Nepodarilo sa obnoviť {app}: {error}", + "app_restore_script_failed": "Chyba nastala vo vnútri skriptu na obnovu aplikácie", + "app_sources_fetch_failed": "Nepodarilo sa získať zdrojové súbory, je adresa URL správna?", + "app_start_backup": "Zbieram súbory, ktoré budú zálohovať pre {app}…", + "app_start_install": "Inštalujem {app}…", + "app_start_remove": "Odstraňujem {app}…", + "app_start_restore": "Obnovujem {app}…", + "app_unknown": "Neznáma aplikácia", + "app_upgrade_app_name": "Teraz aktualizujem {app}…", + "app_upgrade_failed": "Nemôžem aktualizovať {app}: {error}", + "app_upgrade_script_failed": "Chyba nastala vo vnútri skriptu na aktualizáciu aplikácie", + "app_upgrade_some_app_failed": "Niektoré aplikácie sa nepodarilo aktualizovať", + "app_upgraded": "{app} bola aktualizovaná", + "apps_already_up_to_date": "Všetky aplikácie sú aktuálne", + "apps_catalog_failed_to_download": "Nepodarilo sa stiahnuť repozitár aplikáciI {apps_catalog}: {error}", + "apps_catalog_init_success": "Systém s repozitárom aplikácií bol inicializovaný!", + "apps_catalog_obsolete_cache": "Medzipamäť repozitára aplikácií je prázdna alebo zastaralá.", + "apps_catalog_update_success": "Repozitár s aplikáciami bol aktualizovaný!", + "app_change_url_no_script": "Aplikácia '{app_name}' ešte nepodporuje modifikáciu URL adresy. Skúste ju aktualizovať.", + "app_full_domain_unavailable": "Ľutujeme, túto aplikáciu musíte nainštalovať na samostatnej doméne, ale na doméne '{domain}' sú už nainštalované iné aplikácie. Ako alternatívu môžete použiť poddoménu určenú iba pre túto aplikáciu.", + "app_label_deprecated": "Tento príkaz je zastaraný! Prosím, použite nový príkaz 'yunohost user permission update' pre správu názvu aplikácie.", + "app_not_installed": "{app} sa nepodarilo nájsť v zozname nainštalovaných aplikácií: {all_apps}", + "app_not_upgraded": "Aplikáciu '{failed_app}' sa nepodarilo aktualizovať v dôsledku čoho boli aktualizácie nasledovných aplikácií zrušené: {apps}", + "app_requirements_unmeet": "Požiadavky aplikácie {app} neboli splnené, balíček {pkgname} ({version}) musí byť {spec}", + "app_unsupported_remote_type": "Nepodporovaný vzdialený typ použitý pre aplikáciu", + "app_upgrade_several_apps": "Nasledovné aplikácie budú aktualizované: {apps}" } From 5e69c670bb1cce0a19ef699caf947365e5c30d27 Mon Sep 17 00:00:00 2001 From: Jose Riha Date: Thu, 23 Jun 2022 13:07:34 +0000 Subject: [PATCH 462/619] Translated using Weblate (Slovak) Currently translated at 11.9% (82 of 686 strings) Translation: YunoHost/core Translate-URL: https://translate.yunohost.org/projects/yunohost/core/sk/ --- locales/sk.json | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/locales/sk.json b/locales/sk.json index 070d21e14..d127287ef 100644 --- a/locales/sk.json +++ b/locales/sk.json @@ -65,5 +65,20 @@ "app_not_upgraded": "Aplikáciu '{failed_app}' sa nepodarilo aktualizovať v dôsledku čoho boli aktualizácie nasledovných aplikácií zrušené: {apps}", "app_requirements_unmeet": "Požiadavky aplikácie {app} neboli splnené, balíček {pkgname} ({version}) musí byť {spec}", "app_unsupported_remote_type": "Nepodporovaný vzdialený typ použitý pre aplikáciu", - "app_upgrade_several_apps": "Nasledovné aplikácie budú aktualizované: {apps}" + "app_upgrade_several_apps": "Nasledovné aplikácie budú aktualizované: {apps}", + "apps_catalog_updating": "Aktualizujem repozitár aplikácií…", + "ask_firstname": "Krstné meno", + "ask_lastname": "Priezvisko", + "ask_main_domain": "Hlavná doména", + "ask_new_admin_password": "Nové heslo pre správu", + "ask_new_domain": "Nová doména", + "ask_new_path": "Nová cesta", + "ask_password": "Heslo", + "ask_user_domain": "Doména, ktorá bude použitá pre e-mailové adresy používateľov a ich XMPP účet", + "backup_abstract_method": "Táto metóda zálohovania ešte nebola implementovaná", + "backup_actually_backuping": "Vytváram archív so zálohou vyzbieraných súborov…", + "backup_app_failed": "Nepodarilo sa zálohovať {app}", + "backup_applying_method_copy": "Kopírujem všetky súbory do zálohy…", + "backup_applying_method_custom": "Volám vlastnú metódu zálohovania '{method}'…", + "backup_applying_method_tar": "Vytváram TAR archív so zálohou…" } From bf181aaa90bcfaa37ba3c685cdae2180a0cfe2cf Mon Sep 17 00:00:00 2001 From: Jose Riha Date: Thu, 23 Jun 2022 13:11:58 +0000 Subject: [PATCH 463/619] Translated using Weblate (Slovak) Currently translated at 12.0% (83 of 686 strings) Translation: YunoHost/core Translate-URL: https://translate.yunohost.org/projects/yunohost/core/sk/ --- locales/sk.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/locales/sk.json b/locales/sk.json index d127287ef..72eba75c5 100644 --- a/locales/sk.json +++ b/locales/sk.json @@ -80,5 +80,6 @@ "backup_app_failed": "Nepodarilo sa zálohovať {app}", "backup_applying_method_copy": "Kopírujem všetky súbory do zálohy…", "backup_applying_method_custom": "Volám vlastnú metódu zálohovania '{method}'…", - "backup_applying_method_tar": "Vytváram TAR archív so zálohou…" + "backup_applying_method_tar": "Vytváram TAR archív so zálohou…", + "backup_archive_app_not_found": "Nepodarilo sa nájsť {app} v archíve so zálohou" } From 83d0fd421cc7765d7fa1797bf1b5e63d4e7bfd40 Mon Sep 17 00:00:00 2001 From: Jose Riha Date: Thu, 23 Jun 2022 13:13:09 +0000 Subject: [PATCH 464/619] Translated using Weblate (Slovak) Currently translated at 12.2% (84 of 686 strings) Translation: YunoHost/core Translate-URL: https://translate.yunohost.org/projects/yunohost/core/sk/ --- locales/sk.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/locales/sk.json b/locales/sk.json index 72eba75c5..66e08134f 100644 --- a/locales/sk.json +++ b/locales/sk.json @@ -81,5 +81,6 @@ "backup_applying_method_copy": "Kopírujem všetky súbory do zálohy…", "backup_applying_method_custom": "Volám vlastnú metódu zálohovania '{method}'…", "backup_applying_method_tar": "Vytváram TAR archív so zálohou…", - "backup_archive_app_not_found": "Nepodarilo sa nájsť {app} v archíve so zálohou" + "backup_archive_app_not_found": "Nepodarilo sa nájsť {app} v archíve so zálohou", + "backup_archive_broken_link": "Nepodarilo sa získať prístup k archívu so zálohou (neplatný odkaz na {path})" } From 5067be6bb746198d6caaa7c636e88718806d2d33 Mon Sep 17 00:00:00 2001 From: Jose Riha Date: Fri, 24 Jun 2022 20:14:37 +0000 Subject: [PATCH 465/619] Translated using Weblate (Slovak) Currently translated at 19.6% (135 of 686 strings) Translation: YunoHost/core Translate-URL: https://translate.yunohost.org/projects/yunohost/core/sk/ --- locales/sk.json | 53 ++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 52 insertions(+), 1 deletion(-) diff --git a/locales/sk.json b/locales/sk.json index 66e08134f..ca7783473 100644 --- a/locales/sk.json +++ b/locales/sk.json @@ -82,5 +82,56 @@ "backup_applying_method_custom": "Volám vlastnú metódu zálohovania '{method}'…", "backup_applying_method_tar": "Vytváram TAR archív so zálohou…", "backup_archive_app_not_found": "Nepodarilo sa nájsť {app} v archíve so zálohou", - "backup_archive_broken_link": "Nepodarilo sa získať prístup k archívu so zálohou (neplatný odkaz na {path})" + "backup_archive_broken_link": "Nepodarilo sa získať prístup k archívu so zálohou (neplatný odkaz na {path})", + "backup_archive_cant_retrieve_info_json": "Nepodarilo sa načítať informácie o archíve '{archive}'… Nie je možné získať info.json (alebo to nie je platný súbor json).", + "backup_archive_corrupted": "Zdá sa, že archív so zálohou '{archive}' je poškodený: {error}", + "backup_archive_name_unknown": "Neznámy archív s miestnou zálohou s názvom '{name}'", + "backup_archive_open_failed": "Nepodarilo sa otvoriť archív so zálohou", + "backup_ask_for_copying_if_needed": "Chcete dočasne vytvoriť zálohu využitím {size} MB? (Využije sa tento spôsob, pretože niektoré súbory nie je možné pripraviť pomocou účinnejšej metódy.)", + "backup_cant_mount_uncompress_archive": "Dekomprimovaný archív sa nepodarilo pripojiť bez ochrany pred zápisom", + "backup_cleaning_failed": "Nepodarilo sa vyčistiť dočasný priečinok pre zálohovanie", + "backup_copying_to_organize_the_archive": "Kopírujem {size} MB kvôli preusporiadaniu archívu", + "backup_couldnt_bind": "Nepodarilo sa previazať {src} s {dest}.", + "backup_create_size_estimation": "Archív bude obsahovať približne {size} údajov.", + "backup_created": "Záloha bola vytvorená", + "backup_creation_failed": "Nepodarilo sa vytvoriť archív so zálohou", + "backup_csv_addition_failed": "Do CSV súboru sa nepodarilo pridať súbory na zálohovanie", + "backup_csv_creation_failed": "Nepodarilo sa vytvoriť súbor CSV potrebný pre obnovu zo zálohy", + "backup_custom_backup_error": "Vlastná metóda zálohovania sa nedostala za krok 'záloha'", + "backup_custom_mount_error": "Vlastná metóda zálohovania sa nedostala za krok 'pripojenie'", + "backup_delete_error": "Nepodarilo sa odstrániť '{path}'", + "backup_deleted": "Záloha bola odstránená", + "backup_method_copy_finished": "Dokončené kopírovanie zálohy", + "backup_method_custom_finished": "Vlastná metóda zálohovania '{method}' skončila", + "backup_method_tar_finished": "Bol vytvorený TAR archív so zálohou", + "backup_mount_archive_for_restore": "Pripravujem archív na obnovu…", + "backup_nothings_done": "Nie je čo uložiť", + "backup_output_directory_not_empty": "Pre výstup by ste si mali vybrať prázdny adresár", + "backup_output_directory_required": "Musíte vybrať výstupný adresár pre zálohu", + "backup_output_symlink_dir_broken": "Váš adresár pre archívy '{path}' je neplatným symbolickým odkazom. Možno ste zabudli (opätovne) pripojiť alebo vložiť úložné zariadenie, na ktoré odkazuje.", + "backup_permission": "Oprávnenia pre zálohy aplikácie {app}", + "backup_running_hooks": "Spúšťam obslužné skripty záloh…", + "backup_system_part_failed": "Nepodarilo sa pripojiť systémovú časť '{part}'", + "backup_with_no_backup_script_for_app": "Aplikácia '{app}' nemá žiaden skript na zálohovanie. Ignorujem.", + "backup_with_no_restore_script_for_app": "Aplikácia {app} nemá žiaden skript na obnovu, nebudete môcť automaticky obnoviť zálohu tejto aplikácie.", + "certmanager_acme_not_configured_for_domain": "Výzvu ACME nie je možné momentálne spustiť pre {domain}, pretože jej konfigurácia nginx neobsahuje príslušný kus kódu… Prosím, zabezpečte, aby bola Vaša konfigurácia nginx aktuálna tak, že spustíte `yunohost tools regen-conf nginx --dry-run --with-diff`.", + "certmanager_attempt_to_renew_nonLE_cert": "Certifikát pre doménu '{domain}' nevydal Let's Encrypt. Nebude možné ho automaticky obnoviť!", + "certmanager_attempt_to_renew_valid_cert": "Certifikát pre doménu '{domain}' zatiaľ neexpiruje! (Môžete použiť --force, ak viete, čo robíte)", + "certmanager_attempt_to_replace_valid_cert": "Chystáte sa prepísať správny a platný certifikát pre doménu {domain}! (Použite --force na vynútenie)", + "certmanager_cannot_read_cert": "Počas otvárania aktuálneho certifikátu pre doménu {domain} došlo k neznámej chybe (súbor: {file}), príčina: {reason}", + "certmanager_cert_install_success": "Pre doménu '{domain}' bol práve nainštalovaný certifikát od Let's Encrypt", + "certmanager_cert_install_success_selfsigned": "Pre doménu '{domain}' bol práve nainštalovaný vlastnoručne podpísany (self-signed) certifikát", + "certmanager_cert_renew_success": "Certifikát od Let's Encrypt pre doménu '{domain}' bol úspešne obnovený", + "certmanager_cert_signing_failed": "Nepodarilo sa podpísať nový certifikát", + "certmanager_domain_cert_not_selfsigned": "Certifikát pre doménu {domain} nie je vlastnoručne podpísaný (self-signed). Naozaj ho chcete nahradiť? (Použite '--force', ak to chcete urobiť.)", + "certmanager_domain_http_not_working": "Zdá sa, že doména {domain} nie je dostupná prostredníctvom HTTP. Pre zistenie viac informácií skontrolujte, prosím, kategóriu 'Web' v režime diagnostiky. (Ak viete, čo robíte, použite '--no-checks' na vypnutie týchto kontrol.)", + "backup_archive_name_exists": "Archív so zálohou s takýmto názvom už existuje.", + "backup_archive_system_part_not_available": "Systémová časť '{part}' nie je prítomná v tejto zálohe", + "backup_archive_writing_error": "Nepodarilo sa pridať súbory '{source}' (vymenované v archíve '{dest}') do zoznamu na zálohovanie do skomprimovaného archívu '{archive}'", + "backup_hook_unknown": "Obsluha zálohy '{hook}' je neznáma", + "backup_no_uncompress_archive_dir": "Taký dekomprimovaný adresár v archíve neexistuje", + "backup_output_directory_forbidden": "Vyberte si iný adresár pre výstup. Zálohy nie je možné vytvoriť v /bin, /boot, /dev, /etc, /lib, /root, /run, /sbin, /sys, /usr, /var alebo v podadresároch /home/yunohost.backup/archives", + "backup_unable_to_organize_files": "Nie je možné použiť rýchlu metódu na organizáciu súborov v archíve", + "certmanager_certificate_fetching_or_enabling_failed": "Pokus o použitie nového certifikátu pre {domain} skončil s chybou…", + "certmanager_domain_dns_ip_differs_from_public_ip": "DNS záznamy pre doménu '{domain}' sa líšia od IP adresy tohto servera. Pre získanie viac informácií skontrolujte, prosím, kategóriu 'DNS záznamy' (základné) v režime diagnostiky. Ak ste nedávno upravovali Váš A záznam, počkajte nejaký čas, kým sa vypropaguje (niektoré služby kontroly DNS propagovania sú dostupné online). (Ak viete, čo robíte, použite '--no-checks' na vypnutie týchto kontrol.)" } From 686c372baf2210f4e9d38bcb8e0aae6856a05c55 Mon Sep 17 00:00:00 2001 From: Jose Riha Date: Mon, 27 Jun 2022 13:35:17 +0000 Subject: [PATCH 466/619] Translated using Weblate (Slovak) Currently translated at 20.8% (143 of 686 strings) Translation: YunoHost/core Translate-URL: https://translate.yunohost.org/projects/yunohost/core/sk/ --- locales/sk.json | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/locales/sk.json b/locales/sk.json index ca7783473..9185f9331 100644 --- a/locales/sk.json +++ b/locales/sk.json @@ -133,5 +133,13 @@ "backup_output_directory_forbidden": "Vyberte si iný adresár pre výstup. Zálohy nie je možné vytvoriť v /bin, /boot, /dev, /etc, /lib, /root, /run, /sbin, /sys, /usr, /var alebo v podadresároch /home/yunohost.backup/archives", "backup_unable_to_organize_files": "Nie je možné použiť rýchlu metódu na organizáciu súborov v archíve", "certmanager_certificate_fetching_or_enabling_failed": "Pokus o použitie nového certifikátu pre {domain} skončil s chybou…", - "certmanager_domain_dns_ip_differs_from_public_ip": "DNS záznamy pre doménu '{domain}' sa líšia od IP adresy tohto servera. Pre získanie viac informácií skontrolujte, prosím, kategóriu 'DNS záznamy' (základné) v režime diagnostiky. Ak ste nedávno upravovali Váš A záznam, počkajte nejaký čas, kým sa vypropaguje (niektoré služby kontroly DNS propagovania sú dostupné online). (Ak viete, čo robíte, použite '--no-checks' na vypnutie týchto kontrol.)" + "certmanager_domain_dns_ip_differs_from_public_ip": "DNS záznamy pre doménu '{domain}' sa líšia od IP adresy tohto servera. Pre získanie viac informácií skontrolujte, prosím, kategóriu 'DNS záznamy' (základné) v režime diagnostiky. Ak ste nedávno upravovali Váš A záznam, počkajte nejaký čas, kým sa vypropaguje (niektoré služby kontroly DNS propagovania sú dostupné online). (Ak viete, čo robíte, použite '--no-checks' na vypnutie týchto kontrol.)", + "certmanager_domain_not_diagnosed_yet": "Pre doménu {domain} zatiaľ neexistujú výsledky diagnostiky. Prosím, opätovne spustite diagnostiku pre kategórie 'DNS záznamy' a 'Web' a skontrolujte, či je doména pripravená na Let's Encrypt. (Alebo ak viete, čo robíte, použite '--no-checks' na vypnutie týchto kontrol.)", + "certmanager_hit_rate_limit": "V poslednom čase bolo pre sadu domén {domain} vydaných príliš mnoho certifikátov. Skúste to, prosím, neskôr. Viac podrobností nájdete na https://letsencrypt.org/docs/rate-limits/", + "certmanager_no_cert_file": "Nepodarilo sa prečítať súbor s certifikátom pre doménu {domain} (súbor: {file})", + "certmanager_unable_to_parse_self_CA_name": "Nepodarilo sa prečítať názov autority na podpisovanie certifikátov (súbor: {file})", + "config_apply_failed": "Pri nasadzovaní novej konfigurácie došlo k chybe: {error}", + "config_cant_set_value_on_section": "Nemôžete použiť jednoduchú hodnotu na celú časť konfigurácie.", + "certmanager_self_ca_conf_file_not_found": "Nepodarilo sa nájsť súbor s konfiguráciou pre autoritu na podpisovanie certifikátov (súbor: {file})", + "certmanager_warning_subdomain_dns_record": "Poddoména '{subdomain}' nevracia rovnakú IP adresu ako '{domain}'. Niektoré funkcie nebudú dostupné, kým to neopravíte a nevygenerujete nový certifikát." } From 576e8e16b590e3d23f9f2948194d403645dc3195 Mon Sep 17 00:00:00 2001 From: Jose Riha Date: Thu, 30 Jun 2022 21:49:02 +0000 Subject: [PATCH 467/619] Translated using Weblate (Slovak) Currently translated at 22.4% (154 of 686 strings) Translation: YunoHost/core Translate-URL: https://translate.yunohost.org/projects/yunohost/core/sk/ --- locales/sk.json | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/locales/sk.json b/locales/sk.json index 9185f9331..04daf20a9 100644 --- a/locales/sk.json +++ b/locales/sk.json @@ -141,5 +141,16 @@ "config_apply_failed": "Pri nasadzovaní novej konfigurácie došlo k chybe: {error}", "config_cant_set_value_on_section": "Nemôžete použiť jednoduchú hodnotu na celú časť konfigurácie.", "certmanager_self_ca_conf_file_not_found": "Nepodarilo sa nájsť súbor s konfiguráciou pre autoritu na podpisovanie certifikátov (súbor: {file})", - "certmanager_warning_subdomain_dns_record": "Poddoména '{subdomain}' nevracia rovnakú IP adresu ako '{domain}'. Niektoré funkcie nebudú dostupné, kým to neopravíte a nevygenerujete nový certifikát." + "certmanager_warning_subdomain_dns_record": "Poddoména '{subdomain}' nevracia rovnakú IP adresu ako '{domain}'. Niektoré funkcie nebudú dostupné, kým to neopravíte a nevygenerujete nový certifikát.", + "config_forbidden_keyword": "Kľúčové slovo '{keyword}' je vyhradené, nemôžete vytvoriť alebo použiť konfiguračný panel s otázkou s týmto identifikátorom.", + "config_no_panel": "Nenašiel sa žiaden konfiguračný panel.", + "config_unknown_filter_key": "Kľúč filtra '{filter_key}' je nesprávny.", + "config_validate_color": "Toto by mala byť platná kód RGB v šestnástkovej sústave", + "config_validate_date": "Toto by mal byť platný dátum vo formáte RRRR-MM-DD", + "config_validate_email": "Toto by mal byť platný e-mail", + "config_validate_time": "Toto by mal byť platný čas vo formáte HH:MM", + "config_validate_url": "Toto by mala byť platná URL adresa webu", + "config_version_not_supported": "Verzie konfiguračného panela '{version}' nie sú podporované.", + "danger": "Nebezpečenstvo:", + "confirm_app_install_danger": "NEBEZPEČENSTVO! Táto aplikácia je experimentálna (ak vôbec funguje)! Pravdepodobne by ste ju NEMALI inštalovať, pokiaľ si nie ste istý, čo robíte. NEPOSKYTNEME VÁM ŽIADNU POMOC, ak aplikácia nebude fungovať alebo rozbije Váš systém… Ak sa rozhodnete i napriek tomu podstúpiť toto riziko, zadajte '{answers}'" } From fdca9e1041822ad0840fc98727f90543dca4f986 Mon Sep 17 00:00:00 2001 From: ljf Date: Sat, 16 Jul 2022 01:12:54 +0200 Subject: [PATCH 468/619] [fix] Be able to redo postinstall after 128+ chars password --- src/tools.py | 9 ++++----- src/user.py | 6 ++++-- src/utils/password.py | 18 ++++++++++++++++++ 3 files changed, 26 insertions(+), 7 deletions(-) diff --git a/src/tools.py b/src/tools.py index bb7ded03a..32be88c94 100644 --- a/src/tools.py +++ b/src/tools.py @@ -50,7 +50,7 @@ from yunohost.utils.packages import ( _list_upgradable_apt_packages, ynh_packages_version, ) -from yunohost.utils.error import YunohostError, YunohostValidationError +from yunohost.utils.error import yunohosterror, yunohostvalidationerror from yunohost.log import is_unit_operation, OperationLogger MIGRATIONS_STATE_PATH = "/etc/yunohost/migrations.yaml" @@ -77,10 +77,7 @@ def tools_adminpw(new_password, check_strength=True): if check_strength: assert_password_is_strong_enough("admin", new_password) - # UNIX seems to not like password longer than 127 chars ... - # e.g. SSH login gets broken (or even 'su admin' when entering the password) - if len(new_password) >= 127: - raise YunohostValidationError("admin_password_too_long") + assert_password_is_compatible(new_password) new_hash = _hash_user_password(new_password) @@ -226,6 +223,8 @@ def tools_postinstall( raise YunohostValidationError("postinstall_low_rootfsspace") # Check password + assert_password_is_compatible(password) + if not force_password: assert_password_is_strong_enough("admin", password) diff --git a/src/user.py b/src/user.py index 7d023fd83..4549a1c0f 100644 --- a/src/user.py +++ b/src/user.py @@ -146,7 +146,8 @@ def user_create( from yunohost.utils.password import assert_password_is_strong_enough from yunohost.utils.ldap import _get_ldap_interface - # Ensure sufficiently complex password + # Ensure compatibility and sufficiently complex password + assert_password_is_compatible(password) assert_password_is_strong_enough("user", password) # Validate domain used for email address/xmpp account @@ -414,7 +415,8 @@ def user_update( change_password = Moulinette.prompt( m18n.n("ask_password"), is_password=True, confirm=True ) - # Ensure sufficiently complex password + # Ensure compatibility and sufficiently complex password + assert_password_is_compatible(password) assert_password_is_strong_enough("user", change_password) new_attr_dict["userPassword"] = [_hash_user_password(change_password)] diff --git a/src/utils/password.py b/src/utils/password.py index 5b8372962..a38bc4e23 100644 --- a/src/utils/password.py +++ b/src/utils/password.py @@ -47,7 +47,25 @@ STRENGTH_LEVELS = [ ] +def assert_password_is_compatible(password): + """ + UNIX seems to not like password longer than 127 chars ... + e.g. SSH login gets broken (or even 'su admin' when entering the password) + """ + + if len(password) >= 127: + + # Note that those imports are made here and can't be put + # on top (at least not the moulinette ones) + # because the moulinette needs to be correctly initialized + # as well as modules available in python's path. + from yunohost.utils.error import YunohostValidationError + + raise YunohostValidationError("admin_password_too_long") + + def assert_password_is_strong_enough(profile, password): + PasswordValidator(profile).validate(password) From 31bbc026fde7c4f31f84afbd68b66391da7079d9 Mon Sep 17 00:00:00 2001 From: "theo@manjaro" Date: Wed, 20 Jul 2022 11:24:42 +0200 Subject: [PATCH 469/619] Don't restrict choices if there's no choices specified --- src/utils/config.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/utils/config.py b/src/utils/config.py index 56f632b09..e4e353360 100644 --- a/src/utils/config.py +++ b/src/utils/config.py @@ -703,7 +703,8 @@ class Question: self.default = question.get("default", None) self.optional = question.get("optional", False) self.visible = question.get("visible", None) - self.choices = question.get("choices", []) + # Don't restrict choices if there's none specified + self.choices = question.get("choices", None) self.pattern = question.get("pattern", self.pattern) self.ask = question.get("ask", {"en": self.name}) self.help = question.get("help") From 2d223c9158e377b58002ffc2797a6c85de7f9d00 Mon Sep 17 00:00:00 2001 From: "theo@manjaro" Date: Fri, 22 Jul 2022 10:03:29 +0200 Subject: [PATCH 470/619] Saving app's venv in a requirements file, in order to regenerate it post-update --- .../0021_migrate_to_bullseye.py | 60 ++++++++++++++++++- 1 file changed, 59 insertions(+), 1 deletion(-) diff --git a/src/yunohost/data_migrations/0021_migrate_to_bullseye.py b/src/yunohost/data_migrations/0021_migrate_to_bullseye.py index 6b08f5792..0fb698c32 100644 --- a/src/yunohost/data_migrations/0021_migrate_to_bullseye.py +++ b/src/yunohost/data_migrations/0021_migrate_to_bullseye.py @@ -5,7 +5,7 @@ from moulinette import m18n from yunohost.utils.error import YunohostError from moulinette.utils.log import getActionLogger from moulinette.utils.process import check_output, call_async_output -from moulinette.utils.filesystem import read_file, rm, write_to_file +from moulinette.utils.filesystem import read_file, rm, write_to_file, cp from yunohost.tools import ( Migration, @@ -30,6 +30,52 @@ N_CURRENT_YUNOHOST = 4 N_NEXT_DEBAN = 11 N_NEXT_YUNOHOST = 11 +VENV_BACKUP_PREFIX= "BACKUP_VENV_" +VENV_REQUIREMENTS_SUFFIX= "_req.txt" + +def _get_all_venvs(): + result = [] + exclude = glob.glob(f"/opt/{VENV_BACKUP_PREFIX}*") + for x in glob.glob('/opt/*'): + if x not in exclude and os.path.isdir(x) and os.path.isfile(f"{x}/bin/activate"): + content = read_file(f"{x}/bin/activate") + if "VIRTUAL_ENV" and "PYTHONHOME" in content: + result.append(x) + return result + +def _generate_requirements(): + + venvs = _get_all_venvs() + for venv in venvs: + # Generate a requirements file from venv + os.system(f"bash -c 'source {venv}/bin/activate && pip freeze > {venv}{VENV_REQUIREMENTS_SUFFIX} && deactivate'") + + +def _rebuild_venvs(): + + venvs = _get_all_venvs() + for venv in venvs: + venvdirname = venv.split("/")[-1] + # Create a backup of the venv, in case there's a problem + if os.path.isdir(f"/opt/{VENV_BACKUP_PREFIX}{venvdirname}"): + rm(f"/opt/{VENV_BACKUP_PREFIX}{venvdirname}", recursive=True) + backup = True + try: + cp(venv, f"/opt/{VENV_BACKUP_PREFIX}{venvdirname}", recursive=True) + except: + backup = False + if backup and os.path.isfile(venv+VENV_REQUIREMENTS_SUFFIX): + # Recreate the venv + rm(venv, recursive=True) + os.system(f"python -m venv {venv}") + status = os.system(f"bash -c 'source {venv}/bin/activate && pip install -r {venv}{VENV_REQUIREMENTS_SUFFIX} && deactivate'") + if status!=0: + logger.warning(m18n.n("venv_regen_failed", venv=venv)) + else: + rm(venv+VENV_REQUIREMENTS_SUFFIX, recursive=True) + else: + logger.warning(m18n.n("venv_regen_failed", venv=venv)) + class MyMigration(Migration): @@ -70,6 +116,12 @@ class MyMigration(Migration): 'wget --timeout 900 --quiet "https://packages.sury.org/php/apt.gpg" --output-document=- | gpg --dearmor >"/etc/apt/trusted.gpg.d/extra_php_version.gpg"' ) + # + # Get requirements of the different venvs from python apps + # + + _generate_requirements() + # # Run apt update # @@ -264,6 +316,12 @@ class MyMigration(Migration): tools_upgrade(target="system", postupgradecmds=postupgradecmds) + # + # Recreate the venvs + # + + _rebuild_venvs() + def debian_major_version(self): # The python module "platform" and lsb_release are not reliable because # on some setup, they may still return Release=9 even after upgrading to From 1ce13d631dd7463de65cf8348aca43930afd3645 Mon Sep 17 00:00:00 2001 From: "theo@manjaro" Date: Fri, 22 Jul 2022 14:15:21 +0200 Subject: [PATCH 471/619] Detect venvs from /var/www/ and recursively --- .../0021_migrate_to_bullseye.py | 37 +++++++++++-------- 1 file changed, 22 insertions(+), 15 deletions(-) diff --git a/src/yunohost/data_migrations/0021_migrate_to_bullseye.py b/src/yunohost/data_migrations/0021_migrate_to_bullseye.py index 0fb698c32..56044d48f 100644 --- a/src/yunohost/data_migrations/0021_migrate_to_bullseye.py +++ b/src/yunohost/data_migrations/0021_migrate_to_bullseye.py @@ -30,22 +30,30 @@ N_CURRENT_YUNOHOST = 4 N_NEXT_DEBAN = 11 N_NEXT_YUNOHOST = 11 -VENV_BACKUP_PREFIX= "BACKUP_VENV_" -VENV_REQUIREMENTS_SUFFIX= "_req.txt" +VENV_BACKUP_SUFFIX = "_BACKUP_VENV" +VENV_REQUIREMENTS_SUFFIX = "_req.txt" +VENV_IGNORE = "VENVNOREGEN" -def _get_all_venvs(): +def _get_all_venvs(dir,level=0,maxlevel=2): result = [] - exclude = glob.glob(f"/opt/{VENV_BACKUP_PREFIX}*") - for x in glob.glob('/opt/*'): - if x not in exclude and os.path.isdir(x) and os.path.isfile(f"{x}/bin/activate"): - content = read_file(f"{x}/bin/activate") - if "VIRTUAL_ENV" and "PYTHONHOME" in content: - result.append(x) + for file in os.listdir(dir): + path = os.path.join(dir,file) + if os.path.isdir(path): + if os.path.isfile(os.path.join(path,VENV_IGNORE)): + continue + activatepath = os.path.join(path,"bin","activate") + if os.path.isfile(activatepath): + content = read_file(activatepath) + if "VIRTUAL_ENV" and "PYTHONHOME" in content: + result.append(path) + continue + if level {venv}{VENV_REQUIREMENTS_SUFFIX} && deactivate'") @@ -53,15 +61,14 @@ def _generate_requirements(): def _rebuild_venvs(): - venvs = _get_all_venvs() + venvs = _get_all_venvs("/opt/")+_get_all_venvs("/var/www/") for venv in venvs: - venvdirname = venv.split("/")[-1] # Create a backup of the venv, in case there's a problem - if os.path.isdir(f"/opt/{VENV_BACKUP_PREFIX}{venvdirname}"): - rm(f"/opt/{VENV_BACKUP_PREFIX}{venvdirname}", recursive=True) + if os.path.isdir(venv+VENV_BACKUP_SUFFIX): + rm(venv+VENV_BACKUP_SUFFIX, recursive=True) backup = True try: - cp(venv, f"/opt/{VENV_BACKUP_PREFIX}{venvdirname}", recursive=True) + cp(venv, venv+VENV_BACKUP_SUFFIX, recursive=True) except: backup = False if backup and os.path.isfile(venv+VENV_REQUIREMENTS_SUFFIX): From 2e9c4f991e6b620abca349e1d8ef8a7a85a3aa3c Mon Sep 17 00:00:00 2001 From: theo-is-taken <108329355+theo-is-taken@users.noreply.github.com> Date: Fri, 22 Jul 2022 15:23:06 +0200 Subject: [PATCH 472/619] Update src/yunohost/data_migrations/0021_migrate_to_bullseye.py Co-authored-by: ljf (zamentur) --- src/yunohost/data_migrations/0021_migrate_to_bullseye.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/yunohost/data_migrations/0021_migrate_to_bullseye.py b/src/yunohost/data_migrations/0021_migrate_to_bullseye.py index 56044d48f..34e503fac 100644 --- a/src/yunohost/data_migrations/0021_migrate_to_bullseye.py +++ b/src/yunohost/data_migrations/0021_migrate_to_bullseye.py @@ -32,7 +32,7 @@ N_NEXT_YUNOHOST = 11 VENV_BACKUP_SUFFIX = "_BACKUP_VENV" VENV_REQUIREMENTS_SUFFIX = "_req.txt" -VENV_IGNORE = "VENVNOREGEN" +VENV_IGNORE = "ynh_migration_no_regen" def _get_all_venvs(dir,level=0,maxlevel=2): result = [] From a440afe8ebc8d9fe3ce02f3f6da40dfcae505027 Mon Sep 17 00:00:00 2001 From: "theo@manjaro" Date: Fri, 22 Jul 2022 15:26:10 +0200 Subject: [PATCH 473/619] Clarification regarding the use of os functions instead of glob --- src/yunohost/data_migrations/0021_migrate_to_bullseye.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/yunohost/data_migrations/0021_migrate_to_bullseye.py b/src/yunohost/data_migrations/0021_migrate_to_bullseye.py index 56044d48f..59b6ba517 100644 --- a/src/yunohost/data_migrations/0021_migrate_to_bullseye.py +++ b/src/yunohost/data_migrations/0021_migrate_to_bullseye.py @@ -35,6 +35,7 @@ VENV_REQUIREMENTS_SUFFIX = "_req.txt" VENV_IGNORE = "VENVNOREGEN" def _get_all_venvs(dir,level=0,maxlevel=2): + # Using os functions instead of glob, because glob doesn't support hidden folders, and we need recursion with a fixed depth result = [] for file in os.listdir(dir): path = os.path.join(dir,file) From fc0266a62e8c1e9658b3829f15b3f5dbca03e06e Mon Sep 17 00:00:00 2001 From: "theo@manjaro" Date: Fri, 22 Jul 2022 15:53:50 +0200 Subject: [PATCH 474/619] Removed "useless" venv backup --- .../data_migrations/0021_migrate_to_bullseye.py | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/src/yunohost/data_migrations/0021_migrate_to_bullseye.py b/src/yunohost/data_migrations/0021_migrate_to_bullseye.py index a2511faf9..cff11b598 100644 --- a/src/yunohost/data_migrations/0021_migrate_to_bullseye.py +++ b/src/yunohost/data_migrations/0021_migrate_to_bullseye.py @@ -30,7 +30,6 @@ N_CURRENT_YUNOHOST = 4 N_NEXT_DEBAN = 11 N_NEXT_YUNOHOST = 11 -VENV_BACKUP_SUFFIX = "_BACKUP_VENV" VENV_REQUIREMENTS_SUFFIX = "_req.txt" VENV_IGNORE = "ynh_migration_no_regen" @@ -64,15 +63,7 @@ def _rebuild_venvs(): venvs = _get_all_venvs("/opt/")+_get_all_venvs("/var/www/") for venv in venvs: - # Create a backup of the venv, in case there's a problem - if os.path.isdir(venv+VENV_BACKUP_SUFFIX): - rm(venv+VENV_BACKUP_SUFFIX, recursive=True) - backup = True - try: - cp(venv, venv+VENV_BACKUP_SUFFIX, recursive=True) - except: - backup = False - if backup and os.path.isfile(venv+VENV_REQUIREMENTS_SUFFIX): + if os.path.isfile(venv+VENV_REQUIREMENTS_SUFFIX): # Recreate the venv rm(venv, recursive=True) os.system(f"python -m venv {venv}") From b7b4dbfcdff2264011e1b247991bf15a2587a362 Mon Sep 17 00:00:00 2001 From: "theo@manjaro" Date: Fri, 22 Jul 2022 15:56:54 +0200 Subject: [PATCH 475/619] Increased depth of scan --- src/yunohost/data_migrations/0021_migrate_to_bullseye.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/yunohost/data_migrations/0021_migrate_to_bullseye.py b/src/yunohost/data_migrations/0021_migrate_to_bullseye.py index cff11b598..58498ab56 100644 --- a/src/yunohost/data_migrations/0021_migrate_to_bullseye.py +++ b/src/yunohost/data_migrations/0021_migrate_to_bullseye.py @@ -33,7 +33,7 @@ N_NEXT_YUNOHOST = 11 VENV_REQUIREMENTS_SUFFIX = "_req.txt" VENV_IGNORE = "ynh_migration_no_regen" -def _get_all_venvs(dir,level=0,maxlevel=2): +def _get_all_venvs(dir,level=0,maxlevel=3): # Using os functions instead of glob, because glob doesn't support hidden folders, and we need recursion with a fixed depth result = [] for file in os.listdir(dir): From cdd579080833bc77e78246f78dbb16762c91fe14 Mon Sep 17 00:00:00 2001 From: "theo@manjaro" Date: Fri, 22 Jul 2022 16:00:23 +0200 Subject: [PATCH 476/619] Fixed content condition --- src/yunohost/data_migrations/0021_migrate_to_bullseye.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/yunohost/data_migrations/0021_migrate_to_bullseye.py b/src/yunohost/data_migrations/0021_migrate_to_bullseye.py index 58498ab56..1c88a0e4e 100644 --- a/src/yunohost/data_migrations/0021_migrate_to_bullseye.py +++ b/src/yunohost/data_migrations/0021_migrate_to_bullseye.py @@ -44,7 +44,7 @@ def _get_all_venvs(dir,level=0,maxlevel=3): activatepath = os.path.join(path,"bin","activate") if os.path.isfile(activatepath): content = read_file(activatepath) - if "VIRTUAL_ENV" and "PYTHONHOME" in content: + if ("VIRTUAL_ENV" in content) and ("PYTHONHOME" in content): result.append(path) continue if level Date: Fri, 22 Jul 2022 16:01:18 +0200 Subject: [PATCH 477/619] Update src/yunohost/data_migrations/0021_migrate_to_bullseye.py Co-authored-by: ljf (zamentur) --- src/yunohost/data_migrations/0021_migrate_to_bullseye.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/yunohost/data_migrations/0021_migrate_to_bullseye.py b/src/yunohost/data_migrations/0021_migrate_to_bullseye.py index 1c88a0e4e..7aa20d17d 100644 --- a/src/yunohost/data_migrations/0021_migrate_to_bullseye.py +++ b/src/yunohost/data_migrations/0021_migrate_to_bullseye.py @@ -71,7 +71,7 @@ def _rebuild_venvs(): if status!=0: logger.warning(m18n.n("venv_regen_failed", venv=venv)) else: - rm(venv+VENV_REQUIREMENTS_SUFFIX, recursive=True) + rm(venv+VENV_REQUIREMENTS_SUFFIX) else: logger.warning(m18n.n("venv_regen_failed", venv=venv)) From 22fc36e16e7af91607f5fea30a12b9ac0a59cfa0 Mon Sep 17 00:00:00 2001 From: "theo@manjaro" Date: Fri, 22 Jul 2022 16:15:31 +0200 Subject: [PATCH 478/619] Doc-strings and formatting --- .../0021_migrate_to_bullseye.py | 40 +++++++++++++------ 1 file changed, 28 insertions(+), 12 deletions(-) diff --git a/src/yunohost/data_migrations/0021_migrate_to_bullseye.py b/src/yunohost/data_migrations/0021_migrate_to_bullseye.py index 7aa20d17d..f83d79239 100644 --- a/src/yunohost/data_migrations/0021_migrate_to_bullseye.py +++ b/src/yunohost/data_migrations/0021_migrate_to_bullseye.py @@ -33,45 +33,61 @@ N_NEXT_YUNOHOST = 11 VENV_REQUIREMENTS_SUFFIX = "_req.txt" VENV_IGNORE = "ynh_migration_no_regen" -def _get_all_venvs(dir,level=0,maxlevel=3): + +def _get_all_venvs(dir, level=0, maxlevel=3): + """ + Returns the list of all python virtual env directories recursively + + Arguments: + dir - the directory to scan in + maxlevel - the depth of the recursion + level - do not edit this, used as an iterator + """ # Using os functions instead of glob, because glob doesn't support hidden folders, and we need recursion with a fixed depth result = [] for file in os.listdir(dir): - path = os.path.join(dir,file) + path = os.path.join(dir, file) if os.path.isdir(path): - if os.path.isfile(os.path.join(path,VENV_IGNORE)): + if os.path.isfile(os.path.join(path, VENV_IGNORE)): continue - activatepath = os.path.join(path,"bin","activate") + activatepath = os.path.join(path,"bin", "activate") if os.path.isfile(activatepath): content = read_file(activatepath) if ("VIRTUAL_ENV" in content) and ("PYTHONHOME" in content): result.append(path) continue - if level {venv}{VENV_REQUIREMENTS_SUFFIX} && deactivate'") def _rebuild_venvs(): + """ + After the update, recreate a python virtual env based on the previously generated requirements file + """ - venvs = _get_all_venvs("/opt/")+_get_all_venvs("/var/www/") + venvs = _get_all_venvs("/opt/") + _get_all_venvs("/var/www/") for venv in venvs: - if os.path.isfile(venv+VENV_REQUIREMENTS_SUFFIX): + if os.path.isfile(venv + VENV_REQUIREMENTS_SUFFIX): # Recreate the venv rm(venv, recursive=True) os.system(f"python -m venv {venv}") status = os.system(f"bash -c 'source {venv}/bin/activate && pip install -r {venv}{VENV_REQUIREMENTS_SUFFIX} && deactivate'") - if status!=0: + if status != 0: logger.warning(m18n.n("venv_regen_failed", venv=venv)) else: - rm(venv+VENV_REQUIREMENTS_SUFFIX) + rm(venv + VENV_REQUIREMENTS_SUFFIX) else: logger.warning(m18n.n("venv_regen_failed", venv=venv)) From d531f8e0853c78d82a31db599f11870fa1f874f0 Mon Sep 17 00:00:00 2001 From: "theo@manjaro" Date: Fri, 22 Jul 2022 16:22:04 +0200 Subject: [PATCH 479/619] Proper locales --- locales/en.json | 1 + src/yunohost/data_migrations/0021_migrate_to_bullseye.py | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/locales/en.json b/locales/en.json index ce36edaa4..cfb8a01f9 100644 --- a/locales/en.json +++ b/locales/en.json @@ -507,6 +507,7 @@ "migration_0018_failed_to_reset_legacy_rules": "Failed to reset legacy iptables rules: {error}", "migration_0019_add_new_attributes_in_ldap": "Add new attributes for permissions in LDAP database", "migration_0019_slapd_config_will_be_overwritten": "It looks like you manually edited the slapd configuration. For this critical migration, YunoHost needs to force the update of the slapd configuration. The original files will be backuped in {conf_backup_folder}.", + "migration_0021_venv_regen_failed": "The virtual environment '{venv}' failed to regenerate, you probably need to run the command `yunohost app upgrade --force`", "migration_0021_start" : "Starting migration to Bullseye", "migration_0021_patching_sources_list": "Patching the sources.lists...", "migration_0021_main_upgrade": "Starting main upgrade...", diff --git a/src/yunohost/data_migrations/0021_migrate_to_bullseye.py b/src/yunohost/data_migrations/0021_migrate_to_bullseye.py index f83d79239..4cdec3f24 100644 --- a/src/yunohost/data_migrations/0021_migrate_to_bullseye.py +++ b/src/yunohost/data_migrations/0021_migrate_to_bullseye.py @@ -85,11 +85,11 @@ def _rebuild_venvs(): os.system(f"python -m venv {venv}") status = os.system(f"bash -c 'source {venv}/bin/activate && pip install -r {venv}{VENV_REQUIREMENTS_SUFFIX} && deactivate'") if status != 0: - logger.warning(m18n.n("venv_regen_failed", venv=venv)) + logger.warning(m18n.n("migration_0021_venv_regen_failed", venv=venv)) else: rm(venv + VENV_REQUIREMENTS_SUFFIX) else: - logger.warning(m18n.n("venv_regen_failed", venv=venv)) + logger.warning(m18n.n("migration_0021_venv_regen_failed", venv=venv)) class MyMigration(Migration): From d63caa7776e1e87d558bc8c26f97470d00f289eb Mon Sep 17 00:00:00 2001 From: yalh76 Date: Fri, 22 Jul 2022 19:30:44 +0200 Subject: [PATCH 480/619] Fixing app without arguments --- helpers/apps | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/helpers/apps b/helpers/apps index 0faad863c..85b74de15 100644 --- a/helpers/apps +++ b/helpers/apps @@ -31,8 +31,11 @@ ynh_install_apps() { if ! yunohost app list --output-as json --quiet | jq -e --arg id $one_app '.apps[] | select(.id == $id)' >/dev/null then # Retrieve the arguments of the app (part after ?) - local one_argument=$(cut -d "?" -f2- <<< "$one_app_and_its_args") - [ ! -z "$one_argument" ] && one_argument="--args $one_argument" + local one_argument="" + if [[ "$one_app_and_its_args" == *"?"* ]]; then + one_argument=$(cut -d "?" -f2- <<< "$one_app_and_its_args") + one_argument="--args $one_argument" + fi # Install the app with its arguments yunohost app install $one_app $one_argument From 30e926f92c9fcfa113f96bcfb08e31850df10459 Mon Sep 17 00:00:00 2001 From: Kay0u Date: Mon, 25 Jul 2022 12:03:05 +0200 Subject: [PATCH 481/619] do not change the nginx template conf, replace #sub_path_only and #root_path_only after ynh_add_config, otherwise it breaks the change_url script --- helpers/nginx | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/helpers/nginx b/helpers/nginx index e69e06bf1..6daf6cc1e 100644 --- a/helpers/nginx +++ b/helpers/nginx @@ -20,13 +20,15 @@ ynh_add_nginx_config() { local finalnginxconf="/etc/nginx/conf.d/$domain.d/$app.conf" + ynh_add_config --template="$YNH_APP_BASEDIR/conf/nginx.conf" --destination="$finalnginxconf" + if [ "${path_url:-}" != "/" ]; then - ynh_replace_string --match_string="^#sub_path_only" --replace_string="" --target_file="$YNH_APP_BASEDIR/conf/nginx.conf" + ynh_replace_string --match_string="^#sub_path_only" --replace_string="" --target_file="$finalnginxconf" else - ynh_replace_string --match_string="^#root_path_only" --replace_string="" --target_file="$YNH_APP_BASEDIR/conf/nginx.conf" + ynh_replace_string --match_string="^#root_path_only" --replace_string="" --target_file="$finalnginxconf" fi - ynh_add_config --template="$YNH_APP_BASEDIR/conf/nginx.conf" --destination="$finalnginxconf" + ynh_store_file_checksum --file="$finalnginxconf" ynh_systemd_action --service_name=nginx --action=reload } From ddcc114d0c7fd092a4eaa4ec1a7ea120213f6ebd Mon Sep 17 00:00:00 2001 From: Jose Riha Date: Sat, 2 Jul 2022 09:54:47 +0000 Subject: [PATCH 482/619] Translated using Weblate (Slovak) Currently translated at 27.1% (186 of 686 strings) Translation: YunoHost/core Translate-URL: https://translate.yunohost.org/projects/yunohost/core/sk/ --- locales/sk.json | 34 +++++++++++++++++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/locales/sk.json b/locales/sk.json index 04daf20a9..766edffcd 100644 --- a/locales/sk.json +++ b/locales/sk.json @@ -152,5 +152,37 @@ "config_validate_url": "Toto by mala byť platná URL adresa webu", "config_version_not_supported": "Verzie konfiguračného panela '{version}' nie sú podporované.", "danger": "Nebezpečenstvo:", - "confirm_app_install_danger": "NEBEZPEČENSTVO! Táto aplikácia je experimentálna (ak vôbec funguje)! Pravdepodobne by ste ju NEMALI inštalovať, pokiaľ si nie ste istý, čo robíte. NEPOSKYTNEME VÁM ŽIADNU POMOC, ak aplikácia nebude fungovať alebo rozbije Váš systém… Ak sa rozhodnete i napriek tomu podstúpiť toto riziko, zadajte '{answers}'" + "confirm_app_install_danger": "NEBEZPEČENSTVO! Táto aplikácia je experimentálna (ak vôbec funguje)! Pravdepodobne by ste ju NEMALI inštalovať, pokiaľ si nie ste istý, čo robíte. NEPOSKYTNEME VÁM ŽIADNU POMOC, ak táto aplikácia nebude fungovať alebo rozbije Váš systém… Ak sa rozhodnete i napriek tomu podstúpiť toto riziko, zadajte '{answers}'", + "confirm_app_install_thirdparty": "NEBEZPEČENSTVO! Táto aplikácia nie je súčasťou katalógu aplikácií YunoHost. Inštalovaním aplikácií tretích strán môžete ohroziť integritu a bezpečnosť Vášho systému. Pravdepodobne by ste NEMALI pokračovať v inštalácií, pokiaľ neviete, čo robíte. NEPOSKYTNEME VÁM ŽIADNU POMOC, ak táto aplikácia nebude fungovať alebo rozbije Váš systém… Ak sa rozhodnete i napriek tomu podstúpiť toto riziko, zadajte '{answers}'", + "custom_app_url_required": "Pre aktualizáciu Vašej vlastnej aplikácie {app} musíte zadať adresu URL", + "diagnosis_apps_allgood": "Všetky nainštalované aplikácie sa riadia základnými zásadami balíčkovania", + "diagnosis_apps_bad_quality": "Táto aplikácia je v katalógu aplikácií YunoHost momentálne označená ako rozbitá. Toto môže byť dočasný problém do momentu, kedy jej správcovia danú chybu neopravia. Kým sa tak stane sú aktualizácie tejto aplikácie vypnuté.", + "diagnosis_apps_broken": "Táto aplikácia je v katalógu aplikácií YunoHost momentálne označená ako rozbitá. Toto môže byť dočasný problém do momentu, kedy jej správcovia danú chybu neopravia. Kým sa tak stane sú aktualizácie tejto aplikácie vypnuté.", + "diagnosis_apps_deprecated_practices": "Táto verzia nainštalovanej aplikácie používa niektoré prehistorické a zastaralé zásady balíčkovania. Naozaj by ste mali zvážiť jej aktualizovanie.", + "diagnosis_apps_issue": "V aplikácií {app} sa našla chyba", + "diagnosis_apps_outdated_ynh_requirement": "Tejto verzii nainštalovanej aplikácie stačí yunohost vo verzii 2.x, čo naznačuje, že neobsahuje aktuálne odporúčané zásady balíčkovania a pomocné skripty. Naozaj by ste mali zvážiť jej aktualizáciu.", + "diagnosis_basesystem_hardware": "Hardvérová architektúra servera je {virt} {arch}", + "diagnosis_basesystem_hardware_model": "Model servera je {model}", + "diagnosis_basesystem_host": "Server beží na Debiane {debian_version}", + "diagnosis_basesystem_kernel": "Server beží na Linuxovom jadre {kernel_version}", + "diagnosis_basesystem_ynh_single_version": "verzia {package}: {version} ({repo})", + "diagnosis_cache_still_valid": "(Diagnostické údaje pre {category} sú stále platné. Nespúšťajte diagnostiku znovu!)", + "diagnosis_description_apps": "Aplikácie", + "diagnosis_description_basesystem": "Základný systém", + "diagnosis_description_dnsrecords": "DNS záznamy", + "diagnosis_description_ip": "Internetové pripojenie", + "diagnosis_description_mail": "E-mail", + "diagnosis_description_ports": "Otvorenie portov", + "diagnosis_description_regenconf": "Nastavenia systému", + "diagnosis_description_services": "Kontrola stavu služieb", + "diagnosis_description_systemresources": "Systémové prostriedky", + "diagnosis_description_web": "Web", + "diagnosis_diskusage_ok": "Na úložisku {mountpoint} (na zariadení {device}) ostáva {free} ({free_percent} %) voľného miesta (z celkovej veľkosti {total})!", + "diagnosis_display_tip": "Pre zobrazenie nájdených problémov prejdite do časti Diagnostiky vo webovej administrácií alebo spustite 'yunohost diagnosis show --issues --human-readable' z rozhrania príkazového riadka.", + "diagnosis_dns_bad_conf": "Niektoré DNS záznamy chýbajú alebo nie sú platné pre doménu {domain} (kategória {category})", + "confirm_app_install_warning": "Upozornenie: Táto aplikácia môže fungovať, ale nie je dobre integrovaná s YunoHost. Niektoré funkcie ako spoločné prihlásenie (SSO) alebo zálohovanie/obnova nemusia byť dostupné. Nainštalovať aj napriek tomu? [{answers}] ", + "diagnosis_cant_run_because_of_dep": "Nie je možné spustiť diagnostiku pre {category}, kým existujú významné chyby súvisiace s {dep}.", + "diagnosis_diskusage_low": "Na úložisku {mountpoint} (na zariadení {device}) ostáva iba {free} ({free_percent} %) voľného miesta (z celkovej veľkosti {total}). Dávajte pozor.", + "diagnosis_diskusage_verylow": "Na úložisku {mountpoint} (na zariadení {device}) ostáva iba {free} ({free_percent} %) voľného miesta (z celkovej veľkosti {total}). Dobre zvážte vyčistenie úložiska!", + "diagnosis_apps_not_in_app_catalog": "Táto aplikácia sa nenachádza v katalógu aplikácií YunoHost. Ak sa tam v minulosti nachádzala a bola odstránená, mali by ste zvážiť jej odinštalovanie, pretože nebude dostávať žiadne aktualizácie a môže ohroziť integritu a bezpečnosť Vášho systému." } From 1cf7c72721942ca69b4c6accb9189f60fe63b29d Mon Sep 17 00:00:00 2001 From: Jose Riha Date: Sun, 3 Jul 2022 08:52:14 +0000 Subject: [PATCH 483/619] Translated using Weblate (Slovak) Currently translated at 29.3% (201 of 686 strings) Translation: YunoHost/core Translate-URL: https://translate.yunohost.org/projects/yunohost/core/sk/ --- locales/sk.json | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/locales/sk.json b/locales/sk.json index 766edffcd..d7119b297 100644 --- a/locales/sk.json +++ b/locales/sk.json @@ -184,5 +184,20 @@ "diagnosis_cant_run_because_of_dep": "Nie je možné spustiť diagnostiku pre {category}, kým existujú významné chyby súvisiace s {dep}.", "diagnosis_diskusage_low": "Na úložisku {mountpoint} (na zariadení {device}) ostáva iba {free} ({free_percent} %) voľného miesta (z celkovej veľkosti {total}). Dávajte pozor.", "diagnosis_diskusage_verylow": "Na úložisku {mountpoint} (na zariadení {device}) ostáva iba {free} ({free_percent} %) voľného miesta (z celkovej veľkosti {total}). Dobre zvážte vyčistenie úložiska!", - "diagnosis_apps_not_in_app_catalog": "Táto aplikácia sa nenachádza v katalógu aplikácií YunoHost. Ak sa tam v minulosti nachádzala a bola odstránená, mali by ste zvážiť jej odinštalovanie, pretože nebude dostávať žiadne aktualizácie a môže ohroziť integritu a bezpečnosť Vášho systému." + "diagnosis_apps_not_in_app_catalog": "Táto aplikácia sa nenachádza v katalógu aplikácií YunoHost. Ak sa tam v minulosti nachádzala a bola odstránená, mali by ste zvážiť jej odinštalovanie, pretože nebude dostávať žiadne aktualizácie a môže ohroziť integritu a bezpečnosť Vášho systému.", + "diagnosis_backports_in_sources_list": "Vyzerá, že apt (správca balíkov) je nastavený na používanie backports repozitára. Inštalovaním balíkov z backports môžete spôsobiť nestabilitu systému a vznik konfliktov, preto - ak naozaj neviete, čo robíte - Vás chceme od ich používania odradiť.", + "diagnosis_basesystem_ynh_inconsistent_versions": "Používate nekonzistentné verzie balíkov YunoHost… s najväčšou pravdepodobnosťou kvôli nedokončenej/chybnej aktualizácii.", + "diagnosis_basesystem_ynh_main_version": "Na serveri beží YunoHost {main_version} ({repo})", + "diagnosis_dns_discrepancy": "Nasledujúci DNS záznam nezodpovedá odporúčanej konfigurácii:
Typ:{type}
Názov:{name}
Aktuálna hodnota: {current}
Očakávaná hodnota: {value}", + "diagnosis_dns_good_conf": "DNS záznamy sú správne nastavené pre doménu {domain} (kategória {category})", + "diagnosis_dns_missing_record": "Podľa odporúčaného nastavenia DNS by ste mali pridať DNS záznam s nasledujúcimi informáciami.
Typ: {type}
Názov: {name}
Hodnota: {value}", + "diagnosis_dns_point_to_doc": "Prosím, pozrite si dokumentáciu na https://yunohost.org/dns_config, ak potrebujete pomôcť s nastavením DNS záznamov.", + "diagnosis_dns_specialusedomain": "Doména {domain} je založená na top-level doméne (TLD) pre zvláštne použitie ako napríklad .local alebo .test a preto sa neočakáva, že bude obsahovať vlastné DNS záznamy.", + "diagnosis_domain_expiration_error": "Platnosť niektorých domén expiruje VEĽMI SKORO!", + "diagnosis_domain_expiration_not_found": "Pri niektorých doménach nebolo možné skontrolovať dátum ich vypršania", + "diagnosis_domain_expiration_not_found_details": "WHOIS informácie pre doménu {domain} neobsahujú informáciu o dátume jej vypršania?", + "diagnosis_domain_expiration_success": "Vaše domény sú zaregistrované a tak skoro nevyprší ich platnosť.", + "diagnosis_domain_expiration_warning": "Niektoré z domén čoskoro vypršia!", + "diagnosis_domain_expires_in": "{domain} vyprší o {days} dní.", + "diagnosis_dns_try_dyndns_update_force": "Nastavenie DNS tejto domény by mala byť automaticky spravované YunoHost-om. Ak tomu tak nie je, môžete skúsiť vynútiť jej aktualizáciu pomocou príkazu yunohost dyndns update --force." } From 898091d2100dab435afafa53929f351a327177f7 Mon Sep 17 00:00:00 2001 From: Jose Riha Date: Tue, 5 Jul 2022 20:39:46 +0000 Subject: [PATCH 484/619] Translated using Weblate (Slovak) Currently translated at 31.0% (213 of 686 strings) Translation: YunoHost/core Translate-URL: https://translate.yunohost.org/projects/yunohost/core/sk/ --- locales/sk.json | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/locales/sk.json b/locales/sk.json index d7119b297..ac9d565bc 100644 --- a/locales/sk.json +++ b/locales/sk.json @@ -185,7 +185,7 @@ "diagnosis_diskusage_low": "Na úložisku {mountpoint} (na zariadení {device}) ostáva iba {free} ({free_percent} %) voľného miesta (z celkovej veľkosti {total}). Dávajte pozor.", "diagnosis_diskusage_verylow": "Na úložisku {mountpoint} (na zariadení {device}) ostáva iba {free} ({free_percent} %) voľného miesta (z celkovej veľkosti {total}). Dobre zvážte vyčistenie úložiska!", "diagnosis_apps_not_in_app_catalog": "Táto aplikácia sa nenachádza v katalógu aplikácií YunoHost. Ak sa tam v minulosti nachádzala a bola odstránená, mali by ste zvážiť jej odinštalovanie, pretože nebude dostávať žiadne aktualizácie a môže ohroziť integritu a bezpečnosť Vášho systému.", - "diagnosis_backports_in_sources_list": "Vyzerá, že apt (správca balíkov) je nastavený na používanie backports repozitára. Inštalovaním balíkov z backports môžete spôsobiť nestabilitu systému a vznik konfliktov, preto - ak naozaj neviete, čo robíte - Vás chceme od ich používania odradiť.", + "diagnosis_backports_in_sources_list": "Vyzerá, že apt (správca balíkov) je nastavený na používanie repozitára backports. Inštalovaním balíkov z backports môžete spôsobiť nestabilitu systému a vznik konfliktov, preto - ak naozaj neviete, čo robíte - Vás chceme pred ich používaním dôrazne vystríhať.", "diagnosis_basesystem_ynh_inconsistent_versions": "Používate nekonzistentné verzie balíkov YunoHost… s najväčšou pravdepodobnosťou kvôli nedokončenej/chybnej aktualizácii.", "diagnosis_basesystem_ynh_main_version": "Na serveri beží YunoHost {main_version} ({repo})", "diagnosis_dns_discrepancy": "Nasledujúci DNS záznam nezodpovedá odporúčanej konfigurácii:
Typ:{type}
Názov:{name}
Aktuálna hodnota: {current}
Očakávaná hodnota: {value}", @@ -199,5 +199,17 @@ "diagnosis_domain_expiration_success": "Vaše domény sú zaregistrované a tak skoro nevyprší ich platnosť.", "diagnosis_domain_expiration_warning": "Niektoré z domén čoskoro vypršia!", "diagnosis_domain_expires_in": "{domain} vyprší o {days} dní.", - "diagnosis_dns_try_dyndns_update_force": "Nastavenie DNS tejto domény by mala byť automaticky spravované YunoHost-om. Ak tomu tak nie je, môžete skúsiť vynútiť jej aktualizáciu pomocou príkazu yunohost dyndns update --force." + "diagnosis_dns_try_dyndns_update_force": "Nastavenie DNS tejto domény by mala byť automaticky spravované YunoHost-om. Ak tomu tak nie je, môžete skúsiť vynútiť jej aktualizáciu pomocou príkazu yunohost dyndns update --force.", + "diagnosis_domain_not_found_details": "Doména {domain} neexistuje v databáze WHOIS alebo vypršala jej platnosť!", + "diagnosis_everything_ok": "V kategórii {category} vyzerá byť všetko v poriadku!", + "diagnosis_failed": "Nepodarilo sa získať výsledok diagnostiky pre kategóriu '{category}': {error}", + "diagnosis_failed_for_category": "Diagnostika pre kategóriu '{category}' skončila s chybou: {error}", + "diagnosis_found_errors": "Bolo nájdených {error} závažných chýb týkajúcich sa {category}!", + "diagnosis_found_errors_and_warnings": "Bolo nájdených {error} závažných chýb (a {warnings} varovaní) týkajúcich sa {category}!", + "diagnosis_found_warnings": "V kategórii {category} bolo nájdených {warnings} položiek, ktoré je možné opraviť.", + "diagnosis_http_connection_error": "Chyba pripojenia: nepodarilo sa pripojiť k požadovanej doméne, podľa všetkého je nedostupná.", + "diagnosis_http_could_not_diagnose": "Nepodarilo sa zistiť, či sú domény dostupné zvonka pomocou IPv{ipversion}.", + "diagnosis_http_could_not_diagnose_details": "Chyba: {error}", + "diagnosis_http_hairpinning_issue": "Zdá sa, že Vaša miestna sieť nemá zapnutý NAT hairpinning.", + "diagnosis_high_number_auth_failures": "V poslednom čase bol zistený neobvykle vysoký počet neúspešných prihlásení. Uistite sa, či je služba fail2ban spustená a správne nastavená alebo použite vlastný port pre SSH ako je popísané na https://yunohost.org/security." } From f6cb2075f08169e309f8d6f8fe378de4f4ee0099 Mon Sep 17 00:00:00 2001 From: Gregor Date: Thu, 21 Jul 2022 23:13:58 +0000 Subject: [PATCH 485/619] Translated using Weblate (German) Currently translated at 100.0% (686 of 686 strings) Translation: YunoHost/core Translate-URL: https://translate.yunohost.org/projects/yunohost/core/de/ --- locales/de.json | 74 ++++++++++++++++++++++++------------------------- 1 file changed, 37 insertions(+), 37 deletions(-) diff --git a/locales/de.json b/locales/de.json index 686eb9251..23d1f1c28 100644 --- a/locales/de.json +++ b/locales/de.json @@ -71,12 +71,12 @@ "mail_forward_remove_failed": "Die Weiterleitungs-E-Mail '{mail}' konnte nicht gelöscht werden", "main_domain_change_failed": "Die Hauptdomain konnte nicht geändert werden", "main_domain_changed": "Die Hauptdomain wurde geändert", - "pattern_backup_archive_name": "Muss ein gültiger Dateiname mit maximal 30 alphanumerischen sowie -_. Zeichen sein", + "pattern_backup_archive_name": "Es muss ein gültiger Dateiname mit maximal 30 Zeichen sein, nur alphanumerische Zeichen und -_.", "pattern_domain": "Muss ein gültiger Domainname sein (z.B. meine-domain.org)", - "pattern_email": "Muss eine gültige E-Mail-Adresse ohne '+' Symbol sein (z.B. someone@example.com)", + "pattern_email": "Es muss sich um eine gültige E-Mail-Adresse handeln, ohne '+'-Symbol (z. B. name@domäne.de)", "pattern_firstname": "Muss ein gültiger Vorname sein", "pattern_lastname": "Muss ein gültiger Nachname sein", - "pattern_mailbox_quota": "Muss eine Größe mit b/k/M/G/T Suffix, oder 0 zum deaktivieren sein", + "pattern_mailbox_quota": "Es muss eine Größe mit dem Suffix b/k/M/G/T sein oder 0 um kein Kontingent zu haben", "pattern_password": "Muss mindestens drei Zeichen lang sein", "pattern_port_or_range": "Muss ein valider Port (z.B. 0-65535) oder ein Bereich (z.B. 100:200) sein", "pattern_username": "Darf nur aus klein geschriebenen alphanumerischen Zeichen und Unterstrichen bestehen", @@ -86,7 +86,7 @@ "restore_cleaning_failed": "Das temporäre Dateiverzeichnis für Systemrestaurierung konnte nicht gelöscht werden", "restore_complete": "Vollständig wiederhergestellt", "restore_confirm_yunohost_installed": "Möchtest du die Wiederherstellung wirklich starten? [{answers}]", - "restore_failed": "Das System konnte nicht wiederhergestellt werden", + "restore_failed": "System konnte nicht wiederhergestellt werden", "restore_hook_unavailable": "Das Wiederherstellungsskript für '{part}' steht weder in deinem System noch im Archiv zur Verfügung", "restore_nothings_done": "Nichts wurde wiederhergestellt", "restore_running_app_script": "App '{app}' wird wiederhergestellt...", @@ -97,21 +97,21 @@ "service_already_stopped": "Der Dienst '{service}' wurde bereits gestoppt", "service_cmd_exec_failed": "Der Befehl '{command}' konnte nicht ausgeführt werden", "service_disable_failed": "Der Start des Dienstes '{service}' beim Hochfahren konnte nicht verhindert werden.\n\nKürzlich erstellte Logs des Dienstes: {logs}", - "service_disabled": "Der Dienst '{service}' wird beim Hochfahren des Systems nicht mehr gestartet werden.", + "service_disabled": "Der Dienst '{service}' wird beim Systemstart nicht mehr gestartet.", "service_enable_failed": "Der Dienst '{service}' konnte beim Hochfahren nicht gestartet werden.\n\nKürzlich erstellte Logs des Dienstes: {logs}", "service_enabled": "Der Dienst '{service}' wird nun beim Hochfahren des Systems automatisch gestartet.", "service_remove_failed": "Konnte den Dienst '{service}' nicht entfernen", "service_removed": "Der Dienst '{service}' wurde erfolgreich entfernt", "service_start_failed": "Der Dienst '{service}' konnte nicht gestartet werden\n\nKürzlich erstellte Logs des Dienstes: {logs}", "service_started": "Der Dienst '{service}' wurde erfolgreich gestartet", - "service_stop_failed": "Der Dienst '{service}' kann nicht gestoppt werden\n\nAktuelle Service-Logs: {logs}", + "service_stop_failed": "Der Dienst '{service}' kann nicht beendet werden\n\nLetzte Dienstprotokolle:{logs}", "service_stopped": "Der Dienst '{service}' wurde erfolgreich beendet", "service_unknown": "Unbekannter Dienst '{service}'", - "ssowat_conf_generated": "Konfiguration von SSOwat neu erstellt", + "ssowat_conf_generated": "SSOwat-Konfiguration neu generiert", "system_upgraded": "System aktualisiert", "system_username_exists": "Der Anmeldename existiert bereits in der Liste der System-Konten", "unbackup_app": "'{app}' wird nicht gespeichert werden", - "unexpected_error": "Etwas Unerwartetes ist passiert: {error}", + "unexpected_error": "Ein unerwarteter Fehler ist aufgetreten {error}", "unlimit": "Kein Kontingent", "unrestore_app": "{app} wird nicht wiederhergestellt werden", "updating_apt_cache": "Die Liste der verfügbaren Pakete wird aktualisiert…", @@ -132,9 +132,9 @@ "yunohost_already_installed": "YunoHost ist bereits installiert", "yunohost_configured": "YunoHost ist nun konfiguriert", "yunohost_installing": "YunoHost wird installiert...", - "yunohost_not_installed": "YunoHost ist nicht oder nur unvollständig installiert worden. Bitte 'yunohost tools postinstall' ausführen", + "yunohost_not_installed": "YunoHost ist nicht oder unvollständig installiert worden. Bitte 'yunohost tools postinstall' ausführen", "app_not_properly_removed": "{app} wurde nicht ordnungsgemäß entfernt", - "not_enough_disk_space": "Nicht genügend Speicherplatz auf '{path}' frei", + "not_enough_disk_space": "Nicht genügend freier Speicherplatz unter '{path}'", "backup_creation_failed": "Konnte Backup-Archiv nicht erstellen", "app_not_correctly_installed": "{app} scheint nicht korrekt installiert zu sein", "app_requirements_checking": "Überprüfe notwendige Pakete für {app}...", @@ -184,7 +184,7 @@ "dyndns_could_not_check_available": "Konnte nicht überprüfen, ob {domain} auf {provider} verfügbar ist.", "domain_dns_conf_is_just_a_recommendation": "Dieser Befehl zeigt dir die *empfohlene* Konfiguration. Er konfiguriert *nicht* das DNS für dich. Es liegt in deiner Verantwortung, die DNS-Zone bei deinem DNS-Registrar nach dieser Empfehlung zu konfigurieren.", "dpkg_lock_not_available": "Dieser Befehl kann momentan nicht ausgeführt werden, da anscheinend ein anderes Programm die Sperre von dpkg (dem Systempaket-Manager) verwendet", - "confirm_app_install_thirdparty": "WARNUNG! Diese Applikation ist nicht Teil des YunoHost-Applikationskatalogs. Das Installieren von Drittanbieterapplikationen könnte die Sicherheit und Integrität deines Systems beeinträchtigen. Du solltest wahrscheinlich NICHT fortfahren, es sei denn, du weißt, was du tust. Es wird KEINE UNTERSTÜTZUNG angeboten, wenn die Applikation nicht funktionieren oder dein System beschädigen sollte... Wenn du das Risiko trotzdem eingehen möchrst, tippe '{answers}'", + "confirm_app_install_thirdparty": "Warnung! Diese Applikation ist nicht Teil des App-Katalogs von YunoHost. Die Installation von Drittanbieter Applikationen kann die Integrität und Sicherheit Ihres Systems gefährden. Sie sollten sie NICHT installieren, wenn Sie nicht wissen, was Sie tun. Es wird KEIN SUPPORT geleistet, wenn diese Applikation nicht funktioniert oder Ihr System beschädigt! Wenn Sie dieses Risiko trotzdem eingehen wollen, geben Sie '{answers}' ein", "confirm_app_install_danger": "WARNUNG! Diese Applikation ist noch experimentell (wenn nicht sogar ausdrücklich nicht funktionsfähig)! Du solltest sie wahrscheinlich NICHT installieren, es sei denn, du weißt, was du tust. Es wird keine Unterstützung angeboten, falls diese Applikation nicht funktionieren oder dein System beschädigen sollte... Falls du bereit bist, dieses Risiko einzugehen, tippe '{answers}'", "confirm_app_install_warning": "Warnung: Diese Applikation funktioniert möglicherweise, ist jedoch nicht gut in YunoHost integriert. Einige Funktionen wie Single Sign-On und Backup / Restore sind möglicherweise nicht verfügbar. Trotzdem installieren? [{answers}] ", "backup_with_no_restore_script_for_app": "{app} hat kein Wiederherstellungsskript. Das Backup dieser App kann nicht automatisch wiederhergestellt werden.", @@ -319,7 +319,7 @@ "diagnosis_dns_bad_conf": "Einige DNS-Einträge für die Domäne {domain} fehlen oder sind nicht korrekt (Kategorie {category})", "diagnosis_ip_local": "Lokale IP: {local}", "diagnosis_ip_global": "Globale IP: {global}", - "diagnosis_ip_no_ipv6_tip": "Die Verwendung von IPv6 ist nicht Voraussetzung für das Funktionieren deines Servers, trägt aber zur Gesundheit des Internet als Ganzes bei. IPv6 sollte normalerweise automatisch von deinem Server oder deinem Provider konfiguriert werden, sofern verfügbar. Andernfalls musst du einige Dinge manuell konfigurieren. Weitere Informationen findest du hier: https://yunohost.org/#/ipv6. Wenn du IPv6 nicht aktivieren kannst oder dir das zu technisch ist, kannst du diese Warnung gefahrlos ignorieren.", + "diagnosis_ip_no_ipv6_tip": "Ein funktionierendes IPv6 ist für den Betrieb Ihres Servers nicht zwingend erforderlich, aber es ist besser für das Funktionieren des Internets als Ganzes. IPv6 sollte normalerweise automatisch vom System oder Ihrem Provider konfiguriert werden, wenn es verfügbar ist. Andernfalls müssen Sie möglicherweise einige Dinge manuell konfigurieren, wie in der Dokumentation hier beschrieben: https://yunohost.org/#/ipv6. Wenn Sie IPv6 nicht aktivieren können oder wenn es Ihnen zu technisch erscheint, können Sie diese Warnung auch getrost ignorieren.", "diagnosis_services_bad_status_tip": "Du kannst versuchen, den Dienst neu zu starten, und wenn das nicht funktioniert, schaue dir die (Dienst-)Logs in der Verwaltung an (In der Kommandozeile kannst du dies mit yunohost service restart {service} und yunohost service log {service} tun).", "diagnosis_services_bad_status": "Der Dienst {service} ist {status} :(", "diagnosis_diskusage_verylow": "Der Speicher {mountpoint} (auf Gerät {device}) hat nur noch {free} ({free_percent}%) freien Speicherplatz (von ingesamt {total}). Du solltest ernsthaft in Betracht ziehen, etwas Seicherplatz frei zu machen!", @@ -410,7 +410,7 @@ "diagnosis_http_hairpinning_issue": "In deinem lokalen Netzwerk scheint Hairpinning nicht aktiviert zu sein.", "diagnosis_ports_needed_by": "Diesen Port zu öffnen ist nötig, um die Funktionalität des Typs {category} (service {service}) zu gewährleisten", "diagnosis_mail_queue_too_big": "Zu viele anstehende Nachrichten in der Warteschlange ({nb_pending} emails)", - "diagnosis_package_installed_from_sury_details": "Einige Pakete wurden unbeabsichtigterweise aus einem Drittanbieter-Repository, genannt Sury, installiert. Das YunoHost-Team hat die Strategie, um diese Pakete zu handhaben, verbessert, aber es wird erwartet, dass einige Setups, welche PHP7.3-Applikationen installiert haben und immer noch auf Strech laufen, ein paar Inkonsistenzen aufweisen. Um diese Situation zu beheben, solltest du versuchen, den folgenden Befehl auszuführen: {cmd_to_fix}", + "diagnosis_package_installed_from_sury_details": "Einige Pakete wurden versehentlich von einem Drittanbieter-Repository namens Sury installiert. Das YunoHost-Team hat die Strategie für den Umgang mit diesen Paketen verbessert, aber es ist zu erwarten, dass einige Setups, die PHP7.3-Anwendungen installiert haben, während sie noch auf Stretch waren, einige verbleibende Inkonsistenzen aufweisen. Um diese Situation zu beheben, sollten Sie versuchen, den folgenden Befehl auszuführen: {cmd_to_fix}", "domain_cannot_add_xmpp_upload": "Eine hinzugefügte Domain darf nicht mit 'xmpp-upload.' beginnen. Dieser Name ist für das XMPP-Upload-Feature von YunoHost reserviert.", "group_cannot_be_deleted": "Die Gruppe {group} kann nicht manuell entfernt werden.", "group_cannot_edit_primary_group": "Die Gruppe '{group}' kann nicht manuell bearbeitet werden. Es ist die primäre Gruppe, welche dazu gedacht ist, nur ein spezifisches Konto zu enthalten.", @@ -422,7 +422,7 @@ "diagnosis_http_hairpinning_issue_details": "Das liegt wahrscheinlich an deinem Router. Dadurch können Personen von ausserhalb deines Netzwerkes, aber nicht von innerhalb deines lokalen Netzwerkes (wie wahrscheinlich du selbst), auf deinen Server zugreifen, wenn dazu die Domäne oder öffentliche IP verwendet wird. Du kannst das Problem eventuell beheben, indem du ein einen Blick auf https://yunohost.org/dns_local_network wirfst", "diagnosis_http_nginx_conf_not_up_to_date": "Die Konfiguration von Nginx scheint für diese Domäne manuell geändert worden zu sein. Dies hindert YunoHost daran festzustellen, ob es über HTTP erreichbar ist.", "diagnosis_http_bad_status_code": "Es sieht so aus als ob ein anderes Gerät (vielleicht dein Router/Modem) anstelle deines Servers antwortet.
1. Der häufigste Grund hierfür ist, dass Port 80 (und 443) nicht korrekt zu deinem Server weiterleiten.
2. Bei komplexeren Setups: prüfe ob deine Firewall oder Reverse-Proxy die Verbindung stören.", - "diagnosis_never_ran_yet": "Du hast kürzlich einen neuen YunoHost-Server installiert aber es gibt davon noch keinen Diagnosereport. Du solltest eine Diagnose anstossen. Du kannst das entweder vom Webadmin aus oder in der Kommandozeile machen. In der Kommandozeile verwendest du dafür den Befehl 'yunohost diagnosis run'.", + "diagnosis_never_ran_yet": "Es sieht so aus, als wäre dieser Server erst kürzlich eingerichtet worden und es gibt noch keinen Diagnosebericht, der angezeigt werden könnte. Sie sollten zunächst eine vollständige Diagnose durchführen, entweder über die Web-Oberfläche oder mit \"yunohost diagnosis run\" von der Kommandozeile aus.", "diagnosis_http_nginx_conf_not_up_to_date_details": "Um dieses Problem zu beheben, gebe in der Kommandozeile yunohost tools regen-conf nginx --dry-run --with-diff ein. Dieses Tool zeigt dir den Unterschied an. Wenn du damit einverstanden bist, kannst du mit yunohost tools regen-conf nginx --force die Änderungen übernehmen.", "diagnosis_backports_in_sources_list": "Du hast anscheinend apt (den Paketmanager) für das Backports-Repository konfiguriert. Wir raten strikte davon ab, Pakete aus dem Backports-Repository zu installieren. Diese würden wahrscheinlich zu Instabilitäten und Konflikten führen. Es sei denn, du weißt, was du tust.", "diagnosis_basesystem_hardware_model": "Das Servermodell ist {model}", @@ -438,20 +438,20 @@ "global_settings_setting_smtp_relay_port": "SMTP Relay Port", "global_settings_setting_smtp_allow_ipv6": "Erlaube die Nutzung von IPv6 um Mails zu empfangen und zu versenden", "global_settings_setting_pop3_enabled": "Aktiviere das POP3 Protokoll für den Mailserver", - "domain_cannot_remove_main_add_new_one": "Du kannst '{domain}' nicht entfernen, weil es die Haupt-Domäne und gleichzeitig deine einzige Domäne ist. Zuerst musst du eine andere Domäne hinzufügen, indem du 'yunohost domain add another-domain.com>' eingibst. Mache diese dann zu deiner Haupt-Domäne indem du 'yunohost domain main-domain -n ' eingibst. Nun kannst du die Domäne '{domain}' enfernen, indem du 'yunohost domain remove {domain}' eingibst.'", + "domain_cannot_remove_main_add_new_one": "Sie können '{domain}' nicht entfernen, da es die Hauptdomäne und Ihre einzige Domäne ist. Sie müssen zuerst eine andere Domäne mit 'yunohost domain add ' hinzufügen, dann als Hauptdomäne mit 'yunohost domain main-domain -n ' festlegen und dann können Sie die Domäne '{domain}' mit 'yunohost domain remove {domain}' entfernen'.'", "diagnosis_rootfstotalspace_critical": "Das Root-Filesystem hat noch freien Speicher von {space}. Das ist besorngiserregend! Der Speicher wird schnell aufgebraucht sein. 16 GB für das Root-Filesystem werden empfohlen.", "diagnosis_rootfstotalspace_warning": "Das Root-Filesystem hat noch freien Speicher von {space}. Möglich, dass das in Ordnung ist. Vielleicht ist er aber auch schneller aufgebraucht. 16 GB für das Root-Filesystem werden empfohlen.", "global_settings_setting_smtp_relay_host": "Zu verwendender SMTP-Relay-Host um E-Mails zu versenden. Er wird anstelle dieser YunoHost-Instanz verwendet. Nützlich, wenn du in einer der folgenden Situationen bist: Dein ISP- oder VPS-Provider hat deinen Port 25 geblockt, eine deinen residentiellen IPs ist auf DUHL gelistet, du kannst keinen Reverse-DNS konfigurieren oder dieser Server ist nicht direkt mit dem Internet verbunden und du möchtest einen anderen verwenden, um E-Mails zu versenden.", "global_settings_setting_backup_compress_tar_archives": "Beim Erstellen von Backups die Archive komprimieren (.tar.gz) anstelle von unkomprimierten Archiven (.tar). N.B. : Diese Option ergibt leichtere Backup-Archive, aber das initiale Backupprozedere wird länger dauern und mehr CPU brauchen.", - "log_remove_on_failed_restore": "'{}' entfernen nach einer fehlerhaften Wiederherstellung aus einem Backup-Archiv", - "log_backup_restore_app": "'{}' aus einem Backup-Archiv wiederherstellen", - "log_backup_restore_system": "System aus einem Backup-Archiv wiederherstellen", + "log_remove_on_failed_restore": "Entfernen von '{}' nach einer fehlgeschlagenen Wiederherstellung aus einem Sicherungsarchiv", + "log_backup_restore_app": "Wiederherstellen von '{}' aus einem Sicherungsarchiv", + "log_backup_restore_system": "System aus einem Sicherungsarchiv wiederherstellen", "log_available_on_yunopaste": "Das Protokoll ist nun via {url} verfügbar", "log_app_action_run": "Führe Aktion der Applikation '{}' aus", "invalid_regex": "Ungültige Regex:'{regex}'", - "mailbox_disabled": "E-Mail für Konto {user} deaktiviert", - "log_tools_reboot": "Server neustarten", - "log_tools_shutdown": "Server ausschalten", + "mailbox_disabled": "E-Mail für Konto {user} ist deaktiviert", + "log_tools_reboot": "Starten Sie Ihren Server neu", + "log_tools_shutdown": "Ihren Server herunterfahren", "log_tools_upgrade": "Systempakete aktualisieren", "log_tools_postinstall": "Post-Installation des YunoHost-Servers durchführen", "log_tools_migrations_migrate_forward": "Migrationen durchführen", @@ -469,7 +469,7 @@ "log_permission_create": "Erstelle Berechtigung '{}'", "log_dyndns_update": "Die IP, die mit der YunoHost-Subdomain '{}' verbunden ist, aktualisieren", "log_dyndns_subscribe": "Für eine YunoHost-Subdomain registrieren '{}'", - "log_domain_remove": "Entfernen der Domäne '{}' aus der Systemkonfiguration", + "log_domain_remove": "Domäne '{}' aus der Systemkonfiguration entfernen", "log_domain_add": "Hinzufügen der Domäne '{}' zur Systemkonfiguration", "log_remove_on_failed_install": "Entfernen von '{}' nach einer fehlgeschlagenen Installation", "domain_remove_confirm_apps_removal": "Wenn du diese Domäne löschst, werden folgende Applikationen entfernt:\n{apps}\n\nBist du sicher? [{answers}]", @@ -536,7 +536,7 @@ "restore_extracting": "Packe die benötigten Dateien aus dem Archiv aus...", "restore_already_installed_apps": "Folgende Apps können nicht wiederhergestellt werden, weil sie schon installiert sind: {apps}", "regex_with_only_domain": "Du kannst regex nicht als Domain verwenden, sondern nur als Pfad", - "root_password_desynchronized": "Das Admin-Passwort wurde verändert, aber das Root-Passwort ist immer noch das alte!", + "root_password_desynchronized": "Das Admin-Passwort wurde geändert, aber YunoHost konnte dies nicht auf das Root-Passwort übertragen!", "regenconf_need_to_explicitly_specify_ssh": "Die SSH-Konfiguration wurde manuell modifiziert, aber du musst explizit die Kategorie 'SSH' mit --force spezifizieren, um die Änderungen tatsächlich anzuwenden.", "log_backup_create": "Erstelle ein Backup-Archiv", "diagnosis_sshd_config_inconsistent": "Es sieht aus, als ob der SSH-Port manuell geändert wurde in /etc/ssh/ssh_config. Seit YunoHost 4.2 ist eine neue globale Einstellung 'security.ssh.port' verfügbar um zu verhindern, dass die Konfiguration manuell verändert wird.", @@ -544,15 +544,15 @@ "backup_create_size_estimation": "Das Archiv wird etwa {size} an Daten enthalten.", "app_restore_script_failed": "Im Wiederherstellungsskript der Applikation ist ein Fehler aufgetreten", "app_restore_failed": "Konnte {app} nicht wiederherstellen: {error}", - "migration_ldap_rollback_success": "System-Rollback erfolgreich.", + "migration_ldap_rollback_success": "Das System wurde zurückgesetzt.", "migration_ldap_migration_failed_trying_to_rollback": "Migrieren war nicht möglich... Versuch, ein Rollback des Systems durchzuführen.", "migration_ldap_backup_before_migration": "Vor der eigentlichen Migration ein Backup der LDAP-Datenbank und der Applikations-Einstellungen erstellen.", "global_settings_setting_ssowat_panel_overlay_enabled": "Das SSOwat-Overlay-Panel aktivieren", "global_settings_setting_security_ssh_port": "SSH-Port", "diagnosis_sshd_config_inconsistent_details": "Bitte führe yunohost settings set security.ssh.port -v YOUR_SSH_PORT aus, um den SSH-Port festzulegen, und prüfe yunohost tools regen-conf ssh --dry-run --with-diff und yunohost tools regen-conf ssh --force um deine Konfiguration auf die YunoHost-Empfehlung zurückzusetzen.", "regex_incompatible_with_tile": "/!\\ Packagers! Für Berechtigung '{permission}' ist show_tile auf 'true' gesetzt und deshalb kannst du keine regex-URL als Hauptdomäne setzen", - "permission_cant_add_to_all_users": "Die Berechtigung {permission} konnte nicht allen Konten gegeben werden.", - "migration_ldap_can_not_backup_before_migration": "Das System-Backup konnte nicht abgeschlossen werden, bevor die Migration fehlschlug. Fehler: {error}", + "permission_cant_add_to_all_users": "Die Berechtigung {permission} kann nicht für allen Konten hinzugefügt werden.", + "migration_ldap_can_not_backup_before_migration": "Die Sicherung des Systems konnte nicht abgeschlossen werden, bevor die Migration fehlschlug. Fehler: {error}", "service_description_fail2ban": "Schützt gegen Brute-Force-Angriffe und andere Angriffe aus dem Internet", "service_description_dovecot": "Ermöglicht es E-Mail-Clients auf Konten zuzugreifen (IMAP und POP3)", "service_description_dnsmasq": "Verarbeitet die Auflösung des Domainnamens (DNS)", @@ -567,18 +567,18 @@ "service_description_yunohost-firewall": "Verwaltet offene und geschlossene Ports zur Verbindung mit Diensten", "service_description_yunohost-api": "Verwaltet die Interaktionen zwischen der Weboberfläche von YunoHost und dem System", "service_description_ssh": "Ermöglicht die Verbindung zu deinem Server über ein Terminal (SSH-Protokoll)", - "server_reboot_confirm": "Der Server wird sofort heruntergefahren, bist du sicher? [{answers}]", + "server_reboot_confirm": "Der Server wird sofort neu gestartet. Sind Sie sicher? [{answers}]", "server_reboot": "Der Server wird neu gestartet", - "server_shutdown_confirm": "Der Server wird sofort heruntergefahren, bist du sicher? [{answers}]", + "server_shutdown_confirm": "Der Server wird sofort heruntergefahren, sind Sie sicher? [{answers}]", "server_shutdown": "Der Server wird heruntergefahren", - "root_password_replaced_by_admin_password": "Dein Root Passwort wurde durch dein Admin Passwort ersetzt.", + "root_password_replaced_by_admin_password": "Ihr Root-Passwort wurde durch Ihr Admin-Passwort ersetzt.", "show_tile_cant_be_enabled_for_regex": "Du kannst 'show_tile' momentan nicht aktivieren, weil die URL für die Berechtigung '{permission}' ein regulärer Ausdruck ist", "show_tile_cant_be_enabled_for_url_not_defined": "Momentan kannst du 'show_tile' nicht aktivieren, weil du zuerst eine URL für die Berechtigung '{permission}' definieren musst", "this_action_broke_dpkg": "Diese Aktion hat unkonfigurierte Pakete verursacht, welche durch dpkg/apt (die Paketverwaltungen dieses Systems) zurückgelassen wurden... Du kannst versuchen dieses Problem zu lösen, indem du 'sudo apt install --fix-broken' und/oder 'sudo dpkg --configure -a' ausführst.", "update_apt_cache_failed": "Kann den Cache von APT (Debians Paketmanager) nicht aktualisieren. Hier ist ein Auszug aus den sources.list-Zeilen, die helfen könnten, das Problem zu identifizieren:\n{sourceslist}", - "unknown_main_domain_path": "Unbekannte:r Domain oder Pfad für '{app}'. Du musst eine Domain und einen Pfad setzen, um die URL für Berechtigungen zu setzen.", + "unknown_main_domain_path": "Unbekannte Domäne oder Pfad für '{app}'. Sie müssen eine Domäne und einen Pfad angeben, um eine URL für die Genehmigung angeben zu können.", "yunohost_postinstall_end_tip": "Post-install ist fertig! Um das Setup abzuschliessen, wird empfohlen:\n - ein erstes Konto über den Bereich 'Konto' im Adminbereich hinzuzufügen (oder mit 'yunohost user create ' in der Kommandezeile);\n - mögliche Fehler zu diagnostizieren über den Bereich 'Diagnose' im Adminbereich (oder mit 'yunohost diagnosis run' in der Kommandozeile;\n - Die Abschnitte 'Install YunoHost' und 'Geführte Tour' im Administratorenhandbuch zu lesen: https://yunohost.org/admindoc.", - "user_already_exists": "Konto '{user}' ist bereits vorhanden", + "user_already_exists": "Das Konto '{user}' ist bereits vorhanden", "update_apt_cache_warning": "Beim Versuch den Cache für APT (Debians Paketmanager) zu aktualisieren, ist etwas schief gelaufen. Hier ist ein Dump der Zeilen aus sources.list, die Ihnen vielleicht dabei helfen, das Problem zu identifizieren:\n{sourceslist}", "global_settings_setting_security_webadmin_allowlist": "IP-Adressen, die auf die Verwaltungsseite zugreifen dürfen. Kommasepariert.", "global_settings_setting_security_webadmin_allowlist_enabled": "Erlaube nur bestimmten IP-Adressen den Zugriff auf die Verwaltungsseite.", @@ -648,7 +648,7 @@ "domain_config_auth_entrypoint": "API-Einstiegspunkt", "domain_config_auth_application_key": "Anwendungsschlüssel", "domain_config_auth_application_secret": "Geheimer Anwendungsschlüssel", - "domain_config_auth_consumer_key": "Consumer-Schlüssel", + "domain_config_auth_consumer_key": "Verbraucherschlüssel", "invalid_number_min": "Muss größer sein als {min}", "invalid_number_max": "Muss kleiner sein als {max}", "invalid_password": "Ungültiges Passwort", @@ -676,13 +676,13 @@ "global_settings_setting_security_ssh_password_authentication": "Passwort-Authentifizierung für SSH zulassen", "migration_description_0021_migrate_to_bullseye": "Upgrade des Systems auf Debian Bullseye und YunoHost 11.x", "migration_0021_general_warning": "Bitte beachte, dass diese Migration ein heikler Vorgang ist. Das YunoHost-Team hat sein Bestes getan, um sie zu überprüfen und zu testen, aber die Migration könnte immer noch Teile des Systems oder seiner Anwendungen beschädigen.\n\nEs wird daher empfohlen,:\n - Führe eine Sicherung aller kritischen Daten oder Applikationen durch. Mehr Informationen unter https://yunohost.org/backup;\n - Habe Geduld, nachdem du die Migration gestartet hast: Je nach Internetverbindung und Hardware kann es bis zu ein paar Stunden dauern, bis alles aktualisiert ist.", - "tools_upgrade": "Upgrade Systempakete", + "tools_upgrade": "Aktualisieren von Systempaketen", "tools_upgrade_failed": "Pakete konnten nicht aktualisiert werden: {packages_list}", "domain_config_default_app": "Standard-Applikation", - "migration_0023_postgresql_11_not_installed": "PostgreSQL war auf deinem System nicht installiert. Es gibt nichts zu tun.", - "migration_0023_postgresql_13_not_installed": "PostgreSQL 11 ist installiert, PostgreSQL 13 allerdings nicht? Mit deinem System scheint etwas seltsam zu sein :(...", - "migration_description_0022_php73_to_php74_pools": "Migriere php7.3-fpm 'pool' conf Dateien auf php7.4", - "migration_description_0023_postgresql_11_to_13": "Migriere Datenbanken von PostgreSQL 11 auf 13", + "migration_0023_postgresql_11_not_installed": "PostgreSQL wurde nicht auf Ihrem System installiert. Es ist nichts zu tun.", + "migration_0023_postgresql_13_not_installed": "PostgreSQL 11 ist installiert, aber nicht PostgreSQL 13!? Irgendetwas Seltsames könnte auf Ihrem System passiert sein. :( ...", + "migration_description_0022_php73_to_php74_pools": "Migriere php7.3-fpm 'pool' Konfiguration nach php7.4", + "migration_description_0023_postgresql_11_to_13": "Migrieren von Datenbanken von PostgreSQL 11 nach 13", "service_description_postgresql": "Speichert Applikations-Daten (SQL Datenbank)", "migration_0023_not_enough_space": "Stelle sicher, dass unter {path} genug Speicherplatz zur Verfügung steht, um die Migration auszuführen." } From b195cf50adafe9c324b2b063ad3acb48c18e8118 Mon Sep 17 00:00:00 2001 From: Valentin von Guttenberg Date: Thu, 21 Jul 2022 22:49:51 +0000 Subject: [PATCH 486/619] Translated using Weblate (German) Currently translated at 100.0% (686 of 686 strings) Translation: YunoHost/core Translate-URL: https://translate.yunohost.org/projects/yunohost/core/de/ --- locales/de.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/locales/de.json b/locales/de.json index 23d1f1c28..84ac50281 100644 --- a/locales/de.json +++ b/locales/de.json @@ -633,7 +633,7 @@ "user_import_failed": "Der Import von Konten ist komplett fehlgeschlagen", "domain_dns_push_failed_to_list": "Auflistung der aktuellen Einträge über die API des Registrars fehlgeschlagen: {error}", "domain_dns_pushing": "DNS-Einträge übertragen…", - "domain_dns_push_record_failed": "{action} für Eintrag {type}/{name} fehlgeschlagen: {error}", + "domain_dns_push_record_failed": "Fehler bei {action} Eintrag {type}/{name} : {error}", "domain_dns_push_success": "DNS-Einträge aktualisiert!", "domain_dns_push_failed": "Die Aktualisierung der DNS-Einträge ist leider gescheitert.", "domain_dns_push_partial_failure": "DNS-Einträge teilweise aktualisiert: einige Warnungen/Fehler wurden gemeldet.", From d868d290c1633b7d4243ebb0cf7e1f56995dfd36 Mon Sep 17 00:00:00 2001 From: Meta Meta Date: Thu, 21 Jul 2022 22:43:18 +0000 Subject: [PATCH 487/619] Translated using Weblate (German) Currently translated at 100.0% (686 of 686 strings) Translation: YunoHost/core Translate-URL: https://translate.yunohost.org/projects/yunohost/core/de/ --- locales/de.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/locales/de.json b/locales/de.json index 84ac50281..4aa75270b 100644 --- a/locales/de.json +++ b/locales/de.json @@ -346,7 +346,7 @@ "diagnosis_domain_expiration_not_found_details": "Die WHOIS-Informationen für die Domäne {domain} scheinen keine Informationen über das Ablaufdatum zu enthalten. Stimmt das?", "diagnosis_domain_expiration_warning": "Einige Domänen werden bald ablaufen!", "diagnosis_diskusage_ok": "Der Speicher {mountpoint} (auf Gerät {device}) hat immer noch {free} ({free_percent}%) freien Speicherplatz übrig(von insgesamt {total})!", - "diagnosis_ram_ok": "Das System hat immer noch {available} ({available_percent}%) RAM zu Verfügung von {total}.", + "diagnosis_ram_ok": "Das System hat noch {available} ({available_percent}%) RAM von {total} zur Verfügung.", "diagnosis_swap_none": "Das System hat gar keinen Swap. Du solltest überlegen mindestens {recommended} an Swap einzurichten, um Situationen zu verhindern, in welchen der RAM des Systems knapp wird.", "diagnosis_mail_ehlo_unreachable_details": "Konnte keine Verbindung zu deinem Server auf dem Port 25 herzustellen über IPv{ipversion}. Er scheint nicht erreichbar zu sein.
1. Das häufigste Problem ist, dass der Port 25 nicht richtig zu deinem Server weitergeleitet ist.
2. Du solltest auch sicherstellen, dass der Postfix-Dienst läuft.
3. In komplexeren Umgebungen: Stelle sicher, daß keine Firewall oder Reverse-Proxy stört.", "diagnosis_mail_ehlo_wrong": "Ein anderer SMTP-Server antwortet auf IPv{ipversion}. Dein Server wird wahrscheinlich nicht in der Lage sein, E-Mails zu empfangen.", From fdaf9fc0987914769d1557ed8d4d4f74e5255aca Mon Sep 17 00:00:00 2001 From: "ljf (zamentur)" Date: Wed, 3 Aug 2022 14:51:00 +0200 Subject: [PATCH 488/619] [fix] Import assert_password_is_compatible --- src/tools.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/tools.py b/src/tools.py index 32be88c94..1900b3fc9 100644 --- a/src/tools.py +++ b/src/tools.py @@ -71,7 +71,10 @@ def tools_adminpw(new_password, check_strength=True): """ from yunohost.user import _hash_user_password - from yunohost.utils.password import assert_password_is_strong_enough + from yunohost.utils.password import ( + assert_password_is_strong_enough, + assert_password_is_compatible + ) import spwd if check_strength: From f705d81e1786fdea47c2fdd85cc99373b560c57d Mon Sep 17 00:00:00 2001 From: "ljf (zamentur)" Date: Wed, 3 Aug 2022 14:51:19 +0200 Subject: [PATCH 489/619] [fix] Bad importation --- src/tools.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tools.py b/src/tools.py index 1900b3fc9..aa344c77c 100644 --- a/src/tools.py +++ b/src/tools.py @@ -50,7 +50,7 @@ from yunohost.utils.packages import ( _list_upgradable_apt_packages, ynh_packages_version, ) -from yunohost.utils.error import yunohosterror, yunohostvalidationerror +from yunohost.utils.error import YunohostError, YunohostValidationError from yunohost.log import is_unit_operation, OperationLogger MIGRATIONS_STATE_PATH = "/etc/yunohost/migrations.yaml" From 6d8a18e71b43c8560df3cd98e1dbec948fd1f6b9 Mon Sep 17 00:00:00 2001 From: "ljf (zamentur)" Date: Wed, 3 Aug 2022 14:52:17 +0200 Subject: [PATCH 490/619] [fix] Missing import --- src/user.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/user.py b/src/user.py index 4549a1c0f..ca7e525a7 100644 --- a/src/user.py +++ b/src/user.py @@ -143,7 +143,10 @@ def user_create( from yunohost.domain import domain_list, _get_maindomain, _assert_domain_exists from yunohost.hook import hook_callback - from yunohost.utils.password import assert_password_is_strong_enough + from yunohost.utils.password import ( + assert_password_is_strong_enough, + assert_password_is_compatible + ) from yunohost.utils.ldap import _get_ldap_interface # Ensure compatibility and sufficiently complex password From 7c28edd255efdd2647f6f4014716044903ac7d4a Mon Sep 17 00:00:00 2001 From: "ljf (zamentur)" Date: Wed, 3 Aug 2022 14:53:56 +0200 Subject: [PATCH 491/619] [fix] Missing import --- src/user.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/user.py b/src/user.py index ca7e525a7..a9fb442fc 100644 --- a/src/user.py +++ b/src/user.py @@ -369,7 +369,10 @@ def user_update( """ from yunohost.domain import domain_list, _get_maindomain from yunohost.app import app_ssowatconf - from yunohost.utils.password import assert_password_is_strong_enough + from yunohost.utils.password import ( + assert_password_is_strong_enough, + assert_password_is_compatible + ) from yunohost.utils.ldap import _get_ldap_interface from yunohost.hook import hook_callback From f6cd35d94b9b4c5b322e89da0d455eaf9e5525b2 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Wed, 3 Aug 2022 15:03:09 +0200 Subject: [PATCH 492/619] configpanels: remove debug message because it floods the regenconf logs --- src/utils/config.py | 1 - 1 file changed, 1 deletion(-) diff --git a/src/utils/config.py b/src/utils/config.py index 56f632b09..50470a56c 100644 --- a/src/utils/config.py +++ b/src/utils/config.py @@ -533,7 +533,6 @@ class ConfigPanel: def _hydrate(self): # Hydrating config panel with current value - logger.debug("Hydrating config with current values") for _, _, option in self._iterate(): if option["id"] not in self.values: allowed_empty_types = ["alert", "display_text", "markdown", "file"] From 9d39a2c0b46e62fd998c7ff2df9f9a560e467c4e Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Wed, 3 Aug 2022 16:09:47 +0200 Subject: [PATCH 493/619] regenconf dhclient/resolvconf: fix weird typo, probably meant 'search' (like in our rpi-image tweaking) --- hooks/conf_regen/43-dnsmasq | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hooks/conf_regen/43-dnsmasq b/hooks/conf_regen/43-dnsmasq index ec53d75bc..9aca18031 100755 --- a/hooks/conf_regen/43-dnsmasq +++ b/hooks/conf_regen/43-dnsmasq @@ -73,7 +73,7 @@ do_post_regen() { grep -q '^supersede domain-name "";' /etc/dhcp/dhclient.conf 2>/dev/null || echo 'supersede domain-name "";' >>/etc/dhcp/dhclient.conf grep -q '^supersede domain-search "";' /etc/dhcp/dhclient.conf 2>/dev/null || echo 'supersede domain-search "";' >>/etc/dhcp/dhclient.conf - grep -q '^supersede name "";' /etc/dhcp/dhclient.conf 2>/dev/null || echo 'supersede name "";' >>/etc/dhcp/dhclient.conf + grep -q '^supersede search "";' /etc/dhcp/dhclient.conf 2>/dev/null || echo 'supersede search "";' >>/etc/dhcp/dhclient.conf systemctl restart resolvconf fi From e29e9ca3f97545c0286e82ecf279f692d8849d90 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Thu, 4 Aug 2022 18:08:01 +0200 Subject: [PATCH 494/619] Missing import... --- src/tools.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/tools.py b/src/tools.py index aa344c77c..844a2a3ba 100644 --- a/src/tools.py +++ b/src/tools.py @@ -201,7 +201,10 @@ def tools_postinstall( """ from yunohost.dyndns import _dyndns_available from yunohost.utils.dns import is_yunohost_dyndns_domain - from yunohost.utils.password import assert_password_is_strong_enough + from yunohost.utils.password import ( + assert_password_is_strong_enough, + assert_password_is_compatible + ) from yunohost.domain import domain_main_domain import psutil From 470bc79d9717ea9ba44393746a6ca957ac175e39 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Thu, 4 Aug 2022 18:16:00 +0200 Subject: [PATCH 495/619] Undefined variable... --- src/user.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/user.py b/src/user.py index a9fb442fc..ce0cea60d 100644 --- a/src/user.py +++ b/src/user.py @@ -422,7 +422,7 @@ def user_update( m18n.n("ask_password"), is_password=True, confirm=True ) # Ensure compatibility and sufficiently complex password - assert_password_is_compatible(password) + assert_password_is_compatible(change_password) assert_password_is_strong_enough("user", change_password) new_attr_dict["userPassword"] = [_hash_user_password(change_password)] From 5535896efab91af800248698f12dce312447b243 Mon Sep 17 00:00:00 2001 From: ButterflyOfFire Date: Fri, 5 Aug 2022 11:05:20 +0000 Subject: [PATCH 496/619] Translated using Weblate (Arabic) Currently translated at 13.1% (90 of 686 strings) Translation: YunoHost/core Translate-URL: https://translate.yunohost.org/projects/yunohost/core/ar/ --- locales/ar.json | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/locales/ar.json b/locales/ar.json index c440e442f..e37cdbcc7 100644 --- a/locales/ar.json +++ b/locales/ar.json @@ -15,7 +15,7 @@ "app_requirements_checking": "جار فحص الحزم اللازمة لـ {app}…", "app_sources_fetch_failed": "تعذرت عملية جلب مصادر الملفات", "app_unknown": "برنامج مجهول", - "app_upgrade_app_name": "جارٍ تحديث تطبيق {app}…", + "app_upgrade_app_name": "جارٍ تحديث {app}…", "app_upgrade_failed": "تعذرت عملية ترقية {app}", "app_upgrade_some_app_failed": "تعذرت عملية ترقية بعض التطبيقات", "app_upgraded": "تم تحديث التطبيق {app}", @@ -30,9 +30,9 @@ "backup_method_copy_finished": "إنتهت عملية النسخ الإحتياطي", "backup_nothings_done": "ليس هناك أي شيء للحفظ", "backup_output_directory_required": "يتوجب عليك تحديد مجلد لتلقي النسخ الإحتياطية", - "certmanager_cert_install_success": "تمت عملية تنصيب شهادة Let's Encrypt بنجاح على النطاق {domain} !", - "certmanager_cert_install_success_selfsigned": "نجحت عملية تثبيت الشهادة الموقعة ذاتيا الخاصة بالنطاق {domain}", - "certmanager_cert_renew_success": "نجحت عملية تجديد شهادة Let's Encrypt الخاصة باسم النطاق {domain} !", + "certmanager_cert_install_success": "تمت عملية تنصيب شهادة Let's Encrypt بنجاح على النطاق {domain}", + "certmanager_cert_install_success_selfsigned": "نجحت عملية تثبيت الشهادة الموقعة ذاتيا الخاصة بالنطاق '{domain}'", + "certmanager_cert_renew_success": "نجحت عملية تجديد شهادة Let's Encrypt الخاصة باسم النطاق '{domain}'", "certmanager_cert_signing_failed": "فشل إجراء توقيع الشهادة الجديدة", "certmanager_no_cert_file": "تعذرت عملية قراءة شهادة نطاق {domain} (الملف : {file})", "domain_created": "تم إنشاء النطاق", @@ -114,9 +114,9 @@ "aborting": "إلغاء.", "admin_password_too_long": "يرجى اختيار كلمة سرية أقصر مِن 127 حرف", "app_not_upgraded": "", - "app_start_install": "جارٍ تثبيت التطبيق {app}…", - "app_start_remove": "جارٍ حذف التطبيق {app}…", - "app_start_restore": "جارٍ استرجاع التطبيق {app}…", + "app_start_install": "جارٍ تثبيت {app}…", + "app_start_remove": "جارٍ حذف {app}…", + "app_start_restore": "جارٍ استرجاع {app}…", "app_upgrade_several_apps": "سوف يتم تحديث التطبيقات التالية: {apps}", "ask_new_domain": "نطاق جديد", "ask_new_path": "مسار جديد", @@ -127,7 +127,7 @@ "service_description_slapd": "يخزّن المستخدمين والنطاقات والمعلومات المتعلقة بها", "service_reloaded": "تم إعادة تشغيل خدمة '{service}'", "service_restarted": "تم إعادة تشغيل خدمة '{service}'", - "group_unknown": "الفريق {group} مجهول", + "group_unknown": "الفريق '{group}' مجهول", "group_deletion_failed": "فشلت عملية حذف الفريق '{group}': {error}", "group_deleted": "تم حذف الفريق '{group}'", "group_created": "تم إنشاء الفريق '{group}'", @@ -145,7 +145,7 @@ "diagnosis_ip_not_connected_at_all": "يبدو أنّ الخادم غير مُتّصل بتاتا بالإنترنت!؟", "app_install_failed": "لا يمكن تنصيب {app}: {error}", "apps_already_up_to_date": "كافة التطبيقات مُحدّثة", - "app_remove_after_failed_install": "جارٍ حذف التطبيق بعدما فشل تنصيبها…", + "app_remove_after_failed_install": "جارٍ حذف التطبيق بعدما فشل تنصيبه…", "apps_catalog_updating": "جارٍ تحديث فهرس التطبيقات…", "apps_catalog_update_success": "تم تحديث فهرس التطبيقات!", "diagnosis_domain_expiration_error": "ستنتهي مدة صلاحية بعض النطاقات في القريب العاجل!", @@ -158,5 +158,6 @@ "diagnosis_description_services": "حالة الخدمات", "diagnosis_description_dnsrecords": "تسجيلات خدمة DNS", "diagnosis_description_ip": "الإتصال بالإنترنت", - "diagnosis_description_basesystem": "النظام الأساسي" + "diagnosis_description_basesystem": "النظام الأساسي", + "field_invalid": "الحقل غير صحيح : '{}'" } From 92467b5e59311df163cd6fb2279037815b456542 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Sun, 7 Aug 2022 11:33:33 +0200 Subject: [PATCH 497/619] Update changelog for 11.0.8 --- debian/changelog | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/debian/changelog b/debian/changelog index 6a945f739..473fb1abc 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,19 @@ +yunohost (11.0.8) testing; urgency=low + + - [fix] helpers: escape username in ynh_user_exists ([#1469](https://github.com/YunoHost/yunohost/pull/1469)) + - [fix] helpers: in nginx helpers, do not change the nginx template conf, replace #sub_path_only and #root_path_only after ynh_add_config, otherwise it breaks the change_url script (30e926f9) + - [fix] helpers: fix arg parsing in ynh_install_apps ([#1480](https://github.com/YunoHost/yunohost/pull/1480)) + - [fix] postinstall: be able to redo postinstall when the 128+ chars + password error is raised ([#1476](https://github.com/YunoHost/yunohost/pull/1476)) + - [fix] regenconf dhclient/resolvconf: fix weird typo, probably meant 'search' (like in our rpi-image tweaking) (9d39a2c0) + - [fix] configpanels: remove debug message because it floods the regenconf logs (f6cd35d9) + - [fix] configpanels: don't restrict choices if there's no choices specified ([#1478](https://github.com/YunoHost/yunohost/pull/1478) + - [i18n] Translations updated for Arabic, German, Slovak, Telugu + + Thanks to all contributors <3 ! (Alice Kile, ButterflyOfFire, Éric Gaspar, Gregor, Jose Riha, Kay0u, ljf, Meta Meta, tituspijean, Valentin von Guttenberg, yalh76) + + -- Alexandre Aubin Sun, 07 Aug 2022 11:26:54 +0200 + yunohost (11.0.7) testing; urgency=low - [fix] Allow lime2 to upgrade even if kernel is hold ([#1452](https://github.com/YunoHost/yunohost/pull/1452)) From 7fa67b2b229ffd02e4bd909099df892ff40245c9 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Sun, 7 Aug 2022 12:41:18 +0200 Subject: [PATCH 498/619] Zbleuarg --- src/utils/config.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/utils/config.py b/src/utils/config.py index c68d43aef..ec7faa719 100644 --- a/src/utils/config.py +++ b/src/utils/config.py @@ -742,7 +742,7 @@ class Question: confirm=False, prefill=prefill, is_multiline=(self.type == "text"), - autocomplete=self.choices, + autocomplete=self.choices or [], help=_value_for_locale(self.help), ) From 4496996c340816c12f43627fe48e132527ff9b64 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Sun, 7 Aug 2022 12:42:15 +0200 Subject: [PATCH 499/619] Update changelog for 11.0.8.1 --- debian/changelog | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/debian/changelog b/debian/changelog index 473fb1abc..3a7d37aed 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,9 @@ +yunohost (11.0.8.1) testing; urgency=low + + - Fix tests é_è (7fa67b2b) + + -- Alexandre Aubin Sun, 07 Aug 2022 12:41:28 +0200 + yunohost (11.0.8) testing; urgency=low - [fix] helpers: escape username in ynh_user_exists ([#1469](https://github.com/YunoHost/yunohost/pull/1469)) From ebc24362b2783dff588b8cb3277693e0bd1a23b9 Mon Sep 17 00:00:00 2001 From: Kayou Date: Sun, 7 Aug 2022 14:10:59 +0200 Subject: [PATCH 500/619] Fixing path in the generating doc script --- .gitlab/ci/doc.gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab/ci/doc.gitlab-ci.yml b/.gitlab/ci/doc.gitlab-ci.yml index 59179f7a7..528d8f5aa 100644 --- a/.gitlab/ci/doc.gitlab-ci.yml +++ b/.gitlab/ci/doc.gitlab-ci.yml @@ -14,7 +14,7 @@ generate-helpers-doc: - cd doc - python3 generate_helper_doc.py - hub clone https://$GITHUB_TOKEN:x-oauth-basic@github.com/YunoHost/doc.git doc_repo - - cp helpers.md doc_repo/pages/04.contribute/04.packaging_apps/11.helpers/packaging_apps_helpers.md + - cp helpers.md doc_repo/pages/06.contribute/10.packaging_apps/11.helpers/packaging_apps_helpers.md - cd doc_repo # replace ${CI_COMMIT_REF_NAME} with ${CI_COMMIT_TAG} ? - hub checkout -b "${CI_COMMIT_REF_NAME}" From bcdb36b7b2159b0e09c47d6f620f7259a6244308 Mon Sep 17 00:00:00 2001 From: "ljf (zamentur)" Date: Sun, 7 Aug 2022 15:03:27 +0200 Subject: [PATCH 501/619] [enh] Simplify the pip freeze call Co-authored-by: Alexandre Aubin --- src/yunohost/data_migrations/0021_migrate_to_bullseye.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/yunohost/data_migrations/0021_migrate_to_bullseye.py b/src/yunohost/data_migrations/0021_migrate_to_bullseye.py index 4cdec3f24..32a30bf2e 100644 --- a/src/yunohost/data_migrations/0021_migrate_to_bullseye.py +++ b/src/yunohost/data_migrations/0021_migrate_to_bullseye.py @@ -69,7 +69,7 @@ def _generate_requirements(): venvs = _get_all_venvs("/opt/") + _get_all_venvs("/var/www/") for venv in venvs: # Generate a requirements file from venv - os.system(f"bash -c 'source {venv}/bin/activate && pip freeze > {venv}{VENV_REQUIREMENTS_SUFFIX} && deactivate'") + os.system(f"{venv}/bin/pip freeze > {venv}{VENV_REQUIREMENTS_SUFFIX}") def _rebuild_venvs(): From e94b7197f26ff4b455775221ebc6f7f771287834 Mon Sep 17 00:00:00 2001 From: "ljf (zamentur)" Date: Sun, 7 Aug 2022 15:04:55 +0200 Subject: [PATCH 502/619] [enh] Simplify the pip install call Co-authored-by: Alexandre Aubin --- src/yunohost/data_migrations/0021_migrate_to_bullseye.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/yunohost/data_migrations/0021_migrate_to_bullseye.py b/src/yunohost/data_migrations/0021_migrate_to_bullseye.py index 32a30bf2e..7dc0f39aa 100644 --- a/src/yunohost/data_migrations/0021_migrate_to_bullseye.py +++ b/src/yunohost/data_migrations/0021_migrate_to_bullseye.py @@ -83,7 +83,7 @@ def _rebuild_venvs(): # Recreate the venv rm(venv, recursive=True) os.system(f"python -m venv {venv}") - status = os.system(f"bash -c 'source {venv}/bin/activate && pip install -r {venv}{VENV_REQUIREMENTS_SUFFIX} && deactivate'") + status = os.system(f"{venv}/bin/pip install -r {venv}{VENV_REQUIREMENTS_SUFFIX}") if status != 0: logger.warning(m18n.n("migration_0021_venv_regen_failed", venv=venv)) else: From 5a3911c65f0f7bfd509a13d901502351cec71742 Mon Sep 17 00:00:00 2001 From: ljf Date: Sun, 7 Aug 2022 15:26:54 +0200 Subject: [PATCH 503/619] [enh] Split bullseye migration and venv migrations --- .../0021_migrate_to_bullseye.py | 39 ++++--------------- 1 file changed, 7 insertions(+), 32 deletions(-) diff --git a/src/yunohost/data_migrations/0021_migrate_to_bullseye.py b/src/yunohost/data_migrations/0021_migrate_to_bullseye.py index 7dc0f39aa..93ff2f930 100644 --- a/src/yunohost/data_migrations/0021_migrate_to_bullseye.py +++ b/src/yunohost/data_migrations/0021_migrate_to_bullseye.py @@ -5,7 +5,7 @@ from moulinette import m18n from yunohost.utils.error import YunohostError from moulinette.utils.log import getActionLogger from moulinette.utils.process import check_output, call_async_output -from moulinette.utils.filesystem import read_file, rm, write_to_file, cp +from moulinette.utils.filesystem import read_file, rm, write_to_file from yunohost.tools import ( Migration, @@ -30,7 +30,7 @@ N_CURRENT_YUNOHOST = 4 N_NEXT_DEBAN = 11 N_NEXT_YUNOHOST = 11 -VENV_REQUIREMENTS_SUFFIX = "_req.txt" +VENV_REQUIREMENTS_SUFFIX = ".requirements_backup_for_bullseye_upgrade.txt" VENV_IGNORE = "ynh_migration_no_regen" @@ -72,26 +72,6 @@ def _generate_requirements(): os.system(f"{venv}/bin/pip freeze > {venv}{VENV_REQUIREMENTS_SUFFIX}") -def _rebuild_venvs(): - """ - After the update, recreate a python virtual env based on the previously generated requirements file - """ - - venvs = _get_all_venvs("/opt/") + _get_all_venvs("/var/www/") - for venv in venvs: - if os.path.isfile(venv + VENV_REQUIREMENTS_SUFFIX): - # Recreate the venv - rm(venv, recursive=True) - os.system(f"python -m venv {venv}") - status = os.system(f"{venv}/bin/pip install -r {venv}{VENV_REQUIREMENTS_SUFFIX}") - if status != 0: - logger.warning(m18n.n("migration_0021_venv_regen_failed", venv=venv)) - else: - rm(venv + VENV_REQUIREMENTS_SUFFIX) - else: - logger.warning(m18n.n("migration_0021_venv_regen_failed", venv=venv)) - - class MyMigration(Migration): "Upgrade the system to Debian Bullseye and Yunohost 11.x" @@ -331,11 +311,6 @@ class MyMigration(Migration): tools_upgrade(target="system", postupgradecmds=postupgradecmds) - # - # Recreate the venvs - # - - _rebuild_venvs() def debian_major_version(self): # The python module "platform" and lsb_release are not reliable because @@ -380,11 +355,11 @@ class MyMigration(Migration): # Lime2 have hold packages to avoid ethernet instability # See https://github.com/YunoHost/arm-images/commit/b4ef8c99554fd1a122a306db7abacc4e2f2942df lime2_hold_packages = set([ - "armbian-firmware", - "armbian-bsp-cli-lime2", - "linux-dtb-current-sunxi", - "linux-image-current-sunxi", - "linux-u-boot-lime2-current", + "armbian-firmware", + "armbian-bsp-cli-lime2", + "linux-dtb-current-sunxi", + "linux-image-current-sunxi", + "linux-u-boot-lime2-current", "linux-image-next-sunxi" ]) if upgradable_system_packages - lime2_hold_packages: From f83a357d33e36c5a1724c4a6fcc6a97291f76665 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Sun, 7 Aug 2022 19:06:53 +0200 Subject: [PATCH 504/619] bullseye migration: in venv / pip freeze backup mechanism, remove the venv_ignore stuff because it's not relevant anymore --- src/yunohost/data_migrations/0021_migrate_to_bullseye.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/yunohost/data_migrations/0021_migrate_to_bullseye.py b/src/yunohost/data_migrations/0021_migrate_to_bullseye.py index 93ff2f930..31c07191f 100644 --- a/src/yunohost/data_migrations/0021_migrate_to_bullseye.py +++ b/src/yunohost/data_migrations/0021_migrate_to_bullseye.py @@ -31,7 +31,6 @@ N_NEXT_DEBAN = 11 N_NEXT_YUNOHOST = 11 VENV_REQUIREMENTS_SUFFIX = ".requirements_backup_for_bullseye_upgrade.txt" -VENV_IGNORE = "ynh_migration_no_regen" def _get_all_venvs(dir, level=0, maxlevel=3): @@ -48,8 +47,6 @@ def _get_all_venvs(dir, level=0, maxlevel=3): for file in os.listdir(dir): path = os.path.join(dir, file) if os.path.isdir(path): - if os.path.isfile(os.path.join(path, VENV_IGNORE)): - continue activatepath = os.path.join(path,"bin", "activate") if os.path.isfile(activatepath): content = read_file(activatepath) From 2b63058b4599029d70b26670583c0d69e514ca0f Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Sun, 7 Aug 2022 19:07:32 +0200 Subject: [PATCH 505/619] bullseye migration: _generate_requirements -> _backup_pip_freeze_for_python_app_venvs --- src/yunohost/data_migrations/0021_migrate_to_bullseye.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/yunohost/data_migrations/0021_migrate_to_bullseye.py b/src/yunohost/data_migrations/0021_migrate_to_bullseye.py index 31c07191f..9bd746276 100644 --- a/src/yunohost/data_migrations/0021_migrate_to_bullseye.py +++ b/src/yunohost/data_migrations/0021_migrate_to_bullseye.py @@ -58,7 +58,7 @@ def _get_all_venvs(dir, level=0, maxlevel=3): return result -def _generate_requirements(): +def _backup_pip_freeze_for_python_app_venvs(): """ Generate a requirements file for all python virtual env located inside /opt/ and /var/www/ """ @@ -112,7 +112,7 @@ class MyMigration(Migration): # Get requirements of the different venvs from python apps # - _generate_requirements() + _backup_pip_freeze_for_python_app_venvs() # # Run apt update From 80015a728ce08d77b0d9e155ed5e0de319b96dc5 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Sun, 7 Aug 2022 22:57:36 +0200 Subject: [PATCH 506/619] bullseye migration: tweak message to prepare for stable release --- src/yunohost/data_migrations/0021_migrate_to_bullseye.py | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/src/yunohost/data_migrations/0021_migrate_to_bullseye.py b/src/yunohost/data_migrations/0021_migrate_to_bullseye.py index 9bd746276..3be8c9add 100644 --- a/src/yunohost/data_migrations/0021_migrate_to_bullseye.py +++ b/src/yunohost/data_migrations/0021_migrate_to_bullseye.py @@ -386,15 +386,10 @@ class MyMigration(Migration): message = m18n.n("migration_0021_general_warning") - # FIXME: update this message with updated topic link once we release the migration as stable message = ( - "N.B.: **THIS MIGRATION IS STILL IN BETA-STAGE** ! If your server hosts critical services and if you are not too confident with debugging possible issues, we recommend you to wait a little bit more while we gather more feedback and polish things up. If on the other hand you are relatively confident with debugging small issues that may arise, you are encouraged to run this migration ;)! You can read and share feedbacks on this forum thread: https://forum.yunohost.org/t/18531\n\n" + "N.B.: This migration has been tested by the community over the last few months but has only been declared stable recently. If your server hosts critical services and if you are not too confident with debugging possible issues, we recommend you to wait a little bit more while we gather more feedback and polish things up. If on the other hand you are relatively confident with debugging small issues that may arise, you are encouraged to run this migration ;)! You can read about remaining known issues and feedback from the community here: https://forum.yunohost.org/t/20590\n\n" + message ) - # message = ( - # "N.B.: This migration has been tested by the community over the last few months but has only been declared stable recently. If your server hosts critical services and if you are not too confident with debugging possible issues, we recommend you to wait a little bit more while we gather more feedback and polish things up. If on the other hand you are relatively confident with debugging small issues that may arise, you are encouraged to run this migration ;)! You can read about remaining known issues and feedback from the community here: https://forum.yunohost.org/t/12195\n\n" - # + message - # ) if problematic_apps: message += "\n\n" + m18n.n( From 51804925f6fd906efdd94066cd5b9fc8ac99449d Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Sun, 7 Aug 2022 23:04:21 +0200 Subject: [PATCH 507/619] services: Skip php 7.3 which is most likely dead after buster->bullseye migration because users get spooked --- src/service.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/service.py b/src/service.py index 506d3223e..5800f6e4d 100644 --- a/src/service.py +++ b/src/service.py @@ -710,6 +710,10 @@ def _get_services(): ) php_fpm_versions = [v for v in php_fpm_versions.split("\n") if v.strip()] for version in php_fpm_versions: + # Skip php 7.3 which is most likely dead after buster->bullseye migration + # because users get spooked + if version == "7.3": + continue services[f"php{version}-fpm"] = { "log": f"/var/log/php{version}-fpm.log", "test_conf": f"php-fpm{version} --test", # ofc the service is phpx.y-fpm but the program is php-fpmx.y because why not ... From 3b8e49dc64522da2787874762f69ea6dee64df70 Mon Sep 17 00:00:00 2001 From: ljf Date: Sun, 7 Aug 2022 16:50:22 +0200 Subject: [PATCH 508/619] [enh] Split python rebuild migrations --- locales/en.json | 1 + src/migrations/0024_rebuild_python_venv.py | 74 ++++++++++++++++++++++ 2 files changed, 75 insertions(+) create mode 100644 src/migrations/0024_rebuild_python_venv.py diff --git a/locales/en.json b/locales/en.json index e48ba65ce..f4d4492ab 100644 --- a/locales/en.json +++ b/locales/en.json @@ -503,6 +503,7 @@ "migration_0023_not_enough_space": "Make sufficient space available in {path} to run the migration.", "migration_0023_postgresql_11_not_installed": "PostgreSQL was not installed on your system. Nothing to do.", "migration_0023_postgresql_13_not_installed": "PostgreSQL 11 is installed, but not PostgreSQL 13!? Something weird might have happened on your system :(...", + "migration_0024_rebuild_python_venv_failed": "Unable to rebuild the python virtual env {venv}, this app is probably broken. If your app is broken, you probably should force the upgrade of this app thanks to `yunohost app upgrade --force APP`", "migration_description_0021_migrate_to_bullseye": "Upgrade the system to Debian Bullseye and YunoHost 11.x", "migration_description_0022_php73_to_php74_pools": "Migrate php7.3-fpm 'pool' conf files to php7.4", "migration_description_0023_postgresql_11_to_13": "Migrate databases from PostgreSQL 11 to 13", diff --git a/src/migrations/0024_rebuild_python_venv.py b/src/migrations/0024_rebuild_python_venv.py new file mode 100644 index 000000000..7d6530c8c --- /dev/null +++ b/src/migrations/0024_rebuild_python_venv.py @@ -0,0 +1,74 @@ +import subprocess +import os + +from moulinette import m18n +from moulinette.utils.log import getActionLogger +from moulinette.utils.process import call_async_output + +from yunohost.tools import Migration +from yunohost.utils.filesystem import read_file, rm + +logger = getActionLogger("yunohost.migration") + +VENV_REQUIREMENTS_SUFFIX = ".requirements_backup_for_bullseye_upgrade.txt" +VENV_IGNORE = "ynh_migration_no_regen" + + +def _get_all_venvs(dir, level=0, maxlevel=3): + """ + Returns the list of all python virtual env directories recursively + + Arguments: + dir - the directory to scan in + maxlevel - the depth of the recursion + level - do not edit this, used as an iterator + """ + # Using os functions instead of glob, because glob doesn't support hidden + # folders, and we need recursion with a fixed depth + result = [] + for file in os.listdir(dir): + path = os.path.join(dir, file) + if os.path.isdir(path): + if os.path.isfile(os.path.join(path, VENV_IGNORE)): + continue + activatepath = os.path.join(path, "bin", "activate") + if os.path.isfile(activatepath): + content = read_file(activatepath) + if ("VIRTUAL_ENV" in content) and ("PYTHONHOME" in content): + result.append(path) + continue + if level < maxlevel: + result += _get_all_venvs(path, level=level + 1) + return result + + +class MyMigration(Migration): + """ + After the update, recreate a python virtual env based on the previously + generated requirements file + """ + + dependencies = ["migrate_to_bullseye"] + + def run(self): + + venvs = _get_all_venvs("/opt/") + _get_all_venvs("/var/www/") + for venv in venvs: + if not os.path.isfile(venv + VENV_REQUIREMENTS_SUFFIX): + continue + + # Recreate the venv + rm(venv, recursive=True) + callbacks = ( + lambda l: logger.info("+ " + l.rstrip() + "\r"), + lambda l: logger.warning(l.rstrip()) + ) + call_async_output(["python", "-m", "venv", venv], callbacks) + status = call_async_output([ + "{venv}/bin/pip", "install", "-r", + venv + VENV_REQUIREMENTS_SUFFIX], callbacks) + if status != 0: + logger.warning(m18n.n("migration_0024_rebuild_python_venv", + venv=venv)) + else: + rm(venv + VENV_REQUIREMENTS_SUFFIX) From 1d84e07988a59cc55348450860d2e91ff95bdd08 Mon Sep 17 00:00:00 2001 From: ljf Date: Sun, 7 Aug 2022 18:59:39 +0200 Subject: [PATCH 509/619] [enh] Add disclaimer and manual or automatic mode on python migrations --- locales/en.json | 4 ++ src/migrations/0024_rebuild_python_venv.py | 74 ++++++++++++++++++++-- 2 files changed, 73 insertions(+), 5 deletions(-) diff --git a/locales/en.json b/locales/en.json index f4d4492ab..2d283d9fe 100644 --- a/locales/en.json +++ b/locales/en.json @@ -503,10 +503,14 @@ "migration_0023_not_enough_space": "Make sufficient space available in {path} to run the migration.", "migration_0023_postgresql_11_not_installed": "PostgreSQL was not installed on your system. Nothing to do.", "migration_0023_postgresql_13_not_installed": "PostgreSQL 11 is installed, but not PostgreSQL 13!? Something weird might have happened on your system :(...", + "migration_0024_rebuild_python_venv_broken_app": "To upgrade your app {app} to bullseye, you probably should force the upgrade of this app thanks to `yunohost app upgrade --force {app}`", + "migration_0024_rebuild_python_venv_disclaimer": "Python applications doesn't support upgrade to bullseye and need an extra steps to rebuild their virtual environement. By running this migration, YunoHost will try to rebuild automaticcaly your Python apps except for : {apps}. For those apps, you should force the upgrade manually by running `yunohost app upgrade -f APP`.", + "migration_0024_rebuild_python_venv_in_progress": "Rebuild the python virtualenv `{venv}`", "migration_0024_rebuild_python_venv_failed": "Unable to rebuild the python virtual env {venv}, this app is probably broken. If your app is broken, you probably should force the upgrade of this app thanks to `yunohost app upgrade --force APP`", "migration_description_0021_migrate_to_bullseye": "Upgrade the system to Debian Bullseye and YunoHost 11.x", "migration_description_0022_php73_to_php74_pools": "Migrate php7.3-fpm 'pool' conf files to php7.4", "migration_description_0023_postgresql_11_to_13": "Migrate databases from PostgreSQL 11 to 13", + "migration_description_0024_rebuild_python_venv": "Repair python app after bullseye migration", "migration_ldap_backup_before_migration": "Creating a backup of LDAP database and apps settings prior to the actual migration.", "migration_ldap_can_not_backup_before_migration": "The backup of the system could not be completed before the migration failed. Error: {error}", "migration_ldap_migration_failed_trying_to_rollback": "Could not migrate... trying to roll back the system.", diff --git a/src/migrations/0024_rebuild_python_venv.py b/src/migrations/0024_rebuild_python_venv.py index 7d6530c8c..e3ffa99ae 100644 --- a/src/migrations/0024_rebuild_python_venv.py +++ b/src/migrations/0024_rebuild_python_venv.py @@ -1,12 +1,12 @@ -import subprocess import os from moulinette import m18n from moulinette.utils.log import getActionLogger from moulinette.utils.process import call_async_output -from yunohost.tools import Migration -from yunohost.utils.filesystem import read_file, rm +from yunohost.tools import Migration, tools_migrations_state +from moulinette.utils.filesystem import rm, read_file + logger = getActionLogger("yunohost.migration") @@ -47,8 +47,59 @@ class MyMigration(Migration): After the update, recreate a python virtual env based on the previously generated requirements file """ + ignored_python_apps = [ + "calibreweb", + "django-for-runners", + "ffsync", + "jupiterlab", + "librephotos", + "mautrix", + "mediadrop", + "mopidy", + "pgadmin", + "tracim", + "synapse", + "weblate" + ] dependencies = ["migrate_to_bullseye"] + state = None + + def is_pending(self): + if not self.state: + self.state = tools_migrations_state()["migrations"].get("0024_rebuild_python_venv", "pending") + return self.state == "pending" + + @property + def mode(self): + if not self.is_pending(): + return "auto" + + if _get_all_venvs("/opt/") + _get_all_venvs("/var/www/"): + return "manual" + else: + return "auto" + + @property + def disclaimer(self): + # Avoid having a super long disclaimer to generate if migrations has + # been done + if not self.is_pending(): + return None + + apps = [] + venvs = _get_all_venvs("/opt/") + _get_all_venvs("/var/www/") + for venv in venvs: + if not os.path.isfile(venv + VENV_REQUIREMENTS_SUFFIX): + continue + + # Search for ignore apps + for app in self.ignored_python_apps: + if app in venv: + apps.append(app) + + return m18n.n("migration_0024_rebuild_python_venv_disclaimer", + apps=", ".join(apps)) def run(self): @@ -57,15 +108,28 @@ class MyMigration(Migration): if not os.path.isfile(venv + VENV_REQUIREMENTS_SUFFIX): continue + # Search for ignore apps + ignored_app = None + for app in self.ignored_python_apps: + if app in venv: + ignored_app = app + + if ignored_app: + rm(venv + VENV_REQUIREMENTS_SUFFIX) + logger.info(m18n.n("migration_0024_rebuild_python_venv_broken_app", app=ignored_app)) + continue + + logger.info(m18n.n("migration_0024_rebuild_python_venv_in_progress", venv=venv)) + # Recreate the venv rm(venv, recursive=True) callbacks = ( - lambda l: logger.info("+ " + l.rstrip() + "\r"), + lambda l: logger.debug("+ " + l.rstrip() + "\r"), lambda l: logger.warning(l.rstrip()) ) call_async_output(["python", "-m", "venv", venv], callbacks) status = call_async_output([ - "{venv}/bin/pip", "install", "-r", + f"{venv}/bin/pip", "install", "-r", venv + VENV_REQUIREMENTS_SUFFIX], callbacks) if status != 0: logger.warning(m18n.n("migration_0024_rebuild_python_venv", From 0a737c4e9b3a44811b20027b52c38cf12a3f60e4 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Sun, 7 Aug 2022 22:24:50 +0200 Subject: [PATCH 510/619] venv rebuild: various improvements in the migration code --- locales/en.json | 10 ++-- src/migrations/0024_rebuild_python_venv.py | 54 ++++++++++++++-------- 2 files changed, 40 insertions(+), 24 deletions(-) diff --git a/locales/en.json b/locales/en.json index 2d283d9fe..8ede9f092 100644 --- a/locales/en.json +++ b/locales/en.json @@ -503,10 +503,12 @@ "migration_0023_not_enough_space": "Make sufficient space available in {path} to run the migration.", "migration_0023_postgresql_11_not_installed": "PostgreSQL was not installed on your system. Nothing to do.", "migration_0023_postgresql_13_not_installed": "PostgreSQL 11 is installed, but not PostgreSQL 13!? Something weird might have happened on your system :(...", - "migration_0024_rebuild_python_venv_broken_app": "To upgrade your app {app} to bullseye, you probably should force the upgrade of this app thanks to `yunohost app upgrade --force {app}`", - "migration_0024_rebuild_python_venv_disclaimer": "Python applications doesn't support upgrade to bullseye and need an extra steps to rebuild their virtual environement. By running this migration, YunoHost will try to rebuild automaticcaly your Python apps except for : {apps}. For those apps, you should force the upgrade manually by running `yunohost app upgrade -f APP`.", - "migration_0024_rebuild_python_venv_in_progress": "Rebuild the python virtualenv `{venv}`", - "migration_0024_rebuild_python_venv_failed": "Unable to rebuild the python virtual env {venv}, this app is probably broken. If your app is broken, you probably should force the upgrade of this app thanks to `yunohost app upgrade --force APP`", + "migration_0024_rebuild_python_venv_broken_app": "Skipping {app} because virtualenv can't easily be rebuilt for this app. Instead, you should fix the situation by forcing the upgrade of this app using `yunohost app upgrade --force {app}`.", + "migration_0024_rebuild_python_venv_disclaimer_base": "Following the upgrade to Debian Bullseye, some Python applications needs to be partially rebuilt to get converted to the new Python version shipped in Debian (in technical terms: what's called the 'virtualenv' needs to be recreated). In the meantime, those Python applications may not work. YunoHost can attempt to rebuild the virtualenv for some of those, as detailed below. For other apps, or if the rebuild attempt fails, you will need to manually force an upgrade for those apps.", + "migration_0024_rebuild_python_venv_disclaimer_rebuild": "Rebuilding the virtualenv will be attempted for the following apps (NB: the operation may take some time!): {rebuid_apps}", + "migration_0024_rebuild_python_venv_disclaimer_ignored": "Virtualenvs can't be rebuilt automatically for those apps. You need to force an upgrade for those, which can be done from the command line with: `yunohost app upgrade -f APP`: {ignored_apps}", + "migration_0024_rebuild_python_venv_in_progress": "Now attempting to rebuild python virtualenv for `{app}`", + "migration_0024_rebuild_python_venv_failed": "Failed to rebuild the python virtual env for {app}. The app may not work as long as this is not resolved. You should fix the situation by forcing the upgrade of this app using `yunohost app upgrade --force {app}`.", "migration_description_0021_migrate_to_bullseye": "Upgrade the system to Debian Bullseye and YunoHost 11.x", "migration_description_0022_php73_to_php74_pools": "Migrate php7.3-fpm 'pool' conf files to php7.4", "migration_description_0023_postgresql_11_to_13": "Migrate databases from PostgreSQL 11 to 13", diff --git a/src/migrations/0024_rebuild_python_venv.py b/src/migrations/0024_rebuild_python_venv.py index e3ffa99ae..7e659b3df 100644 --- a/src/migrations/0024_rebuild_python_venv.py +++ b/src/migrations/0024_rebuild_python_venv.py @@ -11,7 +11,14 @@ from moulinette.utils.filesystem import rm, read_file logger = getActionLogger("yunohost.migration") VENV_REQUIREMENTS_SUFFIX = ".requirements_backup_for_bullseye_upgrade.txt" -VENV_IGNORE = "ynh_migration_no_regen" + + +def extract_app_from_venv_path(venv_path): + + venv_path = venv_path.replace("/var/www/", "") + venv_path = venv_path.replace("/opt/yunohost/", "") + venv_path = venv_path.replace("/opt/", "") + return venv_path.split("/")[0] def _get_all_venvs(dir, level=0, maxlevel=3): @@ -29,8 +36,6 @@ def _get_all_venvs(dir, level=0, maxlevel=3): for file in os.listdir(dir): path = os.path.join(dir, file) if os.path.isdir(path): - if os.path.isfile(os.path.join(path, VENV_IGNORE)): - continue activatepath = os.path.join(path, "bin", "activate") if os.path.isfile(activatepath): content = read_file(activatepath) @@ -87,19 +92,31 @@ class MyMigration(Migration): if not self.is_pending(): return None - apps = [] + ignored_apps = [] + rebuild_apps = [] + venvs = _get_all_venvs("/opt/") + _get_all_venvs("/var/www/") for venv in venvs: if not os.path.isfile(venv + VENV_REQUIREMENTS_SUFFIX): continue - # Search for ignore apps - for app in self.ignored_python_apps: - if app in venv: - apps.append(app) + app_corresponding_to_venv = extract_app_from_venv_path(venv) - return m18n.n("migration_0024_rebuild_python_venv_disclaimer", - apps=", ".join(apps)) + # Search for ignore apps + if any(app_corresponding_to_venv.startswith(app) for app in self.ignored_python_apps): + ignored_apps.append(app_corresponding_to_venv) + else: + rebuild_apps.append(app_corresponding_to_venv) + + msg = m18n.n("migration_0024_rebuild_python_venv_disclaimer_base", + if rebuild_apps: + msg += "\n\n" + m18n.n("migration_0024_rebuild_python_venv_disclaimer_rebuild", + rebuild_apps="\n - " + "\n - ".join(rebuild_apps)) + if ignored_apps: + msg += "\n\n" + m18n.n("migration_0024_rebuild_python_venv_disclaimer_ignored", + ignored_apps="\n - " + "\n - ".join(ignored_apps)) + + return msg def run(self): @@ -108,18 +125,15 @@ class MyMigration(Migration): if not os.path.isfile(venv + VENV_REQUIREMENTS_SUFFIX): continue - # Search for ignore apps - ignored_app = None - for app in self.ignored_python_apps: - if app in venv: - ignored_app = app + app_corresponding_to_venv = extract_app_from_venv_path(venv) - if ignored_app: + # Search for ignore apps + if any(app_corresponding_to_venv.startswith(app) for app in self.ignored_python_apps): rm(venv + VENV_REQUIREMENTS_SUFFIX) - logger.info(m18n.n("migration_0024_rebuild_python_venv_broken_app", app=ignored_app)) + logger.info(m18n.n("migration_0024_rebuild_python_venv_broken_app", app=app_corresponding_to_venv)) continue - logger.info(m18n.n("migration_0024_rebuild_python_venv_in_progress", venv=venv)) + logger.info(m18n.n("migration_0024_rebuild_python_venv_in_progress", app=app_corresponding_to_venv)) # Recreate the venv rm(venv, recursive=True) @@ -132,7 +146,7 @@ class MyMigration(Migration): f"{venv}/bin/pip", "install", "-r", venv + VENV_REQUIREMENTS_SUFFIX], callbacks) if status != 0: - logger.warning(m18n.n("migration_0024_rebuild_python_venv", - venv=venv)) + logger.error(m18n.n("migration_0024_rebuild_python_venv_failed", + app=app_corresponding_to_venv)) else: rm(venv + VENV_REQUIREMENTS_SUFFIX) From 5f265d0c160eed83bf5e6b1107180c4dc61fb9e5 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Sun, 7 Aug 2022 22:26:59 +0200 Subject: [PATCH 511/619] Typo :| --- src/migrations/0024_rebuild_python_venv.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/migrations/0024_rebuild_python_venv.py b/src/migrations/0024_rebuild_python_venv.py index 7e659b3df..0362c8576 100644 --- a/src/migrations/0024_rebuild_python_venv.py +++ b/src/migrations/0024_rebuild_python_venv.py @@ -108,7 +108,7 @@ class MyMigration(Migration): else: rebuild_apps.append(app_corresponding_to_venv) - msg = m18n.n("migration_0024_rebuild_python_venv_disclaimer_base", + msg = m18n.n("migration_0024_rebuild_python_venv_disclaimer_base") if rebuild_apps: msg += "\n\n" + m18n.n("migration_0024_rebuild_python_venv_disclaimer_rebuild", rebuild_apps="\n - " + "\n - ".join(rebuild_apps)) From a4fca12ebfc4f2e30217acea96fee28d25c01f2f Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Sun, 7 Aug 2022 22:33:53 +0200 Subject: [PATCH 512/619] venv rebuild: moar logic fixes --- locales/en.json | 2 +- src/migrations/0024_rebuild_python_venv.py | 10 +++------- 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/locales/en.json b/locales/en.json index 8ede9f092..c34cf0198 100644 --- a/locales/en.json +++ b/locales/en.json @@ -505,7 +505,7 @@ "migration_0023_postgresql_13_not_installed": "PostgreSQL 11 is installed, but not PostgreSQL 13!? Something weird might have happened on your system :(...", "migration_0024_rebuild_python_venv_broken_app": "Skipping {app} because virtualenv can't easily be rebuilt for this app. Instead, you should fix the situation by forcing the upgrade of this app using `yunohost app upgrade --force {app}`.", "migration_0024_rebuild_python_venv_disclaimer_base": "Following the upgrade to Debian Bullseye, some Python applications needs to be partially rebuilt to get converted to the new Python version shipped in Debian (in technical terms: what's called the 'virtualenv' needs to be recreated). In the meantime, those Python applications may not work. YunoHost can attempt to rebuild the virtualenv for some of those, as detailed below. For other apps, or if the rebuild attempt fails, you will need to manually force an upgrade for those apps.", - "migration_0024_rebuild_python_venv_disclaimer_rebuild": "Rebuilding the virtualenv will be attempted for the following apps (NB: the operation may take some time!): {rebuid_apps}", + "migration_0024_rebuild_python_venv_disclaimer_rebuild": "Rebuilding the virtualenv will be attempted for the following apps (NB: the operation may take some time!): {rebuild_apps}", "migration_0024_rebuild_python_venv_disclaimer_ignored": "Virtualenvs can't be rebuilt automatically for those apps. You need to force an upgrade for those, which can be done from the command line with: `yunohost app upgrade -f APP`: {ignored_apps}", "migration_0024_rebuild_python_venv_in_progress": "Now attempting to rebuild python virtualenv for `{app}`", "migration_0024_rebuild_python_venv_failed": "Failed to rebuild the python virtual env for {app}. The app may not work as long as this is not resolved. You should fix the situation by forcing the upgrade of this app using `yunohost app upgrade --force {app}`.", diff --git a/src/migrations/0024_rebuild_python_venv.py b/src/migrations/0024_rebuild_python_venv.py index 0362c8576..a2f3e57f9 100644 --- a/src/migrations/0024_rebuild_python_venv.py +++ b/src/migrations/0024_rebuild_python_venv.py @@ -37,11 +37,9 @@ def _get_all_venvs(dir, level=0, maxlevel=3): path = os.path.join(dir, file) if os.path.isdir(path): activatepath = os.path.join(path, "bin", "activate") - if os.path.isfile(activatepath): - content = read_file(activatepath) - if ("VIRTUAL_ENV" in content) and ("PYTHONHOME" in content): - result.append(path) - continue + if os.path.isfile(activatepath) and os.path.isfile(path + VENV_REQUIREMENTS_SUFFIX): + result.append(path) + continue if level < maxlevel: result += _get_all_venvs(path, level=level + 1) return result @@ -122,8 +120,6 @@ class MyMigration(Migration): venvs = _get_all_venvs("/opt/") + _get_all_venvs("/var/www/") for venv in venvs: - if not os.path.isfile(venv + VENV_REQUIREMENTS_SUFFIX): - continue app_corresponding_to_venv = extract_app_from_venv_path(venv) From 4251976c48fce21f2da8aa1ee42d653e613cf916 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Sun, 7 Aug 2022 22:46:41 +0200 Subject: [PATCH 513/619] Unused import --- src/migrations/0024_rebuild_python_venv.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/migrations/0024_rebuild_python_venv.py b/src/migrations/0024_rebuild_python_venv.py index a2f3e57f9..b90a35f60 100644 --- a/src/migrations/0024_rebuild_python_venv.py +++ b/src/migrations/0024_rebuild_python_venv.py @@ -5,7 +5,7 @@ from moulinette.utils.log import getActionLogger from moulinette.utils.process import call_async_output from yunohost.tools import Migration, tools_migrations_state -from moulinette.utils.filesystem import rm, read_file +from moulinette.utils.filesystem import rm logger = getActionLogger("yunohost.migration") From bb87891cb6211d49162a16a755359473ebfa18fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Gaspar?= Date: Sun, 7 Aug 2022 13:27:51 +0000 Subject: [PATCH 514/619] Translated using Weblate (French) Currently translated at 100.0% (686 of 686 strings) Translation: YunoHost/core Translate-URL: https://translate.yunohost.org/projects/yunohost/core/fr/ --- locales/fr.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/locales/fr.json b/locales/fr.json index 2773d0bee..77f1ca9d1 100644 --- a/locales/fr.json +++ b/locales/fr.json @@ -151,7 +151,7 @@ "certmanager_attempt_to_renew_nonLE_cert": "Le certificat pour le domaine {domain} n'est pas émis par Let's Encrypt. Impossible de le renouveler automatiquement !", "certmanager_attempt_to_renew_valid_cert": "Le certificat pour le domaine {domain} n'est pas sur le point d'expirer ! (Vous pouvez utiliser --force si vous savez ce que vous faites)", "certmanager_domain_http_not_working": "Le domaine {domain} ne semble pas être accessible via HTTP. Merci de vérifier la catégorie 'Web' dans le diagnostic pour plus d'informations. (Ou si vous savez ce que vous faites, utilisez '--no-checks' pour désactiver la vérification.)", - "certmanager_domain_dns_ip_differs_from_public_ip": "Les enregistrements DNS du domaine '{domain}' sont différents de l'adresse IP de ce serveur. Pour plus d'informations, veuillez consulter la catégorie \"Enregistrements DNS\" dans la section diagnostic. Si vous avez récemment modifié votre enregistrement A, veuillez attendre sa propagation (des vérificateurs de propagation DNS sont disponibles en ligne). (Si vous savez ce que vous faites, utilisez '--no-checks' pour désactiver ces contrôles)", + "certmanager_domain_dns_ip_differs_from_public_ip": "Les enregistrements DNS du domaine '{domain}' sont différents de l'adresse IP de ce serveur. Pour plus d'informations, veuillez consulter la catégorie \"Enregistrements DNS\" dans la section Diagnostic. Si vous avez récemment modifié votre enregistrement A, veuillez attendre sa propagation (des vérificateurs de propagation DNS sont disponibles en ligne). (Si vous savez ce que vous faites, utilisez '--no-checks' pour désactiver ces contrôles)", "certmanager_cannot_read_cert": "Quelque chose s'est mal passé lors de la tentative d'ouverture du certificat actuel pour le domaine {domain} (fichier : {file}), la cause est : {reason}", "certmanager_cert_install_success_selfsigned": "Le certificat auto-signé est maintenant installé pour le domaine '{domain}'", "certmanager_cert_install_success": "Le certificat Let's Encrypt est maintenant installé pour le domaine '{domain}'", @@ -546,7 +546,7 @@ "app_manifest_install_ask_domain": "Choisissez le domaine sur lequel vous souhaitez installer cette application", "global_settings_setting_smtp_relay_user": "Compte utilisateur du relais SMTP", "global_settings_setting_smtp_relay_port": "Port du relais SMTP", - "global_settings_setting_smtp_relay_host": "Un relais SMTP permet d'envoyer du courrier à la place de cette instance YunoHost. Cela est utile si vous êtes dans l'une de ces situations : le port 25 est bloqué par votre FAI ou par votre fournisseur VPS, vous avez une IP résidentielle répertoriée sur DUHL, vous ne pouvez pas configurer de reverse DNS ou le serveur n'est pas directement accessible depuis Internet et que vous voulez en utiliser un autre pour envoyer des mails.", + "global_settings_setting_smtp_relay_host": "Un relais SMTP permet d'envoyer du courrier à la place de cette instance YunoHost. Cela est utile si vous êtes dans l'une de ces situations : le port 25 est bloqué par votre FAI ou par votre fournisseur VPS ; vous avez une IP résidentielle répertoriée sur DUHL ; vous ne pouvez pas configurer le DNS inversé ; ou le serveur n'est pas directement accessible depuis Internet et vous voulez en utiliser un autre pour envoyer des mails.", "diagnosis_package_installed_from_sury_details": "Certains paquets ont été installés par inadvertance à partir d'un dépôt tiers appelé Sury. L'équipe YunoHost a amélioré la stratégie de gestion de ces paquets, mais on s'attend à ce que certaines configurations qui ont installé des applications PHP7.3 tout en étant toujours sur Stretch présentent des incohérences. Pour résoudre cette situation, vous devez essayer d'exécuter la commande suivante : {cmd_to_fix}", "app_argument_password_no_default": "Erreur lors de l'analyse de l'argument de mot de passe '{name}' : l'argument de mot de passe ne peut pas avoir de valeur par défaut pour des raisons de sécurité", "pattern_email_forward": "L'adresse électronique doit être valide, le symbole '+' étant accepté (par exemple : johndoe+yunohost@exemple.com)", @@ -571,7 +571,7 @@ "diagnosis_rootfstotalspace_warning": "Le système de fichiers racine n'est que de {space}. Cela peut suffire, mais faites attention car vous risquez de les remplir rapidement... Il est recommandé d'avoir au moins 16 GB pour ce système de fichiers.", "app_restore_script_failed": "Une erreur s'est produite dans le script de restauration de l'application", "restore_backup_too_old": "Cette sauvegarde ne peut pas être restaurée car elle provient d'une version de YunoHost trop ancienne.", - "log_backup_create": "Création d'une archive de sauvegarde", + "log_backup_create": "Créer une archive de sauvegarde", "global_settings_setting_ssowat_panel_overlay_enabled": "Activer la superposition de la vignette SSOwat", "migration_ldap_rollback_success": "Système rétabli dans son état initial.", "permission_cant_add_to_all_users": "L'autorisation {permission} ne peut pas être ajoutée à tous les utilisateurs.", From 8a9ed1ed7af94b3585ec2f2e43f49c93f2416110 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Sun, 7 Aug 2022 23:29:44 +0200 Subject: [PATCH 515/619] Update changelog for 11.0.9 --- debian/changelog | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/debian/changelog b/debian/changelog index 3a7d37aed..929d94c44 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,13 @@ +yunohost (11.0.9) stable; urgency=low + + - [fix] services: Skip php 7.3 which is most likely dead after buster->bullseye migration because users get spooked (51804925) + - [enh] bullseye: add a migration process to automatically attempt to rebuild venvs (3b8e49dc) + - [i18n] Translations updated for French + + Thanks to all contributors <3 ! (Éric Gaspar, Kayou, ljf, theo-is-taken) + + -- Alexandre Aubin Sun, 07 Aug 2022 23:27:41 +0200 + yunohost (11.0.8.1) testing; urgency=low - Fix tests é_è (7fa67b2b) From 8cef37d704aed37d74254ee63f3498a2f1a697c1 Mon Sep 17 00:00:00 2001 From: yunohost-bot Date: Mon, 8 Aug 2022 16:59:42 +0000 Subject: [PATCH 516/619] [CI] Format code with Black --- src/migrations/0021_migrate_to_bullseye.py | 23 +++---- src/migrations/0024_rebuild_python_venv.py | 74 +++++++++++++++------- src/tools.py | 4 +- src/user.py | 4 +- 4 files changed, 68 insertions(+), 37 deletions(-) diff --git a/src/migrations/0021_migrate_to_bullseye.py b/src/migrations/0021_migrate_to_bullseye.py index f5e7f518c..7577c852c 100644 --- a/src/migrations/0021_migrate_to_bullseye.py +++ b/src/migrations/0021_migrate_to_bullseye.py @@ -35,19 +35,19 @@ VENV_REQUIREMENTS_SUFFIX = ".requirements_backup_for_bullseye_upgrade.txt" def _get_all_venvs(dir, level=0, maxlevel=3): """ - Returns the list of all python virtual env directories recursively + Returns the list of all python virtual env directories recursively - Arguments: - dir - the directory to scan in - maxlevel - the depth of the recursion - level - do not edit this, used as an iterator + Arguments: + dir - the directory to scan in + maxlevel - the depth of the recursion + level - do not edit this, used as an iterator """ # Using os functions instead of glob, because glob doesn't support hidden folders, and we need recursion with a fixed depth result = [] for file in os.listdir(dir): path = os.path.join(dir, file) if os.path.isdir(path): - activatepath = os.path.join(path,"bin", "activate") + activatepath = os.path.join(path, "bin", "activate") if os.path.isfile(activatepath): content = read_file(activatepath) if ("VIRTUAL_ENV" in content) and ("PYTHONHOME" in content): @@ -60,7 +60,7 @@ def _get_all_venvs(dir, level=0, maxlevel=3): def _backup_pip_freeze_for_python_app_venvs(): """ - Generate a requirements file for all python virtual env located inside /opt/ and /var/www/ + Generate a requirements file for all python virtual env located inside /opt/ and /var/www/ """ venvs = _get_all_venvs("/opt/") + _get_all_venvs("/var/www/") @@ -308,7 +308,6 @@ class MyMigration(Migration): tools_upgrade(target="system", postupgradecmds=postupgradecmds) - def debian_major_version(self): # The python module "platform" and lsb_release are not reliable because # on some setup, they may still return Release=9 even after upgrading to @@ -344,7 +343,9 @@ class MyMigration(Migration): # Check system is up to date # (but we don't if 'bullseye' is already in the sources.list ... # which means maybe a previous upgrade crashed and we're re-running it) - if os.path.exists("/etc/apt/sources.list") and " bullseye " not in read_file("/etc/apt/sources.list"): + if os.path.exists("/etc/apt/sources.list") and " bullseye " not in read_file( + "/etc/apt/sources.list" + ): tools_update(target="system") upgradable_system_packages = list(_list_upgradable_apt_packages()) upgradable_system_packages = [ @@ -391,8 +392,8 @@ class MyMigration(Migration): message = m18n.n("migration_0021_general_warning") message = ( - "N.B.: This migration has been tested by the community over the last few months but has only been declared stable recently. If your server hosts critical services and if you are not too confident with debugging possible issues, we recommend you to wait a little bit more while we gather more feedback and polish things up. If on the other hand you are relatively confident with debugging small issues that may arise, you are encouraged to run this migration ;)! You can read about remaining known issues and feedback from the community here: https://forum.yunohost.org/t/20590\n\n" - + message + "N.B.: This migration has been tested by the community over the last few months but has only been declared stable recently. If your server hosts critical services and if you are not too confident with debugging possible issues, we recommend you to wait a little bit more while we gather more feedback and polish things up. If on the other hand you are relatively confident with debugging small issues that may arise, you are encouraged to run this migration ;)! You can read about remaining known issues and feedback from the community here: https://forum.yunohost.org/t/20590\n\n" + + message ) if problematic_apps: diff --git a/src/migrations/0024_rebuild_python_venv.py b/src/migrations/0024_rebuild_python_venv.py index b90a35f60..f39c27c49 100644 --- a/src/migrations/0024_rebuild_python_venv.py +++ b/src/migrations/0024_rebuild_python_venv.py @@ -23,12 +23,12 @@ def extract_app_from_venv_path(venv_path): def _get_all_venvs(dir, level=0, maxlevel=3): """ - Returns the list of all python virtual env directories recursively + Returns the list of all python virtual env directories recursively - Arguments: - dir - the directory to scan in - maxlevel - the depth of the recursion - level - do not edit this, used as an iterator + Arguments: + dir - the directory to scan in + maxlevel - the depth of the recursion + level - do not edit this, used as an iterator """ # Using os functions instead of glob, because glob doesn't support hidden # folders, and we need recursion with a fixed depth @@ -37,7 +37,9 @@ def _get_all_venvs(dir, level=0, maxlevel=3): path = os.path.join(dir, file) if os.path.isdir(path): activatepath = os.path.join(path, "bin", "activate") - if os.path.isfile(activatepath) and os.path.isfile(path + VENV_REQUIREMENTS_SUFFIX): + if os.path.isfile(activatepath) and os.path.isfile( + path + VENV_REQUIREMENTS_SUFFIX + ): result.append(path) continue if level < maxlevel: @@ -50,6 +52,7 @@ class MyMigration(Migration): After the update, recreate a python virtual env based on the previously generated requirements file """ + ignored_python_apps = [ "calibreweb", "django-for-runners", @@ -62,7 +65,7 @@ class MyMigration(Migration): "pgadmin", "tracim", "synapse", - "weblate" + "weblate", ] dependencies = ["migrate_to_bullseye"] @@ -70,7 +73,9 @@ class MyMigration(Migration): def is_pending(self): if not self.state: - self.state = tools_migrations_state()["migrations"].get("0024_rebuild_python_venv", "pending") + self.state = tools_migrations_state()["migrations"].get( + "0024_rebuild_python_venv", "pending" + ) return self.state == "pending" @property @@ -101,18 +106,25 @@ class MyMigration(Migration): app_corresponding_to_venv = extract_app_from_venv_path(venv) # Search for ignore apps - if any(app_corresponding_to_venv.startswith(app) for app in self.ignored_python_apps): + if any( + app_corresponding_to_venv.startswith(app) + for app in self.ignored_python_apps + ): ignored_apps.append(app_corresponding_to_venv) else: rebuild_apps.append(app_corresponding_to_venv) msg = m18n.n("migration_0024_rebuild_python_venv_disclaimer_base") if rebuild_apps: - msg += "\n\n" + m18n.n("migration_0024_rebuild_python_venv_disclaimer_rebuild", - rebuild_apps="\n - " + "\n - ".join(rebuild_apps)) + msg += "\n\n" + m18n.n( + "migration_0024_rebuild_python_venv_disclaimer_rebuild", + rebuild_apps="\n - " + "\n - ".join(rebuild_apps), + ) if ignored_apps: - msg += "\n\n" + m18n.n("migration_0024_rebuild_python_venv_disclaimer_ignored", - ignored_apps="\n - " + "\n - ".join(ignored_apps)) + msg += "\n\n" + m18n.n( + "migration_0024_rebuild_python_venv_disclaimer_ignored", + ignored_apps="\n - " + "\n - ".join(ignored_apps), + ) return msg @@ -124,25 +136,43 @@ class MyMigration(Migration): app_corresponding_to_venv = extract_app_from_venv_path(venv) # Search for ignore apps - if any(app_corresponding_to_venv.startswith(app) for app in self.ignored_python_apps): + if any( + app_corresponding_to_venv.startswith(app) + for app in self.ignored_python_apps + ): rm(venv + VENV_REQUIREMENTS_SUFFIX) - logger.info(m18n.n("migration_0024_rebuild_python_venv_broken_app", app=app_corresponding_to_venv)) + logger.info( + m18n.n( + "migration_0024_rebuild_python_venv_broken_app", + app=app_corresponding_to_venv, + ) + ) continue - logger.info(m18n.n("migration_0024_rebuild_python_venv_in_progress", app=app_corresponding_to_venv)) + logger.info( + m18n.n( + "migration_0024_rebuild_python_venv_in_progress", + app=app_corresponding_to_venv, + ) + ) # Recreate the venv rm(venv, recursive=True) callbacks = ( lambda l: logger.debug("+ " + l.rstrip() + "\r"), - lambda l: logger.warning(l.rstrip()) + lambda l: logger.warning(l.rstrip()), ) call_async_output(["python", "-m", "venv", venv], callbacks) - status = call_async_output([ - f"{venv}/bin/pip", "install", "-r", - venv + VENV_REQUIREMENTS_SUFFIX], callbacks) + status = call_async_output( + [f"{venv}/bin/pip", "install", "-r", venv + VENV_REQUIREMENTS_SUFFIX], + callbacks, + ) if status != 0: - logger.error(m18n.n("migration_0024_rebuild_python_venv_failed", - app=app_corresponding_to_venv)) + logger.error( + m18n.n( + "migration_0024_rebuild_python_venv_failed", + app=app_corresponding_to_venv, + ) + ) else: rm(venv + VENV_REQUIREMENTS_SUFFIX) diff --git a/src/tools.py b/src/tools.py index 844a2a3ba..abf224c1c 100644 --- a/src/tools.py +++ b/src/tools.py @@ -73,7 +73,7 @@ def tools_adminpw(new_password, check_strength=True): from yunohost.user import _hash_user_password from yunohost.utils.password import ( assert_password_is_strong_enough, - assert_password_is_compatible + assert_password_is_compatible, ) import spwd @@ -203,7 +203,7 @@ def tools_postinstall( from yunohost.utils.dns import is_yunohost_dyndns_domain from yunohost.utils.password import ( assert_password_is_strong_enough, - assert_password_is_compatible + assert_password_is_compatible, ) from yunohost.domain import domain_main_domain import psutil diff --git a/src/user.py b/src/user.py index ce0cea60d..0c5a577d7 100644 --- a/src/user.py +++ b/src/user.py @@ -145,7 +145,7 @@ def user_create( from yunohost.hook import hook_callback from yunohost.utils.password import ( assert_password_is_strong_enough, - assert_password_is_compatible + assert_password_is_compatible, ) from yunohost.utils.ldap import _get_ldap_interface @@ -371,7 +371,7 @@ def user_update( from yunohost.app import app_ssowatconf from yunohost.utils.password import ( assert_password_is_strong_enough, - assert_password_is_compatible + assert_password_is_compatible, ) from yunohost.utils.ldap import _get_ldap_interface from yunohost.hook import hook_callback From fa207ebaff48fde81d0ad091ae60b5a39461b80a Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Tue, 9 Aug 2022 17:02:47 +0200 Subject: [PATCH 517/619] Update changelog for 4.4.2 --- debian/changelog | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/debian/changelog b/debian/changelog index 10bf04dc3..e9e8b2d44 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,15 @@ +yunohost (4.4.2) stable; urgency=low + + - Release as stable + - [fix] bullseye migration: /etc/apt/sources.list may not exist (b928dd12) + - [fix] bullseye migration: Allow lime2 to upgrade even if kernel is hold (#1452) + - [fix] bullseye migration: Save python apps venv in a requirements file, in order to regenerate it in a follow-up migration ([#1479](https://github.com/YunoHost/yunohost/pull/1479)) + - [fix] bullseye migration: tweak message to prepare for stable release (80015a72) + + Thanks to all contributors <3 ! (ljf, theo-is-taken) + + -- Alexandre Aubin Tue, 09 Aug 2022 16:59:15 +0200 + yunohost (4.4.1) testing; urgency=low - [fix] php helpers: prevent epic catastrophies when the app changes php version (31d3719b) From 7403d4679ff09a72694d55b41bf86746e50919ec Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Thu, 11 Aug 2022 15:49:44 +0200 Subject: [PATCH 518/619] Unused vars, black --- .../0021_migrate_to_bullseye.py | 48 ++++++++++--------- 1 file changed, 25 insertions(+), 23 deletions(-) diff --git a/src/yunohost/data_migrations/0021_migrate_to_bullseye.py b/src/yunohost/data_migrations/0021_migrate_to_bullseye.py index 3be8c9add..cb8a333f5 100644 --- a/src/yunohost/data_migrations/0021_migrate_to_bullseye.py +++ b/src/yunohost/data_migrations/0021_migrate_to_bullseye.py @@ -27,27 +27,24 @@ logger = getActionLogger("yunohost.migration") N_CURRENT_DEBIAN = 10 N_CURRENT_YUNOHOST = 4 -N_NEXT_DEBAN = 11 -N_NEXT_YUNOHOST = 11 - VENV_REQUIREMENTS_SUFFIX = ".requirements_backup_for_bullseye_upgrade.txt" def _get_all_venvs(dir, level=0, maxlevel=3): """ - Returns the list of all python virtual env directories recursively + Returns the list of all python virtual env directories recursively - Arguments: - dir - the directory to scan in - maxlevel - the depth of the recursion - level - do not edit this, used as an iterator + Arguments: + dir - the directory to scan in + maxlevel - the depth of the recursion + level - do not edit this, used as an iterator """ # Using os functions instead of glob, because glob doesn't support hidden folders, and we need recursion with a fixed depth result = [] for file in os.listdir(dir): path = os.path.join(dir, file) if os.path.isdir(path): - activatepath = os.path.join(path,"bin", "activate") + activatepath = os.path.join(path, "bin", "activate") if os.path.isfile(activatepath): content = read_file(activatepath) if ("VIRTUAL_ENV" in content) and ("PYTHONHOME" in content): @@ -60,7 +57,7 @@ def _get_all_venvs(dir, level=0, maxlevel=3): def _backup_pip_freeze_for_python_app_venvs(): """ - Generate a requirements file for all python virtual env located inside /opt/ and /var/www/ + Generate a requirements file for all python virtual env located inside /opt/ and /var/www/ """ venvs = _get_all_venvs("/opt/") + _get_all_venvs("/var/www/") @@ -308,7 +305,6 @@ class MyMigration(Migration): tools_upgrade(target="system", postupgradecmds=postupgradecmds) - def debian_major_version(self): # The python module "platform" and lsb_release are not reliable because # on some setup, they may still return Release=9 even after upgrading to @@ -344,21 +340,27 @@ class MyMigration(Migration): # Check system is up to date # (but we don't if 'bullseye' is already in the sources.list ... # which means maybe a previous upgrade crashed and we're re-running it) - if os.path.exists("/etc/apt/sources.list") and " bullseye " not in read_file("/etc/apt/sources.list"): + if os.path.exists("/etc/apt/sources.list") and " bullseye " not in read_file( + "/etc/apt/sources.list" + ): tools_update(target="system") upgradable_system_packages = list(_list_upgradable_apt_packages()) - upgradable_system_packages = [package["name"] for package in upgradable_system_packages] + upgradable_system_packages = [ + package["name"] for package in upgradable_system_packages + ] upgradable_system_packages = set(upgradable_system_packages) # Lime2 have hold packages to avoid ethernet instability # See https://github.com/YunoHost/arm-images/commit/b4ef8c99554fd1a122a306db7abacc4e2f2942df - lime2_hold_packages = set([ - "armbian-firmware", - "armbian-bsp-cli-lime2", - "linux-dtb-current-sunxi", - "linux-image-current-sunxi", - "linux-u-boot-lime2-current", - "linux-image-next-sunxi" - ]) + lime2_hold_packages = set( + [ + "armbian-firmware", + "armbian-bsp-cli-lime2", + "linux-dtb-current-sunxi", + "linux-image-current-sunxi", + "linux-u-boot-lime2-current", + "linux-image-next-sunxi", + ] + ) if upgradable_system_packages - lime2_hold_packages: raise YunohostError("migration_0021_system_not_fully_up_to_date") @@ -387,8 +389,8 @@ class MyMigration(Migration): message = m18n.n("migration_0021_general_warning") message = ( - "N.B.: This migration has been tested by the community over the last few months but has only been declared stable recently. If your server hosts critical services and if you are not too confident with debugging possible issues, we recommend you to wait a little bit more while we gather more feedback and polish things up. If on the other hand you are relatively confident with debugging small issues that may arise, you are encouraged to run this migration ;)! You can read about remaining known issues and feedback from the community here: https://forum.yunohost.org/t/20590\n\n" - + message + "N.B.: This migration has been tested by the community over the last few months but has only been declared stable recently. If your server hosts critical services and if you are not too confident with debugging possible issues, we recommend you to wait a little bit more while we gather more feedback and polish things up. If on the other hand you are relatively confident with debugging small issues that may arise, you are encouraged to run this migration ;)! You can read about remaining known issues and feedback from the community here: https://forum.yunohost.org/t/20590\n\n" + + message ) if problematic_apps: From 5fd74577c401ffff08fb4cc382b378d92f5557c2 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Thu, 11 Aug 2022 15:51:03 +0200 Subject: [PATCH 519/619] /opt may not exist ... --- src/yunohost/data_migrations/0021_migrate_to_bullseye.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/yunohost/data_migrations/0021_migrate_to_bullseye.py b/src/yunohost/data_migrations/0021_migrate_to_bullseye.py index cb8a333f5..162b8e376 100644 --- a/src/yunohost/data_migrations/0021_migrate_to_bullseye.py +++ b/src/yunohost/data_migrations/0021_migrate_to_bullseye.py @@ -39,8 +39,11 @@ def _get_all_venvs(dir, level=0, maxlevel=3): maxlevel - the depth of the recursion level - do not edit this, used as an iterator """ - # Using os functions instead of glob, because glob doesn't support hidden folders, and we need recursion with a fixed depth + if not os.path.exists(dir): + return [] + result = [] + # Using os functions instead of glob, because glob doesn't support hidden folders, and we need recursion with a fixed depth for file in os.listdir(dir): path = os.path.join(dir, file) if os.path.isdir(path): From 5d26fec9a54bc53141ed2bf1a8f87f13cb5bd817 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Thu, 11 Aug 2022 15:56:44 +0200 Subject: [PATCH 520/619] Update changelog for 4.4.2.1 --- debian/changelog | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/debian/changelog b/debian/changelog index e9e8b2d44..5582bb2ef 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,9 @@ +yunohost (4.4.2.1) stable; urgency=low + + - [fix] bullseye migration: /opt may not exist ... (5fd74577) + + -- Alexandre Aubin Thu, 11 Aug 2022 15:56:16 +0200 + yunohost (4.4.2) stable; urgency=low - Release as stable From 18442b2449a65696c9abf47dbb57877a0fdee024 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Thu, 11 Aug 2022 15:59:48 +0200 Subject: [PATCH 521/619] /opt may not exist ... --- src/migrations/0024_rebuild_python_venv.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/migrations/0024_rebuild_python_venv.py b/src/migrations/0024_rebuild_python_venv.py index f39c27c49..10db7a34a 100644 --- a/src/migrations/0024_rebuild_python_venv.py +++ b/src/migrations/0024_rebuild_python_venv.py @@ -30,6 +30,9 @@ def _get_all_venvs(dir, level=0, maxlevel=3): maxlevel - the depth of the recursion level - do not edit this, used as an iterator """ + if not os.path.exists(dir): + return [] + # Using os functions instead of glob, because glob doesn't support hidden # folders, and we need recursion with a fixed depth result = [] From 016e0e105b9b916e256cf62e1936f8bbe2067599 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Thu, 11 Aug 2022 16:00:56 +0200 Subject: [PATCH 522/619] Update changelog for 11.0.9.1 --- debian/changelog | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/debian/changelog b/debian/changelog index 05c91650c..3eb9a330b 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,9 @@ +yunohost (11.0.9.1) stable; urgency=low + + - [fix] venv rebuild: /opt may not exist ... + + -- Alexandre Aubin Thu, 11 Aug 2022 16:00:40 +0200 + yunohost (11.0.9) stable; urgency=low - [fix] services: Skip php 7.3 which is most likely dead after buster->bullseye migration because users get spooked (51804925) From 5d90971b5859f460cf1ae8907fa3071bac5acd5d Mon Sep 17 00:00:00 2001 From: "ljf (zamentur)" Date: Fri, 12 Aug 2022 22:22:21 +0200 Subject: [PATCH 523/619] [fix] -f and --force are not thje same with yunohos app upgrade --- locales/en.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/locales/en.json b/locales/en.json index c34cf0198..e78cc06d3 100644 --- a/locales/en.json +++ b/locales/en.json @@ -506,7 +506,7 @@ "migration_0024_rebuild_python_venv_broken_app": "Skipping {app} because virtualenv can't easily be rebuilt for this app. Instead, you should fix the situation by forcing the upgrade of this app using `yunohost app upgrade --force {app}`.", "migration_0024_rebuild_python_venv_disclaimer_base": "Following the upgrade to Debian Bullseye, some Python applications needs to be partially rebuilt to get converted to the new Python version shipped in Debian (in technical terms: what's called the 'virtualenv' needs to be recreated). In the meantime, those Python applications may not work. YunoHost can attempt to rebuild the virtualenv for some of those, as detailed below. For other apps, or if the rebuild attempt fails, you will need to manually force an upgrade for those apps.", "migration_0024_rebuild_python_venv_disclaimer_rebuild": "Rebuilding the virtualenv will be attempted for the following apps (NB: the operation may take some time!): {rebuild_apps}", - "migration_0024_rebuild_python_venv_disclaimer_ignored": "Virtualenvs can't be rebuilt automatically for those apps. You need to force an upgrade for those, which can be done from the command line with: `yunohost app upgrade -f APP`: {ignored_apps}", + "migration_0024_rebuild_python_venv_disclaimer_ignored": "Virtualenvs can't be rebuilt automatically for those apps. You need to force an upgrade for those, which can be done from the command line with: `yunohost app upgrade --force APP`: {ignored_apps}", "migration_0024_rebuild_python_venv_in_progress": "Now attempting to rebuild python virtualenv for `{app}`", "migration_0024_rebuild_python_venv_failed": "Failed to rebuild the python virtual env for {app}. The app may not work as long as this is not resolved. You should fix the situation by forcing the upgrade of this app using `yunohost app upgrade --force {app}`.", "migration_description_0021_migrate_to_bullseye": "Upgrade the system to Debian Bullseye and YunoHost 11.x", From 64e35815dbce0513f0070846351cd67600d50c04 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Sat, 13 Aug 2022 03:57:34 +0200 Subject: [PATCH 524/619] apt helpers: simplify ynh_remove_app_dependencies, we don't need to care about removing php-fpm services from yunohost, because 'yunohost service' now dynamically check what relevant phpX.Y-fpm service exist on the system --- helpers/apt | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/helpers/apt b/helpers/apt index 5ddcba381..02c3a0ab7 100644 --- a/helpers/apt +++ b/helpers/apt @@ -362,16 +362,6 @@ ynh_remove_app_dependencies() { fi ynh_package_autopurge ${dep_app}-ynh-deps # Remove the fake package and its dependencies if they not still used. - - # Check if this app used a specific php version ... in which case we check - # if the corresponding php-fpm is still there. Otherwise, we remove the - # service from yunohost as well - - local specific_php_version=$(echo $current_dependencies | tr '-' ' ' | grep -o -E "\" | sed 's/php//g' | sort | uniq) - [[ "$specific_php_version" != "$YNH_DEFAULT_PHP_VERSION" ]] || specific_php_version="" - if [[ -n "$specific_php_version" ]] && ! ynh_package_is_installed --package="php${specific_php_version}-fpm"; then - yunohost service remove php${specific_php_version}-fpm - fi } # Install packages from an extra repository properly. From 273f0fed77b88de5e157d31bf7cba68e6073dc1b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Sat, 13 Aug 2022 08:34:33 +0200 Subject: [PATCH 525/619] Update en.json Capitalize Python --- locales/en.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/locales/en.json b/locales/en.json index e78cc06d3..25568bbc8 100644 --- a/locales/en.json +++ b/locales/en.json @@ -507,12 +507,12 @@ "migration_0024_rebuild_python_venv_disclaimer_base": "Following the upgrade to Debian Bullseye, some Python applications needs to be partially rebuilt to get converted to the new Python version shipped in Debian (in technical terms: what's called the 'virtualenv' needs to be recreated). In the meantime, those Python applications may not work. YunoHost can attempt to rebuild the virtualenv for some of those, as detailed below. For other apps, or if the rebuild attempt fails, you will need to manually force an upgrade for those apps.", "migration_0024_rebuild_python_venv_disclaimer_rebuild": "Rebuilding the virtualenv will be attempted for the following apps (NB: the operation may take some time!): {rebuild_apps}", "migration_0024_rebuild_python_venv_disclaimer_ignored": "Virtualenvs can't be rebuilt automatically for those apps. You need to force an upgrade for those, which can be done from the command line with: `yunohost app upgrade --force APP`: {ignored_apps}", - "migration_0024_rebuild_python_venv_in_progress": "Now attempting to rebuild python virtualenv for `{app}`", - "migration_0024_rebuild_python_venv_failed": "Failed to rebuild the python virtual env for {app}. The app may not work as long as this is not resolved. You should fix the situation by forcing the upgrade of this app using `yunohost app upgrade --force {app}`.", + "migration_0024_rebuild_python_venv_in_progress": "Now attempting to rebuild the Python virtualenv for `{app}`", + "migration_0024_rebuild_python_venv_failed": "Failed to rebuild the Python virtualenv for {app}. The app may not work as long as this is not resolved. You should fix the situation by forcing the upgrade of this app using `yunohost app upgrade --force {app}`.", "migration_description_0021_migrate_to_bullseye": "Upgrade the system to Debian Bullseye and YunoHost 11.x", "migration_description_0022_php73_to_php74_pools": "Migrate php7.3-fpm 'pool' conf files to php7.4", "migration_description_0023_postgresql_11_to_13": "Migrate databases from PostgreSQL 11 to 13", - "migration_description_0024_rebuild_python_venv": "Repair python app after bullseye migration", + "migration_description_0024_rebuild_python_venv": "Repair Python app after bullseye migration", "migration_ldap_backup_before_migration": "Creating a backup of LDAP database and apps settings prior to the actual migration.", "migration_ldap_can_not_backup_before_migration": "The backup of the system could not be completed before the migration failed. Error: {error}", "migration_ldap_migration_failed_trying_to_rollback": "Could not migrate... trying to roll back the system.", From c7a907bdc998fca89d0bcf6234c292056c5ba462 Mon Sep 17 00:00:00 2001 From: yunohost-bot Date: Sat, 13 Aug 2022 12:37:32 +0000 Subject: [PATCH 526/619] [CI] Reformat / remove stale translated strings --- locales/ar.json | 2 +- locales/de.json | 2 +- locales/en.json | 11 +++++------ locales/es.json | 4 ++-- locales/fr.json | 2 +- locales/kab.json | 2 +- locales/ru.json | 4 ++-- locales/sk.json | 6 +++--- locales/te.json | 4 ++-- 9 files changed, 18 insertions(+), 19 deletions(-) diff --git a/locales/ar.json b/locales/ar.json index e37cdbcc7..17603ba8f 100644 --- a/locales/ar.json +++ b/locales/ar.json @@ -160,4 +160,4 @@ "diagnosis_description_ip": "الإتصال بالإنترنت", "diagnosis_description_basesystem": "النظام الأساسي", "field_invalid": "الحقل غير صحيح : '{}'" -} +} \ No newline at end of file diff --git a/locales/de.json b/locales/de.json index 4aa75270b..674212637 100644 --- a/locales/de.json +++ b/locales/de.json @@ -685,4 +685,4 @@ "migration_description_0023_postgresql_11_to_13": "Migrieren von Datenbanken von PostgreSQL 11 nach 13", "service_description_postgresql": "Speichert Applikations-Daten (SQL Datenbank)", "migration_0023_not_enough_space": "Stelle sicher, dass unter {path} genug Speicherplatz zur Verfügung steht, um die Migration auszuführen." -} +} \ No newline at end of file diff --git a/locales/en.json b/locales/en.json index 25568bbc8..7f18c7863 100644 --- a/locales/en.json +++ b/locales/en.json @@ -487,7 +487,6 @@ "main_domain_change_failed": "Unable to change the main domain", "main_domain_changed": "The main domain has been changed", "migration_0021_cleaning_up": "Cleaning up cache and packages not useful anymore...", - "migration_0021_venv_regen_failed": "The virtual environment '{venv}' failed to regenerate, you probably need to run the command `yunohost app upgrade --force`", "migration_0021_general_warning": "Please note that this migration is a delicate operation. The YunoHost team did its best to review and test it, but the migration might still break parts of the system or its apps.\n\nTherefore, it is recommended to:\n - Perform a backup of any critical data or app. More info on https://yunohost.org/backup;\n - Be patient after launching the migration: Depending on your Internet connection and hardware, it might take up to a few hours for everything to upgrade.", "migration_0021_main_upgrade": "Starting main upgrade...", "migration_0021_modified_files": "Please note that the following files were found to be manually modified and might be overwritten following the upgrade: {manually_modified_files}", @@ -504,11 +503,11 @@ "migration_0023_postgresql_11_not_installed": "PostgreSQL was not installed on your system. Nothing to do.", "migration_0023_postgresql_13_not_installed": "PostgreSQL 11 is installed, but not PostgreSQL 13!? Something weird might have happened on your system :(...", "migration_0024_rebuild_python_venv_broken_app": "Skipping {app} because virtualenv can't easily be rebuilt for this app. Instead, you should fix the situation by forcing the upgrade of this app using `yunohost app upgrade --force {app}`.", - "migration_0024_rebuild_python_venv_disclaimer_base": "Following the upgrade to Debian Bullseye, some Python applications needs to be partially rebuilt to get converted to the new Python version shipped in Debian (in technical terms: what's called the 'virtualenv' needs to be recreated). In the meantime, those Python applications may not work. YunoHost can attempt to rebuild the virtualenv for some of those, as detailed below. For other apps, or if the rebuild attempt fails, you will need to manually force an upgrade for those apps.", - "migration_0024_rebuild_python_venv_disclaimer_rebuild": "Rebuilding the virtualenv will be attempted for the following apps (NB: the operation may take some time!): {rebuild_apps}", - "migration_0024_rebuild_python_venv_disclaimer_ignored": "Virtualenvs can't be rebuilt automatically for those apps. You need to force an upgrade for those, which can be done from the command line with: `yunohost app upgrade --force APP`: {ignored_apps}", - "migration_0024_rebuild_python_venv_in_progress": "Now attempting to rebuild the Python virtualenv for `{app}`", + "migration_0024_rebuild_python_venv_disclaimer_base": "Following the upgrade to Debian Bullseye, some Python applications needs to be partially rebuilt to get converted to the new Python version shipped in Debian (in technical terms: what's called the 'virtualenv' needs to be recreated). In the meantime, those Python applications may not work. YunoHost can attempt to rebuild the virtualenv for some of those, as detailed below. For other apps, or if the rebuild attempt fails, you will need to manually force an upgrade for those apps.", + "migration_0024_rebuild_python_venv_disclaimer_ignored": "Virtualenvs can't be rebuilt automatically for those apps. You need to force an upgrade for those, which can be done from the command line with: `yunohost app upgrade --force APP`: {ignored_apps}", + "migration_0024_rebuild_python_venv_disclaimer_rebuild": "Rebuilding the virtualenv will be attempted for the following apps (NB: the operation may take some time!): {rebuild_apps}", "migration_0024_rebuild_python_venv_failed": "Failed to rebuild the Python virtualenv for {app}. The app may not work as long as this is not resolved. You should fix the situation by forcing the upgrade of this app using `yunohost app upgrade --force {app}`.", + "migration_0024_rebuild_python_venv_in_progress": "Now attempting to rebuild the Python virtualenv for `{app}`", "migration_description_0021_migrate_to_bullseye": "Upgrade the system to Debian Bullseye and YunoHost 11.x", "migration_description_0022_php73_to_php74_pools": "Migrate php7.3-fpm 'pool' conf files to php7.4", "migration_description_0023_postgresql_11_to_13": "Migrate databases from PostgreSQL 11 to 13", @@ -693,4 +692,4 @@ "yunohost_installing": "Installing YunoHost...", "yunohost_not_installed": "YunoHost is not correctly installed. Please run 'yunohost tools postinstall'", "yunohost_postinstall_end_tip": "The post-install completed! To finalize your setup, please consider:\n - adding a first user through the 'Users' section of the webadmin (or 'yunohost user create ' in command-line);\n - diagnose potential issues through the 'Diagnosis' section of the webadmin (or 'yunohost diagnosis run' in command-line);\n - reading the 'Finalizing your setup' and 'Getting to know YunoHost' parts in the admin documentation: https://yunohost.org/admindoc." -} +} \ No newline at end of file diff --git a/locales/es.json b/locales/es.json index aebb959a8..fe88c14d3 100644 --- a/locales/es.json +++ b/locales/es.json @@ -600,7 +600,7 @@ "domain_dns_push_success": "¡Registros DNS actualizados!", "domain_dns_push_failed_to_authenticate": "No se pudo autenticar en la API del registrador para el dominio '{domain}'. ¿Lo más probable es que las credenciales sean incorrectas? (Error: {error})", "domain_dns_registrar_experimental": "Hasta ahora, la comunidad de YunoHost no ha probado ni revisado correctamente la interfaz con la API de **{registrar}**. El soporte es **muy experimental**. ¡Ten cuidado!", - "domain_dns_push_record_failed": "No se pudo {acción} registrar {tipo}/{nombre}: {error}", + "domain_dns_push_record_failed": "No se pudo {action} registrar {type}/{name}: {error}", "domain_config_features_disclaimer": "Hasta ahora, habilitar/deshabilitar las funciones de correo o XMPP solo afecta la configuración de DNS recomendada y automática, ¡no las configuraciones del sistema!", "domain_config_mail_in": "Correos entrantes", "domain_config_mail_out": "Correos salientes", @@ -685,4 +685,4 @@ "show_tile_cant_be_enabled_for_regex": "No puede habilitar 'show_tile' en este momento porque la URL para el permiso '{permission}' es una expresión regular", "show_tile_cant_be_enabled_for_url_not_defined": "No puede habilitar 'show_tile' en este momento, porque primero debe definir una URL para el permiso '{permission}'", "regex_incompatible_with_tile": "/!\\ Empaquetadores! El permiso '{permission}' tiene show_tile establecido en 'true' y, por lo tanto, no puede definir una URL de expresión regular como la URL principal" -} +} \ No newline at end of file diff --git a/locales/fr.json b/locales/fr.json index 77f1ca9d1..1e9fcaa5e 100644 --- a/locales/fr.json +++ b/locales/fr.json @@ -685,4 +685,4 @@ "tools_upgrade_failed": "Impossible de mettre à jour les paquets : {packages_list}", "migration_0023_not_enough_space": "Prévoyez suffisamment d'espace disponible dans {path} pour exécuter la migration.", "migration_0023_postgresql_11_not_installed": "PostgreSQL n'a pas été installé sur votre système. Il n'y a rien à faire." -} +} \ No newline at end of file diff --git a/locales/kab.json b/locales/kab.json index 5daa7cef0..99edca7ad 100644 --- a/locales/kab.json +++ b/locales/kab.json @@ -11,4 +11,4 @@ "diagnosis_description_dnsrecords": "Ikalasen DNS", "diagnosis_description_web": "Réseau", "domain_created": "Taɣult tettwarna" -} +} \ No newline at end of file diff --git a/locales/ru.json b/locales/ru.json index 1546c4d6e..0077add44 100644 --- a/locales/ru.json +++ b/locales/ru.json @@ -332,7 +332,7 @@ "permission_already_up_to_date": "Разрешение не было обновлено, потому что запросы на добавление/удаление уже соответствуют текущему состоянию.", "group_cannot_edit_primary_group": "Группа '{group}' не может быть отредактирована вручную. Это основная группа, предназначенная для содержания только одного конкретного пользователя.", "log_app_remove": "Удалите приложение '{}'", - "not_enough_disk_space": "Недостаточно свободного места в '{путь}'", + "not_enough_disk_space": "Недостаточно свободного места в '{path}'", "pattern_email_forward": "Должен быть корректный адрес электронной почты, символ '+' допустим (например, someone+tag@example.com)", "permission_deletion_failed": "Не удалось удалить разрешение '{permission}': {error}" -} +} \ No newline at end of file diff --git a/locales/sk.json b/locales/sk.json index ac9d565bc..7ac7097f1 100644 --- a/locales/sk.json +++ b/locales/sk.json @@ -204,12 +204,12 @@ "diagnosis_everything_ok": "V kategórii {category} vyzerá byť všetko v poriadku!", "diagnosis_failed": "Nepodarilo sa získať výsledok diagnostiky pre kategóriu '{category}': {error}", "diagnosis_failed_for_category": "Diagnostika pre kategóriu '{category}' skončila s chybou: {error}", - "diagnosis_found_errors": "Bolo nájdených {error} závažných chýb týkajúcich sa {category}!", - "diagnosis_found_errors_and_warnings": "Bolo nájdených {error} závažných chýb (a {warnings} varovaní) týkajúcich sa {category}!", + "diagnosis_found_errors": "Bolo nájdených {errors} závažných chýb týkajúcich sa {category}!", + "diagnosis_found_errors_and_warnings": "Bolo nájdených {errors} závažných chýb (a {warnings} varovaní) týkajúcich sa {category}!", "diagnosis_found_warnings": "V kategórii {category} bolo nájdených {warnings} položiek, ktoré je možné opraviť.", "diagnosis_http_connection_error": "Chyba pripojenia: nepodarilo sa pripojiť k požadovanej doméne, podľa všetkého je nedostupná.", "diagnosis_http_could_not_diagnose": "Nepodarilo sa zistiť, či sú domény dostupné zvonka pomocou IPv{ipversion}.", "diagnosis_http_could_not_diagnose_details": "Chyba: {error}", "diagnosis_http_hairpinning_issue": "Zdá sa, že Vaša miestna sieť nemá zapnutý NAT hairpinning.", "diagnosis_high_number_auth_failures": "V poslednom čase bol zistený neobvykle vysoký počet neúspešných prihlásení. Uistite sa, či je služba fail2ban spustená a správne nastavená alebo použite vlastný port pre SSH ako je popísané na https://yunohost.org/security." -} +} \ No newline at end of file diff --git a/locales/te.json b/locales/te.json index fa6ac91c8..ca871c2ae 100644 --- a/locales/te.json +++ b/locales/te.json @@ -13,6 +13,6 @@ "admin_password_too_long": "దయచేసి 127 క్యారెక్టర్ల కంటే చిన్న పాస్వర్డ్ ఎంచుకోండి", "app_action_broke_system": "ఈ చర్య ఈ ముఖ్యమైన సేవలను విచ్ఛిన్నం చేసినట్లుగా కనిపిస్తోంది: {services}", "app_action_cannot_be_ran_because_required_services_down": "ఈ చర్యను అమలు చేయడానికి ఈ అవసరమైన సేవలు అమలు చేయబడాలి: {services}. కొనసాగడం కొరకు వాటిని పునఃప్రారంభించడానికి ప్రయత్నించండి (మరియు అవి ఎందుకు పనిచేయడం లేదో పరిశోధించవచ్చు).", - "app_argument_choice_invalid": "ఆర్గ్యుమెంట్ '{name}' కొరకు చెల్లుబాటు అయ్యే వైల్యూ ఎంచుకోండి: '{value}' అనేది లభ్యం అవుతున్న ఎంపికల్లో ({Choices}) లేదు", + "app_argument_choice_invalid": "ఆర్గ్యుమెంట్ '{name}' కొరకు చెల్లుబాటు అయ్యే వైల్యూ ఎంచుకోండి: '{value}' అనేది లభ్యం అవుతున్న ఎంపికల్లో ({choices}) లేదు", "app_argument_password_no_default": "పాస్వర్డ్ ఆర్గ్యుమెంట్ '{name}'ని పార్సింగ్ చేసేటప్పుడు దోషం: భద్రతా కారణం కొరకు పాస్వర్డ్ ఆర్గ్యుమెంట్ డిఫాల్ట్ విలువను కలిగి ఉండరాదు" -} +} \ No newline at end of file From 31aacb3361e482298f472e231b245b6fb2bc1a5d Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Sat, 13 Aug 2022 17:38:47 +0200 Subject: [PATCH 527/619] diagnosis: add complains if some app installed are still requiring only yunohost 3.x --- src/diagnosers/80-apps.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/diagnosers/80-apps.py b/src/diagnosers/80-apps.py index 56e45f831..353620cdc 100644 --- a/src/diagnosers/80-apps.py +++ b/src/diagnosers/80-apps.py @@ -64,7 +64,7 @@ class MyDiagnoser(Diagnoser): yunohost_version_req = ( app["manifest"].get("requirements", {}).get("yunohost", "").strip(">= ") ) - if yunohost_version_req.startswith("2."): + if yunohost_version_req.startswith("2.") or yunohost_version_req.startswith("3."): yield ("error", "diagnosis_apps_outdated_ynh_requirement") deprecated_helpers = [ From d2a6dcd41a44d1a87c8f0965e0338be995565291 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Sat, 13 Aug 2022 18:41:52 +0200 Subject: [PATCH 528/619] venv rebuild: migration should have an empty disclaimer when in auto mode --- src/migrations/0024_rebuild_python_venv.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/migrations/0024_rebuild_python_venv.py b/src/migrations/0024_rebuild_python_venv.py index 10db7a34a..5ead78b19 100644 --- a/src/migrations/0024_rebuild_python_venv.py +++ b/src/migrations/0024_rebuild_python_venv.py @@ -98,6 +98,10 @@ class MyMigration(Migration): if not self.is_pending(): return None + # Disclaimer should be empty if in auto, otherwise it excepts the --accept-disclaimer option during debian postinst + if self.mode == "auto": + return None + ignored_apps = [] rebuild_apps = [] @@ -133,6 +137,9 @@ class MyMigration(Migration): def run(self): + if self.mode == "auto": + return + venvs = _get_all_venvs("/opt/") + _get_all_venvs("/var/www/") for venv in venvs: From 98506d6a735529f28403b26dc66b32cc98f3329e Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Sat, 13 Aug 2022 19:04:54 +0200 Subject: [PATCH 529/619] bullseye migration: add critical fix for RPi failing to get network on reboot --- src/migrations/0021_migrate_to_bullseye.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/migrations/0021_migrate_to_bullseye.py b/src/migrations/0021_migrate_to_bullseye.py index 01b846573..6b23f8086 100644 --- a/src/migrations/0021_migrate_to_bullseye.py +++ b/src/migrations/0021_migrate_to_bullseye.py @@ -185,6 +185,17 @@ class MyMigration(Migration): del services["postgresql"] _save_services(services) + # + # Critical fix for RPI otherwise network is down after rebooting + # https://forum.yunohost.org/t/20652 + # + if os.system("systemctl | grep -q dhcpcd") == 0: + os.system("mkdir -p /etc/systemd/system/dhcpcd.service.d") + write_to_file( + "/etc/systemd/system/dhcpcd.service.d/wait.conf", + '[Service]\nExecStart=\nExecStart=/usr/sbin/dhcpcd -w' + ) + # # Main upgrade # From 3f0b19d17d8505a3359027dae89b25c8cb1b26ef Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Sat, 13 Aug 2022 19:34:35 +0200 Subject: [PATCH 530/619] bullseye migration: add the patch for the build-essential / libc6-dev / libgcc-8-dev hell ... --- src/migrations/0021_migrate_to_bullseye.py | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/src/migrations/0021_migrate_to_bullseye.py b/src/migrations/0021_migrate_to_bullseye.py index 6b23f8086..ee83199d2 100644 --- a/src/migrations/0021_migrate_to_bullseye.py +++ b/src/migrations/0021_migrate_to_bullseye.py @@ -190,12 +190,26 @@ class MyMigration(Migration): # https://forum.yunohost.org/t/20652 # if os.system("systemctl | grep -q dhcpcd") == 0: + logger.info("Applying fix for DHCPCD ...") os.system("mkdir -p /etc/systemd/system/dhcpcd.service.d") write_to_file( "/etc/systemd/system/dhcpcd.service.d/wait.conf", '[Service]\nExecStart=\nExecStart=/usr/sbin/dhcpcd -w' ) + # + # Another boring fix for the super annoying libc6-dev: Breaks libgcc-8-dev + # https://forum.yunohost.org/t/20617 + # + if os.system("grep -A10 'ynh-deps' /var/lib/dpkg/status | grep -q 'Depends:.*build-essential'") == 0: + logger.info("Attempting to fix the build-essential / libc6-dev / libgcc-8-dev hell ...") + os.system("cp /var/lib/dpkg/status /root/dpkg_status.bkp") + # This removes the dependency to build-essential from $app-ynh-deps + os.system("perl -i~ -0777 -pe 's/(Package: .*-ynh-deps\\n(.+:.+\\n)+Depends:.*)(build-essential, ?)(.*)/$1$4/g' /var/lib/dpkg/status") + self.apt("build-essential", verb="remove") + os.system("LC_ALL=C DEBIAN_FRONTEND=noninteractive APT_LISTCHANGES_FRONTEND=none apt autoremove --assume-yes") + self.apt("gcc-8 libgcc-8-dev", verb="remove") + # # Main upgrade # @@ -288,7 +302,7 @@ class MyMigration(Migration): # Clean the mess logger.info(m18n.n("migration_0021_cleaning_up")) - os.system("apt autoremove --assume-yes") + os.system("LC_ALL=C DEBIAN_FRONTEND=noninteractive APT_LISTCHANGES_FRONTEND=none apt autoremove --assume-yes") os.system("apt clean --assume-yes") # @@ -464,6 +478,9 @@ class MyMigration(Migration): os.system(f"apt-mark unhold {package}") def apt_install(self, cmd): + return self.apt(cmd, verb="install") + + def apt(self, cmd, verb="install"): def is_relevant(line): return "Reading database ..." not in line.rstrip() @@ -477,7 +494,7 @@ class MyMigration(Migration): ) cmd = ( - "LC_ALL=C DEBIAN_FRONTEND=noninteractive APT_LISTCHANGES_FRONTEND=none apt install --quiet -o=Dpkg::Use-Pty=0 --fix-broken --assume-yes " + f"LC_ALL=C DEBIAN_FRONTEND=noninteractive APT_LISTCHANGES_FRONTEND=none apt {verb} --quiet -o=Dpkg::Use-Pty=0 --fix-broken --assume-yes " + cmd ) From 625eb79ca342f8d705eb2f59d6c44ca16c71d0ca Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Sat, 13 Aug 2022 19:38:28 +0200 Subject: [PATCH 531/619] bullseye migration: add fix for stupid dnsmasq not picking new init script --- src/migrations/0021_migrate_to_bullseye.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/migrations/0021_migrate_to_bullseye.py b/src/migrations/0021_migrate_to_bullseye.py index ee83199d2..ce7d25262 100644 --- a/src/migrations/0021_migrate_to_bullseye.py +++ b/src/migrations/0021_migrate_to_bullseye.py @@ -305,6 +305,14 @@ class MyMigration(Migration): os.system("LC_ALL=C DEBIAN_FRONTEND=noninteractive APT_LISTCHANGES_FRONTEND=none apt autoremove --assume-yes") os.system("apt clean --assume-yes") + # + # Stupid hack for stupid dnsmasq not picking up its new init.d script then breaking everything ... + # https://forum.yunohost.org/t/20676 + # + if os.path.exists("/etc/init.d/dnsmasq.dpkg-dist"): + logger.info("Copying new version for /etc/init.d/dnsmasq ...") + os.system("cp /etc/init.d/dnsmasq.dpkg-dist /etc/init.d/dnsmasq") + # # Yunohost upgrade # From 61175392edeb593f6a26d8e64bf91004474152e7 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Sat, 13 Aug 2022 19:50:35 +0200 Subject: [PATCH 532/619] bullseye migration: backport a bunch of fixes from the dev branch --- .../0021_migrate_to_bullseye.py | 42 +++++++++++++++++-- 1 file changed, 39 insertions(+), 3 deletions(-) diff --git a/src/yunohost/data_migrations/0021_migrate_to_bullseye.py b/src/yunohost/data_migrations/0021_migrate_to_bullseye.py index 162b8e376..ce7d25262 100644 --- a/src/yunohost/data_migrations/0021_migrate_to_bullseye.py +++ b/src/yunohost/data_migrations/0021_migrate_to_bullseye.py @@ -185,6 +185,31 @@ class MyMigration(Migration): del services["postgresql"] _save_services(services) + # + # Critical fix for RPI otherwise network is down after rebooting + # https://forum.yunohost.org/t/20652 + # + if os.system("systemctl | grep -q dhcpcd") == 0: + logger.info("Applying fix for DHCPCD ...") + os.system("mkdir -p /etc/systemd/system/dhcpcd.service.d") + write_to_file( + "/etc/systemd/system/dhcpcd.service.d/wait.conf", + '[Service]\nExecStart=\nExecStart=/usr/sbin/dhcpcd -w' + ) + + # + # Another boring fix for the super annoying libc6-dev: Breaks libgcc-8-dev + # https://forum.yunohost.org/t/20617 + # + if os.system("grep -A10 'ynh-deps' /var/lib/dpkg/status | grep -q 'Depends:.*build-essential'") == 0: + logger.info("Attempting to fix the build-essential / libc6-dev / libgcc-8-dev hell ...") + os.system("cp /var/lib/dpkg/status /root/dpkg_status.bkp") + # This removes the dependency to build-essential from $app-ynh-deps + os.system("perl -i~ -0777 -pe 's/(Package: .*-ynh-deps\\n(.+:.+\\n)+Depends:.*)(build-essential, ?)(.*)/$1$4/g' /var/lib/dpkg/status") + self.apt("build-essential", verb="remove") + os.system("LC_ALL=C DEBIAN_FRONTEND=noninteractive APT_LISTCHANGES_FRONTEND=none apt autoremove --assume-yes") + self.apt("gcc-8 libgcc-8-dev", verb="remove") + # # Main upgrade # @@ -277,9 +302,17 @@ class MyMigration(Migration): # Clean the mess logger.info(m18n.n("migration_0021_cleaning_up")) - os.system("apt autoremove --assume-yes") + os.system("LC_ALL=C DEBIAN_FRONTEND=noninteractive APT_LISTCHANGES_FRONTEND=none apt autoremove --assume-yes") os.system("apt clean --assume-yes") + # + # Stupid hack for stupid dnsmasq not picking up its new init.d script then breaking everything ... + # https://forum.yunohost.org/t/20676 + # + if os.path.exists("/etc/init.d/dnsmasq.dpkg-dist"): + logger.info("Copying new version for /etc/init.d/dnsmasq ...") + os.system("cp /etc/init.d/dnsmasq.dpkg-dist /etc/init.d/dnsmasq") + # # Yunohost upgrade # @@ -337,7 +370,7 @@ class MyMigration(Migration): raise YunohostError("migration_0021_not_buster") # Have > 1 Go free space on /var/ ? - if free_space_in_directory("/var/") / (1024 ** 3) < 1.0: + if free_space_in_directory("/var/") / (1024**3) < 1.0: raise YunohostError("migration_0021_not_enough_free_space") # Check system is up to date @@ -453,6 +486,9 @@ class MyMigration(Migration): os.system(f"apt-mark unhold {package}") def apt_install(self, cmd): + return self.apt(cmd, verb="install") + + def apt(self, cmd, verb="install"): def is_relevant(line): return "Reading database ..." not in line.rstrip() @@ -466,7 +502,7 @@ class MyMigration(Migration): ) cmd = ( - "LC_ALL=C DEBIAN_FRONTEND=noninteractive APT_LISTCHANGES_FRONTEND=none apt install --quiet -o=Dpkg::Use-Pty=0 --fix-broken --assume-yes " + f"LC_ALL=C DEBIAN_FRONTEND=noninteractive APT_LISTCHANGES_FRONTEND=none apt {verb} --quiet -o=Dpkg::Use-Pty=0 --fix-broken --assume-yes " + cmd ) From f7fc609abe1cf8fa1dc0767f0c25a182fadd3ece Mon Sep 17 00:00:00 2001 From: yunohost-bot Date: Sat, 13 Aug 2022 17:54:50 +0000 Subject: [PATCH 533/619] [CI] Format code with Black --- src/diagnosers/80-apps.py | 4 +++- src/migrations/0021_migrate_to_bullseye.py | 25 ++++++++++++++++------ 2 files changed, 22 insertions(+), 7 deletions(-) diff --git a/src/diagnosers/80-apps.py b/src/diagnosers/80-apps.py index 353620cdc..c4c7f48eb 100644 --- a/src/diagnosers/80-apps.py +++ b/src/diagnosers/80-apps.py @@ -64,7 +64,9 @@ class MyDiagnoser(Diagnoser): yunohost_version_req = ( app["manifest"].get("requirements", {}).get("yunohost", "").strip(">= ") ) - if yunohost_version_req.startswith("2.") or yunohost_version_req.startswith("3."): + if yunohost_version_req.startswith("2.") or yunohost_version_req.startswith( + "3." + ): yield ("error", "diagnosis_apps_outdated_ynh_requirement") deprecated_helpers = [ diff --git a/src/migrations/0021_migrate_to_bullseye.py b/src/migrations/0021_migrate_to_bullseye.py index ce7d25262..5d624c01a 100644 --- a/src/migrations/0021_migrate_to_bullseye.py +++ b/src/migrations/0021_migrate_to_bullseye.py @@ -194,20 +194,31 @@ class MyMigration(Migration): os.system("mkdir -p /etc/systemd/system/dhcpcd.service.d") write_to_file( "/etc/systemd/system/dhcpcd.service.d/wait.conf", - '[Service]\nExecStart=\nExecStart=/usr/sbin/dhcpcd -w' + "[Service]\nExecStart=\nExecStart=/usr/sbin/dhcpcd -w", ) # # Another boring fix for the super annoying libc6-dev: Breaks libgcc-8-dev # https://forum.yunohost.org/t/20617 # - if os.system("grep -A10 'ynh-deps' /var/lib/dpkg/status | grep -q 'Depends:.*build-essential'") == 0: - logger.info("Attempting to fix the build-essential / libc6-dev / libgcc-8-dev hell ...") + if ( + os.system( + "grep -A10 'ynh-deps' /var/lib/dpkg/status | grep -q 'Depends:.*build-essential'" + ) + == 0 + ): + logger.info( + "Attempting to fix the build-essential / libc6-dev / libgcc-8-dev hell ..." + ) os.system("cp /var/lib/dpkg/status /root/dpkg_status.bkp") # This removes the dependency to build-essential from $app-ynh-deps - os.system("perl -i~ -0777 -pe 's/(Package: .*-ynh-deps\\n(.+:.+\\n)+Depends:.*)(build-essential, ?)(.*)/$1$4/g' /var/lib/dpkg/status") + os.system( + "perl -i~ -0777 -pe 's/(Package: .*-ynh-deps\\n(.+:.+\\n)+Depends:.*)(build-essential, ?)(.*)/$1$4/g' /var/lib/dpkg/status" + ) self.apt("build-essential", verb="remove") - os.system("LC_ALL=C DEBIAN_FRONTEND=noninteractive APT_LISTCHANGES_FRONTEND=none apt autoremove --assume-yes") + os.system( + "LC_ALL=C DEBIAN_FRONTEND=noninteractive APT_LISTCHANGES_FRONTEND=none apt autoremove --assume-yes" + ) self.apt("gcc-8 libgcc-8-dev", verb="remove") # @@ -302,7 +313,9 @@ class MyMigration(Migration): # Clean the mess logger.info(m18n.n("migration_0021_cleaning_up")) - os.system("LC_ALL=C DEBIAN_FRONTEND=noninteractive APT_LISTCHANGES_FRONTEND=none apt autoremove --assume-yes") + os.system( + "LC_ALL=C DEBIAN_FRONTEND=noninteractive APT_LISTCHANGES_FRONTEND=none apt autoremove --assume-yes" + ) os.system("apt clean --assume-yes") # From 71ad719aafa90e0103d3e1347cb422adb6585f44 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Sat, 13 Aug 2022 19:55:55 +0200 Subject: [PATCH 534/619] Update changelog for 4.4.2.2 --- debian/changelog | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/debian/changelog b/debian/changelog index 5582bb2ef..962455902 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,11 @@ +yunohost (4.4.2.2) stable; urgency=low + + - [fix] bullseye migration: add fix for stupid dnsmasq not picking new init script (origin/dev, origin/HEAD, dev) + - [fix] bullseye migration: add the patch for the build-essential / libc6-dev / libgcc-8-dev hell ... + - [fix] bullseye migration: add critical fix for RPi failing to get network on reboot + + -- Alexandre Aubin Sat, 13 Aug 2022 19:55:38 +0200 + yunohost (4.4.2.1) stable; urgency=low - [fix] bullseye migration: /opt may not exist ... (5fd74577) From d161da039aecc67ed8e18e66b0f1e60a54238fd3 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Sat, 13 Aug 2022 20:02:33 +0200 Subject: [PATCH 535/619] postgresql 11->13 migration: skip if no yunohost app depend on postgresql --- src/migrations/0023_postgresql_11_to_13.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/migrations/0023_postgresql_11_to_13.py b/src/migrations/0023_postgresql_11_to_13.py index 8f03f8c5f..206143dbb 100644 --- a/src/migrations/0023_postgresql_11_to_13.py +++ b/src/migrations/0023_postgresql_11_to_13.py @@ -19,6 +19,10 @@ class MyMigration(Migration): def run(self): + if os.system('grep -A10 "ynh-deps" /var/lib/dpkg/status | grep "Package:\|Depends:" | grep -B1 postgresql') != 0: + logger.info("No YunoHost app seem to require postgresql... Skipping!") + return + if not self.package_is_installed("postgresql-11"): logger.warning(m18n.n("migration_0023_postgresql_11_not_installed")) return From 77c2f5dcd6d4e3c6cfa1864dcf1529887a703b80 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Sat, 13 Aug 2022 20:05:40 +0200 Subject: [PATCH 536/619] bullseye migration: add ffsync to deprecated apps --- src/yunohost/app.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/yunohost/app.py b/src/yunohost/app.py index 997403a07..8d42225f7 100644 --- a/src/yunohost/app.py +++ b/src/yunohost/app.py @@ -2502,7 +2502,7 @@ def is_true(arg): def unstable_apps(): output = [] - deprecated_apps = ["mailman"] + deprecated_apps = ["mailman", "ffsync"] for infos in app_list(full=True)["apps"]: From b3d28bf85de7affc3f5a1ad6ae2af9051c84773c Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Sat, 13 Aug 2022 20:06:47 +0200 Subject: [PATCH 537/619] Update changelog for 4.4.2.3 --- debian/changelog | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/debian/changelog b/debian/changelog index 962455902..be9c07de5 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,10 +1,11 @@ -yunohost (4.4.2.2) stable; urgency=low +yunohost (4.4.2.3) stable; urgency=low - [fix] bullseye migration: add fix for stupid dnsmasq not picking new init script (origin/dev, origin/HEAD, dev) - [fix] bullseye migration: add the patch for the build-essential / libc6-dev / libgcc-8-dev hell ... - [fix] bullseye migration: add critical fix for RPi failing to get network on reboot + - [fix] bullseye migration: add ffsync to deprecated apps (77c2f5dc) - -- Alexandre Aubin Sat, 13 Aug 2022 19:55:38 +0200 + -- Alexandre Aubin Sat, 13 Aug 2022 20:06:00 +0200 yunohost (4.4.2.1) stable; urgency=low From 9ce2bf98ab7c72f9648afbe6e2e4c9a698c41743 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Sat, 13 Aug 2022 20:10:10 +0200 Subject: [PATCH 538/619] Update changelog for 11.0.9.2 --- debian/changelog | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/debian/changelog b/debian/changelog index ddbf63b1e..dc0a418fe 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,15 @@ +yunohost (11.0.9.2) stable; urgency=low + + - [fix] venv rebuild: fix yunohost app force upgrade command (5d90971b) + - [fix] apt helpers: simplify ynh_remove_app_dependencies, we don't need to care about removing php-fpm services from yunohost, because 'yunohost service' now dynamically check what relevant phpX.Y-fpm service exist on the system (64e35815) + - [enh] diagnosis: add complains if some app installed are still requiring only yunohost 3.x (31aacb33) + - [fix] venv rebuild: migration should have an empty disclaimer when in auto mode (d2a6dcd4) + - [fix] postgresql 11->13 migration: skip if no yunohost app depend on postgresql (d161da03) + + Thanks to all contributors <3 ! (Éric Gaspar, ljf) + + -- Alexandre Aubin Sat, 13 Aug 2022 20:08:27 +0200 + yunohost (11.0.9.1) stable; urgency=low - [fix] venv rebuild: /opt may not exist ... From 42d893e1e73dc5afb873313a07218a1c42bec0b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20M?= Date: Fri, 12 Aug 2022 04:56:20 +0000 Subject: [PATCH 539/619] Translated using Weblate (Galician) Currently translated at 99.1% (688 of 694 strings) Translation: YunoHost/core Translate-URL: https://translate.yunohost.org/projects/yunohost/core/gl/ --- locales/gl.json | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/locales/gl.json b/locales/gl.json index 4a77645d6..b0876f368 100644 --- a/locales/gl.json +++ b/locales/gl.json @@ -684,5 +684,7 @@ "migration_description_0023_postgresql_11_to_13": "Migrar bases de datos de PostgreSQL 11 a 13", "service_description_postgresql": "Almacena datos da app (Base datos SQL)", "tools_upgrade": "Actualizando paquetes do sistema", - "domain_config_default_app": "App por defecto" -} \ No newline at end of file + "domain_config_default_app": "App por defecto", + "migration_0021_venv_regen_failed": "Fallou a rexeneración do entorno virtual '{venv}', probablemente teñas que executar o comando `yunohost app upgrade --force`", + "migration_0024_rebuild_python_venv_broken_app": "Omitimos a app {app} porque virtualenv non se pode reconstruir para esta app. Deberías intentar resolver o problema forzando a actualización da app usando `yunohost app upgrade --force {app}`." +} From af637362f73f56598bdd735ee4acdc2e4167a56b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20M?= Date: Fri, 12 Aug 2022 05:44:06 +0000 Subject: [PATCH 540/619] Translated using Weblate (Galician) Currently translated at 100.0% (694 of 694 strings) Translation: YunoHost/core Translate-URL: https://translate.yunohost.org/projects/yunohost/core/gl/ --- locales/gl.json | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/locales/gl.json b/locales/gl.json index b0876f368..c09a0412e 100644 --- a/locales/gl.json +++ b/locales/gl.json @@ -686,5 +686,11 @@ "tools_upgrade": "Actualizando paquetes do sistema", "domain_config_default_app": "App por defecto", "migration_0021_venv_regen_failed": "Fallou a rexeneración do entorno virtual '{venv}', probablemente teñas que executar o comando `yunohost app upgrade --force`", - "migration_0024_rebuild_python_venv_broken_app": "Omitimos a app {app} porque virtualenv non se pode reconstruir para esta app. Deberías intentar resolver o problema forzando a actualización da app usando `yunohost app upgrade --force {app}`." + "migration_0024_rebuild_python_venv_broken_app": "Omitimos a app {app} porque virtualenv non se pode reconstruir para esta app. Deberías intentar resolver o problema forzando a actualización da app usando `yunohost app upgrade --force {app}`.", + "migration_0024_rebuild_python_venv_disclaimer_base": "Após a actualización a Debian Bullseye, algunhas aplicacións de Python precisan ser reconstruídas para usar a nova versión de Python que inclúe Debian (técnicamente: recrear o `virtualenv`). Mentras tanto, algunhas aplicacións de Python poderían non funcionar. YunoHost pode intentar reconstruir o virtualenv para algunhas, como se indica abaixo. Para outras, ou se falla a reconstrución, pode que teñas que forzar a actualización desas apps.", + "migration_0024_rebuild_python_venv_disclaimer_rebuild": "Vaise intentar a reconstrución de virtualenv para as seguintes apps (Nota: a operación podería tomar algún tempo!): {rebuild_apps}", + "migration_0024_rebuild_python_venv_disclaimer_ignored": "Non se puido reconstruir virtualenv para estas apps. Precisas forzar a súa actualización, pódelo facer desde a liña de comandos con: `yunohost app upgrade -f APP`: {ignored_apps}", + "migration_0024_rebuild_python_venv_in_progress": "Intentando reconstruir python virtualenv para `{app}`", + "migration_description_0024_rebuild_python_venv": "Reparar app python após a migración a bullseye", + "migration_0024_rebuild_python_venv_failed": "Fallou a reconstrución de python virtualenv para {app}. A app podería non funcionar mentras non se resolve. Deberías intentar arranxar a situación forzando a actualización desta app usando `yunohost app upgrade --force {app}`." } From 27e5031ad7e41a1d65eb6a2adff78190341580b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Gaspar?= Date: Sat, 13 Aug 2022 06:43:49 +0000 Subject: [PATCH 541/619] Translated using Weblate (French) Currently translated at 100.0% (694 of 694 strings) Translation: YunoHost/core Translate-URL: https://translate.yunohost.org/projects/yunohost/core/fr/ --- locales/fr.json | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/locales/fr.json b/locales/fr.json index 77f1ca9d1..f99af7dc1 100644 --- a/locales/fr.json +++ b/locales/fr.json @@ -546,7 +546,7 @@ "app_manifest_install_ask_domain": "Choisissez le domaine sur lequel vous souhaitez installer cette application", "global_settings_setting_smtp_relay_user": "Compte utilisateur du relais SMTP", "global_settings_setting_smtp_relay_port": "Port du relais SMTP", - "global_settings_setting_smtp_relay_host": "Un relais SMTP permet d'envoyer du courrier à la place de cette instance YunoHost. Cela est utile si vous êtes dans l'une de ces situations : le port 25 est bloqué par votre FAI ou par votre fournisseur VPS ; vous avez une IP résidentielle répertoriée sur DUHL ; vous ne pouvez pas configurer le DNS inversé ; ou le serveur n'est pas directement accessible depuis Internet et vous voulez en utiliser un autre pour envoyer des mails.", + "global_settings_setting_smtp_relay_host": "Relais SMTP à utiliser pour pouvoir envoyer des mails au lieu d'utiliser cette instance YunoHost. Cela est utile si vous êtes dans l'une de ces situations : le port 25 est bloqué par votre FAI ou votre fournisseur VPS ; vous avez une IP résidentielle répertoriée sur DUHL ; vous ne pouvez pas configurer le DNS inversé ; ou le serveur n'est pas directement accessible depuis Internet et vous voulez en utiliser un autre pour envoyer des mails.", "diagnosis_package_installed_from_sury_details": "Certains paquets ont été installés par inadvertance à partir d'un dépôt tiers appelé Sury. L'équipe YunoHost a amélioré la stratégie de gestion de ces paquets, mais on s'attend à ce que certaines configurations qui ont installé des applications PHP7.3 tout en étant toujours sur Stretch présentent des incohérences. Pour résoudre cette situation, vous devez essayer d'exécuter la commande suivante : {cmd_to_fix}", "app_argument_password_no_default": "Erreur lors de l'analyse de l'argument de mot de passe '{name}' : l'argument de mot de passe ne peut pas avoir de valeur par défaut pour des raisons de sécurité", "pattern_email_forward": "L'adresse électronique doit être valide, le symbole '+' étant accepté (par exemple : johndoe+yunohost@exemple.com)", @@ -684,5 +684,13 @@ "migration_0023_postgresql_13_not_installed": "PostgreSQL 11 est installé, mais pas PostgreSQL 13 ! ? Quelque chose d'anormal s'est peut-être produit sur votre système :(...", "tools_upgrade_failed": "Impossible de mettre à jour les paquets : {packages_list}", "migration_0023_not_enough_space": "Prévoyez suffisamment d'espace disponible dans {path} pour exécuter la migration.", - "migration_0023_postgresql_11_not_installed": "PostgreSQL n'a pas été installé sur votre système. Il n'y a rien à faire." + "migration_0023_postgresql_11_not_installed": "PostgreSQL n'a pas été installé sur votre système. Il n'y a rien à faire.", + "migration_0021_venv_regen_failed": "L'environnement virtuel '{venv}' n'a pas pu se régénérer, vous devez probablement exécuter la commande `yunohost app upgrade --force`", + "migration_0024_rebuild_python_venv_disclaimer_rebuild": "La reconstruction du virtualenv sera tentée pour les applications suivantes (NB : l'opération peut prendre un certain temps !) : {rebuild_apps}", + "migration_0024_rebuild_python_venv_in_progress": "Tentative de reconstruction du virtualenv Python pour `{app}`", + "migration_0024_rebuild_python_venv_failed": "Échec de la reconstruction de l'environnement virtuel Python pour {app}. L'application peut ne pas fonctionner tant que ce problème n'est pas résolu. Vous devriez corriger la situation en forçant la mise à jour de cette application en utilisant `yunohost app upgrade --force {app}`.", + "migration_description_0024_rebuild_python_venv": "Réparer l'application Python après la migration Bullseye", + "migration_0024_rebuild_python_venv_broken_app": "Ignorer {app} car virtualenv ne peut pas être facilement reconstruit pour cette application. Au lieu de cela, vous devriez corriger la situation en forçant la mise à jour de cette application en utilisant `yunohost app upgrade --force {app}`.", + "migration_0024_rebuild_python_venv_disclaimer_base": "Suite à la mise à niveau vers Debian Bullseye, certaines applications Python doivent être partiellement reconstruites pour être converties vers la nouvelle version Python livrée dans Debian (en termes techniques : ce qu'on appelle le \"virtualenv\" doit être recréé). En attendant, ces applications Python peuvent ne pas fonctionner. YunoHost peut tenter de reconstruire le virtualenv pour certains d'entre eux, comme détaillé ci-dessous. Pour les autres applications, ou si la tentative de reconstruction échoue, vous devrez forcer manuellement une mise à niveau pour ces applications.", + "migration_0024_rebuild_python_venv_disclaimer_ignored": "Les virtualenvs ne peuvent pas être reconstruits automatiquement pour ces applications. Vous devez forcer une mise à jour pour ceux-ci, ce qui peut être fait à partir de la ligne de commande : `yunohost app upgrade --force APP` : {ignored_apps}" } From 7684e219a97161cfcee5f7f18a96bd7e67cb7076 Mon Sep 17 00:00:00 2001 From: punkrockgirl Date: Sat, 13 Aug 2022 13:41:55 +0000 Subject: [PATCH 542/619] Translated using Weblate (Basque) Currently translated at 100.0% (694 of 694 strings) Translation: YunoHost/core Translate-URL: https://translate.yunohost.org/projects/yunohost/core/eu/ --- locales/eu.json | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/locales/eu.json b/locales/eu.json index e0ce226d5..96d5d8c2e 100644 --- a/locales/eu.json +++ b/locales/eu.json @@ -684,5 +684,13 @@ "migration_0023_postgresql_11_not_installed": "PostgreSQL ez zegoen zure isteman instalatuta. Ez dago egitekorik.", "migration_0023_postgresql_13_not_installed": "PostgreSQL 11 dago instalatuta baina PostgreSQL 13 ez!? Zerbait arraroa gertatu omen zaio zure sistemari :( …", "migration_description_0022_php73_to_php74_pools": "Migratu php7.3-fpm 'pool' ezarpen-fitxategiak php7.4ra", - "migration_description_0023_postgresql_11_to_13": "Migratu datubaseak PostgreSQL 11tik 13ra" -} \ No newline at end of file + "migration_description_0023_postgresql_11_to_13": "Migratu datubaseak PostgreSQL 11tik 13ra", + "migration_0021_venv_regen_failed": "'{venv}' ingurune birtuala ezin izan da birsortu, ziurrenik `yunohost app upgrade --force` komandoa exekutatu behar duzu", + "migration_0024_rebuild_python_venv_broken_app": "{app} aplikazioari ez ikusiarena egin zaio ezin delako ingurune birtuala modu errazean birsortu. Horren ordez, aplikazioaren eguneraketa behartzen saia zaitezke `yunohost app upgrade --force {app}` arazoa konpontzeko.", + "migration_0024_rebuild_python_venv_disclaimer_rebuild": "Ondorengo aplikazioen virtualenv-a birsortzeko saiakera egingo da (eragiketak luze jo dezake!): {rebuild_apps}", + "migration_0024_rebuild_python_venv_disclaimer_ignored": "Virtualenv-ak ezin dira birsortu aplikazio horientzat. Eguneraketa behartu behar duzu horientzat, ondorengo komandoa exekutatuz egin daiteke: `yunohost app upgrade --force APP`: {ignored_apps}", + "migration_0024_rebuild_python_venv_in_progress": "`{app}` aplikazioaren Python virtualenv-a birsortzeko lanetan", + "migration_0024_rebuild_python_venv_failed": "Kale egin du {app} aplikazioaren Python virtualenv-aren birsorkuntza saiakerak. Litekeena da aplikazioak ez funtzionatzea arazoa konpondu arte. Aplikazioaren eguneraketa behartu beharko zenuke ondorengo komandoarekin: `yunohost app upgrade --force {app}`.", + "migration_description_0024_rebuild_python_venv": "Konpondu Python aplikazioa Bullseye eguneraketa eta gero", + "migration_0024_rebuild_python_venv_disclaimer_base": "Debian Bullseye eguneraketa dela-eta, Python aplikazio batzuk birsortu behar dira Debianekin datorren Pythonen bertsiora egokitzeko (teknikoki 'virtualenv' deritzaiona birsortu behar da). Egin artean, litekeena da Python aplikazio horiek ez funtzionatzea. YunoHost saia daiteke beherago ageri diren aplikazioen virtualenv edo ingurune birtualak birsortzen. Beste aplikazio batzuen kasuan, edo birsortze saiakerak kale egingo balu, aplikazio horien eguneraketa behartu beharko duzu." +} From 46e36240a2d7adff11d98ec66b9add088414dd74 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Sat, 13 Aug 2022 21:47:46 +0200 Subject: [PATCH 543/619] Update locales/fr.json --- locales/fr.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/locales/fr.json b/locales/fr.json index f99af7dc1..fcddbe9fc 100644 --- a/locales/fr.json +++ b/locales/fr.json @@ -546,7 +546,7 @@ "app_manifest_install_ask_domain": "Choisissez le domaine sur lequel vous souhaitez installer cette application", "global_settings_setting_smtp_relay_user": "Compte utilisateur du relais SMTP", "global_settings_setting_smtp_relay_port": "Port du relais SMTP", - "global_settings_setting_smtp_relay_host": "Relais SMTP à utiliser pour pouvoir envoyer des mails au lieu d'utiliser cette instance YunoHost. Cela est utile si vous êtes dans l'une de ces situations : le port 25 est bloqué par votre FAI ou votre fournisseur VPS ; vous avez une IP résidentielle répertoriée sur DUHL ; vous ne pouvez pas configurer le DNS inversé ; ou le serveur n'est pas directement accessible depuis Internet et vous voulez en utiliser un autre pour envoyer des mails.", + "global_settings_setting_smtp_relay_host": "Relais SMTP à utiliser pour envoyer les mails au lieu de cette instance YunoHost. Cela est utile si vous êtes dans l'une de ces situations : le port 25 est bloqué par votre FAI ou votre fournisseur VPS ; vous avez une IP résidentielle répertoriée sur DUHL ; vous ne pouvez pas configurer le DNS inversé ; ou le serveur n'est pas directement accessible depuis Internet et vous voulez en utiliser un autre pour envoyer des mails.", "diagnosis_package_installed_from_sury_details": "Certains paquets ont été installés par inadvertance à partir d'un dépôt tiers appelé Sury. L'équipe YunoHost a amélioré la stratégie de gestion de ces paquets, mais on s'attend à ce que certaines configurations qui ont installé des applications PHP7.3 tout en étant toujours sur Stretch présentent des incohérences. Pour résoudre cette situation, vous devez essayer d'exécuter la commande suivante : {cmd_to_fix}", "app_argument_password_no_default": "Erreur lors de l'analyse de l'argument de mot de passe '{name}' : l'argument de mot de passe ne peut pas avoir de valeur par défaut pour des raisons de sécurité", "pattern_email_forward": "L'adresse électronique doit être valide, le symbole '+' étant accepté (par exemple : johndoe+yunohost@exemple.com)", From 3cb1a41aa8acd352c95ecd94900b5ad9fec86aff Mon Sep 17 00:00:00 2001 From: Kay0u Date: Sat, 13 Aug 2022 22:28:27 +0200 Subject: [PATCH 544/619] fix linter in postgresql migration --- src/migrations/0023_postgresql_11_to_13.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/migrations/0023_postgresql_11_to_13.py b/src/migrations/0023_postgresql_11_to_13.py index 206143dbb..5c788584e 100644 --- a/src/migrations/0023_postgresql_11_to_13.py +++ b/src/migrations/0023_postgresql_11_to_13.py @@ -1,5 +1,6 @@ import subprocess import time +import os from moulinette import m18n from yunohost.utils.error import YunohostError, YunohostValidationError @@ -19,7 +20,7 @@ class MyMigration(Migration): def run(self): - if os.system('grep -A10 "ynh-deps" /var/lib/dpkg/status | grep "Package:\|Depends:" | grep -B1 postgresql') != 0: + if os.system('grep -A10 "ynh-deps" /var/lib/dpkg/status | grep -E "Package:|Depends:" | grep -B1 postgresql') != 0: logger.info("No YunoHost app seem to require postgresql... Skipping!") return From 8d84c91e03e9c7bbd4bd8fb6df81bf87e86dc52a Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Sat, 13 Aug 2022 22:39:36 +0200 Subject: [PATCH 545/619] Update changelog for 11.0.9.3 --- debian/changelog | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/debian/changelog b/debian/changelog index dc0a418fe..f19637b5d 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,12 @@ +yunohost (11.0.9.3) stable; urgency=low + + - [fix] postgresql 11->13: Epic typo / missing import (3cb1a41a) + - [i18n] Translations updated for Basque, French, Galician + + Thanks to all contributors <3 ! (Éric Gaspar, José M, Kay0u, punkrockgirl) + + -- Alexandre Aubin Sat, 13 Aug 2022 22:37:05 +0200 + yunohost (11.0.9.2) stable; urgency=low - [fix] venv rebuild: fix yunohost app force upgrade command (5d90971b) From e68fc821cf02dd53cd18e608696f907f2d59272f Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Sun, 14 Aug 2022 18:07:04 +0200 Subject: [PATCH 546/619] bullseye migration: trash pip freeze stderr because it's confusing users ... --- src/yunohost/data_migrations/0021_migrate_to_bullseye.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/yunohost/data_migrations/0021_migrate_to_bullseye.py b/src/yunohost/data_migrations/0021_migrate_to_bullseye.py index ce7d25262..e8f664675 100644 --- a/src/yunohost/data_migrations/0021_migrate_to_bullseye.py +++ b/src/yunohost/data_migrations/0021_migrate_to_bullseye.py @@ -66,7 +66,7 @@ def _backup_pip_freeze_for_python_app_venvs(): venvs = _get_all_venvs("/opt/") + _get_all_venvs("/var/www/") for venv in venvs: # Generate a requirements file from venv - os.system(f"{venv}/bin/pip freeze > {venv}{VENV_REQUIREMENTS_SUFFIX}") + os.system(f"{venv}/bin/pip freeze > {venv}{VENV_REQUIREMENTS_SUFFIX} 2>/dev/null") class MyMigration(Migration): From 02fcbd9792f35b9edf9aa635779ae79fa6cc9345 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Sun, 14 Aug 2022 18:10:10 +0200 Subject: [PATCH 547/619] bullseye migration: add a check that there's at least 70MB available in /boot ... --- src/yunohost/data_migrations/0021_migrate_to_bullseye.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/yunohost/data_migrations/0021_migrate_to_bullseye.py b/src/yunohost/data_migrations/0021_migrate_to_bullseye.py index e8f664675..9b11f8084 100644 --- a/src/yunohost/data_migrations/0021_migrate_to_bullseye.py +++ b/src/yunohost/data_migrations/0021_migrate_to_bullseye.py @@ -373,6 +373,9 @@ class MyMigration(Migration): if free_space_in_directory("/var/") / (1024**3) < 1.0: raise YunohostError("migration_0021_not_enough_free_space") + if free_space_in_directory("/boot/") / (70**3) < 1.0: + raise YunohostError("/boot/ has less than 70MB available. This will probably trigger a crash during the upgrade because a new kernel needs to be installed. Please look for advice on the forum on how to remove old unused kernels to free some space in /boot/.", raw_msg=True) + # Check system is up to date # (but we don't if 'bullseye' is already in the sources.list ... # which means maybe a previous upgrade crashed and we're re-running it) From 633a1fbffe5b374c30814f9152ed0f5883513804 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Sun, 14 Aug 2022 18:17:24 +0200 Subject: [PATCH 548/619] bullseye migration: better detection mechanism for the libc6 / libgcc hell issue --- src/yunohost/data_migrations/0021_migrate_to_bullseye.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/yunohost/data_migrations/0021_migrate_to_bullseye.py b/src/yunohost/data_migrations/0021_migrate_to_bullseye.py index 9b11f8084..7a47941a1 100644 --- a/src/yunohost/data_migrations/0021_migrate_to_bullseye.py +++ b/src/yunohost/data_migrations/0021_migrate_to_bullseye.py @@ -201,7 +201,7 @@ class MyMigration(Migration): # Another boring fix for the super annoying libc6-dev: Breaks libgcc-8-dev # https://forum.yunohost.org/t/20617 # - if os.system("grep -A10 'ynh-deps' /var/lib/dpkg/status | grep -q 'Depends:.*build-essential'") == 0: + if os.sytem("dpkg --list | grep '^ii' | grep -q ' libgcc-8-dev '") == 0 and os.system("LC_ALL=C apt policy libgcc-8-dev | grep Candidate | grep -q rpi"): logger.info("Attempting to fix the build-essential / libc6-dev / libgcc-8-dev hell ...") os.system("cp /var/lib/dpkg/status /root/dpkg_status.bkp") # This removes the dependency to build-essential from $app-ynh-deps From 0a66d039c2b583d416f52e8230009491314a2933 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Sun, 14 Aug 2022 18:18:55 +0200 Subject: [PATCH 549/619] Update changelog for 4.4.2.4 --- debian/changelog | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/debian/changelog b/debian/changelog index be9c07de5..3ad7323d1 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,11 @@ +yunohost (4.4.2.4) stable; urgency=low + + - [fix] bullseye migration: trash pip freeze stderr because it's confusing users ... (e68fc821) + - [fix] bullseye migration: add a check that there's at least 70MB available in /boot ... (02fcbd97) + - [fix] bullseye migration: better detection mechanism for the libc6 / libgcc hell issue (633a1fbf) + + -- Alexandre Aubin Sun, 14 Aug 2022 18:18:13 +0200 + yunohost (4.4.2.3) stable; urgency=low - [fix] bullseye migration: add fix for stupid dnsmasq not picking new init script (origin/dev, origin/HEAD, dev) From c8031acee7500068b354f10f7a71fdb83c58de7a Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Sun, 14 Aug 2022 18:22:12 +0200 Subject: [PATCH 550/619] venv rebuild: synapse's folder is named matrix-synapse --- src/migrations/0024_rebuild_python_venv.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/migrations/0024_rebuild_python_venv.py b/src/migrations/0024_rebuild_python_venv.py index 5ead78b19..d5aa7fc10 100644 --- a/src/migrations/0024_rebuild_python_venv.py +++ b/src/migrations/0024_rebuild_python_venv.py @@ -68,6 +68,7 @@ class MyMigration(Migration): "pgadmin", "tracim", "synapse", + "matrix-synapse", "weblate", ] From 4e39c70123a918ae4235962c7471a0de43041b9d Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Sun, 14 Aug 2022 18:28:25 +0200 Subject: [PATCH 551/619] Update changelog for 11.0.9.4 --- debian/changelog | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/debian/changelog b/debian/changelog index 7584561bd..cbf60aa83 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,10 @@ +yunohost (11.0.9.4) stable; urgency=low + + - Propagate fixes in buster->bullseye migration + - [fix] venv rebuild: synapse's folder is named matrix-synapse (c8031ace) + + -- Alexandre Aubin Sun, 14 Aug 2022 18:22:30 +0200 + yunohost (11.0.9.3) stable; urgency=low - [fix] postgresql 11->13: Epic typo / missing import (3cb1a41a) From 1246fcf8f6c75bea7355acc13181a69337625739 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Sun, 14 Aug 2022 18:56:20 +0200 Subject: [PATCH 552/619] nginx: I'm tired of people reporting the 'Report-Only' error message they see in the console. This is useless. Just get rid of it. --- conf/nginx/security.conf.inc | 1 - 1 file changed, 1 deletion(-) diff --git a/conf/nginx/security.conf.inc b/conf/nginx/security.conf.inc index a35bb566e..fe853155b 100644 --- a/conf/nginx/security.conf.inc +++ b/conf/nginx/security.conf.inc @@ -29,7 +29,6 @@ ssl_dhparam /usr/share/yunohost/ffdhe2048.pem; more_set_headers "Content-Security-Policy : upgrade-insecure-requests; default-src https: data: blob: ; object-src https: data: 'unsafe-inline'; style-src https: data: 'unsafe-inline' ; script-src https: data: 'unsafe-inline' 'unsafe-eval'"; {% else %} more_set_headers "Content-Security-Policy : upgrade-insecure-requests"; -more_set_headers "Content-Security-Policy-Report-Only : default-src https: wss: data: blob: ; object-src https: data: 'unsafe-inline'; style-src https: data: 'unsafe-inline' ; script-src https: data: 'unsafe-inline' 'unsafe-eval'"; {% endif %} more_set_headers "X-Content-Type-Options : nosniff"; more_set_headers "X-XSS-Protection : 1; mode=block"; From f6a80e118e44fded567cc06eb41cabcebbdc2f51 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Sun, 14 Aug 2022 19:41:27 +0200 Subject: [PATCH 553/619] Stupid typo.. --- src/yunohost/data_migrations/0021_migrate_to_bullseye.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/yunohost/data_migrations/0021_migrate_to_bullseye.py b/src/yunohost/data_migrations/0021_migrate_to_bullseye.py index 7a47941a1..84227a475 100644 --- a/src/yunohost/data_migrations/0021_migrate_to_bullseye.py +++ b/src/yunohost/data_migrations/0021_migrate_to_bullseye.py @@ -201,7 +201,7 @@ class MyMigration(Migration): # Another boring fix for the super annoying libc6-dev: Breaks libgcc-8-dev # https://forum.yunohost.org/t/20617 # - if os.sytem("dpkg --list | grep '^ii' | grep -q ' libgcc-8-dev '") == 0 and os.system("LC_ALL=C apt policy libgcc-8-dev | grep Candidate | grep -q rpi"): + if os.system("dpkg --list | grep '^ii' | grep -q ' libgcc-8-dev '") == 0 and os.system("LC_ALL=C apt policy libgcc-8-dev | grep Candidate | grep -q rpi"): logger.info("Attempting to fix the build-essential / libc6-dev / libgcc-8-dev hell ...") os.system("cp /var/lib/dpkg/status /root/dpkg_status.bkp") # This removes the dependency to build-essential from $app-ynh-deps From 415ed60227f708e4292832cc1333964a764c8e63 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Sun, 14 Aug 2022 19:41:50 +0200 Subject: [PATCH 554/619] Update changelog for 4.4.2.5 --- debian/changelog | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/debian/changelog b/debian/changelog index 3ad7323d1..d2d08556b 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,4 +1,4 @@ -yunohost (4.4.2.4) stable; urgency=low +yunohost (4.4.2.5) stable; urgency=low - [fix] bullseye migration: trash pip freeze stderr because it's confusing users ... (e68fc821) - [fix] bullseye migration: add a check that there's at least 70MB available in /boot ... (02fcbd97) From 030927cf03991ae90df8ed1de3b8d220410da817 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Sun, 14 Aug 2022 19:43:18 +0200 Subject: [PATCH 555/619] Update changelog for 11.0.9.5 --- debian/changelog | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/debian/changelog b/debian/changelog index e5401224f..5405aba74 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,4 +1,4 @@ -yunohost (11.0.9.4) stable; urgency=low +yunohost (11.0.9.5) stable; urgency=low - Propagate fixes in buster->bullseye migration - [fix] venv rebuild: synapse's folder is named matrix-synapse (c8031ace) From 8d1c75e732b59846f0799180217417cd3857fbf7 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Sun, 14 Aug 2022 21:34:50 +0200 Subject: [PATCH 556/619] helpers: fix logrotate shitty inconsistent handling of 'supposedly legacy' --non-append option ... --- helpers/logrotate | 29 +++++++++++++++++++---------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/helpers/logrotate b/helpers/logrotate index 6f9726beb..d7ad4571f 100644 --- a/helpers/logrotate +++ b/helpers/logrotate @@ -16,10 +16,27 @@ # Requires YunoHost version 2.6.4 or higher. # Requires YunoHost version 3.2.0 or higher for the argument `--specific_user` ynh_use_logrotate() { + + # Stupid patch to remplace --non-append by --nonappend + # Because for some reason --non-append was supposed to be legacy + # (why is it legacy ? Idk maybe because getopts cant parse args with - in their names..) + # but there was no good communication about this, and now --non-append + # is still the most-used option, yet it was parsed with batshit stupid code + # So instead this loops over the positional args, and replace --non-append + # with --nonappend so it's transperent for the rest of the function... + local all_args=( ${@} ) + for I in $(seq 0 $#) + do + if [[ "${all_args[$I]}" == "--non-append" ]] + then + all_args[$I]="--nonappend" + fi + done + set -- "${all_args[@]}" + # Declare an array to define the options of this helper. local legacy_args=lnuya - local -A args_array=([l]=logfile= [n]=nonappend [u]=specific_user= [y]=non [a]=append) - # [y]=non [a]=append are only for legacy purpose, to not fail on the old option '--non-append' + local -A args_array=([l]=logfile= [n]=nonappend [u]=specific_user=) local logfile local nonappend local specific_user @@ -30,14 +47,6 @@ ynh_use_logrotate() { specific_user="${specific_user:-}" # LEGACY CODE - PRE GETOPTS - if [ $# -gt 0 ] && [ "$1" == "--non-append" ]; then - nonappend=1 - # Destroy this argument for the next command. - shift - elif [ $# -gt 1 ] && [ "$2" == "--non-append" ]; then - nonappend=1 - fi - if [ $# -gt 0 ] && [ "$(echo ${1:0:1})" != "-" ]; then # If the given logfile parameter already exists as a file, or if it ends up with ".log", # we just want to manage a single file From 18ea57a8cc3c1a5d7b9bcf4c68fd476563b58757 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Mon, 15 Aug 2022 15:47:47 +0200 Subject: [PATCH 557/619] Aleks made a gazillion typos again --- src/yunohost/data_migrations/0021_migrate_to_bullseye.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/yunohost/data_migrations/0021_migrate_to_bullseye.py b/src/yunohost/data_migrations/0021_migrate_to_bullseye.py index 84227a475..68f79bacf 100644 --- a/src/yunohost/data_migrations/0021_migrate_to_bullseye.py +++ b/src/yunohost/data_migrations/0021_migrate_to_bullseye.py @@ -201,7 +201,7 @@ class MyMigration(Migration): # Another boring fix for the super annoying libc6-dev: Breaks libgcc-8-dev # https://forum.yunohost.org/t/20617 # - if os.system("dpkg --list | grep '^ii' | grep -q ' libgcc-8-dev '") == 0 and os.system("LC_ALL=C apt policy libgcc-8-dev | grep Candidate | grep -q rpi"): + if os.system("dpkg --list | grep '^ii' | grep -q ' libgcc-8-dev'") == 0 and os.system("LC_ALL=C apt policy libgcc-8-dev | grep Candidate | grep -q rpi") == 0: logger.info("Attempting to fix the build-essential / libc6-dev / libgcc-8-dev hell ...") os.system("cp /var/lib/dpkg/status /root/dpkg_status.bkp") # This removes the dependency to build-essential from $app-ynh-deps From d03abcc73c29bc74faad32b73d687579d112a1f5 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Mon, 15 Aug 2022 15:49:43 +0200 Subject: [PATCH 558/619] bullseye migration: simplify code, we can suffix packages with '-' to mean that we want to remove them during apt install call --- src/yunohost/data_migrations/0021_migrate_to_bullseye.py | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/yunohost/data_migrations/0021_migrate_to_bullseye.py b/src/yunohost/data_migrations/0021_migrate_to_bullseye.py index 68f79bacf..4734c1d10 100644 --- a/src/yunohost/data_migrations/0021_migrate_to_bullseye.py +++ b/src/yunohost/data_migrations/0021_migrate_to_bullseye.py @@ -206,9 +206,9 @@ class MyMigration(Migration): os.system("cp /var/lib/dpkg/status /root/dpkg_status.bkp") # This removes the dependency to build-essential from $app-ynh-deps os.system("perl -i~ -0777 -pe 's/(Package: .*-ynh-deps\\n(.+:.+\\n)+Depends:.*)(build-essential, ?)(.*)/$1$4/g' /var/lib/dpkg/status") - self.apt("build-essential", verb="remove") + self.apt_install("build-essential-") # Note the '-' suffix to mean that we actually want to remove the packages os.system("LC_ALL=C DEBIAN_FRONTEND=noninteractive APT_LISTCHANGES_FRONTEND=none apt autoremove --assume-yes") - self.apt("gcc-8 libgcc-8-dev", verb="remove") + self.apt_install("gcc-8- libgcc-8-dev-") # Note the '-' suffix to mean that we actually want to remove the packages # # Main upgrade @@ -489,9 +489,6 @@ class MyMigration(Migration): os.system(f"apt-mark unhold {package}") def apt_install(self, cmd): - return self.apt(cmd, verb="install") - - def apt(self, cmd, verb="install"): def is_relevant(line): return "Reading database ..." not in line.rstrip() @@ -505,7 +502,7 @@ class MyMigration(Migration): ) cmd = ( - f"LC_ALL=C DEBIAN_FRONTEND=noninteractive APT_LISTCHANGES_FRONTEND=none apt {verb} --quiet -o=Dpkg::Use-Pty=0 --fix-broken --assume-yes " + f"LC_ALL=C DEBIAN_FRONTEND=noninteractive APT_LISTCHANGES_FRONTEND=none apt install --quiet -o=Dpkg::Use-Pty=0 --fix-broken --assume-yes " + cmd ) From 75e96a42ff28a0c4a92f09da6130b17e3010bcef Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Mon, 15 Aug 2022 15:50:16 +0200 Subject: [PATCH 559/619] Update changelog for 4.4.2.6 --- debian/changelog | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/debian/changelog b/debian/changelog index d2d08556b..ff0859878 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,4 +1,4 @@ -yunohost (4.4.2.5) stable; urgency=low +yunohost (4.4.2.6) stable; urgency=low - [fix] bullseye migration: trash pip freeze stderr because it's confusing users ... (e68fc821) - [fix] bullseye migration: add a check that there's at least 70MB available in /boot ... (02fcbd97) From 87f0eff9558667980aed96d9501d933d9c40221b Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Mon, 15 Aug 2022 16:42:56 +0200 Subject: [PATCH 560/619] upgrades: ignore boring insserv warnings during apt commands --- src/yunohost/tools.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/yunohost/tools.py b/src/yunohost/tools.py index dbd3af5f5..d39a48f54 100644 --- a/src/yunohost/tools.py +++ b/src/yunohost/tools.py @@ -698,6 +698,8 @@ def _apt_log_line_is_relevant(line): "==> Keeping old config file as default.", "is a disabled or a static unit", " update-rc.d: warning: start and stop actions are no longer supported; falling back to defaults", + "insserv: warning: current stop runlevel", + "insserv: warning: current start runlevel", ] return line.rstrip() and all(i not in line.rstrip() for i in irrelevants) From 9eb123f8b1ff43ede55969244b92a0cc5391d0bb Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Tue, 16 Aug 2022 23:01:11 +0200 Subject: [PATCH 561/619] [fix] Better handling of super shitty edge case where an app settings.yml is empty for some unexpected mystic reason ... --- src/app.py | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/app.py b/src/app.py index be36a4561..2585a5080 100644 --- a/src/app.py +++ b/src/app.py @@ -1345,7 +1345,7 @@ def app_ssowatconf(): for app in _installed_apps(): - app_settings = read_yaml(APPS_SETTING_PATH + app + "/settings.yml") + app_settings = read_yaml(APPS_SETTING_PATH + app + "/settings.yml") or {} # Redirected redirected_urls.update(app_settings.get("redirected_urls", {})) @@ -1713,11 +1713,18 @@ def _get_app_settings(app): ) try: with open(os.path.join(APPS_SETTING_PATH, app, "settings.yml")) as f: - settings = yaml.safe_load(f) + settings = yaml.safe_load(f) or {} # If label contains unicode char, this may later trigger issues when building strings... # FIXME: this should be propagated to read_yaml so that this fix applies everywhere I think... settings = {k: v for k, v in settings.items()} + # App settings should never be empty, there should always be at least some standard, internal keys like id, install_time etc. + # Otherwise, this probably means that the app settings disappeared somehow... + if not settings: + logger.error(f"It looks like settings.yml for {app} is empty ... This should not happen ...") + logger.error(m18n.n("app_not_correctly_installed", app=app)) + return {} + # Stupid fix for legacy bullshit # In the past, some setups did not have proper normalization for app domain/path # Meaning some setups (as of January 2021) still have path=/foobar/ (with a trailing slash) From d283c900f473e6a690a12e064a0faabb37b2a8e1 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Wed, 17 Aug 2022 01:21:12 +0200 Subject: [PATCH 562/619] bullseye migration: higher treshold for low space detection in /boot/ because some people still experience the issue on 4.4.2.6 --- src/yunohost/data_migrations/0021_migrate_to_bullseye.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/yunohost/data_migrations/0021_migrate_to_bullseye.py b/src/yunohost/data_migrations/0021_migrate_to_bullseye.py index 4734c1d10..82187fb88 100644 --- a/src/yunohost/data_migrations/0021_migrate_to_bullseye.py +++ b/src/yunohost/data_migrations/0021_migrate_to_bullseye.py @@ -373,8 +373,8 @@ class MyMigration(Migration): if free_space_in_directory("/var/") / (1024**3) < 1.0: raise YunohostError("migration_0021_not_enough_free_space") - if free_space_in_directory("/boot/") / (70**3) < 1.0: - raise YunohostError("/boot/ has less than 70MB available. This will probably trigger a crash during the upgrade because a new kernel needs to be installed. Please look for advice on the forum on how to remove old unused kernels to free some space in /boot/.", raw_msg=True) + if free_space_in_directory("/boot/") / (120**3) < 1.0: + raise YunohostError("/boot/ has less than 120MB available. This will probably trigger a crash during the upgrade because a new kernel needs to be installed. Please look for advice on the forum on how to remove old, unused kernels to free up some space in /boot/.", raw_msg=True) # Check system is up to date # (but we don't if 'bullseye' is already in the sources.list ... From b08a31caeeee806949d21f50e824a28306e22e22 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Wed, 17 Aug 2022 01:22:11 +0200 Subject: [PATCH 563/619] Update changelog for 4.4.2.7 --- debian/changelog | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/debian/changelog b/debian/changelog index ff0859878..d8a8b1c19 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,10 @@ +yunohost (4.4.2.7) stable; urgency=low + + - upgrades: ignore boring insserv warnings during apt commands (87f0eff9) + - bullseye migration: higher treshold for low space detection in /boot/ because some people still experience the issue on 4.4.2.6 (d283c900) + + -- Alexandre Aubin Wed, 17 Aug 2022 01:21:36 +0200 + yunohost (4.4.2.6) stable; urgency=low - [fix] bullseye migration: trash pip freeze stderr because it's confusing users ... (e68fc821) From f4436312926b7eb397c5cd5060b4ca754a2da226 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Wed, 17 Aug 2022 01:27:38 +0200 Subject: [PATCH 564/619] Update changelog for 11.0.9.6 --- debian/changelog | 8 ++++++++ maintenance/make_changelog.sh | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/debian/changelog b/debian/changelog index aac543676..2e775bbc4 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,11 @@ +yunohost (11.0.9.6) stable; urgency=low + + - Sync with Buster branch + - [fix] helpers: logrotate shitty inconsistent handling of 'supposedly legacy' --non-append option ... (8d1c75e7) + - [fix] apps: Better handling of super shitty edge case where an app settings.yml is empty for some unexpected mystic reason ... (9eb123f8) + + -- Alexandre Aubin Wed, 17 Aug 2022 01:26:28 +0200 + yunohost (11.0.9.5) stable; urgency=low - Propagate fixes in buster->bullseye migration diff --git a/maintenance/make_changelog.sh b/maintenance/make_changelog.sh index 44171c5b6..a255f69b4 100644 --- a/maintenance/make_changelog.sh +++ b/maintenance/make_changelog.sh @@ -11,7 +11,7 @@ echo "$REPO ($VERSION) $RELEASE; urgency=low" echo "" git log $LAST_RELEASE.. -n 10000 --first-parent --pretty=tformat:' - %b%s (%h)' \ -| sed -E "s@Merge .*#([0-9]+).*\$@ \([#\1]\($REPO_URL/pull/\1\)\)@g" \ +| sed -E "s&Merge .*#([0-9]+).*\$& \([#\1]\($REPO_URL/pull/\1\)\)&g" \ | grep -v "Update from Weblate" \ | tac From 26665b231af6a6375ac04f5b8de2275d9932f96f Mon Sep 17 00:00:00 2001 From: yunohost-bot Date: Wed, 17 Aug 2022 00:34:05 +0000 Subject: [PATCH 565/619] [CI] Format code with Black --- src/app.py | 4 ++- src/migrations/0021_migrate_to_bullseye.py | 29 +++++++++++++++++----- src/migrations/0023_postgresql_11_to_13.py | 7 +++++- 3 files changed, 32 insertions(+), 8 deletions(-) diff --git a/src/app.py b/src/app.py index 2585a5080..fd70e883e 100644 --- a/src/app.py +++ b/src/app.py @@ -1721,7 +1721,9 @@ def _get_app_settings(app): # App settings should never be empty, there should always be at least some standard, internal keys like id, install_time etc. # Otherwise, this probably means that the app settings disappeared somehow... if not settings: - logger.error(f"It looks like settings.yml for {app} is empty ... This should not happen ...") + logger.error( + f"It looks like settings.yml for {app} is empty ... This should not happen ..." + ) logger.error(m18n.n("app_not_correctly_installed", app=app)) return {} diff --git a/src/migrations/0021_migrate_to_bullseye.py b/src/migrations/0021_migrate_to_bullseye.py index 44d88b5d4..f17855913 100644 --- a/src/migrations/0021_migrate_to_bullseye.py +++ b/src/migrations/0021_migrate_to_bullseye.py @@ -66,7 +66,9 @@ def _backup_pip_freeze_for_python_app_venvs(): venvs = _get_all_venvs("/opt/") + _get_all_venvs("/var/www/") for venv in venvs: # Generate a requirements file from venv - os.system(f"{venv}/bin/pip freeze > {venv}{VENV_REQUIREMENTS_SUFFIX} 2>/dev/null") + os.system( + f"{venv}/bin/pip freeze > {venv}{VENV_REQUIREMENTS_SUFFIX} 2>/dev/null" + ) class MyMigration(Migration): @@ -201,18 +203,30 @@ class MyMigration(Migration): # Another boring fix for the super annoying libc6-dev: Breaks libgcc-8-dev # https://forum.yunohost.org/t/20617 # - if os.system("dpkg --list | grep '^ii' | grep -q ' libgcc-8-dev'") == 0 and os.system("LC_ALL=C apt policy libgcc-8-dev | grep Candidate | grep -q rpi") == 0: - logger.info("Attempting to fix the build-essential / libc6-dev / libgcc-8-dev hell ...") + if ( + os.system("dpkg --list | grep '^ii' | grep -q ' libgcc-8-dev'") == 0 + and os.system( + "LC_ALL=C apt policy libgcc-8-dev | grep Candidate | grep -q rpi" + ) + == 0 + ): + logger.info( + "Attempting to fix the build-essential / libc6-dev / libgcc-8-dev hell ..." + ) os.system("cp /var/lib/dpkg/status /root/dpkg_status.bkp") # This removes the dependency to build-essential from $app-ynh-deps os.system( "perl -i~ -0777 -pe 's/(Package: .*-ynh-deps\\n(.+:.+\\n)+Depends:.*)(build-essential, ?)(.*)/$1$4/g' /var/lib/dpkg/status" ) - self.apt_install("build-essential-") # Note the '-' suffix to mean that we actually want to remove the packages + self.apt_install( + "build-essential-" + ) # Note the '-' suffix to mean that we actually want to remove the packages os.system( "LC_ALL=C DEBIAN_FRONTEND=noninteractive APT_LISTCHANGES_FRONTEND=none apt autoremove --assume-yes" ) - self.apt_install("gcc-8- libgcc-8-dev-") # Note the '-' suffix to mean that we actually want to remove the packages + self.apt_install( + "gcc-8- libgcc-8-dev-" + ) # Note the '-' suffix to mean that we actually want to remove the packages # # Main upgrade @@ -380,7 +394,10 @@ class MyMigration(Migration): raise YunohostError("migration_0021_not_enough_free_space") if free_space_in_directory("/boot/") / (120**3) < 1.0: - raise YunohostError("/boot/ has less than 120MB available. This will probably trigger a crash during the upgrade because a new kernel needs to be installed. Please look for advice on the forum on how to remove old, unused kernels to free up some space in /boot/.", raw_msg=True) + raise YunohostError( + "/boot/ has less than 120MB available. This will probably trigger a crash during the upgrade because a new kernel needs to be installed. Please look for advice on the forum on how to remove old, unused kernels to free up some space in /boot/.", + raw_msg=True, + ) # Check system is up to date # (but we don't if 'bullseye' is already in the sources.list ... diff --git a/src/migrations/0023_postgresql_11_to_13.py b/src/migrations/0023_postgresql_11_to_13.py index 5c788584e..981dc1a99 100644 --- a/src/migrations/0023_postgresql_11_to_13.py +++ b/src/migrations/0023_postgresql_11_to_13.py @@ -20,7 +20,12 @@ class MyMigration(Migration): def run(self): - if os.system('grep -A10 "ynh-deps" /var/lib/dpkg/status | grep -E "Package:|Depends:" | grep -B1 postgresql') != 0: + if ( + os.system( + 'grep -A10 "ynh-deps" /var/lib/dpkg/status | grep -E "Package:|Depends:" | grep -B1 postgresql' + ) + != 0 + ): logger.info("No YunoHost app seem to require postgresql... Skipping!") return From efa80304d265425c4013b645a51ce1cff9be1070 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Wed, 17 Aug 2022 19:18:49 +0200 Subject: [PATCH 566/619] =?UTF-8?q?Fix=20broken=20logrotate=20helper=20?= =?UTF-8?q?=C3=A9=5F=C3=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- helpers/logrotate | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/helpers/logrotate b/helpers/logrotate index d7ad4571f..6696632d5 100644 --- a/helpers/logrotate +++ b/helpers/logrotate @@ -25,7 +25,7 @@ ynh_use_logrotate() { # So instead this loops over the positional args, and replace --non-append # with --nonappend so it's transperent for the rest of the function... local all_args=( ${@} ) - for I in $(seq 0 $#) + for I in $(seq 0 $(($# - 1))) do if [[ "${all_args[$I]}" == "--non-append" ]] then From ddf2f36166a39e75b00a3942c5d51ccb51839038 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Gaspar?= Date: Sun, 14 Aug 2022 12:41:15 +0000 Subject: [PATCH 567/619] Translated using Weblate (French) Currently translated at 100.0% (693 of 693 strings) Translation: YunoHost/core Translate-URL: https://translate.yunohost.org/projects/yunohost/core/fr/ --- locales/fr.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/locales/fr.json b/locales/fr.json index 0a72e0731..fcddbe9fc 100644 --- a/locales/fr.json +++ b/locales/fr.json @@ -684,7 +684,7 @@ "migration_0023_postgresql_13_not_installed": "PostgreSQL 11 est installé, mais pas PostgreSQL 13 ! ? Quelque chose d'anormal s'est peut-être produit sur votre système :(...", "tools_upgrade_failed": "Impossible de mettre à jour les paquets : {packages_list}", "migration_0023_not_enough_space": "Prévoyez suffisamment d'espace disponible dans {path} pour exécuter la migration.", - "migration_0023_postgresql_11_not_installed": "PostgreSQL n'a pas été installé sur votre système. Il n'y a rien à faire.", + "migration_0023_postgresql_11_not_installed": "PostgreSQL n'a pas été installé sur votre système. Il n'y a rien à faire.", "migration_0021_venv_regen_failed": "L'environnement virtuel '{venv}' n'a pas pu se régénérer, vous devez probablement exécuter la commande `yunohost app upgrade --force`", "migration_0024_rebuild_python_venv_disclaimer_rebuild": "La reconstruction du virtualenv sera tentée pour les applications suivantes (NB : l'opération peut prendre un certain temps !) : {rebuild_apps}", "migration_0024_rebuild_python_venv_in_progress": "Tentative de reconstruction du virtualenv Python pour `{app}`", @@ -693,4 +693,4 @@ "migration_0024_rebuild_python_venv_broken_app": "Ignorer {app} car virtualenv ne peut pas être facilement reconstruit pour cette application. Au lieu de cela, vous devriez corriger la situation en forçant la mise à jour de cette application en utilisant `yunohost app upgrade --force {app}`.", "migration_0024_rebuild_python_venv_disclaimer_base": "Suite à la mise à niveau vers Debian Bullseye, certaines applications Python doivent être partiellement reconstruites pour être converties vers la nouvelle version Python livrée dans Debian (en termes techniques : ce qu'on appelle le \"virtualenv\" doit être recréé). En attendant, ces applications Python peuvent ne pas fonctionner. YunoHost peut tenter de reconstruire le virtualenv pour certains d'entre eux, comme détaillé ci-dessous. Pour les autres applications, ou si la tentative de reconstruction échoue, vous devrez forcer manuellement une mise à niveau pour ces applications.", "migration_0024_rebuild_python_venv_disclaimer_ignored": "Les virtualenvs ne peuvent pas être reconstruits automatiquement pour ces applications. Vous devez forcer une mise à jour pour ceux-ci, ce qui peut être fait à partir de la ligne de commande : `yunohost app upgrade --force APP` : {ignored_apps}" -} \ No newline at end of file +} From d9446d125e826d413925c3455e116c350a485daf Mon Sep 17 00:00:00 2001 From: Tymofii-Lytvynenko Date: Mon, 15 Aug 2022 15:37:53 +0000 Subject: [PATCH 568/619] Translated using Weblate (Ukrainian) Currently translated at 100.0% (693 of 693 strings) Translation: YunoHost/core Translate-URL: https://translate.yunohost.org/projects/yunohost/core/uk/ --- locales/uk.json | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/locales/uk.json b/locales/uk.json index 9a32a597b..2eab3d5a6 100644 --- a/locales/uk.json +++ b/locales/uk.json @@ -684,5 +684,12 @@ "tools_upgrade_failed": "Не вдалося оновити наступні пакети: {packages_list}", "migration_0023_not_enough_space": "Звільніть достатньо місця в {path} для виконання міграції.", "migration_0023_postgresql_11_not_installed": "PostgreSQL не було встановлено у вашій системі. Нічого робити.", - "migration_description_0022_php73_to_php74_pools": "Перенесення конфігураційних файлів php7.3-fpm 'pool' на php7.4" -} \ No newline at end of file + "migration_description_0022_php73_to_php74_pools": "Перенесення конфігураційних файлів php7.3-fpm 'pool' на php7.4", + "migration_0024_rebuild_python_venv_disclaimer_base": "Після оновлення до Debian Bullseye деякі застосунки Python потрібно частково перебудувати, щоб їх було перетворено на нову версію Python, яка постачається в Debian (з технічної точки зору: те, що називається «virtualenv», потрібно створити заново). Тим часом ці застосунки Python можуть не працювати. YunoHost може спробувати перебудувати virtualenv для деяких із них, як описано нижче. Для інших застосунків або якщо спроба відновлення не вдається, вам потрібно буде вручну примусово оновити їх.", + "migration_0024_rebuild_python_venv_broken_app": "Пропущено {app}, бо virtualenv не можна легко перебудувати для цього застосунку. Натомість вам слід виправити ситуацію, примусово оновивши застосунок за допомогою `yunohost app upgrade --force {app}`.", + "migration_0024_rebuild_python_venv_disclaimer_rebuild": "Буде зроблена спроба перебудувати virtualenv для таких застосунків (Примітка: операція може зайняти деякий час!): {rebuild_apps}", + "migration_0024_rebuild_python_venv_in_progress": "Намагаємося перебудувати Python virtualenv для `{app}`", + "migration_description_0024_rebuild_python_venv": "Відновлення застосунку Python після міграції до bullseye", + "migration_0024_rebuild_python_venv_disclaimer_ignored": "Virtualenvs не можна автоматично перебудувати для цих застосунків. Вам потрібно примусово оновити його для них, що можна зробити з командного рядка за допомогою: `yunohost app upgrade --force APP`: {ignored_apps}", + "migration_0024_rebuild_python_venv_failed": "Не вдалося перебудувати Python virtualenv для {app}. Застосунок може не працювати, доки це не вирішено. Ви повинні виправити ситуацію, примусово оновивши його за допомогою `yunohost app upgrade --force {app}`." +} From 016f5a418cc5eb609c0e679c7049f99685825db7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20M?= Date: Tue, 16 Aug 2022 07:22:07 +0000 Subject: [PATCH 569/619] Translated using Weblate (Galician) Currently translated at 100.0% (693 of 693 strings) Translation: YunoHost/core Translate-URL: https://translate.yunohost.org/projects/yunohost/core/gl/ --- locales/gl.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/locales/gl.json b/locales/gl.json index c09a0412e..5b1864e13 100644 --- a/locales/gl.json +++ b/locales/gl.json @@ -689,8 +689,8 @@ "migration_0024_rebuild_python_venv_broken_app": "Omitimos a app {app} porque virtualenv non se pode reconstruir para esta app. Deberías intentar resolver o problema forzando a actualización da app usando `yunohost app upgrade --force {app}`.", "migration_0024_rebuild_python_venv_disclaimer_base": "Após a actualización a Debian Bullseye, algunhas aplicacións de Python precisan ser reconstruídas para usar a nova versión de Python que inclúe Debian (técnicamente: recrear o `virtualenv`). Mentras tanto, algunhas aplicacións de Python poderían non funcionar. YunoHost pode intentar reconstruir o virtualenv para algunhas, como se indica abaixo. Para outras, ou se falla a reconstrución, pode que teñas que forzar a actualización desas apps.", "migration_0024_rebuild_python_venv_disclaimer_rebuild": "Vaise intentar a reconstrución de virtualenv para as seguintes apps (Nota: a operación podería tomar algún tempo!): {rebuild_apps}", - "migration_0024_rebuild_python_venv_disclaimer_ignored": "Non se puido reconstruir virtualenv para estas apps. Precisas forzar a súa actualización, pódelo facer desde a liña de comandos con: `yunohost app upgrade -f APP`: {ignored_apps}", - "migration_0024_rebuild_python_venv_in_progress": "Intentando reconstruir python virtualenv para `{app}`", - "migration_description_0024_rebuild_python_venv": "Reparar app python após a migración a bullseye", - "migration_0024_rebuild_python_venv_failed": "Fallou a reconstrución de python virtualenv para {app}. A app podería non funcionar mentras non se resolve. Deberías intentar arranxar a situación forzando a actualización desta app usando `yunohost app upgrade --force {app}`." + "migration_0024_rebuild_python_venv_disclaimer_ignored": "Non se puido reconstruir virtualenv para estas apps. Precisas forzar a súa actualización, pódelo facer desde a liña de comandos con: `yunohost app upgrade --force APP`: {ignored_apps}", + "migration_0024_rebuild_python_venv_in_progress": "Intentando reconstruir o Python virtualenv para `{app}`", + "migration_description_0024_rebuild_python_venv": "Reparar app Python após a migración a bullseye", + "migration_0024_rebuild_python_venv_failed": "Fallou a reconstrución de Python virtualenv para {app}. A app podería non funcionar mentras non se resolve. Deberías intentar arranxar a situación forzando a actualización desta app usando `yunohost app upgrade --force {app}`." } From a2dfec499d937f016e835c2457376cef45246ca3 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Wed, 17 Aug 2022 19:23:49 +0200 Subject: [PATCH 570/619] lint: F541 f-string is missing placeholders --- src/migrations/0021_migrate_to_bullseye.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/migrations/0021_migrate_to_bullseye.py b/src/migrations/0021_migrate_to_bullseye.py index f17855913..6b1d7c30b 100644 --- a/src/migrations/0021_migrate_to_bullseye.py +++ b/src/migrations/0021_migrate_to_bullseye.py @@ -525,7 +525,7 @@ class MyMigration(Migration): ) cmd = ( - f"LC_ALL=C DEBIAN_FRONTEND=noninteractive APT_LISTCHANGES_FRONTEND=none apt install --quiet -o=Dpkg::Use-Pty=0 --fix-broken --assume-yes " + "LC_ALL=C DEBIAN_FRONTEND=noninteractive APT_LISTCHANGES_FRONTEND=none apt install --quiet -o=Dpkg::Use-Pty=0 --fix-broken --assume-yes " + cmd ) From ec271043cdcf28ba74acc87d4ae854d8c2852695 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Wed, 17 Aug 2022 19:25:18 +0200 Subject: [PATCH 571/619] Update changelog for 11.0.9.7 --- debian/changelog | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/debian/changelog b/debian/changelog index 2e775bbc4..b911ccb38 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,12 @@ +yunohost (11.0.9.7) stable; urgency=low + + - [fix] logorate helper: was broken because wrong index é_è (efa80304) + - [i18n] Translations updated for French, Galician, Ukrainian + + Thanks to all contributors <3 ! (Éric Gaspar, José M, Tymofii-Lytvynenko) + + -- Alexandre Aubin Wed, 17 Aug 2022 19:24:11 +0200 + yunohost (11.0.9.6) stable; urgency=low - Sync with Buster branch From b306df2c3bed9343c869d5ea19631f321f935375 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Thu, 18 Aug 2022 19:17:48 +0200 Subject: [PATCH 572/619] apt helper: fix edge case with equivs package being flagged hold because of buster->bullseye migration --- data/helpers.d/apt | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/data/helpers.d/apt b/data/helpers.d/apt index 490a59f24..10edf23d4 100644 --- a/data/helpers.d/apt +++ b/data/helpers.d/apt @@ -394,6 +394,13 @@ ynh_remove_app_dependencies() { current_dependencies=${current_dependencies// | /|} fi + # Edge case where the app dep may be on hold, + # cf https://forum.yunohost.org/t/migration-error-cause-of-ffsync/20675/4 + if apt-mark showhold | grep -q -w ${dep_app}-ynh-deps + do + apt-mark unhold ${dep_app}-ynh-deps + done + ynh_package_autopurge ${dep_app}-ynh-deps # Remove the fake package and its dependencies if they not still used. # Check if this app used a specific php version ... in which case we check From a2d4abc1f8ef8b3033dcbf472faf2d731aa71681 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Thu, 18 Aug 2022 19:24:34 +0200 Subject: [PATCH 573/619] bullseye migration: fix check about free space in /boot/ ... --- src/yunohost/data_migrations/0021_migrate_to_bullseye.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/yunohost/data_migrations/0021_migrate_to_bullseye.py b/src/yunohost/data_migrations/0021_migrate_to_bullseye.py index 82187fb88..6aa9616ac 100644 --- a/src/yunohost/data_migrations/0021_migrate_to_bullseye.py +++ b/src/yunohost/data_migrations/0021_migrate_to_bullseye.py @@ -373,8 +373,9 @@ class MyMigration(Migration): if free_space_in_directory("/var/") / (1024**3) < 1.0: raise YunohostError("migration_0021_not_enough_free_space") - if free_space_in_directory("/boot/") / (120**3) < 1.0: - raise YunohostError("/boot/ has less than 120MB available. This will probably trigger a crash during the upgrade because a new kernel needs to be installed. Please look for advice on the forum on how to remove old, unused kernels to free up some space in /boot/.", raw_msg=True) + # Have > 70 MB free space on /var/ ? + if free_space_in_directory("/boot/") / (1024**2) < 70.0: + raise YunohostError("/boot/ has less than 70MB available. This will probably trigger a crash during the upgrade because a new kernel needs to be installed. Please look for advice on the forum on how to remove old, unused kernels to free up some space in /boot/.", raw_msg=True) # Check system is up to date # (but we don't if 'bullseye' is already in the sources.list ... From 4a1b31bac4a21c5e1d6e304bddb47015149513a9 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Thu, 18 Aug 2022 19:25:31 +0200 Subject: [PATCH 574/619] Update changelog for 4.4.2.8 --- debian/changelog | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/debian/changelog b/debian/changelog index d8a8b1c19..5e5a608c2 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,10 @@ +yunohost (4.4.2.8) stable; urgency=low + + - apt helper: fix edge case with equivs package being flagged hold because of buster->bullseye migration (b306df2c) + - bullseye migration: fix check about free space in /boot/ ... (a2d4abc1) + + -- Alexandre Aubin Thu, 18 Aug 2022 19:24:47 +0200 + yunohost (4.4.2.7) stable; urgency=low - upgrades: ignore boring insserv warnings during apt commands (87f0eff9) From 3706ba3121b815a8e442b7f17ff7fa9e52b8219d Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Fri, 19 Aug 2022 18:30:23 +0200 Subject: [PATCH 575/619] Hmpf --- data/helpers.d/apt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/data/helpers.d/apt b/data/helpers.d/apt index 10edf23d4..0a1d70004 100644 --- a/data/helpers.d/apt +++ b/data/helpers.d/apt @@ -397,9 +397,9 @@ ynh_remove_app_dependencies() { # Edge case where the app dep may be on hold, # cf https://forum.yunohost.org/t/migration-error-cause-of-ffsync/20675/4 if apt-mark showhold | grep -q -w ${dep_app}-ynh-deps - do + then apt-mark unhold ${dep_app}-ynh-deps - done + fi ynh_package_autopurge ${dep_app}-ynh-deps # Remove the fake package and its dependencies if they not still used. From 9ef7ac7117bcfd1b50628ad493f22e5ba9b4f0c4 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Fri, 19 Aug 2022 18:30:53 +0200 Subject: [PATCH 576/619] Update changelog for 4.4.2.9 --- debian/changelog | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/debian/changelog b/debian/changelog index 5e5a608c2..3f0189ad1 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,4 +1,4 @@ -yunohost (4.4.2.8) stable; urgency=low +yunohost (4.4.2.9) stable; urgency=low - apt helper: fix edge case with equivs package being flagged hold because of buster->bullseye migration (b306df2c) - bullseye migration: fix check about free space in /boot/ ... (a2d4abc1) From 18e041c4059af2532f467bb1a63153a4851abad3 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Fri, 19 Aug 2022 20:45:17 +0200 Subject: [PATCH 577/619] php7.3->7.4: autopatch nginx configs during restore --- helpers/backup | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/helpers/backup b/helpers/backup index 01b51d5a1..22737ff86 100644 --- a/helpers/backup +++ b/helpers/backup @@ -285,6 +285,14 @@ ynh_restore_file() { else mv "$archive_path" "${dest_path}" fi + + # Boring hack for nginx conf file mapped to php7.3 + # Note that there's no need to patch the fpm config because most php apps + # will call "ynh_add_fpm_config" during restore, effectively recreating the file from scratch + if [[ "${dest_path}" == "/etc/nginx/conf.d/"* ]] && grep 'php7.3.*sock' "${dest_path}" + then + sed -i 's/php7.3/php7.4/g' "${dest_path}" + fi } # Calculate and store a file checksum into the app settings From 2469b675151f3b56661e027f2defdbf6d554f2f4 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Fri, 19 Aug 2022 20:51:30 +0200 Subject: [PATCH 578/619] Update changelog for 11.0.9.8 --- debian/changelog | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/debian/changelog b/debian/changelog index 6f79734eb..96ca84faa 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,10 @@ +yunohost (11.0.9.8) stable; urgency=low + + - Sync with Buster branch + - [fix] php7.3->7.4: autopatch nginx configs during restore (18e041c4) + + -- Alexandre Aubin Fri, 19 Aug 2022 20:50:52 +0200 + yunohost (11.0.9.7) stable; urgency=low - [fix] logorate helper: was broken because wrong index é_è (efa80304) From 6a594d0e1d2ba65d7ed411262b71bb9a61eee54b Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Mon, 22 Aug 2022 10:25:27 +0200 Subject: [PATCH 579/619] bullseye migration: add proper explanations and advices after the damn 'The distribution is not Buster' message ... --- locales/en.json | 2 +- locales/fr.json | 2 +- src/yunohost/data_migrations/0021_migrate_to_bullseye.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/locales/en.json b/locales/en.json index cfb8a01f9..edce0545f 100644 --- a/locales/en.json +++ b/locales/en.json @@ -513,7 +513,7 @@ "migration_0021_main_upgrade": "Starting main upgrade...", "migration_0021_still_on_buster_after_main_upgrade": "Something went wrong during the main upgrade, the system appears to still be on Debian Buster", "migration_0021_yunohost_upgrade" : "Starting YunoHost core upgrade...", - "migration_0021_not_buster" : "The current Debian distribution is not Buster!", + "migration_0021_not_buster2": "The current Debian distribution is not Buster! If you already ran the Buster->Bullseye migration, then this error is symptomatic of the fact that the migration procedure was not 100% succesful (otherwise YunoHost would have flagged it as completed). It is recommended to investigate what happened with the support team, who will need the **full** log of the `migration, which can be found in Tools > Logs in the webadmin.", "migration_0021_not_enough_free_space" : "Free space is pretty low in /var/! You should have at least 1GB free to run this migration.", "migration_0021_system_not_fully_up_to_date": "Your system is not fully up-to-date. Please perform a regular upgrade before running the migration to Bullseye.", "migration_0021_general_warning": "Please note that this migration is a delicate operation. The YunoHost team did its best to review and test it, but the migration might still break parts of the system or its apps.\n\nTherefore, it is recommended to:\n - Perform a backup of any critical data or app. More info on https://yunohost.org/backup;\n - Be patient after launching the migration: Depending on your Internet connection and hardware, it might take up to a few hours for everything to upgrade.", diff --git a/locales/fr.json b/locales/fr.json index 92dc4b68a..bca5c16bb 100644 --- a/locales/fr.json +++ b/locales/fr.json @@ -716,7 +716,7 @@ "migration_0021_modified_files": "Veuillez noter que les fichiers suivants ont été modifiés manuellement et pourraient être écrasés à la suite de la mise à niveau : {manually_modified_files}", "migration_0021_cleaning_up": "Nettoyage du cache et des paquets qui ne sont plus nécessaires...", "migration_0021_patch_yunohost_conflicts": "Application du correctif pour contourner le problème de conflit...", - "migration_0021_not_buster": "La distribution Debian actuelle n'est pas Buster !", + "migration_0021_not_buster2": "La distribution Debian actuelle n'est pas Buster ! Si vous avez déjà effectué la migration Buster->Bullseye, alors cette erreur est symptomatique du fait que la migration n'a pas été terminée correctement à 100% (sinon YunoHost aurait marqué la migration comme terminée). Il est recommandé d'étudier ce qu'il s'est passé avec l'équipe de support, qui aura besoin du log **complet** de la migration, qui peut être retrouvé dans Outils > Journaux dans la webadmin.", "migration_description_0021_migrate_to_bullseye": "Mise à niveau du système vers Debian Bullseye et YunoHost 11.x", "global_settings_setting_security_ssh_password_authentication": "Autoriser l'authentification par mot de passe pour SSH" } diff --git a/src/yunohost/data_migrations/0021_migrate_to_bullseye.py b/src/yunohost/data_migrations/0021_migrate_to_bullseye.py index 6aa9616ac..8c3ba8ecf 100644 --- a/src/yunohost/data_migrations/0021_migrate_to_bullseye.py +++ b/src/yunohost/data_migrations/0021_migrate_to_bullseye.py @@ -367,7 +367,7 @@ class MyMigration(Migration): not self.debian_major_version() == N_CURRENT_DEBIAN and not self.yunohost_major_version() == N_CURRENT_YUNOHOST ): - raise YunohostError("migration_0021_not_buster") + raise YunohostError("migration_0021_not_buster2") # Have > 1 Go free space on /var/ ? if free_space_in_directory("/var/") / (1024**3) < 1.0: From 97fd8f0c9b53b6a267114d9358ca81ef73904149 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Mon, 22 Aug 2022 10:29:30 +0200 Subject: [PATCH 580/619] Update changelog for 4.4.2.10 --- debian/changelog | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/debian/changelog b/debian/changelog index 3f0189ad1..59cda2aba 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,9 @@ +yunohost (4.4.2.10) stable; urgency=low + + - bullseye migration: add proper explanations and advices after the damn 'The distribution is not Buster' message ... (6a594d0e) + + -- Alexandre Aubin Mon, 22 Aug 2022 10:28:50 +0200 + yunohost (4.4.2.9) stable; urgency=low - apt helper: fix edge case with equivs package being flagged hold because of buster->bullseye migration (b306df2c) From c88af25949cb1eb33ff7ab73005ce4241b88ea66 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Mon, 22 Aug 2022 10:33:11 +0200 Subject: [PATCH 581/619] Update changelog for 11.0.9.9 --- debian/changelog | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/debian/changelog b/debian/changelog index 1f2318aaa..61143d17b 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,4 +1,4 @@ -yunohost (11.0.9.8) stable; urgency=low +yunohost (11.0.9.9) stable; urgency=low - Sync with Buster branch - [fix] php7.3->7.4: autopatch nginx configs during restore (18e041c4) From ae92a0b8eae0f5e8bf9e546f4f86cf5b087b693a Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Wed, 24 Aug 2022 10:28:58 +0200 Subject: [PATCH 582/619] diagnosis: fix inaccurate message --- locales/en.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/locales/en.json b/locales/en.json index 4c7636499..620616748 100644 --- a/locales/en.json +++ b/locales/en.json @@ -161,7 +161,7 @@ "diagnosis_apps_deprecated_practices": "This app's installed version still uses some super-old deprecated packaging practices. You should really consider upgrading it.", "diagnosis_apps_issue": "An issue was found for app {app}", "diagnosis_apps_not_in_app_catalog": "This application is not in YunoHost's application catalog. If it was in the past and got removed, you should consider uninstalling this app as it won't receive upgrade, and may compromise the integrity and security of your system.", - "diagnosis_apps_outdated_ynh_requirement": "This app's installed version only requires yunohost >= 2.x, which tends to indicate that it's not up to date with recommended packaging practices and helpers. You should really consider upgrading it.", + "diagnosis_apps_outdated_ynh_requirement": "This app's installed version only requires yunohost >= 2.x or 3.x, which tends to indicate that it's not up to date with recommended packaging practices and helpers. You should really consider upgrading it.", "diagnosis_backports_in_sources_list": "It looks like apt (the package manager) is configured to use the backports repository. Unless you really know what you are doing, we strongly discourage from installing packages from backports, because it's likely to create unstabilities or conflicts on your system.", "diagnosis_basesystem_hardware": "Server hardware architecture is {virt} {arch}", "diagnosis_basesystem_hardware_model": "Server model is {model}", From 530bf04af5bead567e47df485ccf6d54da403f27 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Fri, 26 Aug 2022 16:24:44 +0200 Subject: [PATCH 583/619] [fix] logrotate helpers: getopts miserably explodes if 'legacy_args' is inconsistent with 'args_array' ... --- helpers/logrotate | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/helpers/logrotate b/helpers/logrotate index 6696632d5..45f66d443 100644 --- a/helpers/logrotate +++ b/helpers/logrotate @@ -35,7 +35,7 @@ ynh_use_logrotate() { set -- "${all_args[@]}" # Declare an array to define the options of this helper. - local legacy_args=lnuya + local legacy_args=lnu local -A args_array=([l]=logfile= [n]=nonappend [u]=specific_user=) local logfile local nonappend From 1aeb3da962ecf6b66fadf87732138963f72276ab Mon Sep 17 00:00:00 2001 From: liimee Date: Fri, 19 Aug 2022 10:07:36 +0000 Subject: [PATCH 584/619] Translated using Weblate (Indonesian) Currently translated at 9.6% (67 of 693 strings) Translation: YunoHost/core Translate-URL: https://translate.yunohost.org/projects/yunohost/core/id/ --- locales/id.json | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/locales/id.json b/locales/id.json index 47aff8b2e..7e67503be 100644 --- a/locales/id.json +++ b/locales/id.json @@ -11,7 +11,7 @@ "app_change_url_identical_domains": "Domain)url_path yang lama dan baru identik ('{domain}{path}'), tak ada yang perlu dilakukan.", "app_change_url_no_script": "Aplikasi '{app_name}' belum mendukung pengubahan URL. Mungkin Anda harus memperbaruinya.", "app_change_url_success": "URL {app} sekarang adalah {domain}{path}", - "app_id_invalid": "ID aplikasi tidak valid", + "app_id_invalid": "ID aplikasi tidak sah", "app_install_failed": "Tidak dapat memasang {app}: {error}", "app_install_files_invalid": "Berkas-berkas ini tidak dapat dipasang", "app_install_script_failed": "Sebuah kesalahan terjadi pada script pemasangan aplikasi", @@ -54,5 +54,16 @@ "backup_method_tar_finished": "Arsip TAR cadanagan dibuat", "backup_nothings_done": "Tak ada yang harus disimpan", "certmanager_cert_install_success": "Sertifikat Let's Encrypt sekarang sudah terpasang pada domain '{domain}'", - "backup_mount_archive_for_restore": "Menyiapkan arsip untuk pemulihan..." -} \ No newline at end of file + "backup_mount_archive_for_restore": "Menyiapkan arsip untuk pemulihan...", + "aborting": "Membatalkan.", + "action_invalid": "Tindakan tidak sah '{action}'", + "app_action_cannot_be_ran_because_required_services_down": "Layanan yang dibutuhkan ini harus aktif untuk menjalankan tindakan ini: {services}. Coba memulai ulang layanan tersebut untuk melanjutkan (dan mungkin melakukan penyelidikan mengapa layanan tersebut nonaktif).", + "app_argument_choice_invalid": "Pilih nilai yang sah untuk argumen '{name}': '{value}' tidak termasuk pada pilihan yang tersedia ({choices})", + "app_argument_invalid": "Pilih nilai yang sah untuk argumen '{name}': {error}", + "app_extraction_failed": "Tidak dapat mengekstrak berkas pemasangan", + "app_full_domain_unavailable": "Maaf, aplikasi ini harus dipasang pada domain sendiri, namun aplikasi lain sudah terpasang pada domain '{domain}'. Anda dapat menggunakan subdomain hanya untuk aplikasi ini.", + "app_location_unavailable": "URL ini mungkin tidak tersedia, atau terjadi konflik dengan aplikasi yang telah terpasang:\n{apps}", + "app_not_upgraded": "Aplikasi '{failed_app}' gagal diperbarui, oleh karena itu aplikasi-aplikasi berikut juga dibatalkan: {apps}", + "app_config_unable_to_apply": "Gagal menerapkan nilai-nilai panel konfigurasi.", + "app_config_unable_to_read": "Gagal membaca nilai-nilai panel konfigurasi." +} From b5a2e9f2b956404a86b3c97d4c6d1658ba93a201 Mon Sep 17 00:00:00 2001 From: Leandro Noferini Date: Sat, 20 Aug 2022 18:18:34 +0000 Subject: [PATCH 585/619] Translated using Weblate (Italian) Currently translated at 95.5% (662 of 693 strings) Translation: YunoHost/core Translate-URL: https://translate.yunohost.org/projects/yunohost/core/it/ --- locales/it.json | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/locales/it.json b/locales/it.json index 844b756ea..6d6aedd5b 100644 --- a/locales/it.json +++ b/locales/it.json @@ -659,5 +659,6 @@ "user_import_bad_line": "Linea errata {line}: {details}", "config_validate_url": "È necessario inserire un URL web valido", "ldap_server_down": "Impossibile raggiungere il server LDAP", - "ldap_server_is_down_restart_it": "Il servizio LDAP è down, prova a riavviarlo…" -} \ No newline at end of file + "ldap_server_is_down_restart_it": "Il servizio LDAP è down, prova a riavviarlo…", + "domain_config_default_app": "Applicazione di default" +} From a3cd1d11218c178392b5e06dcd2ad8ea92a42001 Mon Sep 17 00:00:00 2001 From: xabirequejo Date: Mon, 22 Aug 2022 15:14:54 +0000 Subject: [PATCH 586/619] Translated using Weblate (Basque) Currently translated at 100.0% (693 of 693 strings) Translation: YunoHost/core Translate-URL: https://translate.yunohost.org/projects/yunohost/core/eu/ --- locales/eu.json | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/locales/eu.json b/locales/eu.json index 96d5d8c2e..6ebe8b061 100644 --- a/locales/eu.json +++ b/locales/eu.json @@ -332,7 +332,7 @@ "domain_registrar_is_not_configured": "Oraindik ez da {domain} domeinurako erregistro-enpresa ezarri.", "domain_dns_push_not_applicable": "Ezin da {domain} domeinurako DNS konfigurazio automatiko funtzioa erabili. DNS erregistroak eskuz ezarri beharko zenituzke gidaorriei erreparatuz: https://yunohost.org/dns_config.", "domain_dns_push_managed_in_parent_domain": "DNS ezarpenak automatikoki konfiguratzeko funtzioa {parent_domain} domeinu nagusian kudeatzen da.", - "domain_dns_registrar_managed_in_parent_domain": "Domeinu hau {parent_domain_link} (r)en azpidomeinua da. DNS ezarpenak {parent_domain}(r)en konfigurazio atalean kudeatu behar dira.", + "domain_dns_registrar_managed_in_parent_domain": "Domeinu hau {parent_domain_link}(r)en azpidomeinua da. DNS ezarpenak {parent_domain}(r)en konfigurazio atalean kudeatu behar dira.", "domain_dns_registrar_yunohost": "Hau nohost.me / nohost.st / ynh.fr domeinu bat da eta, beraz, DNS ezarpenak automatikoki kudeatzen ditu YunoHostek, bestelako ezer konfiguratu beharrik gabe. (ikus 'yunohost dyndns update' komandoa)", "domain_dns_registrar_not_supported": "YunoHostek ezin izan du domeinu honen erregistro-enpresa automatikoki antzeman. Eskuz konfiguratu beharko dituzu DNS ezarpenak gidalerroei erreparatuz: https://yunohost.org/dns.", "domain_dns_registrar_experimental": "Oraingoz, YunoHosten kideek ez dute **{registrar}** erregistro-enpresaren APIa nahi beste probatu eta aztertu. Funtzioa **oso esperimentala** da — kontuz!", @@ -692,5 +692,6 @@ "migration_0024_rebuild_python_venv_in_progress": "`{app}` aplikazioaren Python virtualenv-a birsortzeko lanetan", "migration_0024_rebuild_python_venv_failed": "Kale egin du {app} aplikazioaren Python virtualenv-aren birsorkuntza saiakerak. Litekeena da aplikazioak ez funtzionatzea arazoa konpondu arte. Aplikazioaren eguneraketa behartu beharko zenuke ondorengo komandoarekin: `yunohost app upgrade --force {app}`.", "migration_description_0024_rebuild_python_venv": "Konpondu Python aplikazioa Bullseye eguneraketa eta gero", - "migration_0024_rebuild_python_venv_disclaimer_base": "Debian Bullseye eguneraketa dela-eta, Python aplikazio batzuk birsortu behar dira Debianekin datorren Pythonen bertsiora egokitzeko (teknikoki 'virtualenv' deritzaiona birsortu behar da). Egin artean, litekeena da Python aplikazio horiek ez funtzionatzea. YunoHost saia daiteke beherago ageri diren aplikazioen virtualenv edo ingurune birtualak birsortzen. Beste aplikazio batzuen kasuan, edo birsortze saiakerak kale egingo balu, aplikazio horien eguneraketa behartu beharko duzu." + "migration_0024_rebuild_python_venv_disclaimer_base": "Debian Bullseye eguneraketa dela-eta, Python aplikazio batzuk birsortu behar dira Debianekin datorren Pythonen bertsiora egokitzeko (teknikoki 'virtualenv' deritzaiona birsortu behar da). Egin artean, litekeena da Python aplikazio horiek ez funtzionatzea. YunoHost saia daiteke beherago ageri diren aplikazioen virtualenv edo ingurune birtualak birsortzen. Beste aplikazio batzuen kasuan, edo birsortze saiakerak kale egingo balu, aplikazio horien eguneraketa behartu beharko duzu.", + "migration_0021_not_buster2": "Zerbitzariak darabilen Debian bertsioa ez da Buster! Dagoeneko Buster -> Bullseye migrazioa exekutatu baduzu, errore honek migrazioa erabat arrakastatsua izan ez zela esan nahi du (bestela YunoHostek amaitutzat markatuko luke). Komenigarria izango litzateke, laguntza taldearekin batera, zer gertatu zen aztertzea. Horretarako `migrazioaren erregistro **osoa** beharko duzue, Erramintak > Erregistroak atalean eskuragarri dagoena." } From 3f8982b75a286a9aa54d52bfe28d3ff34c7ba461 Mon Sep 17 00:00:00 2001 From: Jose Riha Date: Thu, 25 Aug 2022 05:29:31 +0000 Subject: [PATCH 587/619] Translated using Weblate (Slovak) Currently translated at 32.1% (223 of 693 strings) Translation: YunoHost/core Translate-URL: https://translate.yunohost.org/projects/yunohost/core/sk/ --- locales/sk.json | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/locales/sk.json b/locales/sk.json index 7ac7097f1..875d23a98 100644 --- a/locales/sk.json +++ b/locales/sk.json @@ -160,7 +160,7 @@ "diagnosis_apps_broken": "Táto aplikácia je v katalógu aplikácií YunoHost momentálne označená ako rozbitá. Toto môže byť dočasný problém do momentu, kedy jej správcovia danú chybu neopravia. Kým sa tak stane sú aktualizácie tejto aplikácie vypnuté.", "diagnosis_apps_deprecated_practices": "Táto verzia nainštalovanej aplikácie používa niektoré prehistorické a zastaralé zásady balíčkovania. Naozaj by ste mali zvážiť jej aktualizovanie.", "diagnosis_apps_issue": "V aplikácií {app} sa našla chyba", - "diagnosis_apps_outdated_ynh_requirement": "Tejto verzii nainštalovanej aplikácie stačí yunohost vo verzii 2.x, čo naznačuje, že neobsahuje aktuálne odporúčané zásady balíčkovania a pomocné skripty. Naozaj by ste mali zvážiť jej aktualizáciu.", + "diagnosis_apps_outdated_ynh_requirement": "Táto verzia nainštalovanej aplikácie vyžaduje yunohost iba vo verzii 2.x alebo 3.x, čo naznačuje, že neobsahuje aktuálne odporúčané zásady balíčkovania a pomocné skripty. Naozaj by ste mali zvážiť jej aktualizáciu.", "diagnosis_basesystem_hardware": "Hardvérová architektúra servera je {virt} {arch}", "diagnosis_basesystem_hardware_model": "Model servera je {model}", "diagnosis_basesystem_host": "Server beží na Debiane {debian_version}", @@ -211,5 +211,15 @@ "diagnosis_http_could_not_diagnose": "Nepodarilo sa zistiť, či sú domény dostupné zvonka pomocou IPv{ipversion}.", "diagnosis_http_could_not_diagnose_details": "Chyba: {error}", "diagnosis_http_hairpinning_issue": "Zdá sa, že Vaša miestna sieť nemá zapnutý NAT hairpinning.", - "diagnosis_high_number_auth_failures": "V poslednom čase bol zistený neobvykle vysoký počet neúspešných prihlásení. Uistite sa, či je služba fail2ban spustená a správne nastavená alebo použite vlastný port pre SSH ako je popísané na https://yunohost.org/security." -} \ No newline at end of file + "diagnosis_high_number_auth_failures": "V poslednom čase bol zistený neobvykle vysoký počet neúspešných prihlásení. Uistite sa, či je služba fail2ban spustená a správne nastavená alebo použite vlastný port pre SSH ako je popísané na https://yunohost.org/security.", + "diagnosis_http_nginx_conf_not_up_to_date_details": "Pre opravu tohto problému preskúmajte rozdiely medzi konfiguráciami v termináli príkazom yunohost tools regen-conf nginx --dry-run --with-diff a ak so zmenami súhlasíte, aplikujte ich príkazom yunohost tools regen-conf nginx --force.", + "diagnosis_http_timeout": "Pri pokuse o kontaktovanie servera zvonku vypršal časový limit. Vyzerá byť nedostupný.
1. Najčastejšou príčinou tohto problému zvykne byť nesprávne nastavenie presmerovania portu 80 (a 443) na váš server.
2. Mali by ste skontrolovať, či je služba nginx spustená.
3. Pri komplexnejších inštaláciach: ubezpečte sa, že problém nie je spôsobený bránou firewall alebo reverznou proxy.", + "diagnosis_http_bad_status_code": "Zdá sa, že miesto vášho servera na vašu požiadavku zareagoval iný počítač (možno váš router).
1. Najčastejšou príčinou tohto problému zvykne byť nesprávne nastavenie presmerovania portu 80 (a 443) na váš server.
2. Pri komplexnejších inštaláciach: ubezpečte sa, že problém nie je spôsobený bránou firewall alebo reverznou proxy.", + "diagnosis_http_hairpinning_issue_details": "Toto pravdepodobne spôsobuje zariadenia od vášho poskytovateľa internetu / router. Vo výsledku pre používateľov mimo vašej miestnej siete (zvonku) funguje pripojenie na server normálne, to však neplatí pre používateľov v rámci miestnej siete (ako ste možno aj vy?) pri použití doménového mena alebo globálnej IP adresy. Túto situáciu sa vám možno podarí vyriešiť po prečítaní ", + "diagnosis_http_nginx_conf_not_up_to_date": "Nginx konfigurácia tejto domény sa zdá byť upravená ručne a znemožňuje YunoHost-u zistiť, či je dostupná na HTTP.", + "diagnosis_http_ok": "Doména {domain} je dostupná prostredníctvom HTTP mimo miestnej siete.", + "diagnosis_http_partially_unreachable": "Doména {domain} sa zdá byť nedostupná prostredníctvom HTTP mimo miestnej siete pri použití IPv{failed}, hoci funguje pri IPv{passed}.", + "diagnosis_http_special_use_tld": "Doména {domain} je založená na top-level doméne (TLD) pre zvláštne určenie ako je .local alebo .test a preto sa neočakáva, aby bola dostupná mimo miestnej siete.", + "diagnosis_http_unreachable": "Doména {domain} sa zdá byť nedostupná prostredníctvom HTTP mimo miestnej siete.", + "diagnosis_ignored_issues": "(+ {nb_ignored} ignorovaný(ch) problém(ov))" +} From ef5e2beb770a4fac1cba41fc1cd2d12d8030c0f1 Mon Sep 17 00:00:00 2001 From: Stephan Klein Date: Fri, 26 Aug 2022 09:01:49 +0000 Subject: [PATCH 588/619] Translated using Weblate (French) Currently translated at 100.0% (693 of 693 strings) Translation: YunoHost/core Translate-URL: https://translate.yunohost.org/projects/yunohost/core/fr/ --- locales/fr.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/locales/fr.json b/locales/fr.json index c6803cd39..ec9a6b59a 100644 --- a/locales/fr.json +++ b/locales/fr.json @@ -591,7 +591,7 @@ "ldap_server_down": "Impossible d'atteindre le serveur LDAP", "global_settings_setting_security_experimental_enabled": "Activer les fonctionnalités de sécurité expérimentales (ne l'activez pas si vous ne savez pas ce que vous faites !)", "diagnosis_apps_deprecated_practices": "La version installée de cette application utilise toujours certaines pratiques de packaging obsolètes. Vous devriez vraiment envisager de mettre l'application à jour.", - "diagnosis_apps_outdated_ynh_requirement": "La version installée de cette application nécessite uniquement YunoHost >= 2.x, cela indique que l'application n'est pas à jour avec les bonnes pratiques de packaging et les helpers recommandées. Vous devriez vraiment envisager de mettre l'application à jour.", + "diagnosis_apps_outdated_ynh_requirement": "La version installée de cette application nécessite uniquement YunoHost >= 2.x ou 3.x, ce qui tend à indiquer qu'elle n'est pas à jour avec les pratiques recommandées de packaging et des helpers . Vous devriez vraiment envisager de la mettre à jour.", "diagnosis_apps_bad_quality": "Cette application est actuellement signalée comme cassée dans le catalogue d'applications de YunoHost. Cela peut être un problème temporaire. En attendant que les mainteneurs tentent de résoudre le problème, la mise à jour de cette application est désactivée.", "diagnosis_apps_broken": "Cette application est actuellement signalée comme cassée dans le catalogue d'applications de YunoHost. Cela peut être un problème temporaire. En attendant que les mainteneurs tentent de résoudre le problème, la mise à jour de cette application est désactivée.", "diagnosis_apps_not_in_app_catalog": "Cette application est absente ou ne figure plus dans le catalogue d'applications de YunoHost. Vous devriez envisager de la désinstaller car elle ne recevra pas de mise à jour et pourrait compromettre l'intégrité et la sécurité de votre système.", From d87a0e3c8366dc8b5656b9c0c9cc686f920b848d Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Fri, 26 Aug 2022 16:33:30 +0200 Subject: [PATCH 589/619] Fix make_changelog script having irrelevant entrie about i18n (weblate commit message changed at some point) --- maintenance/make_changelog.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/maintenance/make_changelog.sh b/maintenance/make_changelog.sh index a255f69b4..7f461074f 100644 --- a/maintenance/make_changelog.sh +++ b/maintenance/make_changelog.sh @@ -12,7 +12,7 @@ echo "" git log $LAST_RELEASE.. -n 10000 --first-parent --pretty=tformat:' - %b%s (%h)' \ | sed -E "s&Merge .*#([0-9]+).*\$& \([#\1]\($REPO_URL/pull/\1\)\)&g" \ -| grep -v "Update from Weblate" \ +| grep -v "Translations update from Weblate" \ | tac TRANSLATIONS=$(git log $LAST_RELEASE... -n 10000 --pretty=format:"%s" \ From 907a1fa2bb81ee443f35e84249cad798d44c836b Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Fri, 26 Aug 2022 16:34:34 +0200 Subject: [PATCH 590/619] Update changelog for 11.0.9.10 --- debian/changelog | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/debian/changelog b/debian/changelog index 61143d17b..9779754ec 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,13 @@ +yunohost (11.0.9.10) stable; urgency=low + + - [fix] diagnosis: fix inaccurate message (ae92a0b8) + - [fix] logrotate helpers: getopts miserably explodes if 'legacy_args' is inconsistent with 'args_array' ... (530bf04a) + - [i18n] Translations updated for Basque, French, Indonesian, Italian, Slovak + + Thanks to all contributors <3 ! (Jose Riha, Leandro Noferini, liimee, Stephan Klein, xabirequejo) + + -- Alexandre Aubin Fri, 26 Aug 2022 16:32:19 +0200 + yunohost (11.0.9.9) stable; urgency=low - Sync with Buster branch From f5d94509a1f9884cd16d48f0dc2f41089bbbb289 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Fri, 26 Aug 2022 19:20:13 +0200 Subject: [PATCH 591/619] bullseye migration: add trick to automagically find the likely log of a previously failed migration to ease support --- .../data_migrations/0021_migrate_to_bullseye.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/yunohost/data_migrations/0021_migrate_to_bullseye.py b/src/yunohost/data_migrations/0021_migrate_to_bullseye.py index 8c3ba8ecf..444306b8e 100644 --- a/src/yunohost/data_migrations/0021_migrate_to_bullseye.py +++ b/src/yunohost/data_migrations/0021_migrate_to_bullseye.py @@ -367,6 +367,16 @@ class MyMigration(Migration): not self.debian_major_version() == N_CURRENT_DEBIAN and not self.yunohost_major_version() == N_CURRENT_YUNOHOST ): + try: + # Here we try to find the previous migration log, which should be somewhat recent and be at least 10k (we keep the biggest one) + maybe_previous_migration_log_id = check_output("cd /var/log/yunohost/categories/operation && find -name '*migrate*.log -size +10k -mtime -100 -exec ls -s {} \\; | sort -n | tr './' ' ' | awk '{print $2}' | tail -n 1") + if maybe_previous_migration_log_id: + logger.info(f"NB: the previous migration log id seems to be {maybe_previous_migration_log_id}. You can share it with the support team with : sudo yunohost log share {maybe_previous_migration_log_id}") + except Exception: + # Yeah it's not that important ... it's to simplify support ... + pass + + raise YunohostError("migration_0021_not_buster2") # Have > 1 Go free space on /var/ ? From 190c1302b1b16fe8eb1433780bd5352d0f9205dc Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Fri, 26 Aug 2022 19:23:02 +0200 Subject: [PATCH 592/619] Update changelog for 4.4.2.11 --- debian/changelog | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/debian/changelog b/debian/changelog index 59cda2aba..404493b7a 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,9 @@ +yunohost (4.4.2.11) stable; urgency=low + + - bullseye migration: add trick to automagically find the likely log of a previously failed migration to ease support (f5d94509) + + -- Alexandre Aubin Fri, 26 Aug 2022 19:22:30 +0200 + yunohost (4.4.2.10) stable; urgency=low - bullseye migration: add proper explanations and advices after the damn 'The distribution is not Buster' message ... (6a594d0e) From 86e13b06a4b2f77c9434cba68155b1aec8ccaa9c Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Fri, 26 Aug 2022 21:16:30 +0200 Subject: [PATCH 593/619] Update changelog for 11.0.9.11 --- debian/changelog | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/debian/changelog b/debian/changelog index ecbc5433e..ae0db2574 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,5 +1,6 @@ -yunohost (11.0.9.10) stable; urgency=low +yunohost (11.0.9.11) stable; urgency=low + = Merge with Buster branch - [fix] diagnosis: fix inaccurate message (ae92a0b8) - [fix] logrotate helpers: getopts miserably explodes if 'legacy_args' is inconsistent with 'args_array' ... (530bf04a) - [i18n] Translations updated for Basque, French, Indonesian, Italian, Slovak From 8951eb38bcb440cae5d7598927348dcfe57c0a2b Mon Sep 17 00:00:00 2001 From: Salamandar <6552989+Salamandar@users.noreply.github.com> Date: Sat, 27 Aug 2022 11:23:28 +0200 Subject: [PATCH 594/619] tools_postinstall: list all partitions (not only physical ones) This allows special installation cases such as in a container, where disk_partitions(all=False) would not show virtual mount points. --- src/tools.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tools.py b/src/tools.py index e9adedb2a..0980488ed 100644 --- a/src/tools.py +++ b/src/tools.py @@ -219,7 +219,7 @@ def tools_postinstall( ) # Check there's at least 10 GB on the rootfs... - disk_partitions = sorted(psutil.disk_partitions(), key=lambda k: k.mountpoint) + disk_partitions = sorted(psutil.disk_partitions(all=True), key=lambda k: k.mountpoint) main_disk_partitions = [d for d in disk_partitions if d.mountpoint in ["/", "/var"]] main_space = sum( psutil.disk_usage(d.mountpoint).total for d in main_disk_partitions From 36f910ed2885ddc16b356feeb9f6b7ac176ad619 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Sat, 27 Aug 2022 19:38:05 +0200 Subject: [PATCH 595/619] Aaaaand i managed to make a typo again --- src/yunohost/data_migrations/0021_migrate_to_bullseye.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/yunohost/data_migrations/0021_migrate_to_bullseye.py b/src/yunohost/data_migrations/0021_migrate_to_bullseye.py index 444306b8e..ee4ba65ea 100644 --- a/src/yunohost/data_migrations/0021_migrate_to_bullseye.py +++ b/src/yunohost/data_migrations/0021_migrate_to_bullseye.py @@ -369,7 +369,7 @@ class MyMigration(Migration): ): try: # Here we try to find the previous migration log, which should be somewhat recent and be at least 10k (we keep the biggest one) - maybe_previous_migration_log_id = check_output("cd /var/log/yunohost/categories/operation && find -name '*migrate*.log -size +10k -mtime -100 -exec ls -s {} \\; | sort -n | tr './' ' ' | awk '{print $2}' | tail -n 1") + maybe_previous_migration_log_id = check_output("cd /var/log/yunohost/categories/operation && find -name '*migrate*.log' -size +10k -mtime -100 -exec ls -s {} \\; | sort -n | tr './' ' ' | awk '{print $2}' | tail -n 1") if maybe_previous_migration_log_id: logger.info(f"NB: the previous migration log id seems to be {maybe_previous_migration_log_id}. You can share it with the support team with : sudo yunohost log share {maybe_previous_migration_log_id}") except Exception: From b9bb2e4de508c197986cc63acaf8e1083bc7224c Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Sun, 28 Aug 2022 14:47:29 +0200 Subject: [PATCH 596/619] Update changelog for 4.4.2.12 --- debian/changelog | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/debian/changelog b/debian/changelog index 404493b7a..b0d69cb05 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,4 +1,4 @@ -yunohost (4.4.2.11) stable; urgency=low +yunohost (4.4.2.12) stable; urgency=low - bullseye migration: add trick to automagically find the likely log of a previously failed migration to ease support (f5d94509) From c4b6dc239908175cec9d41b7cf8c6960c28e98a8 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Sat, 27 Aug 2022 19:38:05 +0200 Subject: [PATCH 597/619] Aaaaand i managed to make a typo again --- src/migrations/0021_migrate_to_bullseye.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/migrations/0021_migrate_to_bullseye.py b/src/migrations/0021_migrate_to_bullseye.py index eb5031823..0fbf5a5ea 100644 --- a/src/migrations/0021_migrate_to_bullseye.py +++ b/src/migrations/0021_migrate_to_bullseye.py @@ -389,7 +389,7 @@ class MyMigration(Migration): ): try: # Here we try to find the previous migration log, which should be somewhat recent and be at least 10k (we keep the biggest one) - maybe_previous_migration_log_id = check_output("cd /var/log/yunohost/categories/operation && find -name '*migrate*.log -size +10k -mtime -100 -exec ls -s {} \\; | sort -n | tr './' ' ' | awk '{print $2}' | tail -n 1") + maybe_previous_migration_log_id = check_output("cd /var/log/yunohost/categories/operation && find -name '*migrate*.log' -size +10k -mtime -100 -exec ls -s {} \\; | sort -n | tr './' ' ' | awk '{print $2}' | tail -n 1") if maybe_previous_migration_log_id: logger.info(f"NB: the previous migration log id seems to be {maybe_previous_migration_log_id}. You can share it with the support team with : sudo yunohost log share {maybe_previous_migration_log_id}") except Exception: From 9b5478ee63ccafedd28d9f69b4f740b0c6a0e61c Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Sun, 28 Aug 2022 14:47:29 +0200 Subject: [PATCH 598/619] Update changelog for 4.4.2.12 --- debian/changelog | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/debian/changelog b/debian/changelog index ae0db2574..69d689f81 100644 --- a/debian/changelog +++ b/debian/changelog @@ -203,7 +203,7 @@ yunohost (11.0.2) testing; urgency=low -- Alexandre Aubin Wed, 19 Jan 2022 20:52:39 +0100 -yunohost (4.4.2.11) stable; urgency=low +yunohost (4.4.2.12) stable; urgency=low - bullseye migration: add trick to automagically find the likely log of a previously failed migration to ease support (f5d94509) From b49e1bad53e49971cbb96768dc191d42fba15a13 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Sun, 28 Aug 2022 14:49:12 +0200 Subject: [PATCH 599/619] Update changelog for 11.0.9.12 --- debian/changelog | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/debian/changelog b/debian/changelog index 69d689f81..1bc60b4c9 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,12 @@ +yunohost (11.0.9.12) stable; urgency=low + + - [fix] postinstall: check all partitions (not only physical ones) ([#1497](https://github.com/YunoHost/yunohost/pull/1497)) + - [i18n] Translations updated for Basque, French, Indonesian, Italian, Slovak + + Thanks to all contributors <3 ! (Salamandar) + + -- Alexandre Aubin Sun, 28 Aug 2022 14:50:38 +0200 + yunohost (11.0.9.11) stable; urgency=low = Merge with Buster branch From efe0e601826f606bf44e199740a67c79566c8386 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Sun, 28 Aug 2022 17:25:31 +0200 Subject: [PATCH 600/619] [fix] defaultapp: domain may not exist in app_map dict output --- src/domain.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/domain.py b/src/domain.py index e40b4f03c..29040ced8 100644 --- a/src/domain.py +++ b/src/domain.py @@ -461,7 +461,7 @@ class DomainConfigPanel(ConfigPanel): ): from yunohost.app import app_ssowatconf, app_map - if "/" in app_map(raw=True)[self.entity]: + if "/" in app_map(raw=True).get(self.entity, {}): raise YunohostValidationError( "app_make_default_location_already_used", app=self.future_values["default_app"], From a0d19d88e6523f2cf33d392faef4c0ce8ef51a08 Mon Sep 17 00:00:00 2001 From: yunohost-bot Date: Sun, 28 Aug 2022 15:43:54 +0000 Subject: [PATCH 601/619] [CI] Format code with Black --- src/migrations/0021_migrate_to_bullseye.py | 9 ++++++--- src/tools.py | 4 +++- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/migrations/0021_migrate_to_bullseye.py b/src/migrations/0021_migrate_to_bullseye.py index 0fbf5a5ea..690bc1249 100644 --- a/src/migrations/0021_migrate_to_bullseye.py +++ b/src/migrations/0021_migrate_to_bullseye.py @@ -389,14 +389,17 @@ class MyMigration(Migration): ): try: # Here we try to find the previous migration log, which should be somewhat recent and be at least 10k (we keep the biggest one) - maybe_previous_migration_log_id = check_output("cd /var/log/yunohost/categories/operation && find -name '*migrate*.log' -size +10k -mtime -100 -exec ls -s {} \\; | sort -n | tr './' ' ' | awk '{print $2}' | tail -n 1") + maybe_previous_migration_log_id = check_output( + "cd /var/log/yunohost/categories/operation && find -name '*migrate*.log' -size +10k -mtime -100 -exec ls -s {} \\; | sort -n | tr './' ' ' | awk '{print $2}' | tail -n 1" + ) if maybe_previous_migration_log_id: - logger.info(f"NB: the previous migration log id seems to be {maybe_previous_migration_log_id}. You can share it with the support team with : sudo yunohost log share {maybe_previous_migration_log_id}") + logger.info( + f"NB: the previous migration log id seems to be {maybe_previous_migration_log_id}. You can share it with the support team with : sudo yunohost log share {maybe_previous_migration_log_id}" + ) except Exception: # Yeah it's not that important ... it's to simplify support ... pass - raise YunohostError("migration_0021_not_buster2") # Have > 1 Go free space on /var/ ? diff --git a/src/tools.py b/src/tools.py index 0980488ed..e739c4504 100644 --- a/src/tools.py +++ b/src/tools.py @@ -219,7 +219,9 @@ def tools_postinstall( ) # Check there's at least 10 GB on the rootfs... - disk_partitions = sorted(psutil.disk_partitions(all=True), key=lambda k: k.mountpoint) + disk_partitions = sorted( + psutil.disk_partitions(all=True), key=lambda k: k.mountpoint + ) main_disk_partitions = [d for d in disk_partitions if d.mountpoint in ["/", "/var"]] main_space = sum( psutil.disk_usage(d.mountpoint).total for d in main_disk_partitions From b5fabc871bf0825e0acae16392c74bd593de86a4 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Mon, 29 Aug 2022 15:36:24 +0200 Subject: [PATCH 602/619] [fix] bullseye migration: a few annoying issues related to Sury --- .../data_migrations/0021_migrate_to_bullseye.py | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/src/yunohost/data_migrations/0021_migrate_to_bullseye.py b/src/yunohost/data_migrations/0021_migrate_to_bullseye.py index ee4ba65ea..94778f10d 100644 --- a/src/yunohost/data_migrations/0021_migrate_to_bullseye.py +++ b/src/yunohost/data_migrations/0021_migrate_to_bullseye.py @@ -104,9 +104,17 @@ class MyMigration(Migration): open("/etc/apt/sources.list.d/extra_php_version.list", "w").write( "deb https://packages.sury.org/php/ bullseye main" ) - os.system( - 'wget --timeout 900 --quiet "https://packages.sury.org/php/apt.gpg" --output-document=- | gpg --dearmor >"/etc/apt/trusted.gpg.d/extra_php_version.gpg"' - ) + + # Add Sury key even if extra_php_version.list was already there, + # because some old system may be using an outdated key not valid for Bullseye + # and that'll block the migration + os.system( + 'wget --timeout 900 --quiet "https://packages.sury.org/php/apt.gpg" --output-document=- | gpg --dearmor >"/etc/apt/trusted.gpg.d/extra_php_version.gpg"' + ) + + # Remove legacy, duplicated sury entry if it exists + if os.path.exists("/etc/apt/sources.list.d/sury.list"): + os.system("rm -rf /etc/apt/sources.list.d/sury.list") # # Get requirements of the different venvs from python apps From f4219791a12c765a2add717f4a7a91c324a2d3af Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Mon, 29 Aug 2022 15:40:46 +0200 Subject: [PATCH 603/619] Update changelog for 4.4.2.13 --- debian/changelog | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/debian/changelog b/debian/changelog index b0d69cb05..0dec25c43 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,9 @@ +yunohost (4.4.2.13) stable; urgency=low + + - [fix] bullseye migration: a few annoying issues related to Sury (b5fabc87) + + -- Alexandre Aubin Mon, 29 Aug 2022 15:40:03 +0200 + yunohost (4.4.2.12) stable; urgency=low - bullseye migration: add trick to automagically find the likely log of a previously failed migration to ease support (f5d94509) From 503b90316fc186b91d26679eb88092507bb80a4e Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Tue, 30 Aug 2022 00:04:23 +0200 Subject: [PATCH 604/619] [fix] regenconf: fix a stupid issue with slapcat displaying an error message because grep -q breaks the pipe --- hooks/conf_regen/06-slapd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hooks/conf_regen/06-slapd b/hooks/conf_regen/06-slapd index 616b383ec..1cc1052b7 100755 --- a/hooks/conf_regen/06-slapd +++ b/hooks/conf_regen/06-slapd @@ -139,7 +139,7 @@ do_post_regen() { fi # For some reason, old setups don't have the admins group defined... - if ! slapcat | grep -q 'cn=admins,ou=groups,dc=yunohost,dc=org'; then + if ! slapcat -H "ldap:///cn=admins,ou=groups,dc=yunohost,dc=org" | grep -q 'cn=admins,ou=groups,dc=yunohost,dc=org'; then slapadd -F /etc/ldap/slapd.d -b dc=yunohost,dc=org <<< \ "dn: cn=admins,ou=groups,dc=yunohost,dc=org cn: admins From 7601492081ecea2b39ed21cc4f6c0ba94dd6cc03 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Tue, 30 Aug 2022 18:41:00 +0200 Subject: [PATCH 605/619] bullseye migration: remove derpy OVH repo... --- src/yunohost/data_migrations/0021_migrate_to_bullseye.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/yunohost/data_migrations/0021_migrate_to_bullseye.py b/src/yunohost/data_migrations/0021_migrate_to_bullseye.py index 94778f10d..f287182d8 100644 --- a/src/yunohost/data_migrations/0021_migrate_to_bullseye.py +++ b/src/yunohost/data_migrations/0021_migrate_to_bullseye.py @@ -94,6 +94,9 @@ class MyMigration(Migration): logger.info(m18n.n("migration_0021_patching_sources_list")) self.patch_apt_sources_list() + # Stupid OVH has some repo configured which dont work with bullseye and break apt ... + os.system("sudo rm -f /etc/apt/sources.list.d/ovh-*.list") + # Force add sury if it's not there yet # This is to solve some weird issue with php-common breaking php7.3-common, # hence breaking many php7.3-deps From c3eb455b5b791a7d04071fd645a0b5589c7a1200 Mon Sep 17 00:00:00 2001 From: Jose Riha Date: Wed, 31 Aug 2022 06:50:21 +0000 Subject: [PATCH 606/619] Translated using Weblate (Slovak) Currently translated at 33.9% (235 of 693 strings) Translation: YunoHost/core Translate-URL: https://translate.yunohost.org/projects/yunohost/core/sk/ --- locales/sk.json | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/locales/sk.json b/locales/sk.json index 875d23a98..5dcd338c5 100644 --- a/locales/sk.json +++ b/locales/sk.json @@ -221,5 +221,17 @@ "diagnosis_http_partially_unreachable": "Doména {domain} sa zdá byť nedostupná prostredníctvom HTTP mimo miestnej siete pri použití IPv{failed}, hoci funguje pri IPv{passed}.", "diagnosis_http_special_use_tld": "Doména {domain} je založená na top-level doméne (TLD) pre zvláštne určenie ako je .local alebo .test a preto sa neočakáva, aby bola dostupná mimo miestnej siete.", "diagnosis_http_unreachable": "Doména {domain} sa zdá byť nedostupná prostredníctvom HTTP mimo miestnej siete.", - "diagnosis_ignored_issues": "(+ {nb_ignored} ignorovaný(ch) problém(ov))" + "diagnosis_ignored_issues": "(+ {nb_ignored} ignorovaný(ch) problém(ov))", + "diagnosis_ip_no_ipv6_tip": "Váš server bude fungovať aj bez IPv6, no pre celkové zdravie internetu je lepšie ho nastaviť. V prípade, že je IPv6 dostupné, systém alebo váš poskytovateľ by ho mal automaticky nakonfigurovať. V opačnom prípade budete možno musieť nastaviť zopár vecí ručne tak, ako je vysvetlené v dokumentácii na https://yunohost.org/#/ipv6. Ak nemôžete povoliť IPv6 alebo je to na vás príliš technicky náročné, môžete pokojne toto upozornenie ignorovať.", + "diagnosis_ip_broken_dnsresolution": "Zdá sa, že z nejakého dôvodu nefunguje prekladanie názvov domén… Blokuje vaša brána firewall DNS požiadavky?", + "diagnosis_ip_broken_resolvconf": "Zdá sa, že na vašom serveri nefunguje prekladanie názvov domén, čo môže súvisieť s tým, že /etc/resolv.conf neukazuje na 127.0.0.1.", + "diagnosis_ip_connected_ipv4": "Server nie je pripojený k internetu prostredníctvom IPv4!", + "diagnosis_ip_connected_ipv6": "Server nie je pripojený k internetu prostredníctvom IPv6!", + "diagnosis_ip_dnsresolution_working": "Preklad názvov domén nefunguje!", + "diagnosis_ip_global": "Globálna IP adresa: {global}", + "diagnosis_ip_local": "Miestna IP adresa: {local}", + "diagnosis_ip_no_ipv4": "Na serveri nefunguje spojenie cez protokol IPv4.", + "diagnosis_ip_no_ipv6": "Na serveri nefunguje spojenie cez protokol IPv6.", + "diagnosis_ip_not_connected_at_all": "Zdá sa, že tento server nie je vôbec pripojený k internetu!?", + "diagnosis_ip_weird_resolvconf": "Zdá sa, že preklad názvov domén funguje, ale podľa všetkého používate vlastný súbor /etc/resolv.conf." } From 24f28ef87ab314b817457fdbdb2c424454c85c40 Mon Sep 17 00:00:00 2001 From: yunohost-bot Date: Thu, 1 Sep 2022 09:39:13 +0000 Subject: [PATCH 607/619] [CI] Reformat / remove stale translated strings --- locales/de.json | 1 - locales/en.json | 2 +- locales/es.json | 1 - locales/eu.json | 4 +--- locales/fr.json | 3 +-- locales/gl.json | 4 +--- locales/id.json | 2 +- locales/it.json | 2 +- locales/sk.json | 2 +- locales/uk.json | 3 +-- 10 files changed, 8 insertions(+), 16 deletions(-) diff --git a/locales/de.json b/locales/de.json index 674212637..bb9253611 100644 --- a/locales/de.json +++ b/locales/de.json @@ -666,7 +666,6 @@ "migration_0021_main_upgrade": "Starte Hauptupdate...", "migration_0021_still_on_buster_after_main_upgrade": "Irgendetwas ist während des Haupt-Upgrades schief gelaufen, das System scheint immer noch auf Debian Buster zu laufen", "migration_0021_yunohost_upgrade": "Start des YunoHost Kern-Upgrades...", - "migration_0021_not_buster": "Die aktuelle Debian-Distribution ist nicht Buster!", "migration_0021_not_enough_free_space": "Der freie Speicherplatz in /var/ ist ziemlich gering! Du solltest mindestens 1 GB frei haben, um diese Migration durchzuführen.", "migration_0021_system_not_fully_up_to_date": "Dein System ist nicht ganz aktuell. Bitte führe ein reguläres Upgrade durch, bevor du die Migration zu Bullseye durchführst.", "migration_0021_problematic_apps_warning": "Bitte beachte, dass die folgenden, möglicherweise problematischen installierten Anwendungen erkannt wurden. Es sieht so aus, als ob diese nicht aus dem YunoHost-Applikations-Katalog installiert wurden oder nicht als \"funktionierend\" gekennzeichnet sind. Es kann daher nicht garantiert werden, dass sie nach dem Upgrade noch funktionieren werden: {problematic_apps}", diff --git a/locales/en.json b/locales/en.json index 620616748..b7c18ca70 100644 --- a/locales/en.json +++ b/locales/en.json @@ -692,4 +692,4 @@ "yunohost_installing": "Installing YunoHost...", "yunohost_not_installed": "YunoHost is not correctly installed. Please run 'yunohost tools postinstall'", "yunohost_postinstall_end_tip": "The post-install completed! To finalize your setup, please consider:\n - adding a first user through the 'Users' section of the webadmin (or 'yunohost user create ' in command-line);\n - diagnose potential issues through the 'Diagnosis' section of the webadmin (or 'yunohost diagnosis run' in command-line);\n - reading the 'Finalizing your setup' and 'Getting to know YunoHost' parts in the admin documentation: https://yunohost.org/admindoc." -} +} \ No newline at end of file diff --git a/locales/es.json b/locales/es.json index fe88c14d3..79bf19c9a 100644 --- a/locales/es.json +++ b/locales/es.json @@ -637,7 +637,6 @@ "migration_0021_main_upgrade": "Iniciando actualización principal...", "migration_0021_still_on_buster_after_main_upgrade": "Algo salió mal durante la actualización principal, el sistema parece estar todavía en Debian Buster", "migration_0021_yunohost_upgrade": "Iniciando la actualización principal de YunoHost...", - "migration_0021_not_buster": "¡La distribución actual de Debian no es Buster!", "migration_0021_not_enough_free_space": "¡El espacio libre es bastante bajo en /var/! Debe tener al menos 1 GB libre para ejecutar esta migración.", "migration_0021_system_not_fully_up_to_date": "Su sistema no está completamente actualizado. Realice una actualización regular antes de ejecutar la migración a Bullseye.", "migration_0021_general_warning": "Tenga en cuenta que esta migración es una operación delicada. El equipo de YunoHost hizo todo lo posible para revisarlo y probarlo, pero la migración aún podría romper partes del sistema o sus aplicaciones.\n\nPor lo tanto, se recomienda:\n - Realice una copia de seguridad de cualquier dato o aplicación crítica. Más información en https://yunohost.org/backup;\n - Sea paciente después de iniciar la migración: dependiendo de su conexión a Internet y hardware, puede tomar algunas horas para que todo se actualice.", diff --git a/locales/eu.json b/locales/eu.json index 6ebe8b061..ca33a972a 100644 --- a/locales/eu.json +++ b/locales/eu.json @@ -670,7 +670,6 @@ "migration_0021_main_upgrade": "Eguneraketa nagusia abiarazten…", "migration_0021_still_on_buster_after_main_upgrade": "Zerbaitek huts egin du eguneraketa nagusian, badirudi sistemak oraindik darabilela Debian Buster", "migration_0021_yunohost_upgrade": "YunoHosten muineko eguneraketa abiarazten…", - "migration_0021_not_buster": "Uneko Debian ez da Buster!", "migration_0021_not_enough_free_space": "/var/-enerabilgarri dagoen espazioa oso txikia da! Guxtienez GB 1 izan beharko zenuke erabilgarri migrazioari ekiteko.", "migration_0021_system_not_fully_up_to_date": "Sistema ez dago erabat egunean. Mesedez, egizu eguneraketa arrunt bat Bullseye-(e)rako migrazioa abiarazi baino lehen.", "migration_0021_general_warning": "Mesedez, kontuan hartu migrazio hau konplexua dela. YunoHost taldeak ahalegin handia egin du probatzeko, baina hala ere migrazioak sistemaren zatiren bat edo aplikazioak apurt litzake.\n\nHorregatik, gomendagarria da:\n\t- Datu edo aplikazio garrantzitsuen babeskopia egitea. Informazio gehiago: https://yunohost.org/backup;\n\t- Ez izan presarik migrazioa abiaraztean: zure internet eta hardwarearen arabera ordu batzuk ere iraun lezake eguneraketa prozesuak.", @@ -685,7 +684,6 @@ "migration_0023_postgresql_13_not_installed": "PostgreSQL 11 dago instalatuta baina PostgreSQL 13 ez!? Zerbait arraroa gertatu omen zaio zure sistemari :( …", "migration_description_0022_php73_to_php74_pools": "Migratu php7.3-fpm 'pool' ezarpen-fitxategiak php7.4ra", "migration_description_0023_postgresql_11_to_13": "Migratu datubaseak PostgreSQL 11tik 13ra", - "migration_0021_venv_regen_failed": "'{venv}' ingurune birtuala ezin izan da birsortu, ziurrenik `yunohost app upgrade --force` komandoa exekutatu behar duzu", "migration_0024_rebuild_python_venv_broken_app": "{app} aplikazioari ez ikusiarena egin zaio ezin delako ingurune birtuala modu errazean birsortu. Horren ordez, aplikazioaren eguneraketa behartzen saia zaitezke `yunohost app upgrade --force {app}` arazoa konpontzeko.", "migration_0024_rebuild_python_venv_disclaimer_rebuild": "Ondorengo aplikazioen virtualenv-a birsortzeko saiakera egingo da (eragiketak luze jo dezake!): {rebuild_apps}", "migration_0024_rebuild_python_venv_disclaimer_ignored": "Virtualenv-ak ezin dira birsortu aplikazio horientzat. Eguneraketa behartu behar duzu horientzat, ondorengo komandoa exekutatuz egin daiteke: `yunohost app upgrade --force APP`: {ignored_apps}", @@ -694,4 +692,4 @@ "migration_description_0024_rebuild_python_venv": "Konpondu Python aplikazioa Bullseye eguneraketa eta gero", "migration_0024_rebuild_python_venv_disclaimer_base": "Debian Bullseye eguneraketa dela-eta, Python aplikazio batzuk birsortu behar dira Debianekin datorren Pythonen bertsiora egokitzeko (teknikoki 'virtualenv' deritzaiona birsortu behar da). Egin artean, litekeena da Python aplikazio horiek ez funtzionatzea. YunoHost saia daiteke beherago ageri diren aplikazioen virtualenv edo ingurune birtualak birsortzen. Beste aplikazio batzuen kasuan, edo birsortze saiakerak kale egingo balu, aplikazio horien eguneraketa behartu beharko duzu.", "migration_0021_not_buster2": "Zerbitzariak darabilen Debian bertsioa ez da Buster! Dagoeneko Buster -> Bullseye migrazioa exekutatu baduzu, errore honek migrazioa erabat arrakastatsua izan ez zela esan nahi du (bestela YunoHostek amaitutzat markatuko luke). Komenigarria izango litzateke, laguntza taldearekin batera, zer gertatu zen aztertzea. Horretarako `migrazioaren erregistro **osoa** beharko duzue, Erramintak > Erregistroak atalean eskuragarri dagoena." -} +} \ No newline at end of file diff --git a/locales/fr.json b/locales/fr.json index ec9a6b59a..789fa14f6 100644 --- a/locales/fr.json +++ b/locales/fr.json @@ -685,7 +685,6 @@ "tools_upgrade_failed": "Impossible de mettre à jour les paquets : {packages_list}", "migration_0023_not_enough_space": "Prévoyez suffisamment d'espace disponible dans {path} pour exécuter la migration.", "migration_0023_postgresql_11_not_installed": "PostgreSQL n'a pas été installé sur votre système. Il n'y a rien à faire.", - "migration_0021_venv_regen_failed": "L'environnement virtuel '{venv}' n'a pas pu se régénérer, vous devez probablement exécuter la commande `yunohost app upgrade --force`", "migration_0024_rebuild_python_venv_disclaimer_rebuild": "La reconstruction du virtualenv sera tentée pour les applications suivantes (NB : l'opération peut prendre un certain temps !) : {rebuild_apps}", "migration_0024_rebuild_python_venv_in_progress": "Tentative de reconstruction du virtualenv Python pour `{app}`", "migration_0024_rebuild_python_venv_failed": "Échec de la reconstruction de l'environnement virtuel Python pour {app}. L'application peut ne pas fonctionner tant que ce problème n'est pas résolu. Vous devriez corriger la situation en forçant la mise à jour de cette application en utilisant `yunohost app upgrade --force {app}`.", @@ -693,4 +692,4 @@ "migration_0024_rebuild_python_venv_broken_app": "Ignorer {app} car virtualenv ne peut pas être facilement reconstruit pour cette application. Au lieu de cela, vous devriez corriger la situation en forçant la mise à jour de cette application en utilisant `yunohost app upgrade --force {app}`.", "migration_0024_rebuild_python_venv_disclaimer_base": "Suite à la mise à niveau vers Debian Bullseye, certaines applications Python doivent être partiellement reconstruites pour être converties vers la nouvelle version Python livrée dans Debian (en termes techniques : ce qu'on appelle le \"virtualenv\" doit être recréé). En attendant, ces applications Python peuvent ne pas fonctionner. YunoHost peut tenter de reconstruire le virtualenv pour certains d'entre eux, comme détaillé ci-dessous. Pour les autres applications, ou si la tentative de reconstruction échoue, vous devrez forcer manuellement une mise à niveau pour ces applications.", "migration_0024_rebuild_python_venv_disclaimer_ignored": "Les virtualenvs ne peuvent pas être reconstruits automatiquement pour ces applications. Vous devez forcer une mise à jour pour ceux-ci, ce qui peut être fait à partir de la ligne de commande : `yunohost app upgrade --force APP` : {ignored_apps}" -} +} \ No newline at end of file diff --git a/locales/gl.json b/locales/gl.json index 5b1864e13..ef3c03ca0 100644 --- a/locales/gl.json +++ b/locales/gl.json @@ -666,7 +666,6 @@ "migration_0021_main_upgrade": "Iniciando a actualización principal...", "migration_0021_still_on_buster_after_main_upgrade": "Algo fallou durante a actualización principal, o sistema semlla que aínda está en Debian Buster", "migration_0021_yunohost_upgrade": "Iniciando actualización compoñente core de YunoHost...", - "migration_0021_not_buster": "A distribución Debian actual non é Buster!", "migration_0021_not_enough_free_space": "Queda pouco espazo en /var/! Deberías ter polo menos 1GB libre para facer a migración.", "migration_0021_problematic_apps_warning": "Detectamos que están instaladas estas app que poderían ser problemáticas. Semella que non foron instaladas desde o catálogo YunoHost, ou non están marcadas como que 'funcionan'. Así, non podemos garantir que seguiran funcionando ben tras a migración: {problematic_apps}", "migration_0021_modified_files": "Ten en conta que os seguintes ficheiros semella que foron editados manualmente e poderían ser sobrescritos durante a migración: {manually_modified_files}", @@ -685,7 +684,6 @@ "service_description_postgresql": "Almacena datos da app (Base datos SQL)", "tools_upgrade": "Actualizando paquetes do sistema", "domain_config_default_app": "App por defecto", - "migration_0021_venv_regen_failed": "Fallou a rexeneración do entorno virtual '{venv}', probablemente teñas que executar o comando `yunohost app upgrade --force`", "migration_0024_rebuild_python_venv_broken_app": "Omitimos a app {app} porque virtualenv non se pode reconstruir para esta app. Deberías intentar resolver o problema forzando a actualización da app usando `yunohost app upgrade --force {app}`.", "migration_0024_rebuild_python_venv_disclaimer_base": "Após a actualización a Debian Bullseye, algunhas aplicacións de Python precisan ser reconstruídas para usar a nova versión de Python que inclúe Debian (técnicamente: recrear o `virtualenv`). Mentras tanto, algunhas aplicacións de Python poderían non funcionar. YunoHost pode intentar reconstruir o virtualenv para algunhas, como se indica abaixo. Para outras, ou se falla a reconstrución, pode que teñas que forzar a actualización desas apps.", "migration_0024_rebuild_python_venv_disclaimer_rebuild": "Vaise intentar a reconstrución de virtualenv para as seguintes apps (Nota: a operación podería tomar algún tempo!): {rebuild_apps}", @@ -693,4 +691,4 @@ "migration_0024_rebuild_python_venv_in_progress": "Intentando reconstruir o Python virtualenv para `{app}`", "migration_description_0024_rebuild_python_venv": "Reparar app Python após a migración a bullseye", "migration_0024_rebuild_python_venv_failed": "Fallou a reconstrución de Python virtualenv para {app}. A app podería non funcionar mentras non se resolve. Deberías intentar arranxar a situación forzando a actualización desta app usando `yunohost app upgrade --force {app}`." -} +} \ No newline at end of file diff --git a/locales/id.json b/locales/id.json index 7e67503be..d70ed4ed5 100644 --- a/locales/id.json +++ b/locales/id.json @@ -66,4 +66,4 @@ "app_not_upgraded": "Aplikasi '{failed_app}' gagal diperbarui, oleh karena itu aplikasi-aplikasi berikut juga dibatalkan: {apps}", "app_config_unable_to_apply": "Gagal menerapkan nilai-nilai panel konfigurasi.", "app_config_unable_to_read": "Gagal membaca nilai-nilai panel konfigurasi." -} +} \ No newline at end of file diff --git a/locales/it.json b/locales/it.json index 6d6aedd5b..704345d25 100644 --- a/locales/it.json +++ b/locales/it.json @@ -661,4 +661,4 @@ "ldap_server_down": "Impossibile raggiungere il server LDAP", "ldap_server_is_down_restart_it": "Il servizio LDAP è down, prova a riavviarlo…", "domain_config_default_app": "Applicazione di default" -} +} \ No newline at end of file diff --git a/locales/sk.json b/locales/sk.json index 5dcd338c5..18a4bf8bf 100644 --- a/locales/sk.json +++ b/locales/sk.json @@ -234,4 +234,4 @@ "diagnosis_ip_no_ipv6": "Na serveri nefunguje spojenie cez protokol IPv6.", "diagnosis_ip_not_connected_at_all": "Zdá sa, že tento server nie je vôbec pripojený k internetu!?", "diagnosis_ip_weird_resolvconf": "Zdá sa, že preklad názvov domén funguje, ale podľa všetkého používate vlastný súbor /etc/resolv.conf." -} +} \ No newline at end of file diff --git a/locales/uk.json b/locales/uk.json index 2eab3d5a6..2b98167a9 100644 --- a/locales/uk.json +++ b/locales/uk.json @@ -665,7 +665,6 @@ "migration_0021_patching_sources_list": "Виправлення sources.lists...", "migration_0021_main_upgrade": "Початок основного оновлення...", "migration_0021_yunohost_upgrade": "Початок оновлення ядра YunoHost...", - "migration_0021_not_buster": "Поточний дистрибутив Debian не є Buster!", "migration_0021_problematic_apps_warning": "Зверніть увагу, що були виявлені наступні, ймовірно проблемні встановлені застосунки. Схоже, що вони не були встановлені з каталогу застосунків YunoHost або не зазначені як «робочі». Отже, не можна гарантувати, що вони будуть працювати після оновлення: {problematic_apps}", "migration_0021_modified_files": "Зверніть увагу, що такі файли були змінені вручну і можуть бути перезаписані після оновлення: {manually_modified_files}", "migration_0021_cleaning_up": "Очищення кеш-пам'яті і пакетів, які більше не потрібні...", @@ -692,4 +691,4 @@ "migration_description_0024_rebuild_python_venv": "Відновлення застосунку Python після міграції до bullseye", "migration_0024_rebuild_python_venv_disclaimer_ignored": "Virtualenvs не можна автоматично перебудувати для цих застосунків. Вам потрібно примусово оновити його для них, що можна зробити з командного рядка за допомогою: `yunohost app upgrade --force APP`: {ignored_apps}", "migration_0024_rebuild_python_venv_failed": "Не вдалося перебудувати Python virtualenv для {app}. Застосунок може не працювати, доки це не вирішено. Ви повинні виправити ситуацію, примусово оновивши його за допомогою `yunohost app upgrade --force {app}`." -} +} \ No newline at end of file From b77e811402271650c19eed906978114e245538bf Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Thu, 1 Sep 2022 19:16:37 +0200 Subject: [PATCH 608/619] regenconf: add a timeout to curl inside dnsmasq regenconf to prevent being stuck too long when no network on the machine --- hooks/conf_regen/43-dnsmasq | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/hooks/conf_regen/43-dnsmasq b/hooks/conf_regen/43-dnsmasq index 9aca18031..648a128c2 100755 --- a/hooks/conf_regen/43-dnsmasq +++ b/hooks/conf_regen/43-dnsmasq @@ -21,9 +21,9 @@ do_pre_regen() { cat plain/resolv.dnsmasq.conf | grep "^nameserver" | shuf >${pending_dir}/etc/resolv.dnsmasq.conf # retrieve variables - ipv4=$(curl -s -4 https://ip.yunohost.org 2>/dev/null || true) + ipv4=$(curl --max-time 10 -s -4 https://ip.yunohost.org 2>/dev/null || true) ynh_validate_ip4 "$ipv4" || ipv4='127.0.0.1' - ipv6=$(curl -s -6 https://ip6.yunohost.org 2>/dev/null || true) + ipv6=$(curl --max-time 10 -s -6 https://ip6.yunohost.org 2>/dev/null || true) ynh_validate_ip6 "$ipv6" || ipv6='' interfaces="$(ip -j addr show | jq -r '[.[].ifname]|join(" ")')" wireless_interfaces="lo" From 68b4d3098650a3ce0fa3c57b2b2170a6ec49ba0e Mon Sep 17 00:00:00 2001 From: tituspijean Date: Fri, 2 Sep 2022 23:27:23 +0200 Subject: [PATCH 609/619] Fix ynh_delete_file_checksum in helpers/config no need for `--update_only` --- helpers/config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/helpers/config b/helpers/config index 9c7272b85..c1f8bca32 100644 --- a/helpers/config +++ b/helpers/config @@ -77,7 +77,7 @@ _ynh_app_config_apply_one() { if [[ "${!short_setting}" == "" ]]; then ynh_backup_if_checksum_is_different --file="$bind_file" ynh_secure_remove --file="$bind_file" - ynh_delete_file_checksum --file="$bind_file" --update_only + ynh_delete_file_checksum --file="$bind_file" ynh_print_info --message="File '$bind_file' removed" else ynh_backup_if_checksum_is_different --file="$bind_file" From c469757af976724299ee095f08fe48d4e9d2d686 Mon Sep 17 00:00:00 2001 From: xabirequejo Date: Thu, 1 Sep 2022 12:15:02 +0000 Subject: [PATCH 610/619] Translated using Weblate (Basque) Currently translated at 100.0% (693 of 693 strings) Translation: YunoHost/core Translate-URL: https://translate.yunohost.org/projects/yunohost/core/eu/ --- locales/eu.json | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/locales/eu.json b/locales/eu.json index ca33a972a..52706c110 100644 --- a/locales/eu.json +++ b/locales/eu.json @@ -243,7 +243,7 @@ "diagnosis_apps_deprecated_practices": "Instalatutako aplikazio honen bertsioak oraindik darabiltza zaharkitutako pakete-jarraibideak. Eguneratzea hausnartu beharko zenuke.", "diagnosis_apps_issue": "Arazo bat dago {app} aplikazioarekin", "diagnosis_apps_not_in_app_catalog": "Aplikazio hau ez da YunoHosten aplikazioen katalogokoa. Iraganean egon bazen eta ezabatu izan balitz, desinstalatzea litzateke onena, ez baitu eguneraketarik jasoko eta sistemaren integritate eta segurtasuna arriskuan jarri lezakeelako.", - "diagnosis_apps_outdated_ynh_requirement": "Instalatutako aplikazio honen bertsioak yunohost >= 2.x baino ez du behar, eta horrek egungo pakete-jardunbideekin bat ez datorrela iradokitzen du. Eguneratzen saiatu beharko zinateke.", + "diagnosis_apps_outdated_ynh_requirement": "Instalatutako aplikazio honen bertsioak yunohost >= 2.x edo 3.x baino ez du behar, eta horrek eguneratua izan ez dela eta egungo pakete-jardunbideekin bat ez datorrela iradokitzen du. Eguneratzen saiatu beharko zinateke.", "diagnosis_description_apps": "Aplikazioak", "domain_dns_conf_special_use_tld": "Domeinu hau top-level domain (TLD) erabilera bereziko motakoa da .local edo .test bezala eta ez du DNS ezarpenik behar.", "log_permission_create": "Sortu '{}' baimena", @@ -293,7 +293,7 @@ "group_created": "'{group}' taldea sortu da", "global_settings_setting_security_password_user_strength": "Erabiltzaile-pasahitzaren segurtasuna", "global_settings_setting_security_experimental_enabled": "Gaitu segurtasun funtzio esperimentalak (ez ezazu egin ez badakizu zertan ari zaren!)", - "good_practices_about_admin_password": "Administrazio-pasahitz berria ezartzear zaude. Pasahitzak zortzi karaktere izan beharko lituzke gutxienez, baina gomendagarria da pasahitz luzeagoa erabiltzea (esaldi bat, esaterako) edota karaktere desberdinak erabiltzea (hizki larriak, txikiak, zenbakiak eta karaktere bereziak).", + "good_practices_about_admin_password": "Administrazio-pasahitz berria ezartzear zaude. Pasahitzak 8 karaktere izan beharko lituzke gutxienez, baina gomendagarria da pasahitz luzeagoa erabiltzea (esaldi bat, esaterako) edota karaktere desberdinak erabiltzea (hizki larriak, txikiak, zenbakiak eta karaktere bereziak).", "log_help_to_get_failed_log": "Ezin izan da '{desc}' eragiketa exekutatu. Mesedez, laguntza nahi baduzu partekatu eragiketa honen erregistro osoa 'yunohost log share {name}' komandoa erabiliz", "global_settings_setting_security_webadmin_allowlist_enabled": "Baimendu IP zehatz batzuk bakarrik administrazio-atarian.", "group_unknown": "'{group}' taldea ezezaguna da", @@ -361,7 +361,7 @@ "global_settings_bad_choice_for_enum": "{setting} ezarpenerako aukera okerra. '{choice}' ezarri da baina hauek dira aukerak: {available_choices}", "global_settings_setting_security_postfix_compatibility": "Bateragarritasun eta segurtasun arteko gatazka Postfix zerbitzarirako. Zifraketari eragiten dio (eta segurtasunari lotutako beste kontu batzuei)", "global_settings_setting_security_ssh_compatibility": "Bateragarritasun eta segurtasun arteko gatazka SSH zerbitzarirako. Zifraketari eragiten dio (eta segurtasunari lotutako beste kontu batzuei)", - "good_practices_about_user_password": "Erabiltzaile-pasahitz berria ezartzear zaude. Pasahitzak zortzi karaktere izan beharko lituzke gutxienez, baina gomendagarria da pasahitz luzeagoa erabiltzea (esaldi bat, esaterako) edota karaktere desberdinak erabiltzea (hizki larriak, txikiak, zenbakiak eta karaktere bereziak).", + "good_practices_about_user_password": "Erabiltzaile-pasahitz berria ezartzear zaude. Pasahitzak 8 karaktere izan beharko lituzke gutxienez, baina gomendagarria da pasahitz luzeagoa erabiltzea (esaldi bat, esaterako) edota karaktere desberdinak erabiltzea (hizki larriak, txikiak, zenbakiak eta karaktere bereziak).", "group_cannot_edit_all_users": "'all_users' taldea ezin da eskuz moldatu. YunoHosten izena emanda dauden erabiltzaile guztiak barne dituen talde berezia da", "invalid_number": "Zenbaki bat izan behar da", "ldap_attribute_already_exists": "'{attribute}' LDAP funtzioa existitzen da dagoeneko eta '{value}' balioa dauka", @@ -606,7 +606,7 @@ "migrations_migration_has_failed": "{id} migrazioak ez du amaitu, geldiarazten. Errorea: {exception}", "migrations_need_to_accept_disclaimer": "{id} migrazioa abiarazteko, ondorengo baldintzak onartu behar dituzu:\n---\n{disclaimer}\n---\nMigrazioa onartzen baduzu, mesedez berrabiarazi prozesua komandoan '--accept-disclaimer' aukera gehituz.", "not_enough_disk_space": "Ez dago nahikoa espazio librerik '{path}'-n", - "password_too_simple_3": "Pasahitzak zortzi karaktere izan behar ditu gutxienez eta zenbakiren bat, hizki larriren bat, txikiren bat eta karaktere bereziren bat izan behar ditu", + "password_too_simple_3": "Pasahitzak 8 karaktere izan behar ditu gutxienez eta zenbakiren bat, hizki larriren bat, txikiren bat eta karaktere bereziren bat izan behar ditu", "pattern_backup_archive_name": "Fitxategiaren izenak 30 karaktere izan ditzake gehienez, alfanumerikoak eta ._- baino ez", "pattern_domain": "Domeinu izen baliagarri bat izan behar da (adibidez: nire-domeinua.eus)", "pattern_mailbox_quota": "Tamainak b/k/M/G/T zehaztu behar du edo 0 mugarik ezarri nahi ez bada", @@ -692,4 +692,4 @@ "migration_description_0024_rebuild_python_venv": "Konpondu Python aplikazioa Bullseye eguneraketa eta gero", "migration_0024_rebuild_python_venv_disclaimer_base": "Debian Bullseye eguneraketa dela-eta, Python aplikazio batzuk birsortu behar dira Debianekin datorren Pythonen bertsiora egokitzeko (teknikoki 'virtualenv' deritzaiona birsortu behar da). Egin artean, litekeena da Python aplikazio horiek ez funtzionatzea. YunoHost saia daiteke beherago ageri diren aplikazioen virtualenv edo ingurune birtualak birsortzen. Beste aplikazio batzuen kasuan, edo birsortze saiakerak kale egingo balu, aplikazio horien eguneraketa behartu beharko duzu.", "migration_0021_not_buster2": "Zerbitzariak darabilen Debian bertsioa ez da Buster! Dagoeneko Buster -> Bullseye migrazioa exekutatu baduzu, errore honek migrazioa erabat arrakastatsua izan ez zela esan nahi du (bestela YunoHostek amaitutzat markatuko luke). Komenigarria izango litzateke, laguntza taldearekin batera, zer gertatu zen aztertzea. Horretarako `migrazioaren erregistro **osoa** beharko duzue, Erramintak > Erregistroak atalean eskuragarri dagoena." -} \ No newline at end of file +} From f3eafb1b33cdb3e03e03c69be7d1a2eec115dd97 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20M?= Date: Thu, 1 Sep 2022 12:34:26 +0000 Subject: [PATCH 611/619] Translated using Weblate (Galician) Currently translated at 100.0% (693 of 693 strings) Translation: YunoHost/core Translate-URL: https://translate.yunohost.org/projects/yunohost/core/gl/ --- locales/gl.json | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/locales/gl.json b/locales/gl.json index ef3c03ca0..970f7bf41 100644 --- a/locales/gl.json +++ b/locales/gl.json @@ -599,7 +599,7 @@ "user_import_nothing_to_do": "Ningunha usuaria precisa ser importada", "user_import_partial_failed": "A operación de importación de usuarias fallou parcialmente", "diagnosis_apps_deprecated_practices": "A versión instalada desta app aínda utiliza algunha das antigas prácticas de empaquetado xa abandonadas. Deberías considerar actualizala.", - "diagnosis_apps_outdated_ynh_requirement": "A versión instalada desta app só require yunohost >= 2.x, que normalmente indica que non está ao día coas prácticas recomendadas de empaquetado e asistentes. Deberías considerar actualizala.", + "diagnosis_apps_outdated_ynh_requirement": "A versión instalada desta app só require yunohost >= 2.x ou 3.x, esto normalmente indica que non está ao día coas prácticas recomendadas de empaquetado e asistentes. Deberías considerar actualizala.", "user_import_success": "Usuarias importadas correctamente", "diagnosis_high_number_auth_failures": "Hai un alto número sospeitoso de intentos fallidos de autenticación. Deberías comprobar que fail2ban está a executarse e que está correctamente configurado, ou utiliza un porto personalizado para SSH tal como se explica en https://yunohost.org/security.", "user_import_bad_file": "O ficheiro CSV non ten o formato correcto e será ignorado para evitar unha potencial perda de datos", @@ -690,5 +690,6 @@ "migration_0024_rebuild_python_venv_disclaimer_ignored": "Non se puido reconstruir virtualenv para estas apps. Precisas forzar a súa actualización, pódelo facer desde a liña de comandos con: `yunohost app upgrade --force APP`: {ignored_apps}", "migration_0024_rebuild_python_venv_in_progress": "Intentando reconstruir o Python virtualenv para `{app}`", "migration_description_0024_rebuild_python_venv": "Reparar app Python após a migración a bullseye", - "migration_0024_rebuild_python_venv_failed": "Fallou a reconstrución de Python virtualenv para {app}. A app podería non funcionar mentras non se resolve. Deberías intentar arranxar a situación forzando a actualización desta app usando `yunohost app upgrade --force {app}`." -} \ No newline at end of file + "migration_0024_rebuild_python_venv_failed": "Fallou a reconstrución de Python virtualenv para {app}. A app podería non funcionar mentras non se resolve. Deberías intentar arranxar a situación forzando a actualización desta app usando `yunohost app upgrade --force {app}`.", + "migration_0021_not_buster2": "A distribución actual Debian non é Buster! Se xa realizaches a migración Buster->Bullseye entón este erro indica que o proceso de migración non se realizou de xeito correcto ao 100% (se non YunoHost debería telo marcado como completado). É recomendable comprobar xunto co equipo de axuda o que aconteceu, necesitarán o rexistro **completo** da `migración`, que podes atopar na webadmin en Ferramentas > Rexistros." +} From 4cb075d0eb06657f0205d407f6ad1b33d46cafa1 Mon Sep 17 00:00:00 2001 From: xabirequejo Date: Thu, 1 Sep 2022 14:06:47 +0000 Subject: [PATCH 612/619] Translated using Weblate (Basque) Currently translated at 100.0% (693 of 693 strings) Translation: YunoHost/core Translate-URL: https://translate.yunohost.org/projects/yunohost/core/eu/ --- locales/eu.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/locales/eu.json b/locales/eu.json index 52706c110..5dff66225 100644 --- a/locales/eu.json +++ b/locales/eu.json @@ -1,5 +1,5 @@ { - "password_too_simple_1": "Pasahitzak gutxienez zortzi karaktere izan behar ditu", + "password_too_simple_1": "Pasahitzak 8 karaktere izan behar ditu gutxienez", "action_invalid": "'{action}' eragiketa baliogabea da", "aborting": "Bertan behera uzten.", "admin_password_changed": "Administrazio-pasahitza aldatu da", @@ -307,7 +307,7 @@ "diagnosis_mail_fcrdns_nok_alternatives_6": "Operadore batzuek ez dute alderantzizko DNSa konfiguratzen uzten (edo funtzioa ez dabil…). IPv4rako alderantzizko DNSa zuzen konfiguratuta badago, IPv6 desgaitzen saia zaitezke posta elektronikoa bidaltzeko, yunohost settings set smtp.allow_ipv6 -v off exekutatuz. Adi: honek esan nahi du ez zarela gai izango IPv6 bakarrik darabilten zerbitzari apurren posta elektronikoa jasotzeko edo beraiei bidaltzeko.", "diagnosis_sshd_config_inconsistent": "Dirudienez SSH ataka eskuz aldatu da /etc/ssh/sshd_config fitxategian. YunoHost 4.2tik aurrera 'security.ssh.port' izeneko ezarpen orokor bat dago konfigurazioa eskuz aldatzea ekiditeko.", "diagnosis_sshd_config_inconsistent_details": "Mesedez, exekutatu yunohost settings set security.ssh.port -v YOUR_SSH_PORT SSH ataka zehazteko, egiaztatu yunohost tools regen-conf ssh --dry-run --with-diff erabiliz eta yunohost tools regen-conf ssh --force exekutatu gomendatutako konfiguraziora bueltatu nahi baduzu.", - "domain_dns_push_failed_to_authenticate": "Ezinezkoa izan da '{domain}' domeinurako APIa erabiliz erregistro-enpresan saioa hastea. Zuzenak al dira datuak? (Errorea: {error})", + "domain_dns_push_failed_to_authenticate": "Ezinezkoa izan da '{domain}' domeinuko erregistro-enpresan APIa erabiliz saioa hastea. Ziurrenik datuak ez dira zuzenak. (Errorea: {error})", "domain_dns_pushing": "DNS ezarpenak bidaltzen…", "diagnosis_sshd_config_insecure": "Badirudi SSH konfigurazioa eskuz aldatu dela eta ez da segurua ez duelako 'AllowGroups' edo 'AllowUsers' baldintzarik jartzen fitxategien atzitzea oztopatzeko.", "disk_space_not_sufficient_update": "Ez dago aplikazio hau eguneratzeko nahikoa espaziorik", @@ -576,7 +576,7 @@ "migrations_loading_migration": "{id} migrazioa kargatzen…", "migrations_no_migrations_to_run": "Ez dago exekutatzeko migraziorik", "password_listed": "Pasahitz hau munduan erabilienetarikoa da. Mesedez, aukeratu bereziagoa den beste bat.", - "password_too_simple_2": "Pasahitzak zortzi karaktere izan behar ditu gutxienez eta zenbakiren bat, hizki larriren bat eta txikiren bat izan behar ditu", + "password_too_simple_2": "Pasahitzak 8 karaktere izan behar ditu gutxienez eta zenbakiren bat, hizki larriren bat eta txikiren bat izan behar ditu", "pattern_firstname": "Izen horrek ez du balio", "pattern_password": "Gutxienez hiru karaktere izan behar ditu", "restore_failed": "Ezin izan da sistema lehengoratu", From 02b3a138b6eec6f3bc9dc10133dd98dd75658694 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Sat, 3 Sep 2022 12:41:09 +0200 Subject: [PATCH 613/619] bullseye migration: improve autofix procedure for the libc6 hell --- src/yunohost/data_migrations/0021_migrate_to_bullseye.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/yunohost/data_migrations/0021_migrate_to_bullseye.py b/src/yunohost/data_migrations/0021_migrate_to_bullseye.py index f287182d8..de9de481a 100644 --- a/src/yunohost/data_migrations/0021_migrate_to_bullseye.py +++ b/src/yunohost/data_migrations/0021_migrate_to_bullseye.py @@ -219,7 +219,7 @@ class MyMigration(Migration): os.system("perl -i~ -0777 -pe 's/(Package: .*-ynh-deps\\n(.+:.+\\n)+Depends:.*)(build-essential, ?)(.*)/$1$4/g' /var/lib/dpkg/status") self.apt_install("build-essential-") # Note the '-' suffix to mean that we actually want to remove the packages os.system("LC_ALL=C DEBIAN_FRONTEND=noninteractive APT_LISTCHANGES_FRONTEND=none apt autoremove --assume-yes") - self.apt_install("gcc-8- libgcc-8-dev-") # Note the '-' suffix to mean that we actually want to remove the packages + self.apt_install("gcc-8- libgcc-8-dev- equivs") # Note the '-' suffix to mean that we actually want to remove the packages .. we also explicitly add 'equivs' to the list because sometimes apt is dumb and will derp about it # # Main upgrade From 3c586159d29c9443f49a2a3d5d33bf2667011e9e Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Sat, 3 Sep 2022 23:20:20 +0200 Subject: [PATCH 614/619] Update changelog for 4.4.2.14 --- debian/changelog | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/debian/changelog b/debian/changelog index 0dec25c43..d52ba8d52 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,10 @@ +yunohost (4.4.2.14) stable; urgency=low + + - bullseye migration: remove derpy OVH repo... (76014920) + - bullseye migration: improve autofix procedure for the libc6 hell (02b3a138) + + -- Alexandre Aubin Sat, 03 Sep 2022 23:19:08 +0200 + yunohost (4.4.2.13) stable; urgency=low - [fix] bullseye migration: a few annoying issues related to Sury (b5fabc87) From 8e1e29bbd4702e3fb2b6440856699da01352098e Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Sat, 3 Sep 2022 23:29:40 +0200 Subject: [PATCH 615/619] Update changelog for 11.0.9.13 --- debian/changelog | 13 +++++++++++++ maintenance/make_changelog.sh | 6 ++++-- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/debian/changelog b/debian/changelog index e86830113..32c42fb9c 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,16 @@ +yunohost (11.0.9.13) stable; urgency=low + + - [fix] defaultapp: domain may not exist in app_map dict output (efe0e601) + - [fix] regenconf: fix a stupid issue with slapcat displaying an error message because grep -q breaks the pipe (503b9031) + - [fix] regenconf: add a timeout to curl inside dnsmasq regenconf to prevent being stuck too long when no network on the machine (b77e8114) + - [fix] ynh_delete_file_checksum with non-existing option in helpers/config ([#1501](https://github.com/YunoHost/yunohost/pull/1501)) + - [i18n] Translations updated for Basque, Galician, Slovak + + Thanks to all contributors <3 ! (José M, Jose Riha, tituspijean, xabirequejo) + + -- Alexandre Aubin Sat, 03 Sep 2022 23:27:56 +0200 + + yunohost (11.0.9.12) stable; urgency=low - [fix] postinstall: check all partitions (not only physical ones) ([#1497](https://github.com/YunoHost/yunohost/pull/1497)) diff --git a/maintenance/make_changelog.sh b/maintenance/make_changelog.sh index 7f461074f..89087eba3 100644 --- a/maintenance/make_changelog.sh +++ b/maintenance/make_changelog.sh @@ -5,7 +5,9 @@ REPO_URL=$(git remote get-url origin) ME=$(git config --global --get user.name) EMAIL=$(git config --global --get user.email) -LAST_RELEASE=$(git tag --list 'debian/11.*' | tail -n 1) +LAST_RELEASE=$(git tag --list 'debian/11.*' --sort="v:refname" | tail -n 1) + +echo $LAST_RELEASE echo "$REPO ($VERSION) $RELEASE; urgency=low" echo "" @@ -23,7 +25,7 @@ TRANSLATIONS=$(git log $LAST_RELEASE... -n 10000 --pretty=format:"%s" \ echo "" CONTRIBUTORS=$(git logc $LAST_RELEASE... -n 10000 --pretty=format:"%an" \ - | sort | uniq | grep -v "$ME" \ + | sort | uniq | grep -v "$ME" | grep -v 'yunohost-bot' | grep -vi 'weblate' \ | tr '\n' ', ' | sed -e 's/,$//g' -e 's/,/, /g') [[ -z "$CONTRIBUTORS" ]] || echo " Thanks to all contributors <3 ! ($CONTRIBUTORS)" echo "" From f6057d2572a49e4ab3d4e6d4e6a7f7da3601ceee Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Mon, 5 Sep 2022 18:23:37 +0200 Subject: [PATCH 616/619] dns: fix confusion on XMPP CNAME records for nohost.me & co domains --- src/diagnosers/12-dnsrecords.py | 2 +- src/dns.py | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/diagnosers/12-dnsrecords.py b/src/diagnosers/12-dnsrecords.py index 4d30bb1a7..9876da791 100644 --- a/src/diagnosers/12-dnsrecords.py +++ b/src/diagnosers/12-dnsrecords.py @@ -105,7 +105,7 @@ class MyDiagnoser(Diagnoser): if r["value"] == "@": r["value"] = domain + "." elif r["type"] == "CNAME": - r["value"] = r["value"] + f".{base_dns_zone}." + r["value"] = r["value"] # + f".{base_dns_zone}." if self.current_record_match_expected(r): results[id_] = "OK" diff --git a/src/dns.py b/src/dns.py index c8bebed41..1d0b4486f 100644 --- a/src/dns.py +++ b/src/dns.py @@ -235,10 +235,10 @@ def _build_dns_conf(base_domain, include_empty_AAAA_if_no_ipv6=False): "SRV", f"0 5 5269 {domain}.", ], - [f"muc{suffix}", ttl, "CNAME", basename], - [f"pubsub{suffix}", ttl, "CNAME", basename], - [f"vjud{suffix}", ttl, "CNAME", basename], - [f"xmpp-upload{suffix}", ttl, "CNAME", basename], + [f"muc{suffix}", ttl, "CNAME", f"{domain}."], + [f"pubsub{suffix}", ttl, "CNAME", f"{domain}."], + [f"vjud{suffix}", ttl, "CNAME", f"{domain}."], + [f"xmpp-upload{suffix}", ttl, "CNAME", f"{domain}."], ] ######### From e51cdd987c8d88c1ddad12ca6afd23e3a9d1886c Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Wed, 7 Sep 2022 13:07:52 +0200 Subject: [PATCH 617/619] helper ynh_get_ram: LANG= isn't enough to get en_US output, gotta use LC_ALL --- helpers/hardware | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/helpers/hardware b/helpers/hardware index 337630fa8..3ccf7ffe8 100644 --- a/helpers/hardware +++ b/helpers/hardware @@ -30,8 +30,8 @@ ynh_get_ram() { ram=0 # Use the total amount of ram elif [ $free -eq 1 ]; then - local free_ram=$(LANG=C vmstat --stats --unit M | grep "free memory" | awk '{print $1}') - local free_swap=$(LANG=C vmstat --stats --unit M | grep "free swap" | awk '{print $1}') + local free_ram=$(LC_ALL=C vmstat --stats --unit M | grep "free memory" | awk '{print $1}') + local free_swap=$(LC_ALL=C vmstat --stats --unit M | grep "free swap" | awk '{print $1}') local free_ram_swap=$((free_ram + free_swap)) # Use the total amount of free ram @@ -44,8 +44,8 @@ ynh_get_ram() { ram=$free_swap fi elif [ $total -eq 1 ]; then - local total_ram=$(LANG=C vmstat --stats --unit M | grep "total memory" | awk '{print $1}') - local total_swap=$(LANG=C vmstat --stats --unit M | grep "total swap" | awk '{print $1}') + local total_ram=$(LC_ALL=C vmstat --stats --unit M | grep "total memory" | awk '{print $1}') + local total_swap=$(LC_ALL=C vmstat --stats --unit M | grep "total swap" | awk '{print $1}') local total_ram_swap=$((total_ram + total_swap)) local ram=$total_ram_swap From 6a914fb2b5713caa4f611acb1d162309b90660e8 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Wed, 7 Sep 2022 13:09:35 +0200 Subject: [PATCH 618/619] Update changelog for 11.0.9.14 --- debian/changelog | 8 +++++++- maintenance/make_changelog.sh | 2 -- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/debian/changelog b/debian/changelog index 32c42fb9c..f6fbe6eba 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,10 @@ +yunohost (11.0.9.14) stable; urgency=low + + - [fix] dns: confusion on XMPP CNAME records for nohost.me & co domains (f6057d25) + - [fix] helper ynh_get_ram: LANG= isn't enough to get en_US output, gotta use LC_ALL (e51cdd98) + + -- Alexandre Aubin Wed, 07 Sep 2022 13:08:31 +0200 + yunohost (11.0.9.13) stable; urgency=low - [fix] defaultapp: domain may not exist in app_map dict output (efe0e601) @@ -10,7 +17,6 @@ yunohost (11.0.9.13) stable; urgency=low -- Alexandre Aubin Sat, 03 Sep 2022 23:27:56 +0200 - yunohost (11.0.9.12) stable; urgency=low - [fix] postinstall: check all partitions (not only physical ones) ([#1497](https://github.com/YunoHost/yunohost/pull/1497)) diff --git a/maintenance/make_changelog.sh b/maintenance/make_changelog.sh index 89087eba3..a73b5061b 100644 --- a/maintenance/make_changelog.sh +++ b/maintenance/make_changelog.sh @@ -7,8 +7,6 @@ EMAIL=$(git config --global --get user.email) LAST_RELEASE=$(git tag --list 'debian/11.*' --sort="v:refname" | tail -n 1) -echo $LAST_RELEASE - echo "$REPO ($VERSION) $RELEASE; urgency=low" echo "" From b0411d5da99fcfbac60d4335fcbca0a66096cca6 Mon Sep 17 00:00:00 2001 From: "ljf (zamentur)" Date: Mon, 12 Sep 2022 01:47:03 +0200 Subject: [PATCH 619/619] [fix] Lidswitch if no reboot --- hooks/conf_regen/01-yunohost | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/hooks/conf_regen/01-yunohost b/hooks/conf_regen/01-yunohost index dc0bfc689..14c0da969 100755 --- a/hooks/conf_regen/01-yunohost +++ b/hooks/conf_regen/01-yunohost @@ -221,7 +221,10 @@ do_post_regen() { systemctl restart ntp } [[ ! "$regen_conf_files" =~ "nftables.service.d/ynh-override.conf" ]] || systemctl daemon-reload - [[ ! "$regen_conf_files" =~ "login.conf.d/ynh-override.conf" ]] || systemctl daemon-reload + [[ ! "$regen_conf_files" =~ "login.conf.d/ynh-override.conf" ]] || { + systemctl daemon-reload + systemctl restart systemd-logind + } [[ ! "$regen_conf_files" =~ "yunohost-firewall.service" ]] || systemctl daemon-reload [[ ! "$regen_conf_files" =~ "yunohost-api.service" ]] || systemctl daemon-reload