From 3fe44ee73bbe7c96dfb5b5ecc19db1efe37f5d43 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Tue, 11 Jan 2022 19:50:43 +0100 Subject: [PATCH 001/236] 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 002/236] 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 003/236] 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 004/236] 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 005/236] 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 006/236] 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 007/236] 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 008/236] [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 009/236] [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 010/236] 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 011/236] 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 012/236] 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 013/236] 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 014/236] 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 015/236] =?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 016/236] 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 017/236] 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 018/236] =?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 019/236] 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 020/236] [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 021/236] 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 022/236] 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 023/236] 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 024/236] 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 025/236] 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 026/236] 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 027/236] 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 028/236] 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 029/236] 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 030/236] [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 031/236] [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 032/236] [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 033/236] 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 034/236] 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 035/236] 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 036/236] 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 037/236] [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 038/236] [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 039/236] 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 040/236] 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 041/236] 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 042/236] 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 043/236] [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 044/236] [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 045/236] [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 046/236] 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 047/236] 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 048/236] 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 049/236] 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 050/236] [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 051/236] [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 052/236] 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 053/236] 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 054/236] [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 055/236] 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 056/236] 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 057/236] 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 058/236] 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 059/236] 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 060/236] 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 061/236] 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 062/236] 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 063/236] 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 064/236] =?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 065/236] 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 066/236] 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 067/236] 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 068/236] 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 069/236] 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 070/236] 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 071/236] 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 072/236] [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 073/236] 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 074/236] 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 075/236] 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 076/236] 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 077/236] 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 078/236] 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 079/236] [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 080/236] 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 081/236] 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 082/236] 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 083/236] 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 084/236] [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 085/236] 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 086/236] 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 087/236] 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 088/236] 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 089/236] 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 090/236] 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 091/236] 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 092/236] 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 093/236] 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 094/236] 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 095/236] 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 096/236] 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 097/236] 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 098/236] 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 099/236] 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 100/236] 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 101/236] 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 102/236] 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 103/236] [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 104/236] 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 105/236] 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 106/236] 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 107/236] 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 108/236] 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 109/236] 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 110/236] 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 111/236] 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 112/236] [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 113/236] 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 114/236] 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 115/236] 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 116/236] 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 117/236] 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 118/236] 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 119/236] 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 120/236] 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 121/236] 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 122/236] 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 123/236] 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 124/236] [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 125/236] 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 126/236] [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 127/236] 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 128/236] 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 129/236] 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 130/236] 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 131/236] 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 132/236] 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 133/236] 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 134/236] 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 135/236] 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 136/236] 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 137/236] 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 138/236] 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 139/236] 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 140/236] 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 141/236] 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 142/236] 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 143/236] 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 144/236] 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 145/236] 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 146/236] 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 147/236] 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 148/236] 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 149/236] 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 150/236] 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 151/236] [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 152/236] 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 153/236] 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 154/236] 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 155/236] 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 156/236] 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 157/236] 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 158/236] 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 159/236] 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 160/236] 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 161/236] [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 162/236] [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 163/236] [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 164/236] [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 165/236] 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 166/236] 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 167/236] 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 168/236] 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 169/236] 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 170/236] [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 171/236] 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 172/236] 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 173/236] 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 174/236] 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 175/236] 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 176/236] 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 177/236] 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 178/236] 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 179/236] 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 180/236] 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 181/236] 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 182/236] 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 183/236] 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 184/236] 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 185/236] 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 186/236] 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 187/236] 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 188/236] [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 189/236] 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 190/236] 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 191/236] 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 192/236] 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 193/236] 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 194/236] 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 195/236] 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 196/236] 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 197/236] 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 198/236] 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 199/236] 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 200/236] 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 201/236] 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 202/236] 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 203/236] 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 204/236] 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 205/236] 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 206/236] 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 207/236] 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 208/236] [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 209/236] [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 210/236] [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 211/236] [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 212/236] 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 213/236] 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 214/236] 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 215/236] 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 216/236] 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 217/236] 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 218/236] 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 219/236] 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 220/236] 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 221/236] [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 222/236] [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 223/236] [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 224/236] 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 225/236] 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 226/236] 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 227/236] 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 228/236] [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 229/236] [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 230/236] 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 231/236] 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 232/236] 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 233/236] 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 234/236] 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 235/236] 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 236/236] [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