Merge branch 'dev' into report-backport-in-source-list

This commit is contained in:
Alexandre Aubin 2021-01-03 21:20:07 +01:00
commit 57c302cb63
44 changed files with 1284 additions and 355 deletions

View file

@ -38,7 +38,7 @@ build-ssowat:
variables: variables:
PACKAGE: "ssowat" PACKAGE: "ssowat"
script: script:
- DEBIAN_DEPENDS=$(cat debian/control | tr "," "\n" | grep -Po "ssowat \([>,=,<]+ .*\)" | grep -Po "[0-9]+([.][0-9]+)?" | head -n 1) - DEBIAN_DEPENDS=$(cat debian/control | tr "," "\n" | grep -Po "ssowat \([>,=,<]+ .*\)" | grep -Po "[0-9\.]+")
- git clone $YNH_SOURCE/$PACKAGE -b $CI_COMMIT_REF_NAME $YNH_BUILD_DIR/$PACKAGE --depth 1 || git clone $YNH_SOURCE/$PACKAGE -b $DEBIAN_DEPENDS $YNH_BUILD_DIR/$PACKAGE --depth 1 || git clone $YNH_SOURCE/$PACKAGE $YNH_BUILD_DIR/$PACKAGE --depth 1 - git clone $YNH_SOURCE/$PACKAGE -b $CI_COMMIT_REF_NAME $YNH_BUILD_DIR/$PACKAGE --depth 1 || git clone $YNH_SOURCE/$PACKAGE -b $DEBIAN_DEPENDS $YNH_BUILD_DIR/$PACKAGE --depth 1 || git clone $YNH_SOURCE/$PACKAGE $YNH_BUILD_DIR/$PACKAGE --depth 1
- DEBIAN_FRONTEND=noninteractive apt --assume-yes -o Dpkg::Options::="--force-confold" build-dep $(pwd)/$YNH_BUILD_DIR/$PACKAGE - DEBIAN_FRONTEND=noninteractive apt --assume-yes -o Dpkg::Options::="--force-confold" build-dep $(pwd)/$YNH_BUILD_DIR/$PACKAGE
- *build_script - *build_script
@ -48,7 +48,7 @@ build-moulinette:
variables: variables:
PACKAGE: "moulinette" PACKAGE: "moulinette"
script: script:
- DEBIAN_DEPENDS=$(cat debian/control | tr "," "\n" | grep -Po "moulinette \([>,=,<]+ .*\)" | grep -Po "[0-9]+([.][0-9]+)?" | head -n 1) - DEBIAN_DEPENDS=$(cat debian/control | tr "," "\n" | grep -Po "moulinette \([>,=,<]+ .*\)" | grep -Po "[0-9\.]+")
- git clone $YNH_SOURCE/$PACKAGE -b $CI_COMMIT_REF_NAME $YNH_BUILD_DIR/$PACKAGE --depth 1 || git clone $YNH_SOURCE/$PACKAGE -b $DEBIAN_DEPENDS $YNH_BUILD_DIR/$PACKAGE --depth 1 || git clone $YNH_SOURCE/$PACKAGE $YNH_BUILD_DIR/$PACKAGE --depth 1 - git clone $YNH_SOURCE/$PACKAGE -b $CI_COMMIT_REF_NAME $YNH_BUILD_DIR/$PACKAGE --depth 1 || git clone $YNH_SOURCE/$PACKAGE -b $DEBIAN_DEPENDS $YNH_BUILD_DIR/$PACKAGE --depth 1 || git clone $YNH_SOURCE/$PACKAGE $YNH_BUILD_DIR/$PACKAGE --depth 1
- DEBIAN_FRONTEND=noninteractive apt --assume-yes -o Dpkg::Options::="--force-confold" build-dep $(pwd)/$YNH_BUILD_DIR/$PACKAGE - DEBIAN_FRONTEND=noninteractive apt --assume-yes -o Dpkg::Options::="--force-confold" build-dep $(pwd)/$YNH_BUILD_DIR/$PACKAGE
- *build_script - *build_script

View file

@ -6,9 +6,22 @@ generate-helpers-doc:
stage: doc stage: doc
image: "before-install" image: "before-install"
needs: [] needs: []
before_script:
- 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"
script: script:
- cd doc - cd doc
- python generate_helper_doc.py - python generate_helper_doc.py
- hub clone https://$GITHUB_TOKEN:x-oauth-basic@github.com/YunoHost/doc.git doc_repo
- cp helpers.html doc_repo/packaging_apps_helpers.md
- cd doc_repo
# replace ${CI_COMMIT_REF_NAME} with ${CI_COMMIT_TAG} ?
- hub checkout -b "${CI_COMMIT_REF_NAME}"
- hub commit -am "[CI] Helper for ${CI_COMMIT_REF_NAME}"
- hub pull-request -m "[CI] Helper for ${CI_COMMIT_REF_NAME}" -p # GITHUB_USER and GITHUB_TOKEN registered here https://gitlab.com/yunohost/yunohost/-/settings/ci_cd
artifacts: artifacts:
paths: paths:
- doc/helpers.html - doc/helpers.html
only:
- tags

View file

@ -87,7 +87,7 @@ user:
ask: ask_firstname ask: ask_firstname
required: True required: True
pattern: &pattern_firstname pattern: &pattern_firstname
- !!str ^([^\W\d_]{2,30}[ ,.'-]{0,3})+$ - !!str ^([^\W\d_]{1,30}[ ,.'-]{0,3})+$
- "pattern_firstname" - "pattern_firstname"
-l: -l:
full: --lastname full: --lastname
@ -95,7 +95,7 @@ user:
ask: ask_lastname ask: ask_lastname
required: True required: True
pattern: &pattern_lastname pattern: &pattern_lastname
- !!str ^([^\W\d_]{2,30}[ ,.'-]{0,3})+$ - !!str ^([^\W\d_]{1,30}[ ,.'-]{0,3})+$
- "pattern_lastname" - "pattern_lastname"
-m: -m:
full: --mail full: --mail
@ -307,7 +307,7 @@ user:
api: GET /users/permissions/<permission> api: GET /users/permissions/<permission>
arguments: arguments:
permission: permission:
help: Name of the permission to fetch info about help: Name of the permission to fetch info about (use "yunohost user permission list" and "yunohost user permission -f" to see all the current permissions)
### user_permission_update() ### user_permission_update()
update: update:
@ -315,7 +315,7 @@ user:
api: PUT /users/permissions/<permission> api: PUT /users/permissions/<permission>
arguments: arguments:
permission: permission:
help: Permission to manage (e.g. mail or nextcloud or wordpress.editors) help: Permission to manage (e.g. mail or nextcloud or wordpress.editors) (use "yunohost user permission list" and "yunohost user permission -f" to see all the current permissions)
-a: -a:
full: --add full: --add
help: Group or usernames to grant this permission to help: Group or usernames to grant this permission to
@ -346,7 +346,7 @@ user:
api: DELETE /users/permissions/<app> api: DELETE /users/permissions/<app>
arguments: arguments:
permission: permission:
help: Permission to manage (e.g. mail or nextcloud or wordpress.editors) help: Permission to manage (e.g. mail or nextcloud or wordpress.editors) (use "yunohost user permission list" and "yunohost user permission -f" to see all the current permissions)
ssh: ssh:
subcategory_help: Manage ssh access subcategory_help: Manage ssh access

View file

@ -460,7 +460,8 @@ ynh_remove_extra_repo () {
name="${name:-$app}" name="${name:-$app}"
ynh_secure_remove "/etc/apt/sources.list.d/$name.list" ynh_secure_remove "/etc/apt/sources.list.d/$name.list"
ynh_secure_remove "/etc/apt/preferences.d/$name" # 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 "/etc/apt/trusted.gpg.d/$name.gpg" > /dev/null ynh_secure_remove "/etc/apt/trusted.gpg.d/$name.gpg" > /dev/null
ynh_secure_remove "/etc/apt/trusted.gpg.d/$name.asc" > /dev/null ynh_secure_remove "/etc/apt/trusted.gpg.d/$name.asc" > /dev/null
@ -548,6 +549,9 @@ ynh_pin_repo () {
append="tee" append="tee"
fi fi
# Sury pinning is managed by the regenconf in the core...
[[ "$name" != "extra_php_version" ]] || return
mkdir --parents "/etc/apt/preferences.d" mkdir --parents "/etc/apt/preferences.d"
echo "Package: $package echo "Package: $package
Pin: $pin Pin: $pin

View file

@ -1,6 +1,6 @@
#!/bin/bash #!/bin/bash
n_version=6.5.1 n_version=6.7.0
n_install_dir="/opt/node_n" n_install_dir="/opt/node_n"
node_version_path="$n_install_dir/n/versions/node" 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. # N_PREFIX is the directory of n, it needs to be loaded as a environment variable.
@ -18,7 +18,7 @@ ynh_install_n () {
# Build an app.src for n # Build an app.src for n
mkdir --parents "../conf" mkdir --parents "../conf"
echo "SOURCE_URL=https://github.com/tj/n/archive/v${n_version}.tar.gz echo "SOURCE_URL=https://github.com/tj/n/archive/v${n_version}.tar.gz
SOURCE_SUM=5833f15893b9951a9ed59487e87b6c181d96b83a525846255872c4f92f0d25dd" > "../conf/n.src" SOURCE_SUM=92e00fa86d1c4e8dc6ca8df7e75fc93afe8f71949890ef67c40555df4efc4abe" > "../conf/n.src"
# Download and extract n # Download and extract n
ynh_setup_source --dest_dir="$n_install_dir/git" --source_id=n ynh_setup_source --dest_dir="$n_install_dir/git" --source_id=n
# Install n # Install n

View file

@ -85,6 +85,19 @@ ynh_add_fpm_config () {
# Set the default PHP-FPM version by default # Set the default PHP-FPM version by default
phpversion="${phpversion:-$YNH_PHP_VERSION}" phpversion="${phpversion:-$YNH_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" != "$phpversion" ]
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"
ynh_backup_if_checksum_is_different --file="$old_php_finalphpconf"
ynh_remove_fpm_config
fi
# If the requested PHP version is not the default version for YunoHost # If the requested PHP version is not the default version for YunoHost
if [ "$phpversion" != "$YNH_DEFAULT_PHP_VERSION" ] if [ "$phpversion" != "$YNH_DEFAULT_PHP_VERSION" ]
then then
@ -256,7 +269,13 @@ WantedBy=multi-user.target
# Restart the service, as this service is either stopped or only for this app # Restart the service, as this service is either stopped or only for this app
ynh_systemd_action --service_name=$fpm_service --action=restart ynh_systemd_action --service_name=$fpm_service --action=restart
else else
# Reload PHP, to not impact other parts of the system using PHP # Validate that the new php conf doesn't break php-fpm entirely
if ! php-fpm${phpversion} --test 2>/dev/null
then
php-fpm${phpversion} --test || true
ynh_secure_remove --file="$finalphpconf"
ynh_die --message="The new configuration broke php-fpm?"
fi
ynh_systemd_action --service_name=$fpm_service --action=reload ynh_systemd_action --service_name=$fpm_service --action=reload
fi fi
} }
@ -272,7 +291,7 @@ ynh_remove_fpm_config () {
local dedicated_service=$(ynh_app_setting_get --app=$app --key=fpm_dedicated_service) local dedicated_service=$(ynh_app_setting_get --app=$app --key=fpm_dedicated_service)
dedicated_service=${dedicated_service:-0} dedicated_service=${dedicated_service:-0}
# Get the version of PHP used by this app # Get the version of PHP used by this app
local phpversion=$(ynh_app_setting_get $app phpversion) local phpversion=$(ynh_app_setting_get --app=$app --key=phpversion)
# Assume default PHP-FPM version by default # Assume default PHP-FPM version by default
phpversion="${phpversion:-$YNH_DEFAULT_PHP_VERSION}" phpversion="${phpversion:-$YNH_DEFAULT_PHP_VERSION}"
@ -371,7 +390,7 @@ ynh_install_php () {
# Requires YunoHost version 3.8.1 or higher. # Requires YunoHost version 3.8.1 or higher.
ynh_remove_php () { ynh_remove_php () {
# Get the version of PHP used by this app # Get the version of PHP used by this app
local phpversion=$(ynh_app_setting_get $app phpversion) local phpversion=$(ynh_app_setting_get --app=$app --key=phpversion)
if [ "$phpversion" == "$YNH_DEFAULT_PHP_VERSION" ] || [ -z "$phpversion" ] if [ "$phpversion" == "$YNH_DEFAULT_PHP_VERSION" ] || [ -z "$phpversion" ]
then then

View file

@ -298,7 +298,7 @@ ynh_permission_create() {
fi fi
fi fi
yunohost tools shell -c "from yunohost.permission import permission_create; permission_create('$app.$permission' $url $additional_urls $auth_header $allowed $label $show_tile $protected , sync_perm=False)" yunohost tools shell -c "from yunohost.permission import permission_create; permission_create('$app.$permission' $url $additional_urls $auth_header $allowed $label $show_tile $protected)"
} }
# Remove a permission for the app (note that when the app is removed all permission is automatically removed) # Remove a permission for the app (note that when the app is removed all permission is automatically removed)
@ -316,7 +316,7 @@ ynh_permission_delete() {
local permission local permission
ynh_handle_getopts_args "$@" ynh_handle_getopts_args "$@"
yunohost tools shell -c "from yunohost.permission import permission_delete; permission_delete('$app.$permission', sync_perm=False)" yunohost tools shell -c "from yunohost.permission import permission_delete; permission_delete('$app.$permission')"
} }
# Check if a permission exists # Check if a permission exists
@ -408,7 +408,7 @@ ynh_permission_url() {
clear_urls=",clear_urls=True" clear_urls=",clear_urls=True"
fi fi
yunohost tools shell -c "from yunohost.permission import permission_url; permission_url('$app.$permission' $url $add_url $remove_url $auth_header $clear_urls )" yunohost tools shell -c "from yunohost.permission import permission_url; permission_url('$app.$permission' $url $add_url $remove_url $auth_header $clear_urls)"
} }
@ -487,7 +487,7 @@ ynh_permission_update() {
fi fi
fi fi
yunohost tools shell -c "from yunohost.permission import user_permission_update; user_permission_update('$app.$permission' $add $remove $label $show_tile $protected , force=True, sync_perm=False)" yunohost tools shell -c "from yunohost.permission import user_permission_update; user_permission_update('$app.$permission' $add $remove $label $show_tile $protected , force=True)"
} }
# Check if a permission has an user # Check if a permission has an user

View file

@ -579,6 +579,7 @@ ynh_app_upstream_version () {
local manifest local manifest
# Manage arguments with getopts # Manage arguments with getopts
ynh_handle_getopts_args "$@" ynh_handle_getopts_args "$@"
manifest="${manifest:-}"
if [[ "$manifest" != "" ]] && [[ -e "$manifest" ]]; if [[ "$manifest" != "" ]] && [[ -e "$manifest" ]];
then then

View file

@ -0,0 +1,9 @@
#!/bin/bash
source /usr/share/yunohost/helpers
ynh_abort_if_errors
YNH_CWD="${YNH_BACKUP_DIR%/}/conf/dkim"
mkdir -p "$YNH_CWD"
cd "$YNH_CWD"
ynh_backup --src_path="/etc/dkim"

View file

@ -0,0 +1,11 @@
#!/bin/bash
source /usr/share/yunohost/helpers
ynh_abort_if_errors
YNH_CWD="${YNH_BACKUP_DIR%/}/conf/ynh/dyndns"
mkdir -p $YNH_CWD
cd "$YNH_CWD"
# Backup the configuration
ynh_backup --src_path="/etc/yunohost/dyndns" --not_mandatory
ynh_backup --src_path="/etc/cron.d/yunohost-dyndns" --not_mandatory

View file

@ -32,11 +32,17 @@ class BaseSystemDiagnoser(Diagnoser):
data={"virt": virt, "arch": arch}, data={"virt": virt, "arch": arch},
summary="diagnosis_basesystem_hardware") summary="diagnosis_basesystem_hardware")
# Also possibly the board name # Also possibly the board / hardware name
if os.path.exists("/proc/device-tree/model"): if os.path.exists("/proc/device-tree/model"):
model = read_file('/proc/device-tree/model').strip().replace('\x00', '') model = read_file('/proc/device-tree/model').strip().replace('\x00', '')
hardware["data"]["model"] = model hardware["data"]["model"] = model
hardware["details"] = ["diagnosis_basesystem_hardware_board"] hardware["details"] = ["diagnosis_basesystem_hardware_model"]
elif os.path.exists("/sys/devices/virtual/dmi/id/sys_vendor"):
model = read_file("/sys/devices/virtual/dmi/id/sys_vendor").strip()
if os.path.exists("/sys/devices/virtual/dmi/id/product_name"):
model = "%s %s" % (model, read_file("/sys/devices/virtual/dmi/id/product_name").strip())
hardware["data"]["model"] = model
hardware["details"] = ["diagnosis_basesystem_hardware_model"]
yield hardware yield hardware

View file

@ -0,0 +1,9 @@
#!/bin/bash
backup_dir="$1/conf/dkim"
cp -a $backup_dir/etc/dkim/. /etc/dkim
chown -R root:root /etc/dkim
chown _rspamd:root /etc/dkim
chown _rspamd:root /etc/dkim/*.mail.key

View file

@ -0,0 +1,10 @@
#!/bin/bash
source /usr/share/yunohost/helpers
ynh_abort_if_errors
YNH_CWD="${YNH_BACKUP_DIR%/}/conf/ynh/dyndns"
cd "$YNH_CWD"
# Restore file if exists
ynh_restore_file --origin_path="/etc/yunohost/dyndns" --not_mandatory
ynh_restore_file --origin_path="/etc/cron.d/yunohost-dyndns" --not_mandatory

View file

@ -1,8 +1,8 @@
address=/{{ domain }}/{{ ipv4 }} host-record={{ domain }},{{ ipv4 }}
address=/xmpp-upload.{{ domain }}/{{ ipv4 }} host-record=xmpp-upload.{{ domain }},{{ ipv4 }}
{% if ipv6 %} {% if ipv6 %}
address=/{{ domain }}/{{ ipv6 }} host-record={{ domain }},{{ ipv6 }}
address=/xmpp-upload.{{ domain }}/{{ ipv6 }} host-record=xmpp-upload.{{ domain }},{{ ipv6 }}
{% endif %} {% endif %}
txt-record={{ domain }},"v=spf1 mx a -all" txt-record={{ domain }},"v=spf1 mx a -all"
mx-host={{ domain }},{{ domain }},5 mx-host={{ domain }},{{ domain }},5

View file

@ -2,4 +2,5 @@ location ^~ '/.well-known/acme-challenge/'
{ {
default_type "text/plain"; default_type "text/plain";
alias /tmp/acme-challenge-public/; alias /tmp/acme-challenge-public/;
gzip off;
} }

View file

@ -53,12 +53,8 @@ smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtpd_tls_loglevel=1 smtpd_tls_loglevel=1
# -- TLS for outgoing connections # -- TLS for outgoing connections
{% if relay_host != "" %}
smtp_tls_security_level = encrypt
{% else %}
# Use TLS if this is supported by the remote SMTP server, otherwise use plaintext. # Use TLS if this is supported by the remote SMTP server, otherwise use plaintext.
smtp_tls_security_level = may smtp_tls_security_level = may
{% endif %}
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
smtp_tls_exclude_ciphers = aNULL, MD5, DES, ADH, RC4, 3DES smtp_tls_exclude_ciphers = aNULL, MD5, DES, ADH, RC4, 3DES
smtp_tls_mandatory_ciphers= high smtp_tls_mandatory_ciphers= high
@ -182,6 +178,9 @@ milter_default_action = accept
smtp_destination_concurrency_limit = 2 smtp_destination_concurrency_limit = 2
default_destination_rate_delay = 5s default_destination_rate_delay = 5s
# Avoid to be blacklisted due to too many recipient
smtpd_client_recipient_rate_limit=150
# Avoid email adress scanning # Avoid email adress scanning
# By default it's possible to detect if the email adress exist # By default it's possible to detect if the email adress exist
# So it's easly possible to scan a server to know which email adress is valid # So it's easly possible to scan a server to know which email adress is valid

View file

@ -8,7 +8,7 @@
BASE dc=yunohost,dc=org BASE dc=yunohost,dc=org
URI ldap://localhost:389 URI ldap://localhost:389
#SIZELIMIT 12 SIZELIMIT 10000
#TIMELIMIT 15 #TIMELIMIT 15
#DEREF never #DEREF never

119
debian/changelog vendored
View file

@ -1,6 +1,123 @@
yunohost (4.1.2) testing; urgency=low
- [enh] diagnosis: Detect moar hardware name (b685a274)
- [fix] permissions: Handle regexes that may start with ^ or \ (bdff5937)
- [fix] permissions: Tile/protect status for legacy migration ([#1113](https://github.com/yunohost/yunohost/pull/1113))
- [fix] domain: double return prevent new code from working (0c977d8c)
- [fix] settings: When encountering unknown setting, also save the regular setting so we don't re-encounter the unknown settings everytime (d77d5afb)
- [fix] users: only ask for one letter for first/last name ([#1114](https://github.com/yunohost/yunohost/pull/1114))
- [fix] apt/sury: Tweak app helpers to not mess with Sury's pinning ([#1110](https://github.com/yunohost/yunohost/pull/1110))
- [i18n] Translations updated for German
Thanks to all contributors <3 ! (Bram, C. Wehrli, Kayou)
-- Alexandre Aubin <alex.aubin@mailoo.org> Thu, 31 Dec 2020 16:26:51 +0100
yunohost (4.1.1) testing; urgency=low
- [fix] Backup/restore DKIM keys ([#1098](https://github.com/yunohost/yunohost/pull/1098), [#1100](https://github.com/yunohost/yunohost/pull/1100))
- [fix] Backup/restore Dyndns keys ([#1101](https://github.com/yunohost/yunohost/pull/1101))
- [fix] mail: Add a max limit to number of recipients ([#1094](https://github.com/yunohost/yunohost/pull/1094))
- [fix] mail: Do not enforce encryption for relays .. some don't support it ... (11fe9d7e)
- [i18n] Translations updated for French, German, Italian, Occitan
Misc small fixes:
- [fix] misc: Prevent running `yunohost domain dns-conf` on arbirary domains ([#1099](https://github.com/yunohost/yunohost/pull/1099))
- [enh] misc: We don't care that 'apt-key output should not be parsed' (5422a49d)
- [fix] dnsmasq: Avoid to define wildcard records locally ([#1102](https://github.com/yunohost/yunohost/pull/1102))
- [fix] ssowat: Fix indent ([#1103](https://github.com/yunohost/yunohost/pull/1103))
- [fix] nginx: Force-disable gzip for acme-challenge (c5d06af2)
- [enh] app helpers: Handle change php version ([#1107](https://github.com/yunohost/yunohost/pull/1107))
- [fix] permissions: Misc fixes ([#1104](https://github.com/yunohost/yunohost/pull/1104), [#1105](https://github.com/yunohost/yunohost/pull/1105))
- [fix] certificates: Use organization name to check if from Lets Encrypt ([#1093](https://github.com/yunohost/yunohost/pull/1093))
- [enh] ldap: Increase ldap search size limit? ([#1074](https://github.com/yunohost/yunohost/pull/1074))
- [fix] app helpers: Avoid unecessarily reloading php7.3 too fast ([#1108](https://github.com/yunohost/yunohost/pull/1108))
- [fix] log: Fix a small issue where metadata could be None (because of empty yaml maybe?) (f9143d53)
Thanks to all contributors <3 ! (Christian Wehrli, Eric COURTEAU, Flavio Cristoforetti, Kay0u, Kayou, ljf, ljf (zamentur), Quentí)
-- Alexandre Aubin <alex.aubin@mailoo.org> Sat, 19 Dec 2020 01:33:36 +0100
yunohost (4.1.0) testing; urgency=low yunohost (4.1.0) testing; urgency=low
- Tmp bump of the version number to fix CI (c.f. Breaks: yunohost(<<4.1) in moulinette) - [enh] Extends permissions features, improve legacy settings handling (YunoHost#861)
- [enh] During app installs, add a default answer for user-type questions (YunoHost#982)
- [enh] Default questions for common app manifest arguments (YunoHost#981)
- [enh] Only upgrade apps if version actually changed (YunoHost#864)
- [enh] Create uncompressed backup archives by default (instead of .tar.gz) (YunoHost#1020)
- [enh] Add possibility to download backups (YunoHost#1046)
- [enh] Asking an email address during user creation was confusing, now define it a username@domain by default (admin only chooses the domain) (YunoHost#962)
- [enh] Be able to configure an smtp relay (YunoHost#773)
- [enh] Add a diagnosis to detect processes rencently killed by oom_reaper (YunoHost/f5acbffb)
- [enh] Simplify operation log list (YunoHost#955)
- [enh] Smarter sorting of domain list (YunoHost#860)
- [fix] Accept '+' sign in mail forward adresses (YunoHost#818)
- [enh] Add x509 fingerprint in /etc/issue (YunoHost#1056)
- [enh] Add ynh_add_config helper (YunoHost#1055)
- [enh] Upgrade n version (YunoHost#1073)
- [enh] Clean /usr/bin/yunohost, make it easier to use yunohost as a python lib (YunoHost#922)
- [enh] Lazy loading of smtplib to reduce memory footprint a bit (0f2e9ab1)
- [enh] Refactor manifest arguments parsing (YunoHost#1013)
- [enh] Detect misformated arguments in getopts (YunoHost#1052)
- [enh] Refactor app download process, make it github-independent (YunoHost#1049)
- [fix] Test at the beginning of postinstall that iptables is working instead of miserably crashing later (YunoHost/f73ae4ee)
- [enh] Service logs: journalctl -x in fact makes everything bloated, the supposedly additional info it displays does not contains anything relevant... (YunoHost/452b178d)
- [enh] Add redis hook to enforce permissions on /var/log/redis (YunoHost/a1c1057a)
- [enh] Add configuration tests for dnsmasq, fail2ban, slapd (YunoHost/6e69df37)
- [enh] Remove some old fail2ban jails that do not exists anymore (YunoHost/2c6736df)
- [enh] Get rid of yunohost.local in main domain nginx conf (YunoHost/ba884d5b)
- [enh] Ignore some unimportant apt warnings (YunoHost/199cc50)
- [enh] Create the helper doc on new version (YunoHost#1080)
- [enh] The email "abuse@you_domain.tld" is now unavailable for security reason (YunoHost/67e03e6)
- [enh] Remove some warnings during backup (YunoHost#1047)
- [i18n] Translations updated for Catalan, Chinese (Simplified), French, German, Italian, Occitan, Portuguese
Thanks to all contributors <3 ! (Aleks, Augustin T., Baptiste W., Bram, Christian W., Colin W., cyxae, ekhae, Éric G., Félix P., Josué, Julien J., Kayou, Leandro N., ljf, Maniack C, ppr, Quentí, Quentin D., SiM, yalh76, Yifei D., xaloc33)
-- Kay0u <pierre@kayou.io> Thu, 03 Dec 2020 16:34:38 +0100
yunohost (4.0.8.3) stable; urgency=low
- [fix] Certificate renewal for LE (#1092)
Thanks to all contributors <3 ! (frju365)
-- Kay0u <pierre@kayou.io> Thu, 03 Dec 2020 14:01:03 +0000
yunohost (4.0.8.2) stable; urgency=low
- [fix] intermediate_certificate is now included in signed certificate (#1067)
Thanks to all contributors <3 ! (Bram)
-- Alexandre Aubin <alex.aubin@mailoo.org> Wed, 04 Nov 2020 23:32:16 +0100
yunohost (4.0.8.1) stable; urgency=low
- [fix] App installs logs were still disclosing secrets when shared sometimes ...
-- Alexandre Aubin <alex.aubin@mailoo.org> Wed, 04 Nov 2020 17:24:52 +0100
yunohost (4.0.8) stable; urgency=low
- [fix] Diagnose ssl libs installed from sury (#1053)
- [enh] Better problematic apt dependencies auto-investigation mechanism (#1051, 8d4f36e1)
- [fix] Force locale to C during postgresql migration to avoid some stupid issue related to locale (d532cd5e)
- [fix] Use php7.3 by default in CLI (82c0cc92)
- [fix] Typo in fpm_config helper led to install process hanging forever (7dcf4b00)
Thanks to all contributors <3 ! (Kayou)
-- Alexandre Aubin <alex.aubin@mailoo.org> Wed, 16 Sep 2020 16:23:04 +0200
yunohost (4.0.7.1) stable; urgency=low
- Forbid users from using SSH as a VPN (even if SSH login is disabled) (#1050)
Thanks to all contributors <3 ! (ljf)
-- Alexandre Aubin <alex.aubin@mailoo.org> Fri, 11 Sep 2020 21:06:09 +0200
yunohost (4.0.7) stable; urgency=low yunohost (4.0.7) stable; urgency=low

2
debian/control vendored
View file

@ -11,7 +11,7 @@ Package: yunohost
Essential: yes Essential: yes
Architecture: all Architecture: all
Depends: ${python:Depends}, ${misc:Depends} Depends: ${python:Depends}, ${misc:Depends}
, moulinette (>= 4.1), ssowat (>= 4.0) , moulinette (>= 4.1.0.1), ssowat (>= 4.0)
, python-psutil, python-requests, python-dnspython, python-openssl , python-psutil, python-requests, python-dnspython, python-openssl
, python-miniupnpc, python-dbus, python-jinja2 , python-miniupnpc, python-dbus, python-jinja2
, python-toml, python-packaging, python-publicsuffix , python-toml, python-packaging, python-publicsuffix

View file

@ -3,10 +3,19 @@
import os import os
import glob import glob
import datetime import datetime
import subprocess
def get_current_commit():
p = subprocess.Popen("git rev-parse --verify HEAD", shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
stdout, stderr = p.communicate()
current_commit = stdout.strip().decode('utf-8')
return current_commit
def render(helpers): def render(helpers):
current_commit = get_current_commit()
data = {"helpers": helpers, data = {"helpers": helpers,
"date": datetime.datetime.now().strftime("%m/%d/%Y"), "date": datetime.datetime.now().strftime("%m/%d/%Y"),
"version": open("../debian/changelog").readlines()[0].split()[1].strip("()") "version": open("../debian/changelog").readlines()[0].split()[1].strip("()")
@ -25,7 +34,7 @@ def render(helpers):
template = open("helper_doc_template.html", "r").read() template = open("helper_doc_template.html", "r").read()
t = Template(template) t = Template(template)
t.globals['now'] = datetime.datetime.utcnow t.globals['now'] = datetime.datetime.utcnow
result = t.render(data=data, convert=shell_to_html, shell_css=shell_css) result = t.render(current_commit=current_commit, data=data, convert=shell_to_html, shell_css=shell_css)
open("helpers.html", "w").write(result) open("helpers.html", "w").write(result)
############################################################################## ##############################################################################
@ -197,7 +206,7 @@ def main():
for helper_file in helper_files: for helper_file in helper_files:
category_name = os.path.basename(helper_file) category_name = os.path.basename(helper_file)
print "Parsing %s ..." % category_name print("Parsing %s ..." % category_name)
p = Parser(helper_file) p = Parser(helper_file)
p.parse_blocks() p.parse_blocks()
for b in p.blocks: for b in p.blocks:

View file

@ -2,7 +2,7 @@
<h1>App helpers</h1> <h1>App helpers</h1>
<p>Doc auto-generated by <a href="https://github.com/YunoHost/yunohost/blob/stretch-unstable/doc/generate_helper_doc.py">this script</a> on {{data.date}} (Yunohost version {{data.version}})</p> <p>Doc auto-generated by <a href="https://github.com/YunoHost/yunohost/blob/{{ current_commit }}/doc/generate_helper_doc.py">this script</a> on {{data.date}} (Yunohost version {{data.version}})</p>
{% for category, helpers in data.helpers %} {% for category, helpers in data.helpers %}
@ -72,7 +72,7 @@
</p> </p>
{% endif %} {% endif %}
<p> <p>
<a href="https://github.com/YunoHost/yunohost/blob/stretch-stable/data/helpers.d/{{ category }}#L{{ h.line + 1 }}">Dude, show me the code !</a> <a href="https://github.com/YunoHost/yunohost/blob/{{ current_commit }}/data/helpers.d/{{ category }}#L{{ h.line + 1 }}">Dude, show me the code !</a>
</p> </p>
</div> </div>

View file

@ -16,7 +16,7 @@
"app_extraction_failed": "No s'han pogut extreure els fitxers d'instal·lació", "app_extraction_failed": "No s'han pogut extreure els fitxers d'instal·lació",
"app_id_invalid": "ID de l'aplicació incorrecte", "app_id_invalid": "ID de l'aplicació incorrecte",
"app_install_files_invalid": "Aquests fitxers no es poden instal·lar", "app_install_files_invalid": "Aquests fitxers no es poden instal·lar",
"app_make_default_location_already_used": "No es pot fer l'aplicació '{app}' per defecte en el domini «{domain}» ja que ja és utilitzat per una altra aplicació '{other_app}'", "app_make_default_location_already_used": "No es pot fer l'aplicació '{app}' l'aplicació per defecte en el domini «{domain}», ja que ja és utilitzat per '{other_app}'",
"app_location_unavailable": "Aquesta URL no està disponible o entra en conflicte amb aplicacions ja instal·lades:\n{apps:s}", "app_location_unavailable": "Aquesta URL no està disponible o entra en conflicte amb aplicacions ja instal·lades:\n{apps:s}",
"app_manifest_invalid": "Hi ha algun error amb el manifest de l'aplicació: {error}", "app_manifest_invalid": "Hi ha algun error amb el manifest de l'aplicació: {error}",
"app_not_correctly_installed": "{app:s} sembla estar mal instal·lada", "app_not_correctly_installed": "{app:s} sembla estar mal instal·lada",
@ -300,7 +300,7 @@
"packages_upgrade_failed": "No s'han pogut actualitzar tots els paquets", "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_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_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 (ex.: algu@domini.cat)", "pattern_email": "Ha de ser una adreça de correu vàlida, sense el símbol «+» (ex.: algu@domini.cat)",
"pattern_firstname": "Ha de ser un nom vàlid", "pattern_firstname": "Ha de ser un nom vàlid",
"pattern_lastname": "Ha de ser un cognom vàlid", "pattern_lastname": "Ha de ser un cognom vàlid",
"pattern_mailbox_quota": "Ha de ser una mida amb el sufix b/k/M/G/T o 0 per no tenir quota", "pattern_mailbox_quota": "Ha de ser una mida amb el sufix b/k/M/G/T o 0 per no tenir quota",
@ -386,7 +386,7 @@
"service_stop_failed": "No s'ha pogut aturar el servei «{service:s}»\n\nRegistres recents: {logs:s}", "service_stop_failed": "No s'ha pogut aturar el servei «{service:s}»\n\nRegistres recents: {logs:s}",
"service_stopped": "S'ha aturat el servei «{service:s}»", "service_stopped": "S'ha aturat el servei «{service:s}»",
"service_unknown": "Servei «{service:s}» desconegut", "service_unknown": "Servei «{service:s}» desconegut",
"ssowat_conf_generated": "S'ha generat la configuració SSOwat", "ssowat_conf_generated": "S'ha regenerat la configuració SSOwat",
"ssowat_conf_updated": "S'ha actualitzat la configuració SSOwat", "ssowat_conf_updated": "S'ha actualitzat la configuració SSOwat",
"system_upgraded": "S'ha actualitzat el sistema", "system_upgraded": "S'ha actualitzat el sistema",
"system_username_exists": "El nom d'usuari ja existeix en la llista d'usuaris de sistema", "system_username_exists": "El nom d'usuari ja existeix en la llista d'usuaris de sistema",
@ -442,9 +442,9 @@
"migration_description_0011_setup_group_permission": "Configurar els grups d'usuaris i els permisos per les aplicacions i els serveis", "migration_description_0011_setup_group_permission": "Configurar els grups d'usuaris i els permisos per les aplicacions i els serveis",
"migration_0011_backup_before_migration": "Creant una còpia de seguretat de la base de dades LDAP i la configuració de les aplicacions abans d'efectuar la migració.", "migration_0011_backup_before_migration": "Creant una còpia de seguretat de la base de dades LDAP i la configuració de les aplicacions abans d'efectuar la migració.",
"migration_0011_can_not_backup_before_migration": "No s'ha pogut completar la còpia de seguretat abans de que la migració fallés. Error: {error:s}", "migration_0011_can_not_backup_before_migration": "No s'ha pogut completar la còpia de seguretat abans de que la migració fallés. Error: {error:s}",
"migration_0011_create_group": "Creant un grup per a cada usuari", "migration_0011_create_group": "Creant un grup per a cada usuari...",
"migration_0011_done": "Migració completada. Ja podeu gestionar grups d'usuaris.", "migration_0011_done": "Migració completada. Ja podeu gestionar grups d'usuaris.",
"migration_0011_LDAP_update_failed": "Ha fallat l'actualització de LDAP. Error: {error:s}", "migration_0011_LDAP_update_failed": "No s'ha pogut actualitzar LDAP. Error: {error:s}",
"migration_0011_migrate_permission": "Fent la migració dels permisos de la configuració de les aplicacions a LDAP...", "migration_0011_migrate_permission": "Fent la migració dels permisos de la configuració de les aplicacions a LDAP...",
"migration_0011_migration_failed_trying_to_rollback": "No s'ha pogut fer la migració… s'intenta tornar el sistema a l'estat anterior.", "migration_0011_migration_failed_trying_to_rollback": "No s'ha pogut fer la migració… s'intenta tornar el sistema a l'estat anterior.",
"migration_0011_rollback_success": "S'ha tornat el sistema a l'estat anterior.", "migration_0011_rollback_success": "S'ha tornat el sistema a l'estat anterior.",
@ -676,5 +676,41 @@
"migration_0017_postgresql_96_not_installed": "PostgreSQL no està instal·lat en aquest sistema. No s'ha de realitzar cap operació.", "migration_0017_postgresql_96_not_installed": "PostgreSQL no està instal·lat en aquest sistema. No s'ha de realitzar cap operació.",
"migration_description_0018_xtable_to_nftable": "Migrar les regles del trànsit de xarxa al nou sistema nftable", "migration_description_0018_xtable_to_nftable": "Migrar les regles del trànsit de xarxa al nou sistema nftable",
"migration_description_0017_postgresql_9p6_to_11": "Migrar les bases de dades de PosrgreSQL 9.6 a 11", "migration_description_0017_postgresql_9p6_to_11": "Migrar les bases de dades de PosrgreSQL 9.6 a 11",
"migration_description_0016_php70_to_php73_pools": "Migrar els fitxers de configuració «pool» php7.0-fpm a php7.3" "migration_description_0016_php70_to_php73_pools": "Migrar els fitxers de configuració «pool» php7.0-fpm a php7.3",
"global_settings_setting_backup_compress_tar_archives": "Comprimir els arxius (.tar.gz) en lloc d'arxius no comprimits (.tar) al crear noves còpies de seguretat. N.B.: activar aquesta opció permet fer arxius de còpia de seguretat més lleugers, però el procés inicial de còpia de seguretat serà significativament més llarg i més exigent a nivell de CPU.",
"global_settings_setting_smtp_relay_host": "L'amfitrió de tramesa SMTP que s'ha d'utilitzar per enviar correus electrònics en lloc d'aquesta instància de YunoHost. És útil si esteu en una de les següents situacions: el port 25 està bloquejat per el vostre proveïdor d'accés a internet o proveïdor de servidor privat virtual, si teniu una IP residencial llistada a DUHL, si no podeu configurar el DNS invers o si el servidor no està directament exposat a internet i voleu utilitzar-ne un altre per enviar correus electrònics.",
"unknown_main_domain_path": "Domini o ruta desconeguda per a «{app}». Heu d'especificar un domini i una ruta per a poder especificar una URL per al permís.",
"show_tile_cant_be_enabled_for_regex": "No podeu activar «show_title» ara, perquè la URL per al permís «{permission}» és una expressió regular",
"show_tile_cant_be_enabled_for_url_not_defined": "No podeu activar «show_title» ara, perquè primer s'ha de definir una URL per al permís «{permission}»",
"regex_with_only_domain": "No podeu utilitzar una expressió regular com a domini, només com a ruta",
"regex_incompatible_with_tile": "/!\\ Empaquetadors! El permís «{permission}» té «show_tile» definit a «true» i pertant no pot definir una URL regex com a URL principal",
"permission_protected": "El permís {permission} està protegit. No podeu afegir o eliminar el grup visitants a o d'aquest permís.",
"pattern_email_forward": "Ha de ser una adreça de correu vàlida, s'accepta el símbol «+» (per exemple, algu+etiqueta@exemple.cat)",
"invalid_number": "Ha de ser una xifra",
"migration_0019_slapd_config_will_be_overwritten": "Sembla que heu modificat manualment la configuració sldap. Per a aquesta migració crítica, YunoHist necessita forçar l'actualització de la configuració sldap. Es crearà una còpia de seguretat dels fitxers originals a {conf_backup_folder}.",
"migration_0019_rollback_success": "S'ha restaurat el sistema.",
"migration_0019_migration_failed_trying_to_rollback": "No s'ha pogut fer la migració... intentant restaurar el sistema.",
"migration_0019_can_not_backup_before_migration": "No s'ha pogut completar la còpia de seguretat del sistema abans de que fallés la migració. Error: {error:s}",
"migration_0019_backup_before_migration": "Creant una còpia de seguretat de la base de dades LDAP i de la configuració de les aplicacions abans de la migració actual.",
"migration_0019_add_new_attributes_in_ldap": "Afegir nous atributs per als permisos en la base de dades LDAP",
"migration_description_0019_extend_permissions_features": "Amplia/refés el sistema de gestió dels permisos de l'aplicació",
"migrating_legacy_permission_settings": "Migració dels paràmetres de permisos antics...",
"invalid_regex": "Regex no vàlid: «{regex:s}»",
"global_settings_setting_smtp_relay_password": "Tramesa de la contrasenya d'amfitrió SMTP",
"global_settings_setting_smtp_relay_user": "Tramesa de compte d'usuari SMTP",
"global_settings_setting_smtp_relay_port": "Port de tramesa SMTP",
"domain_name_unknown": "Domini «{domain}» desconegut",
"diagnosis_processes_killed_by_oom_reaper": "El sistema ha matat alguns processos recentment perquè s'ha quedat sense memòria. Això acostuma a ser un símptoma de falta de memòria en el sistema o d'un procés que consumeix massa memòria. Llista dels processos que s'han matat:\n{kills_summary}",
"diagnosis_package_installed_from_sury_details": "Alguns paquets s'han instal·lat per equivocació des d'un repositori de tercers anomenat Sury. L'equip de YunoHost a millorat l'estratègia per a gestionar aquests paquets, però s'espera que algunes configuracions que han instal·lat aplicacions PHP7.3 a Stretch puguin tenir algunes inconsistències. Per a resoldre aquesta situació, hauríeu d'intentar executar la següent ordre: <cmd>{cmd_to_fix}</cmd>",
"diagnosis_package_installed_from_sury": "Alguns paquets del sistema s'han de tornar a versions anteriors",
"ask_user_domain": "Domini a utilitzar per l'adreçar de correu electrònic i per al compte XMPP",
"app_manifest_install_ask_is_public": "Aquesta aplicació hauria de ser visible per a visitants anònims?",
"app_manifest_install_ask_admin": "Escolliu l'usuari administrador per aquesta aplicació",
"app_manifest_install_ask_password": "Escolliu la contrasenya d'administració per aquesta aplicació",
"app_manifest_install_ask_path": "Escolliu la ruta en la que s'hauria d'instal·lar aquesta aplicació",
"app_manifest_install_ask_domain": "Escolliu el domini en el que s'hauria d'instal·lar aquesta aplicació",
"app_label_deprecated": "Aquesta ordre està desestimada! Si us plau utilitzeu la nova ordre «yunohost user permission update» per gestionar l'etiqueta de l'aplicació.",
"app_argument_password_no_default": "Hi ha hagut un error al analitzar l'argument de la contrasenya «{name}»: l'argument de contrasenya no pot tenir un valor per defecte per raons de seguretat",
"additional_urls_already_removed": "URL addicional «{url:s}» ja ha estat eliminada per al permís «{permission:s}»",
"additional_urls_already_added": "URL addicional «{url:s}» ja ha estat afegida per al permís «{permission:s}»"
} }

1
locales/cs.json Normal file
View file

@ -0,0 +1 @@
{}

View file

@ -1,7 +1,7 @@
{ {
"action_invalid": "Ungültige Aktion '{action:s}'", "action_invalid": "Ungültige Aktion '{action:s}'",
"admin_password": "Administrator-Passwort", "admin_password": "Administrator-Passwort",
"admin_password_change_failed": "Passwort kann nicht geändert werden", "admin_password_change_failed": "Ändern des Passworts nicht möglich",
"admin_password_changed": "Das Administrator-Kennwort wurde geändert", "admin_password_changed": "Das Administrator-Kennwort wurde geändert",
"app_already_installed": "{app:s} ist schon installiert", "app_already_installed": "{app:s} ist schon installiert",
"app_argument_choice_invalid": "Wähle einen der folgenden Werte '{choices:s}' für das Argument '{name:s}'", "app_argument_choice_invalid": "Wähle einen der folgenden Werte '{choices:s}' für das Argument '{name:s}'",
@ -243,7 +243,7 @@
"app_start_remove": "{app} wird entfernt...", "app_start_remove": "{app} wird entfernt...",
"app_start_install": "{app} wird installiert...", "app_start_install": "{app} wird installiert...",
"app_not_upgraded": "Die App '{failed_app}' konnte nicht aktualisiert werden. Infolgedessen wurden die folgenden App-Upgrades abgebrochen: {apps}", "app_not_upgraded": "Die App '{failed_app}' konnte nicht aktualisiert werden. Infolgedessen wurden die folgenden App-Upgrades abgebrochen: {apps}",
"app_make_default_location_already_used": "Die App \"{app}\" kann nicht als Standard für die Domain \"{domain}\" festgelegt werden. Sie wird bereits von der App \"{other_app}\" verwendet", "app_make_default_location_already_used": "Die App \"{app}\" kann nicht als Standard für die Domain \"{domain}\" festgelegt werden. Sie wird bereits von \"{other_app}\" verwendet",
"aborting": "Breche ab.", "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}. Versuchen Sie, 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.", "already_up_to_date": "Nichts zu tun. Alles ist bereits auf dem neusten Stand.",
@ -298,7 +298,7 @@
"log_app_makedefault": "Mache '{}' zur Standard-Anwendung", "log_app_makedefault": "Mache '{}' zur Standard-Anwendung",
"hook_json_return_error": "Konnte die Rückkehr vom Einsprungpunkt {path:s} nicht lesen. Fehler: {msg:s}. Unformatierter Inhalt: {raw_content}", "hook_json_return_error": "Konnte die Rückkehr vom Einsprungpunkt {path:s} nicht lesen. Fehler: {msg:s}. Unformatierter Inhalt: {raw_content}",
"app_full_domain_unavailable": "Es tut uns leid, aber diese Anwendung erfordert die Installation auf einer eigenen Domain, aber einige andere Anwendungen sind bereits auf der Domäne'{domain}' installiert. Eine mögliche Lösung ist das Hinzufügen und Verwenden einer Subdomain, die dieser Anwendung zugeordnet ist.", "app_full_domain_unavailable": "Es tut uns leid, aber diese Anwendung erfordert die Installation auf einer eigenen Domain, aber einige andere Anwendungen sind bereits auf der Domäne'{domain}' installiert. Eine mögliche Lösung ist das Hinzufügen und Verwenden einer Subdomain, die dieser Anwendung zugeordnet ist.",
"app_install_failed": "Installation von {app} fehlgeschlagen: {error}", "app_install_failed": "{app} kann nicht installiert werden: {error}",
"app_install_script_failed": "Im Installationsscript ist ein Fehler aufgetreten", "app_install_script_failed": "Im Installationsscript ist ein Fehler aufgetreten",
"app_remove_after_failed_install": "Entfernen der App nach fehlgeschlagener Installation...", "app_remove_after_failed_install": "Entfernen der App nach fehlgeschlagener Installation...",
"app_upgrade_script_failed": "Es ist ein Fehler im App-Upgrade-Skript aufgetreten", "app_upgrade_script_failed": "Es ist ein Fehler im App-Upgrade-Skript aufgetreten",
@ -464,6 +464,13 @@
"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.", "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_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 einen spezifischen Benutzer zu enthalten.",
"diagnosis_processes_killed_by_oom_reaper": "Einige Prozesse wurden vom System beendet, weil nicht genügend Arbeitsspeicher vorhanden ist. Das passiert normalerweise, wenn das System nicht genügend Arbeitsspeicher zur Verfügung hat oder wenn ein Prozess zu viel Speicher verbraucht. Zusammenfassung der beendeten Prozesse: {kills_summary}", "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": "Offene Ports" "diagnosis_description_ports": "Offene Ports",
"additional_urls_already_added": "Zusätzliche URL '{url:s}' bereits hinzugefügt in der zusätzlichen URL für Berechtigung '{permission:s}'",
"additional_urls_already_removed": "Zusätzliche URL '{url:s}' bereits entfernt in der zusätzlichen URL für Berechtigung '{permission:s}'",
"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 <a href='https://yunohost.org/dns_local_network'>https://yunohost.org/dns_local_network</a> werfen",
"diagnosis_http_nginx_conf_not_up_to_date": "Jemand hat anscheinend die Konfiguration von Nginx manuell geändert. Diese Änderung verhindert, dass Yunohost eine Diagnose durchführen kann, wenn er via HTTP erreichbar ist.",
"diagnosis_http_bad_status_code": "Anscheinend beantwortet ein anderes Gerät als Ihr Server die Anfrage (Vielleicht ihr Internetrouter).<br>1. Die häufigste Ursache ist, dass Port 80 (und 443) <a href='https://yunohost.org/isp_box_config'>nicht richtig auf Ihren Server weitergeleitet wird</a>.<br> 2. Bei komplexeren Setups: Vergewissern Sie sich, dass keine Firewall und keine Reverse-Proxy interferieren.",
"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'."
} }

View file

@ -141,7 +141,7 @@
"confirm_app_install_thirdparty": "DANGER! This app is not part of Yunohost's app catalog. Installing third-party apps may compromise the integrity and security of your system. You should probably NOT install it unless you know what you are doing. NO SUPPORT will be provided if this app doesn't work or breaks your system… If you are willing to take that risk anyway, type '{answers:s}'", "confirm_app_install_thirdparty": "DANGER! This app is not part of Yunohost's app catalog. Installing third-party apps may compromise the integrity and security of your system. You should probably NOT install it unless you know what you are doing. NO SUPPORT will be provided if this app doesn't work or breaks your system… If you are willing to take that risk anyway, type '{answers:s}'",
"custom_app_url_required": "You must provide a URL to upgrade your custom app {app:s}", "custom_app_url_required": "You must provide a URL to upgrade your custom app {app:s}",
"diagnosis_basesystem_hardware": "Server hardware architecture is {virt} {arch}", "diagnosis_basesystem_hardware": "Server hardware architecture is {virt} {arch}",
"diagnosis_basesystem_hardware_board": "Server board model is {model}", "diagnosis_basesystem_hardware_model": "Server model is {model}",
"diagnosis_basesystem_host": "Server is running Debian {debian_version}", "diagnosis_basesystem_host": "Server is running Debian {debian_version}",
"diagnosis_basesystem_kernel": "Server is running Linux kernel {kernel_version}", "diagnosis_basesystem_kernel": "Server is running Linux kernel {kernel_version}",
"diagnosis_basesystem_ynh_single_version": "{package} version: {version} ({repo})", "diagnosis_basesystem_ynh_single_version": "{package} version: {version} ({repo})",
@ -278,7 +278,7 @@
"domain_dyndns_root_unknown": "Unknown DynDNS root domain", "domain_dyndns_root_unknown": "Unknown DynDNS root domain",
"domain_exists": "The domain already exists", "domain_exists": "The domain already exists",
"domain_hostname_failed": "Unable to set new hostname. This might cause an issue later (it might be fine).", "domain_hostname_failed": "Unable to set new hostname. This might cause an issue later (it might be fine).",
"domain_uninstall_app_first": "Those applications are still installed on your domain: {apps}. Please uninstall them before proceeding to domain removal", "domain_uninstall_app_first": "Those applications are still installed on your domain:\n{apps}\n\nPlease uninstall them using 'yunohost app remove the_app_id' or move them to another domain using 'yunohost app change-url the_app_id' before proceeding to domain removal",
"domain_name_unknown": "Domain '{domain}' unknown", "domain_name_unknown": "Domain '{domain}' unknown",
"domain_unknown": "Unknown domain", "domain_unknown": "Unknown domain",
"domains_available": "Available domains:", "domains_available": "Available domains:",
@ -301,8 +301,6 @@
"dyndns_registration_failed": "Could not register DynDNS domain: {error:s}", "dyndns_registration_failed": "Could not register DynDNS domain: {error:s}",
"dyndns_domain_not_provided": "DynDNS provider {provider:s} cannot provide domain {domain:s}.", "dyndns_domain_not_provided": "DynDNS provider {provider:s} cannot provide domain {domain:s}.",
"dyndns_unavailable": "The domain '{domain:s}' is unavailable.", "dyndns_unavailable": "The domain '{domain:s}' is unavailable.",
"executing_command": "Executing command '{command:s}'...",
"executing_script": "Executing script '{script:s}'...",
"extracting": "Extracting...", "extracting": "Extracting...",
"experimental_feature": "Warning: This feature is experimental and not considered stable, you should not use it unless you know what you are doing.", "experimental_feature": "Warning: This feature is experimental and not considered stable, you should not use it unless you know what you are doing.",
"field_invalid": "Invalid field '{:s}'", "field_invalid": "Invalid field '{:s}'",
@ -471,6 +469,7 @@
"migrations_success_forward": "Migration {id} completed", "migrations_success_forward": "Migration {id} completed",
"migrations_to_be_ran_manually": "Migration {id} has to be run manually. Please go to Tools → Migrations on the webadmin page, or run `yunohost tools migrations migrate`.", "migrations_to_be_ran_manually": "Migration {id} has to be run manually. Please go to Tools → Migrations on the webadmin page, or run `yunohost tools migrations migrate`.",
"not_enough_disk_space": "Not enough free space on '{path:s}'", "not_enough_disk_space": "Not enough free space on '{path:s}'",
"invalid_number": "Must be a number",
"operation_interrupted": "The operation was manually interrupted?", "operation_interrupted": "The operation was manually interrupted?",
"packages_upgrade_failed": "Could not upgrade all the packages", "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_listed": "This password is among the most used passwords in the world. Please choose something more unique.",
@ -529,7 +528,7 @@
"restore_already_installed_apps": "The following apps can't be restored because they are already installed: {apps}", "restore_already_installed_apps": "The following apps can't be restored because they are already installed: {apps}",
"restore_app_failed": "Could not restore {app:s}", "restore_app_failed": "Could not restore {app:s}",
"restore_cleaning_failed": "Could not clean up the temporary restoration directory", "restore_cleaning_failed": "Could not clean up the temporary restoration directory",
"restore_complete": "Restored", "restore_complete": "Restoration completed",
"restore_confirm_yunohost_installed": "Do you really want to restore an already installed system? [{answers:s}]", "restore_confirm_yunohost_installed": "Do you really want to restore an already installed system? [{answers:s}]",
"restore_extracting": "Extracting needed files from the archive…", "restore_extracting": "Extracting needed files from the archive…",
"restore_failed": "Could not restore system", "restore_failed": "Could not restore system",
@ -587,7 +586,7 @@
"service_unknown": "Unknown service '{service:s}'", "service_unknown": "Unknown service '{service:s}'",
"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}'", "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}'",
"show_tile_cant_be_enabled_for_regex": "You cannot enable 'show_tile' right no, because the URL for the permission '{permission}' is a regex", "show_tile_cant_be_enabled_for_regex": "You cannot enable 'show_tile' right no, because the URL for the permission '{permission}' is a regex",
"ssowat_conf_generated": "SSOwat configuration generated", "ssowat_conf_generated": "SSOwat configuration regenerated",
"ssowat_conf_updated": "SSOwat configuration updated", "ssowat_conf_updated": "SSOwat configuration updated",
"system_upgraded": "System upgraded", "system_upgraded": "System upgraded",
"system_username_exists": "Username already exists in the list of system users", "system_username_exists": "Username already exists in the list of system users",

View file

@ -605,5 +605,31 @@
"diagnosis_dns_point_to_doc": "Por favor, consulta la documentación en <a href='https://yunohost.org/dns_config'>https://yunohost.org/dns_config</a> si necesitas ayuda para configurar los registros DNS.", "diagnosis_dns_point_to_doc": "Por favor, consulta la documentación en <a href='https://yunohost.org/dns_config'>https://yunohost.org/dns_config</a> si necesitas ayuda para configurar los registros DNS.",
"diagnosis_ip_global": "IP Global: <code>{global}</code>", "diagnosis_ip_global": "IP Global: <code>{global}</code>",
"diagnosis_mail_outgoing_port_25_ok": "El servidor de email SMTP puede mandar emails (puerto saliente 25 no está bloqueado).", "diagnosis_mail_outgoing_port_25_ok": "El servidor de email SMTP puede mandar emails (puerto saliente 25 no está bloqueado).",
"diagnosis_mail_outgoing_port_25_blocked_details": "Deberías intentar desbloquear el puerto 25 saliente en la interfaz de tu router o en la interfaz de tu provedor de hosting. (Algunos hosting pueden necesitar que les abras un ticket de soporte para esto)." "diagnosis_mail_outgoing_port_25_blocked_details": "Deberías intentar desbloquear el puerto 25 saliente en la interfaz de tu router o en la interfaz de tu provedor de hosting. (Algunos hosting pueden necesitar que les abras un ticket de soporte para esto).",
"diagnosis_swap_tip": "Por favor tenga cuidado y sepa que si el servidor contiene swap en una tarjeta SD o un disco duro de estado sólido, esto reducirá drásticamente la vida útil del dispositivo.",
"diagnosis_domain_expires_in": "{domain} expira en {days} días.",
"diagnosis_domain_expiration_error": "¡Algunos dominios expirarán MUY PRONTO!",
"diagnosis_domain_expiration_warning": "¡Algunos dominios expirarán pronto!",
"diagnosis_domain_expiration_success": "Sus dominios están registrados y no expirarán pronto.",
"diagnosis_domain_expiration_not_found_details": "¿Parece que la información de WHOIS para el dominio {domain} no contiene información sobre la fecha de expiración?",
"diagnosis_domain_not_found_details": "¡El dominio {domain} no existe en la base de datos WHOIS o ha expirado!",
"diagnosis_domain_expiration_not_found": "No se pudo revisar la fecha de expiración para algunos dominios",
"diagnosis_dns_try_dyndns_update_force": "La configuración DNS de este dominio debería ser administrada automáticamente por Yunohost. Si no es el caso, puede intentar forzar una actualización ejecutando <cmd>yunohost dyndns update --force</cmd>.",
"diagnosis_ip_local": "IP Local: <code>{local}</code>",
"diagnosis_ip_no_ipv6_tip": "Tener IPv6 funcionando no es obligatorio para que su servidor funcione, pero es mejor para la salud del Internet en general. IPv6 debería ser configurado automáticamente por el sistema o su proveedor si está disponible. De otra manera, es posible que tenga que configurar varias cosas manualmente, tal y como se explica en esta documentación <a href='https://yunohost.org/#/ipv6'>https://yunohost.org/#/ipv6</a>. Si no puede habilitar IPv6 o si parece demasiado técnico, puede ignorar esta advertencia con toda seguridad.",
"diagnosis_display_tip": "Para ver los problemas encontrados, puede ir a la sección de diagnóstico del webadmin, o ejecutar 'yunohost diagnosis show --issues' en la línea de comandos.",
"diagnosis_package_installed_from_sury_details": "Algunos paquetes fueron accidentalmente instalados de un repositorio de terceros llamado Sury. El equipo Yunohost ha mejorado la estrategia para manejar estos pquetes, pero es posible que algunas instalaciones con aplicaciones de PHP7.3 en Stretch puedan tener algunas inconsistencias. Para solucionar esta situación, debería intentar ejecutar el siguiente comando: <cmd>{cmd_to_fix}</cmd>",
"diagnosis_package_installed_from_sury": "Algunos paquetes del sistema deberían ser devueltos a una versión anterior",
"certmanager_domain_not_diagnosed_yet": "Aún no hay resultado del diagnóstico para el dominio {domain}. Por favor ejecute el diagnóstico para las categorías 'Registros DNS' y 'Web' en la sección de diagnóstico para verificar si el dominio está listo para Let's Encrypt. (O si sabe lo que está haciendo, utilice '--no-checks' para deshabilitar esos chequeos.)",
"backup_archive_corrupted": "Parece que el archivo de respaldo '{archive}' está corrupto : {error}",
"backup_archive_cant_retrieve_info_json": "No se pudieron cargar informaciones para el archivo '{archive}'... El archivo info.json no se puede cargar (o no es un json válido).",
"ask_user_domain": "Dominio a usar para la dirección de correo del usuario y cuenta XMPP",
"app_packaging_format_not_supported": "Esta aplicación no se puede instalar porque su formato de empaque no está soportado por su versión de YunoHost. Considere actualizar su sistema.",
"app_manifest_install_ask_is_public": "¿Debería exponerse esta aplicación a visitantes anónimos?",
"app_manifest_install_ask_admin": "Elija un usuario administrativo para esta aplicación",
"app_manifest_install_ask_password": "Elija una contraseña de administración para esta aplicación",
"app_manifest_install_ask_path": "Seleccione el path donde esta aplicación debería ser instalada",
"app_manifest_install_ask_domain": "Seleccione el dominio donde esta app debería ser instalada",
"app_label_deprecated": "Este comando está depreciado! Favor usar el nuevo comando 'yunohost user permission update' para administrar la etiqueta de app.",
"app_argument_password_no_default": "Error al interpretar argumento de contraseña'{name}': El argumento de contraseña no puede tener un valor por defecto por razón de seguridad"
} }

View file

@ -60,12 +60,12 @@
"downloading": "Téléchargement en cours …", "downloading": "Téléchargement en cours …",
"dyndns_cron_installed": "La tâche cron pour le domaine DynDNS a été créée", "dyndns_cron_installed": "La tâche cron pour le domaine DynDNS a été créée",
"dyndns_cron_remove_failed": "Impossible de supprimer la tâche cron DynDNS parce que : {error}", "dyndns_cron_remove_failed": "Impossible de supprimer la tâche cron DynDNS parce que : {error}",
"dyndns_cron_removed": "La tâche cron pour le domaine DynDNS enlevée", "dyndns_cron_removed": "La tâche cron pour le domaine DynDNS a été enlevée",
"dyndns_ip_update_failed": "Impossible de mettre à jour ladresse IP sur le domaine DynDNS", "dyndns_ip_update_failed": "Impossible de mettre à jour ladresse IP sur le domaine DynDNS",
"dyndns_ip_updated": "Mise à jour de votre IP pour le domaine DynDNS", "dyndns_ip_updated": "Mise à jour de votre IP pour le domaine DynDNS",
"dyndns_key_generating": "Génération de la clé DNS..., cela peut prendre un certain temps.", "dyndns_key_generating": "Génération de la clé DNS..., cela peut prendre un certain temps.",
"dyndns_key_not_found": "Clé DNS introuvable pour le domaine", "dyndns_key_not_found": "Clé DNS introuvable pour le domaine",
"dyndns_no_domain_registered": "Aucun domaine enregistré avec DynDNS", "dyndns_no_domain_registered": "Aucun domaine n'a été enregistré avec DynDNS",
"dyndns_registered": "Domaine DynDNS enregistré", "dyndns_registered": "Domaine DynDNS enregistré",
"dyndns_registration_failed": "Impossible denregistrer le domaine DynDNS : {error:s}", "dyndns_registration_failed": "Impossible denregistrer le domaine DynDNS : {error:s}",
"dyndns_unavailable": "Le domaine {domain:s} est indisponible.", "dyndns_unavailable": "Le domaine {domain:s} est indisponible.",
@ -84,7 +84,7 @@
"installation_failed": "Quelque chose sest mal passé lors de linstallation", "installation_failed": "Quelque chose sest mal passé lors de linstallation",
"ip6tables_unavailable": "Vous ne pouvez pas jouer avec ip6tables ici. Vous êtes soit dans un conteneur, soit votre noyau ne le prend pas en charge", "ip6tables_unavailable": "Vous ne pouvez pas jouer avec ip6tables ici. Vous êtes soit dans un conteneur, soit votre noyau ne le prend pas en charge",
"iptables_unavailable": "Vous ne pouvez pas jouer avec iptables ici. Vous êtes soit dans un conteneur, soit votre noyau ne le prend pas en charge", "iptables_unavailable": "Vous ne pouvez pas jouer avec iptables ici. Vous êtes soit dans un conteneur, soit votre noyau ne le prend pas en charge",
"ldap_initialized": "Lannuaire LDAP initialisé", "ldap_initialized": "Lannuaire LDAP a été initialisé",
"mail_alias_remove_failed": "Impossible de supprimer lalias de courriel '{mail:s}'", "mail_alias_remove_failed": "Impossible de supprimer lalias de courriel '{mail:s}'",
"mail_domain_unknown": "Le domaine '{domain:s}' de cette adresse de courriel nest pas valide. Merci dutiliser un domaine administré par ce serveur.", "mail_domain_unknown": "Le domaine '{domain:s}' de cette adresse de courriel nest pas valide. Merci dutiliser un domaine administré par ce serveur.",
"mail_forward_remove_failed": "Impossible de supprimer le courriel de transfert '{mail:s}'", "mail_forward_remove_failed": "Impossible de supprimer le courriel de transfert '{mail:s}'",
@ -109,7 +109,7 @@
"restore_already_installed_app": "Une application est déjà installée avec lidentifiant '{app:s}'", "restore_already_installed_app": "Une application est déjà installée avec lidentifiant '{app:s}'",
"restore_app_failed": "Impossible de restaurer '{app:s}'", "restore_app_failed": "Impossible de restaurer '{app:s}'",
"restore_cleaning_failed": "Impossible de nettoyer le dossier temporaire de restauration", "restore_cleaning_failed": "Impossible de nettoyer le dossier temporaire de restauration",
"restore_complete": "Restauré", "restore_complete": "Restauration terminée",
"restore_confirm_yunohost_installed": "Voulez-vous vraiment restaurer un système déjà installé ? [{answers:s}]", "restore_confirm_yunohost_installed": "Voulez-vous vraiment restaurer un système déjà installé ? [{answers:s}]",
"restore_failed": "Impossible de restaurer le système", "restore_failed": "Impossible de restaurer le système",
"restore_hook_unavailable": "Le script de restauration '{part:s}' nest pas disponible sur votre système, et ne lest pas non plus dans larchive", "restore_hook_unavailable": "Le script de restauration '{part:s}' nest pas disponible sur votre système, et ne lest pas non plus dans larchive",
@ -129,11 +129,11 @@
"service_removed": "Le service « {service:s} » a été supprimé", "service_removed": "Le service « {service:s} » a été supprimé",
"service_start_failed": "Impossible de démarrer le service '{service:s}'\n\nJournaux historisés récents : {logs:s}", "service_start_failed": "Impossible de démarrer le service '{service:s}'\n\nJournaux historisés récents : {logs:s}",
"service_started": "Le service « {service:s} » a été démarré", "service_started": "Le service « {service:s} » a été démarré",
"service_stop_failed": "Impossible darrêter le service '{service:s}'\n\nJournaux historisés récents : {logs:s}", "service_stop_failed": "Impossible darrêter le service '{service:s}'\n\nJournaux récents de service : {logs:s}",
"service_stopped": "Le service « {service:s} » a été arrêté", "service_stopped": "Le service « {service:s} » a été arrêté",
"service_unknown": "Le service '{service:s}' est inconnu", "service_unknown": "Le service '{service:s}' est inconnu",
"ssowat_conf_generated": "La configuration de SSOwat générée", "ssowat_conf_generated": "La configuration de SSOwat a été regénérée",
"ssowat_conf_updated": "La configuration de SSOwat mise à jour", "ssowat_conf_updated": "La configuration de SSOwat a été mise à jour",
"system_upgraded": "Système mis à jour", "system_upgraded": "Système mis à jour",
"system_username_exists": "Ce nom dutilisateur existe déjà dans les utilisateurs système", "system_username_exists": "Ce nom dutilisateur existe déjà dans les utilisateurs système",
"unbackup_app": "'{app:s}' ne sera pas sauvegardée", "unbackup_app": "'{app:s}' ne sera pas sauvegardée",
@ -147,9 +147,9 @@
"upnp_disabled": "UPnP désactivé", "upnp_disabled": "UPnP désactivé",
"upnp_enabled": "UPnP activé", "upnp_enabled": "UPnP activé",
"upnp_port_open_failed": "Impossible douvrir les ports UPnP", "upnp_port_open_failed": "Impossible douvrir les ports UPnP",
"user_created": "Lutilisateur créé", "user_created": "Lutilisateur a été créé",
"user_creation_failed": "Impossible de créer lutilisateur {user} : {error}", "user_creation_failed": "Impossible de créer lutilisateur {user} : {error}",
"user_deleted": "Lutilisateur supprimé", "user_deleted": "Lutilisateur a été supprimé",
"user_deletion_failed": "Impossible de supprimer lutilisateur {user} : {error}", "user_deletion_failed": "Impossible de supprimer lutilisateur {user} : {error}",
"user_home_creation_failed": "Impossible de créer le dossier personnel de lutilisateur", "user_home_creation_failed": "Impossible de créer le dossier personnel de lutilisateur",
"user_unknown": "Lutilisateur {user:s} est inconnu", "user_unknown": "Lutilisateur {user:s} est inconnu",
@ -252,35 +252,12 @@
"app_upgrade_some_app_failed": "Certaines applications nont pas été mises à jour", "app_upgrade_some_app_failed": "Certaines applications nont pas été mises à jour",
"dyndns_could_not_check_provide": "Impossible de vérifier si {provider:s} peut fournir {domain:s}.", "dyndns_could_not_check_provide": "Impossible de vérifier si {provider:s} peut fournir {domain:s}.",
"dyndns_domain_not_provided": "Le fournisseur DynDNS {provider:s} ne peut pas fournir le domaine {domain:s}.", "dyndns_domain_not_provided": "Le fournisseur DynDNS {provider:s} ne peut pas fournir le domaine {domain:s}.",
"app_make_default_location_already_used": "Impossible de configurer lapplication '{app}' par défaut pour le domaine '{domain}' car il est déjà utilisé par lapplication '{other_app}'", "app_make_default_location_already_used": "Impossible de configurer lapplication '{app}' par défaut pour le domaine '{domain}' car il est déjà utilisé par l'application '{other_app}'",
"app_upgrade_app_name": "Mise à jour de {app}...", "app_upgrade_app_name": "Mise à jour de {app}...",
"backup_output_symlink_dir_broken": "Votre répertoire darchivage '{path:s}' est un lien symbolique brisé. Peut-être avez-vous oublié de re/monter ou de brancher le support de stockage sur lequel il pointe.", "backup_output_symlink_dir_broken": "Votre répertoire darchivage '{path:s}' est un lien symbolique brisé. Peut-être avez-vous oublié de re/monter ou de brancher le support de stockage sur lequel il pointe.",
"migrate_tsig_end": "La migration à HMAC-SHA-512 est terminée",
"migrate_tsig_failed": "La migration du domaine DynDNS {domain} à HMAC-SHA-512 a échoué. Annulation des modifications. Erreur : {error_code} - {error}",
"migrate_tsig_start": "Lalgorithme de génération des clefs nest pas suffisamment sécurisé pour la signature TSIG du domaine '{domain}', lancement de la migration vers HMAC-SHA-512 qui est plus sécurisé",
"migrate_tsig_wait": "Attendre trois minutes pour que le serveur DynDNS prenne en compte la nouvelle clef …",
"migrate_tsig_wait_2": "2 minutes …",
"migrate_tsig_wait_3": "1 minute …",
"migrate_tsig_wait_4": "30 secondes …",
"migrate_tsig_not_needed": "Il ne semble pas que vous utilisez un domaine DynDNS, donc aucune migration nest nécessaire.",
"migration_description_0001_change_cert_group_to_sslcert": "Changement des permissions de groupe des certificats de « metronome » à « ssl-cert »",
"migration_description_0002_migrate_to_tsig_sha256": "Amélioration de la sécurité de DynDNS TSIG en utilisant SHA512 au lieu de MD5",
"migration_description_0003_migrate_to_stretch": "Mise à niveau du système vers Debian Stretch et YunoHost 3.0",
"migration_0003_start": "Démarrage de la migration vers Stretch. Les journaux seront disponibles dans {logfile}.",
"migration_0003_patching_sources_list": "Modification du fichier sources.lists …",
"migration_0003_main_upgrade": "Démarrage de la mise à niveau principale …",
"migration_0003_fail2ban_upgrade": "Démarrage de la mise à niveau de Fail2Ban …",
"migration_0003_restoring_origin_nginx_conf": "Votre fichier /etc/nginx/nginx.conf a été modifié d'une manière ou dune autre. La migration va dabord le réinitialiser à son état d'origine… Le fichier précédent sera disponible en tant que {backup_dest}.",
"migration_0003_yunohost_upgrade": "Démarrage de la mise à niveau du package YunoHost… La migration se terminera, mais la mise à niveau réelle aura lieu immédiatement après. Une fois l'opération terminée, vous devrez peut-être vous reconnecter à la page webadmin.",
"migration_0003_not_jessie": "La distribution Debian actuelle nest pas Jessie !",
"migration_0003_system_not_fully_up_to_date": "Votre système nest pas complètement à jour. Veuillez mener une mise à jour classique avant de lancer la migration à Stretch.",
"migration_0003_still_on_jessie_after_main_upgrade": "Quelque chose sest mal passé pendant la mise à niveau principale : le système est toujours sur Debian Jessie !? Pour investiguer sur le problème, veuillez regarder les journaux {log}:s …",
"migration_0003_general_warning": "Veuillez noter que cette migration est une opération délicate. Si léquipe YunoHost a fait de son mieux pour la relire et la tester, la migration pourrait tout de même casser des parties de votre système ou de vos applications.\n\nEn conséquence, nous vous recommandons :\n - de lancer une sauvegarde de vos données ou applications critiques. Plus dinformations sur https://yunohost.org/backup ;\n - dêtre patient après avoir lancé la migration : selon votre connexion internet et matériel, cela pourrait prendre jusquà quelques heures pour que tout soit à niveau.\n\nEn outre, le port SMTP utilisé par les clients de messagerie externes comme (Thunderbird ou K9-Mail) a été changé de 465 (SSL/TLS) à 587 (STARTTLS). Lancien port 465 sera automatiquement fermé et le nouveau port 587 sera ouvert dans le pare-feu. Vous et vos utilisateurs *devront* adapter la configuration de vos clients de messagerie en conséquence.",
"migration_0003_problematic_apps_warning": "Veuillez noter que les applications installées potentiellement problématiques suivantes ont été détectées. Il semble que celles-ci nont pas été installées à partir dun catalogue dapplications, ou ne sont pas marquées comme \"fonctionnelle\". Par conséquent, il ne peut pas être garanti quils fonctionneront toujours après la mise à niveau : {problematic_apps}",
"migration_0003_modified_files": "Veuillez noter que les fichiers suivants ont été détectés comme modifiés manuellement et pourraient être écrasés à la fin de la mise à niveau : {manually_modified_files}",
"migrations_list_conflict_pending_done": "Vous ne pouvez pas utiliser --previous et --done simultanément.", "migrations_list_conflict_pending_done": "Vous ne pouvez pas utiliser --previous et --done simultanément.",
"migrations_to_be_ran_manually": "La migration {id} doit être lancée manuellement. Veuillez aller dans Outils > Migrations dans linterface admin, ou lancer `yunohost tools migrations migrate`.", "migrations_to_be_ran_manually": "La migration {id} doit être lancée manuellement. Veuillez aller dans Outils > Migrations dans linterface admin, ou lancer `yunohost tools migrations migrate`.",
"migrations_need_to_accept_disclaimer": "Pour lancer la migration {id}, vous devez accepter cette clause de non-responsabilité :\n---\n{disclaimer}\n---\nSi vous acceptez de lancer la migration, veuillez relancer la commande avec loption --accept-disclaimer.", "migrations_need_to_accept_disclaimer": "Pour lancer la migration {id}, vous devez accepter cet avertissement :\n---\n{disclaimer}\n---\nSi vous acceptez de lancer la migration, veuillez relancer la commande avec loption --accept-disclaimer.",
"service_description_avahi-daemon": "Vous permet datteindre votre serveur en utilisant « yunohost.local » sur votre réseau local", "service_description_avahi-daemon": "Vous permet datteindre votre serveur en utilisant « yunohost.local » sur votre réseau local",
"service_description_dnsmasq": "Gère la résolution des noms de domaine (DNS)", "service_description_dnsmasq": "Gère la résolution des noms de domaine (DNS)",
"service_description_dovecot": "Permet aux clients de messagerie daccéder/récupérer les courriels (via IMAP et POP3)", "service_description_dovecot": "Permet aux clients de messagerie daccéder/récupérer les courriels (via IMAP et POP3)",
@ -340,8 +317,8 @@
"migration_0005_not_enough_space": "Laissez suffisamment despace disponible dans {path} pour exécuter la migration.", "migration_0005_not_enough_space": "Laissez suffisamment despace disponible dans {path} pour exécuter la migration.",
"service_description_php7.0-fpm": "Exécute des applications écrites en PHP avec NGINX", "service_description_php7.0-fpm": "Exécute des applications écrites en PHP avec NGINX",
"users_available": "Liste des utilisateurs disponibles :", "users_available": "Liste des utilisateurs disponibles :",
"good_practices_about_admin_password": "Vous êtes maintenant 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 de passe) et / ou d'utiliser une variation de caractères (majuscule, minuscule, chiffres et caractères spéciaux).", "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 de passe) et / ou d'utiliser une variation de caractères (majuscule, minuscule, chiffres et caractères spéciaux).",
"good_practices_about_user_password": "Vous êtes maintenant 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 variation de caractères (majuscule, minuscule, 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 variation de caractères (majuscule, minuscule, chiffres et caractères spéciaux).",
"migration_description_0006_sync_admin_and_root_passwords": "Synchroniser les mots de passe admin et root", "migration_description_0006_sync_admin_and_root_passwords": "Synchroniser les mots de passe admin et root",
"migration_0006_disclaimer": "YunoHost sattend maintenant à ce que les mots de passe administrateur et racine soient synchronisés. Cette migration remplace votre mot de passe root par le mot de passe administrateur.", "migration_0006_disclaimer": "YunoHost sattend maintenant à ce que les mots de passe administrateur et racine soient synchronisés. Cette migration remplace votre mot de passe root par le mot de passe administrateur.",
"password_listed": "Ce mot de passe fait partie des mots de passe les plus utilisés au monde. Veuillez choisir quelque chose de plus unique.", "password_listed": "Ce mot de passe fait partie des mots de passe les plus utilisés au monde. Veuillez choisir quelque chose de plus unique.",
@ -419,13 +396,13 @@
"service_regen_conf_is_deprecated": "'yunohost service regen-conf' est obsolète ! Veuillez plutôt utiliser 'yunohost tools regen-conf' à la place.", "service_regen_conf_is_deprecated": "'yunohost service regen-conf' est obsolète ! Veuillez plutôt utiliser 'yunohost tools regen-conf' à la place.",
"tools_upgrade_at_least_one": "Veuillez spécifier '--apps' ou '--system'", "tools_upgrade_at_least_one": "Veuillez spécifier '--apps' ou '--system'",
"tools_upgrade_cant_both": "Impossible de mettre à niveau le système et les applications en même temps", "tools_upgrade_cant_both": "Impossible de mettre à niveau le système et les applications en même temps",
"tools_upgrade_cant_hold_critical_packages": "Impossibilité de maintenir les paquets critiques…", "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": "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_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": "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", "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)", "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 de conserver les paquets critiques…", "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 à l'administrateur Web. Le journal de mise à niveau sera disponible dans Outils → Journal (dans le webadmin) ou en utilisant la « liste des journaux yunohost » (à partir de la ligne de commande).", "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 à l'administrateur Web. Le journal de mise à niveau sera disponible dans Outils → Journal (dans le webadmin) ou en utilisant la « liste des journaux yunohost » (à 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_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}", "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}",
@ -442,7 +419,7 @@
"mailbox_disabled": "La boîte aux lettres est désactivée pour lutilisateur {user:s}", "mailbox_disabled": "La boîte aux lettres est désactivée pour lutilisateur {user:s}",
"app_action_broke_system": "Cette action semble avoir cassé des services importants : {services}", "app_action_broke_system": "Cette action semble avoir cassé des services importants : {services}",
"apps_already_up_to_date": "Toutes les applications sont déjà à jour", "apps_already_up_to_date": "Toutes les applications sont déjà à jour",
"migration_0011_create_group": "Création dun groupe pour chaque utilisateur…", "migration_0011_create_group": "Création d'un groupe pour chaque utilisateur…",
"migration_0011_done": "Migration terminée. Vous êtes maintenant en mesure de gérer des groupes dutilisateurs.", "migration_0011_done": "Migration terminée. Vous êtes maintenant en mesure de gérer des groupes dutilisateurs.",
"migrations_must_provide_explicit_targets": "Vous devez fournir des cibles explicites lorsque vous utilisez '--skip' ou '--force-rerun'", "migrations_must_provide_explicit_targets": "Vous devez fournir des cibles explicites lorsque vous utilisez '--skip' ou '--force-rerun'",
"migrations_no_such_migration": "Il ny a pas de migration appelée '{id}'", "migrations_no_such_migration": "Il ny a pas de migration appelée '{id}'",
@ -456,10 +433,10 @@
"migration_0011_rollback_success": "Système restauré.", "migration_0011_rollback_success": "Système restauré.",
"migration_0011_update_LDAP_database": "Mise à jour de la base de données LDAP...", "migration_0011_update_LDAP_database": "Mise à jour de la base de données LDAP...",
"migration_0011_backup_before_migration": "Création dune sauvegarde des paramètres de la base de données LDAP et des applications avant la migration.", "migration_0011_backup_before_migration": "Création dune sauvegarde des paramètres de la base de données LDAP et des applications avant la migration.",
"permission_not_found": "Autorisation '{permission:s}' introuvable", "permission_not_found": "Permission '{permission:s}' introuvable",
"permission_update_failed": "Impossible de mettre à jour lautorisation '{permission}' : {error}", "permission_update_failed": "Impossible de mettre à jour la permission '{permission}' : {error}",
"permission_updated": "Permission '{permission:s}' mise à jour", "permission_updated": "Permission '{permission:s}' mise à jour",
"permission_update_nothing_to_do": "Aucune autorisation pour mettre à jour", "permission_update_nothing_to_do": "Aucune permission à mettre à jour",
"dyndns_provider_unreachable": "Impossible datteindre le fournisseur DynDNS {provider} : votre YunoHost nest pas correctement connecté à Internet ou le serveur Dynette est en panne.", "dyndns_provider_unreachable": "Impossible datteindre le fournisseur DynDNS {provider} : votre YunoHost nest pas correctement connecté à Internet ou le serveur Dynette est en panne.",
"migration_0011_update_LDAP_schema": "Mise à jour du schéma LDAP...", "migration_0011_update_LDAP_schema": "Mise à jour du schéma LDAP...",
"migrations_already_ran": "Ces migrations sont déjà effectuées : {ids}", "migrations_already_ran": "Ces migrations sont déjà effectuées : {ids}",
@ -482,7 +459,7 @@
"group_user_not_in_group": "Lutilisateur {user} nest pas dans le groupe {group}", "group_user_not_in_group": "Lutilisateur {user} nest pas dans le groupe {group}",
"log_permission_create": "Créer permission '{}'", "log_permission_create": "Créer permission '{}'",
"log_permission_delete": "Supprimer permission '{}'", "log_permission_delete": "Supprimer permission '{}'",
"log_user_group_create": "Créer '{}' groupe", "log_user_group_create": "Créer le groupe '{}'",
"log_user_permission_update": "Mise à jour des accès pour la permission '{}'", "log_user_permission_update": "Mise à jour des accès pour la permission '{}'",
"log_user_permission_reset": "Réinitialiser la permission '{}'", "log_user_permission_reset": "Réinitialiser la permission '{}'",
"migration_0011_failed_to_remove_stale_object": "Impossible de supprimer un objet périmé {dn} : {error}", "migration_0011_failed_to_remove_stale_object": "Impossible de supprimer un objet périmé {dn} : {error}",
@ -672,8 +649,8 @@
"global_settings_setting_backup_compress_tar_archives": "Compresser les archives (.tar.gz) au lieu des archives non-compressées lors de la création des backups. N.B. : activer cette option permet d'obtenir des sauvegardes plus légères, mais leur création sera significativement plus longue et plus gourmande en CPU.", "global_settings_setting_backup_compress_tar_archives": "Compresser les archives (.tar.gz) au lieu des archives non-compressées lors de la création des backups. N.B. : activer cette option permet d'obtenir des sauvegardes plus légères, mais leur création sera significativement plus longue et plus gourmande en CPU.",
"migration_description_0018_xtable_to_nftable": "Migrer les anciennes règles de trafic réseau vers le nouveau système basé sur nftables", "migration_description_0018_xtable_to_nftable": "Migrer les anciennes règles de trafic réseau vers le nouveau système basé sur nftables",
"service_description_php7.3-fpm": "Exécute les applications écrites en PHP avec NGINX", "service_description_php7.3-fpm": "Exécute les applications écrites en PHP avec NGINX",
"migration_0018_failed_to_reset_legacy_rules": "La réinitialisation des règles iptable legacy a échoué :", "migration_0018_failed_to_reset_legacy_rules": "La réinitialisation des règles iptable par défaut a échoué : {error}",
"migration_0018_failed_to_migrate_iptables_rules": "Échec de la migration des anciennes règles iptables vers nftables : {error}", "migration_0018_failed_to_migrate_iptables_rules": "La migration des règles iptables héritées vers nftables a échoué: {error}",
"migration_0017_not_enough_space": "Laissez suffisamment d'espace disponible dans {path} avant de lancer la migration.", "migration_0017_not_enough_space": "Laissez suffisamment d'espace disponible dans {path} avant de lancer la migration.",
"migration_0017_postgresql_11_not_installed": "PostgreSQL 9.6 est installé mais pas posgreSQL 11 ? Il s'est sans doute passé quelque chose d'étrange sur votre système :(...", "migration_0017_postgresql_11_not_installed": "PostgreSQL 9.6 est installé mais pas posgreSQL 11 ? Il s'est sans doute passé quelque chose d'étrange sur votre système :(...",
"migration_0017_postgresql_96_not_installed": "PostgreSQL n'a pas été installé sur votre système. Aucune opération à effectuer.", "migration_0017_postgresql_96_not_installed": "PostgreSQL n'a pas été installé sur votre système. Aucune opération à effectuer.",
@ -692,6 +669,26 @@
"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> {cmd_to_fix} </cmd>", "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> {cmd_to_fix} </cmd>",
"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é", "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": "Il doit s'agir d'une adresse électronique valide, le symbole '+' étant accepté (par exemples : johndoe@exemple.com ou bien johndoe+yunohost@exemple.com)", "pattern_email_forward": "Il doit s'agir d'une adresse électronique valide, le symbole '+' étant accepté (par exemples : johndoe@exemple.com ou bien johndoe+yunohost@exemple.com)",
"global_settings_setting_smtp_relay_password": "Mot de passe SMTP du serveur de courrier électronique", "global_settings_setting_smtp_relay_password": "Mot de passe du relais de l'hôte SMTP",
"diagnosis_package_installed_from_sury": "Certains paquets du système devraient être rétrograder vers une version moins récente" "diagnosis_package_installed_from_sury": "Des paquets du système devraient être rétrogradé de version",
"additional_urls_already_added": "URL supplémentaire '{url:s}' déjà ajoutée pour la permission '{permission:s}'",
"unknown_main_domain_path": "Domaine ou chemin inconnu pour '{app}'. Vous devez spécifier un domaine et un chemin pour pouvoir spécifier une URL pour l'autorisation.",
"show_tile_cant_be_enabled_for_regex": "Vous ne pouvez pas activer 'show_tile' pour le moment, car l'URL de l'autorisation '{permission}' est une expression régulière",
"show_tile_cant_be_enabled_for_url_not_defined": "Vous ne pouvez pas activer 'show_tile' pour le moment, car vous devez d'abord définir une URL pour l'autorisation '{permission}'",
"regex_with_only_domain": "Vous ne pouvez pas utiliser une expression régulière pour le domaine, uniquement pour le chemin",
"regex_incompatible_with_tile": "/!\\ Packagers ! La permission '{permission}' a 'show_tile' définie sur 'true' et vous ne pouvez donc pas définir une URL regex comme URL principale",
"permission_protected": "L'autorisation {permission} est protégée. Vous ne pouvez pas ajouter ou supprimer le groupe visiteurs à/de cette autorisation.",
"migration_0019_slapd_config_will_be_overwritten": "Il semble que vous ayez modifié manuellement la configuration de slapd. Pour cette migration critique, YunoHost doit forcer la mise à jour de la configuration slapd. Les fichiers originaux seront sauvegardés dans {conf_backup_folder}.",
"migration_0019_migration_failed_trying_to_rollback": "Impossible de migrer... tentative de restauration du système.",
"migration_0019_can_not_backup_before_migration": "La sauvegarde du système n'a pas pu être effectuée avant l'échec de la migration. Erreur : {error:s}",
"migration_0019_backup_before_migration": "Création d'une sauvegarde de la base de données LDAP et des paramètres des applications avant la migration.",
"migration_0019_add_new_attributes_in_ldap": "Ajouter de nouveaux attributs pour les autorisations dans la base de données LDAP",
"migrating_legacy_permission_settings": "Migration des anciens paramètres d'autorisation...",
"invalid_regex": "Regex non valide : '{regex:s}'",
"domain_name_unknown": "Domaine '{domain}' inconnu",
"app_label_deprecated": "Cette commande est obsolète ! Veuillez utiliser la nouvelle commande 'yunohost user permission update' pour gérer l'étiquette de l'application.",
"additional_urls_already_removed": "URL supplémentaire '{url:s}' déjà supprimée pour la permission '{permission:s}'",
"migration_0019_rollback_success": "Retour à l'état antérieur du système.",
"invalid_number": "Doit être un nombre",
"migration_description_0019_extend_permissions_features": "Étendre et retravailler le système de gestion des permissions applicatives"
} }

View file

@ -9,22 +9,22 @@
"backup_created": "Backup completo", "backup_created": "Backup completo",
"backup_invalid_archive": "Archivio di backup non valido", "backup_invalid_archive": "Archivio di backup non valido",
"backup_output_directory_not_empty": "Dovresti scegliere una cartella di output vuota", "backup_output_directory_not_empty": "Dovresti scegliere una cartella di output vuota",
"domain_created": "Il dominio è stato creato", "domain_created": "Dominio creato",
"domain_exists": "Il dominio è già esistente", "domain_exists": "Il dominio esiste già",
"ldap_initialized": "LDAP è stato inizializzato", "ldap_initialized": "LDAP inizializzato",
"pattern_email": "L'indirizzo email deve essere valido (es. someone@domain.org)", "pattern_email": "L'indirizzo email deve essere valido, senza simboli '+' (es. tizio@dominio.com)",
"pattern_mailbox_quota": "La dimensione deve avere un suffisso b/k/M/G/T o 0 per disattivare la quota", "pattern_mailbox_quota": "La dimensione deve avere un suffisso b/k/M/G/T o 0 per disattivare la quota",
"port_already_opened": "La porta {port:d} è già aperta per {ip_version:s} connessioni", "port_already_opened": "La porta {port:d} è già aperta per {ip_version:s} connessioni",
"service_add_failed": "Impossibile aggiungere il servizio '{service:s}'", "service_add_failed": "Impossibile aggiungere il servizio '{service:s}'",
"service_cmd_exec_failed": "Impossibile eseguire il comando '{command:s}'", "service_cmd_exec_failed": "Impossibile eseguire il comando '{command:s}'",
"service_disabled": "Il servizio '{service:s}' è stato disattivato", "service_disabled": "Il servizio '{service:s}' non partirà più al boot di sistema.",
"service_remove_failed": "Impossibile rimuovere il servizio '{service:s}'", "service_remove_failed": "Impossibile rimuovere il servizio '{service:s}'",
"service_removed": "Il servizio '{service:s}' è stato rimosso", "service_removed": "Servizio '{service:s}' rimosso",
"service_stop_failed": "Impossibile fermare il servizio '{service:s}'\n\nRegistri di servizio recenti:{logs:s}", "service_stop_failed": "Impossibile fermare il servizio '{service:s}'\n\nRegistri di servizio recenti:{logs:s}",
"system_username_exists": "il nome utente esiste già negli utenti del sistema", "system_username_exists": "Il nome utente esiste già negli utenti del sistema",
"unrestore_app": "L'applicazione '{app:s}' non verrà ripristinata", "unrestore_app": "{app:s} non verrà ripristinata",
"upgrading_packages": "Aggiornamento dei pacchetti", "upgrading_packages": "Aggiornamento dei pacchetti...",
"user_deleted": "L'utente è stato cancellato", "user_deleted": "Utente cancellato",
"admin_password": "Password dell'amministrazione", "admin_password": "Password dell'amministrazione",
"admin_password_change_failed": "Impossibile cambiare la password", "admin_password_change_failed": "Impossibile cambiare la password",
"admin_password_changed": "La password d'amministrazione è stata cambiata", "admin_password_changed": "La password d'amministrazione è stata cambiata",
@ -63,54 +63,54 @@
"backup_output_directory_required": "Devi fornire una directory di output per il backup", "backup_output_directory_required": "Devi fornire una directory di output per il backup",
"backup_running_hooks": "Esecuzione degli hook di backup…", "backup_running_hooks": "Esecuzione degli hook di backup…",
"custom_app_url_required": "Devi fornire un URL per essere in grado di aggiornare l'applicazione personalizzata {app:s}", "custom_app_url_required": "Devi fornire un URL per essere in grado di aggiornare l'applicazione personalizzata {app:s}",
"domain_creation_failed": "Impossibile creare un dominio", "domain_creation_failed": "Impossibile creare il dominio {domain}: {error}",
"domain_deleted": "Il dominio è stato cancellato", "domain_deleted": "Dominio cancellato",
"domain_deletion_failed": "Impossibile cancellare il dominio", "domain_deletion_failed": "Impossibile cancellare il dominio {domain}: {error}",
"domain_dyndns_already_subscribed": "Hai già sottoscritto un dominio DynDNS", "domain_dyndns_already_subscribed": "Hai già sottoscritto un dominio DynDNS",
"domain_dyndns_root_unknown": "Dominio radice DynDNS sconosciuto", "domain_dyndns_root_unknown": "Dominio radice DynDNS sconosciuto",
"domain_hostname_failed": "La definizione del nuovo hostname è fallita", "domain_hostname_failed": "Impossibile impostare il nuovo hostname. Potrebbe causare problemi in futuro (o anche no).",
"domain_uninstall_app_first": "Una o più applicazioni sono installate su questo dominio. Disinstalla loro prima di procedere alla cancellazione di un dominio", "domain_uninstall_app_first": "Queste applicazioni sono già installate su questo dominio: {apps}. Disinstallale prima di procedere alla cancellazione di un dominio",
"domain_unknown": "Dominio sconosciuto", "domain_unknown": "Dominio sconosciuto",
"done": "Terminato", "done": "Terminato",
"domains_available": "Domini disponibili:", "domains_available": "Domini disponibili:",
"downloading": "Scaricamento…", "downloading": "Scaricamento…",
"dyndns_cron_installed": "Il cronjob DynDNS è stato installato", "dyndns_cron_installed": "Cronjob DynDNS creato",
"dyndns_cron_remove_failed": "Impossibile rimuovere il cronjob DynDNS", "dyndns_cron_remove_failed": "Impossibile rimuovere il cronjob DynDNS perchè: {error}",
"dyndns_cron_removed": "Il cronjob DynDNS è stato rimosso", "dyndns_cron_removed": "Cronjob DynDNS rimosso",
"dyndns_ip_update_failed": "Impossibile aggiornare l'indirizzo IP in DynDNS", "dyndns_ip_update_failed": "Impossibile aggiornare l'indirizzo IP in DynDNS",
"dyndns_ip_updated": "Il tuo indirizzo IP è stato aggiornato in DynDNS", "dyndns_ip_updated": "Il tuo indirizzo IP è stato aggiornato su DynDNS",
"dyndns_key_generating": "Si sta generando la chiave DNS, potrebbe richiedere del tempo…", "dyndns_key_generating": "Generando la chiave DNS... Potrebbe richiedere del tempo.",
"dyndns_key_not_found": "La chiave DNS non è stata trovata per il dominio", "dyndns_key_not_found": "La chiave DNS non è stata trovata per il dominio",
"dyndns_no_domain_registered": "Nessuno dominio è stato registrato con DynDNS", "dyndns_no_domain_registered": "Nessuno dominio registrato con DynDNS",
"dyndns_registered": "Il dominio DynDNS è stato registrato", "dyndns_registered": "Dominio DynDNS registrato",
"dyndns_registration_failed": "Non è possibile registrare il dominio DynDNS: {error:s}", "dyndns_registration_failed": "Non è possibile registrare il dominio DynDNS: {error:s}",
"dyndns_unavailable": "Dominio {domain:s} non disponibile.", "dyndns_unavailable": "Il dominio {domain:s} non disponibile.",
"executing_command": "Esecuzione del comando '{command:s}'…", "executing_command": "Esecuzione del comando '{command:s}'…",
"executing_script": "Esecuzione dello script '{script:s}'…", "executing_script": "Esecuzione dello script '{script:s}'…",
"extracting": "Estrazione", "extracting": "Estrazione...",
"field_invalid": "Campo '{:s}' non valido", "field_invalid": "Campo '{:s}' non valido",
"firewall_reload_failed": "Impossibile ricaricare il firewall", "firewall_reload_failed": "Impossibile ricaricare il firewall",
"firewall_reloaded": "Il firewall è stato ricaricato", "firewall_reloaded": "Firewall ricaricato",
"firewall_rules_cmd_failed": "Alcune regole del firewall sono fallite. Per ulteriori informazioni, vedi il registro.", "firewall_rules_cmd_failed": "Alcune regole del firewall sono fallite. Per ulteriori informazioni, vedi il registro.",
"hook_exec_failed": "L'esecuzione dello script è fallita: {path:s}", "hook_exec_failed": "Impossibile eseguire lo script: {path:s}",
"hook_exec_not_terminated": "L'esecuzione dello script non è stata terminata: {path:s}", "hook_exec_not_terminated": "Los script non è stato eseguito correttamente: {path:s}",
"hook_name_unknown": "Nome di hook '{name:s}' sconosciuto", "hook_name_unknown": "Nome di hook '{name:s}' sconosciuto",
"installation_complete": "Installazione completata", "installation_complete": "Installazione completata",
"installation_failed": "Installazione fallita", "installation_failed": "Qualcosa è andato storto durante l'installazione",
"ip6tables_unavailable": "Non puoi giocare con ip6tables qui. O sei in un container o il tuo kernel non lo supporta", "ip6tables_unavailable": "Non puoi giocare con ip6tables qui. O sei in un container o il tuo kernel non lo supporta",
"iptables_unavailable": "Non puoi giocare con iptables qui. O sei in un container o il tuo kernel non lo supporta", "iptables_unavailable": "Non puoi giocare con iptables qui. O sei in un container o il tuo kernel non lo supporta",
"ldap_init_failed_to_create_admin": "L'inizializzazione LDAP non è riuscita a creare un utente admin", "ldap_init_failed_to_create_admin": "L'inizializzazione LDAP non è riuscita a creare un utente admin",
"mail_alias_remove_failed": "Impossibile rimuovere l'alias mail '{mail:s}'", "mail_alias_remove_failed": "Impossibile rimuovere l'alias mail '{mail:s}'",
"mail_domain_unknown": "Dominio d'indirizzo mail '{domain:s}' sconosciuto", "mail_domain_unknown": "Indirizzo mail non valido per il dominio '{domain:s}'. Usa un dominio gestito da questo server.",
"mail_forward_remove_failed": "Impossibile rimuovere la mail inoltrata '{mail:s}'", "mail_forward_remove_failed": "Impossibile rimuovere la mail inoltrata '{mail:s}'",
"mailbox_used_space_dovecot_down": "Il servizio di posta elettronica Dovecot deve essere attivato se vuoi riportare lo spazio usato dalla posta elettronica", "mailbox_used_space_dovecot_down": "La casella di posta elettronica Dovecot deve essere attivato se vuoi recuperare lo spazio usato dalla posta elettronica",
"main_domain_change_failed": "Impossibile cambiare il dominio principale", "main_domain_change_failed": "Impossibile cambiare il dominio principale",
"main_domain_changed": "Il dominio principale è stato cambiato", "main_domain_changed": "Il dominio principale è stato cambiato",
"no_internet_connection": "Il server non è collegato a Internet", "no_internet_connection": "Il server non è collegato a Internet",
"not_enough_disk_space": "Non c'è abbastanza spazio libero in '{path:s}'", "not_enough_disk_space": "Non c'è abbastanza spazio libero in '{path:s}'",
"package_unknown": "Pacchetto '{pkgname}' sconosciuto", "package_unknown": "Pacchetto '{pkgname}' sconosciuto",
"packages_upgrade_failed": "Impossibile aggiornare tutti i pacchetti", "packages_upgrade_failed": "Impossibile aggiornare tutti i pacchetti",
"pattern_backup_archive_name": "Deve essere un nome di file valido con caratteri alfanumerici e -_. soli", "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_domain": "Deve essere un nome di dominio valido (es. il-mio-dominio.org)",
"pattern_firstname": "Deve essere un nome valido", "pattern_firstname": "Deve essere un nome valido",
"pattern_lastname": "Deve essere un cognome valido", "pattern_lastname": "Deve essere un cognome valido",
@ -119,50 +119,50 @@
"pattern_positive_number": "Deve essere un numero positivo", "pattern_positive_number": "Deve essere un numero positivo",
"pattern_username": "Caratteri minuscoli alfanumerici o trattini bassi soli", "pattern_username": "Caratteri minuscoli alfanumerici o trattini bassi soli",
"port_already_closed": "La porta {port:d} è già chiusa per le connessioni {ip_version:s}", "port_already_closed": "La porta {port:d} è già chiusa per le connessioni {ip_version:s}",
"restore_already_installed_app": "Un'applicazione è già installata con l'identificativo '{app:s}'", "restore_already_installed_app": "Un'applicazione con l'ID '{app:s}' è già installata",
"restore_app_failed": "Impossibile ripristinare l'applicazione '{app:s}'", "restore_app_failed": "Impossibile ripristinare l'applicazione '{app:s}'",
"restore_cleaning_failed": "Impossibile pulire la directory temporanea di ripristino", "restore_cleaning_failed": "Impossibile pulire la directory temporanea di ripristino",
"restore_complete": "Ripristino completo", "restore_complete": "Ripristino completo",
"restore_confirm_yunohost_installed": "Sei sicuro di volere ripristinare un sistema già installato? {answers:s}", "restore_confirm_yunohost_installed": "Sei sicuro di volere ripristinare un sistema già installato? {answers:s}",
"restore_failed": "Impossibile ripristinare il sistema", "restore_failed": "Impossibile ripristinare il sistema",
"user_update_failed": "Impossibile aggiornare l'utente", "user_update_failed": "Impossibile aggiornare l'utente {user}: {error}",
"restore_hook_unavailable": "Lo script di ripristino per '{part:s}' non è disponibile per il tuo sistema e non è nemmeno nell'archivio", "restore_hook_unavailable": "Lo script di ripristino per '{part:s}' non è disponibile per il tuo sistema e non è nemmeno nell'archivio",
"restore_nothings_done": "Non è stato ripristinato nulla", "restore_nothings_done": "Nulla è stato ripristinato",
"restore_running_app_script": "Esecuzione dello script di ripristino dell'applicazione '{app:s}'…", "restore_running_app_script": "Ripristino dell'app '{app:s}'…",
"restore_running_hooks": "Esecuzione degli hook di ripristino…", "restore_running_hooks": "Esecuzione degli hook di ripristino…",
"service_added": "Il servizio '{service:s}' è stato aggiunto", "service_added": "Il servizio '{service:s}' è stato aggiunto",
"service_already_started": "Il servizio '{service:s}' è già stato avviato", "service_already_started": "Il servizio '{service:s}' è già avviato",
"service_already_stopped": "Il servizio '{service:s}' è già stato fermato", "service_already_stopped": "Il servizio '{service:s}' è già stato fermato",
"service_disable_failed": "Impossibile disabilitare il servizio '{service:s}'\n\nRegistri di servizio recenti:{logs:s}", "service_disable_failed": "Impossibile disabilitare l'avvio al boot del servizio '{service:s}'\n\nRegistri di servizio recenti:{logs:s}",
"service_enable_failed": "Impossibile abilitare il servizio '{service:s}'\n\nRegistri di servizio recenti:{logs:s}", "service_enable_failed": "Impossibile eseguire il servizio '{service:s}' al boot di sistema.\n\nRegistri di servizio recenti:{logs:s}",
"service_enabled": "Il servizio '{service:s}' è stato attivato", "service_enabled": "Il servizio '{service:s}' si avvierà automaticamente al boot di sistema.",
"service_start_failed": "Impossibile eseguire il servizio '{service:s}'\n\nRegistri di servizio recenti:{logs:s}", "service_start_failed": "Impossibile eseguire il servizio '{service:s}'\n\nRegistri di servizio recenti:{logs:s}",
"service_started": "Il servizio '{service:s}' è stato avviato", "service_started": "Servizio '{service:s}' avviato",
"service_stopped": "Il servizio '{service:s}' è stato fermato", "service_stopped": "Servizio '{service:s}' fermato",
"service_unknown": "Servizio '{service:s}' sconosciuto", "service_unknown": "Servizio '{service:s}' sconosciuto",
"ssowat_conf_generated": "La configurazione SSOwat è stata generata", "ssowat_conf_generated": "La configurazione SSOwat rigenerata",
"ssowat_conf_updated": "La configurazione SSOwat è stata aggiornata", "ssowat_conf_updated": "Configurazione SSOwat aggiornata",
"system_upgraded": "Il sistema è stato aggiornato", "system_upgraded": "Sistema aggiornato",
"unbackup_app": "L'applicazione '{app:s}' non verrà salvata", "unbackup_app": "{app:s} non verrà salvata",
"unexpected_error": "Un'errore inaspettata si è verificata", "unexpected_error": "È successo qualcosa di inatteso: {error}",
"unlimit": "Nessuna quota", "unlimit": "Nessuna quota",
"updating_apt_cache": "Recupero degli aggiornamenti disponibili per i pacchetti di sistema", "updating_apt_cache": "Recupero degli aggiornamenti disponibili per i pacchetti di sistema...",
"upgrade_complete": "Aggiornamento completo", "upgrade_complete": "Aggiornamento completo",
"upnp_dev_not_found": "Nessuno supporto UPnP trovato", "upnp_dev_not_found": "Nessuno supporto UPnP trovato",
"upnp_disabled": "UPnP è stato disattivato", "upnp_disabled": "UPnP è stato disattivato",
"upnp_enabled": "UPnP è stato attivato", "upnp_enabled": "UPnP è stato attivato",
"upnp_port_open_failed": "Impossibile aprire le porte UPnP", "upnp_port_open_failed": "Impossibile aprire le porte attraverso UPnP",
"user_created": "L'utente è stato creato", "user_created": "Utente creato",
"user_creation_failed": "Impossibile creare l'utente", "user_creation_failed": "Impossibile creare l'utente {user}: {error}",
"user_deletion_failed": "Impossibile cancellare l'utente", "user_deletion_failed": "Impossibile cancellare l'utente {user}: {error}",
"user_home_creation_failed": "Impossibile creare la home directory del utente", "user_home_creation_failed": "Impossibile creare la 'home' directory del utente",
"user_unknown": "Utente sconosciuto: {user:s}", "user_unknown": "Utente sconosciuto: {user:s}",
"user_updated": "L'utente è stato aggiornato", "user_updated": "Info dell'utente cambiate",
"yunohost_already_installed": "YunoHost è già installato", "yunohost_already_installed": "YunoHost è già installato",
"yunohost_ca_creation_failed": "Impossibile creare una certificate authority", "yunohost_ca_creation_failed": "Impossibile creare una certificate authority",
"yunohost_configured": "YunoHost è stato configurato", "yunohost_configured": "YunoHost ora è configurato",
"yunohost_installing": "Installazione di YunoHost", "yunohost_installing": "Installazione di YunoHost...",
"yunohost_not_installed": "YunoHost non è o non corretamente installato. Esegui 'yunohost tools postinstall'", "yunohost_not_installed": "YunoHost non è correttamente installato. Esegui 'yunohost tools postinstall'",
"domain_cert_gen_failed": "Impossibile generare il certificato", "domain_cert_gen_failed": "Impossibile generare il certificato",
"certmanager_attempt_to_replace_valid_cert": "Stai provando a sovrascrivere un certificato buono e valido per il dominio {domain:s}! (Usa --force per ignorare)", "certmanager_attempt_to_replace_valid_cert": "Stai provando a sovrascrivere un certificato buono e valido per il dominio {domain:s}! (Usa --force per ignorare)",
"certmanager_domain_unknown": "Dominio {domain:s} sconosciuto", "certmanager_domain_unknown": "Dominio {domain:s} sconosciuto",
@ -170,14 +170,14 @@
"certmanager_certificate_fetching_or_enabling_failed": "Il tentativo di usare il nuovo certificato per {domain:s} non funziona...", "certmanager_certificate_fetching_or_enabling_failed": "Il tentativo di usare il nuovo certificato per {domain:s} non funziona...",
"certmanager_attempt_to_renew_nonLE_cert": "Il certificato per il dominio {domain:s} non è emesso da Let's Encrypt. Impossibile rinnovarlo automaticamente!", "certmanager_attempt_to_renew_nonLE_cert": "Il certificato per il dominio {domain:s} non è emesso da Let's Encrypt. Impossibile rinnovarlo automaticamente!",
"certmanager_attempt_to_renew_valid_cert": "Il certificato per il dominio {domain:s} non è in scadenza! (Puoi usare --force per forzare se sai quel che stai facendo)", "certmanager_attempt_to_renew_valid_cert": "Il certificato per il dominio {domain:s} non è in scadenza! (Puoi usare --force per forzare se sai quel che stai facendo)",
"certmanager_domain_http_not_working": "Sembra che non sia possibile accedere al dominio {domain:s} attraverso HTTP. Verifica la configurazione del DNS e di nginx", "certmanager_domain_http_not_working": "Il dominio {domain:s} non sembra accessibile attraverso HTTP. Verifica nella sezione 'Web' nella diagnosi per maggiori informazioni. (Se sai cosa stai facendo, usa '--no-checks' per disattivare i controlli.)",
"app_already_installed_cant_change_url": "Questa applicazione è già installata. L'URL non può essere cambiato solo da questa funzione. Controlla se `app changeurl` è disponibile.", "app_already_installed_cant_change_url": "Questa applicazione è già installata. L'URL non può essere cambiato solo da questa funzione. Controlla se `app changeurl` è disponibile.",
"app_already_up_to_date": "{app:s} è già aggiornata", "app_already_up_to_date": "{app:s} è già aggiornata",
"app_change_url_failed_nginx_reload": "Non riesco a riavviare NGINX. Questo è il risultato di 'nginx -t':\n{nginx_errors:s}", "app_change_url_failed_nginx_reload": "Non riesco a riavviare NGINX. Questo è il risultato di 'nginx -t':\n{nginx_errors:s}",
"app_change_url_identical_domains": "Il vecchio ed il nuovo dominio/percorso_url sono identici ('{domain:s}{path:s}'), nessuna operazione necessaria.", "app_change_url_identical_domains": "Il vecchio ed il nuovo dominio/percorso_url sono identici ('{domain:s}{path:s}'), nessuna operazione necessaria.",
"app_change_url_no_script": "L'applicazione '{app_name:s}' non supporta ancora la modifica dell'URL. Forse dovresti aggiornarla.", "app_change_url_no_script": "L'applicazione '{app_name:s}' non supporta ancora la modifica dell'URL. Forse dovresti aggiornarla.",
"app_change_url_success": "L'URL dell'applicazione {app:s} è stato cambiato in {domain:s}{path:s}", "app_change_url_success": "L'URL dell'applicazione {app:s} è stato cambiato in {domain:s}{path:s}",
"app_make_default_location_already_used": "Impostazione dell'applicazione '{app}' come predefinita del dominio non riuscita perché il dominio {domain} è già in uso per l'altra applicazione '{other_app}'", "app_make_default_location_already_used": "Impostazione dell'applicazione '{app}' come predefinita del dominio non riuscita perché il dominio '{domain}' è in uso per dall'applicazione '{other_app}'",
"app_location_unavailable": "Questo URL non è più disponibile o va in conflitto con la/le applicazione/i già installata/e:\n{apps:s}", "app_location_unavailable": "Questo URL non è più disponibile o va in conflitto con la/le applicazione/i già installata/e:\n{apps:s}",
"app_upgrade_app_name": "Aggiornamento di {app}...", "app_upgrade_app_name": "Aggiornamento di {app}...",
"app_upgrade_some_app_failed": "Alcune applicazioni non possono essere aggiornate", "app_upgrade_some_app_failed": "Alcune applicazioni non possono essere aggiornate",
@ -232,62 +232,62 @@
"password_too_simple_3": "La password deve essere lunga almeno 8 caratteri e contenere numeri, maiuscole e minuscole e simboli", "password_too_simple_3": "La password deve essere lunga almeno 8 caratteri e contenere numeri, maiuscole e minuscole e simboli",
"password_too_simple_4": "La password deve essere lunga almeno 12 caratteri e contenere numeri, maiuscole e minuscole", "password_too_simple_4": "La password deve essere lunga almeno 12 caratteri e contenere numeri, maiuscole e minuscole",
"users_available": "Utenti disponibili:", "users_available": "Utenti disponibili:",
"yunohost_ca_creation_success": "L'autorità di certificazione locale è stata creata.", "yunohost_ca_creation_success": "Autorità di certificazione locale creata.",
"app_action_cannot_be_ran_because_required_services_down": "I seguenti servizi dovrebbero essere in funzione per completare questa azione: {services}. Prova a riavviarli per proseguire (e possibilmente cercare di capire come ma non funzionano più).", "app_action_cannot_be_ran_because_required_services_down": "I seguenti servizi dovrebbero essere in funzione per completare questa azione: {services}. Prova a riavviarli per proseguire (e possibilmente cercare di capire come ma non funzionano più).",
"backup_output_symlink_dir_broken": "La tua cartella d'archivio '{path:s}' è un link simbolico interrotto. Probabilmente hai dimenticato di montare o montare nuovamente il supporto al quale punta il link.", "backup_output_symlink_dir_broken": "La tua cartella d'archivio '{path:s}' è un link simbolico interrotto. Probabilmente hai dimenticato di montare o montare nuovamente il supporto al quale punta il link.",
"certmanager_conflicting_nginx_file": "Impossibile preparare il dominio per il controllo ACME: il file di configurazione nginx {filepath:s} è in conflitto e dovrebbe essere prima rimosso", "certmanager_conflicting_nginx_file": "Impossibile preparare il dominio per il controllo ACME: il file di configurazione nginx {filepath:s} è in conflitto e dovrebbe essere prima rimosso",
"certmanager_couldnt_fetch_intermediate_cert": "Tempo scaduto durante il tentativo di recupero di un certificato intermedio da Let's Encrypt. Installazione/rinnovo non riuscito - per favore riprova più tardi.", "certmanager_couldnt_fetch_intermediate_cert": "Tempo scaduto durante il tentativo di recupero di un certificato intermedio da Let's Encrypt. Installazione/rinnovo non riuscito - per favore riprova più tardi.",
"certmanager_domain_dns_ip_differs_from_public_ip": "Il valore DNS 'A' per il dominio {domain:s} è diverso dall'IP di questo server. Se hai modificato recentemente il tuo valore A, attendi che si propaghi (esistono online alcuni siti per il controllo della propagazione DNS). (Se sai cosa stai facendo, usa --no-checks per disabilitare quei controlli.)", "certmanager_domain_dns_ip_differs_from_public_ip": "I record DNS per il dominio '{domain:s}' è diverso dall'IP di questo server. Controlla la sezione (basic) 'Record DNS' nella diagnosi per maggiori informazioni. Se hai modificato recentemente il tuo valore A, attendi che si propaghi (esistono online alcuni siti per il controllo della propagazione DNS). (Se sai cosa stai facendo, usa '--no-checks' per disattivare i controlli.)",
"certmanager_error_no_A_record": "Nessun valore DNS 'A' trovato per {domain:s}. Devi far puntare il tuo nome di dominio verso la tua macchina per essere in grado di installare un certificato Let's Encrypt! (Se sai cosa stai facendo, usa --no-checks per disabilitare quei controlli.)", "certmanager_error_no_A_record": "Nessun valore DNS 'A' trovato per {domain:s}. Devi far puntare il tuo nome di dominio verso la tua macchina per essere in grado di installare un certificato Let's Encrypt! (Se sai cosa stai facendo, usa --no-checks per disabilitare quei controlli.)",
"certmanager_hit_rate_limit": "Troppi certificati già rilasciati per l'esatta serie di dominii {domain:s} recentemente. Per favore riprova più tardi. Guarda https://letsencrypt.org/docs/rate-limits/ per maggiori dettagli", "certmanager_hit_rate_limit": "Troppi certificati già rilasciati per questa esatta serie di domini {domain:s} recentemente. Per favore riprova più tardi. Guarda https://letsencrypt.org/docs/rate-limits/ per maggiori dettagli",
"certmanager_http_check_timeout": "Tempo scaduto durante il tentativo di contatto del tuo server a se stesso attraverso HTTP utilizzando l'indirizzo IP pubblico (dominio {domain:s} con ip {ip:s}). Potresti avere un problema di hairpinning o il firewall/router davanti al tuo server non è correttamente configurato.", "certmanager_http_check_timeout": "Tempo scaduto durante il tentativo di contatto del tuo server a se stesso attraverso HTTP utilizzando l'indirizzo IP pubblico (dominio {domain:s} con ip {ip:s}). Potresti avere un problema di hairpinning o il firewall/router davanti al tuo server non è correttamente configurato.",
"certmanager_no_cert_file": "Impossibile leggere il file di certificato per il dominio {domain:s} (file: {file:s})", "certmanager_no_cert_file": "Impossibile leggere il file di certificato per il dominio {domain:s} (file: {file:s})",
"certmanager_self_ca_conf_file_not_found": "File di configurazione non trovato per l'autorità di autofirma (file: {file:s})", "certmanager_self_ca_conf_file_not_found": "File di configurazione non trovato per l'autorità di auto-firma (file: {file:s})",
"certmanager_unable_to_parse_self_CA_name": "Impossibile analizzare il nome dell'autorità di autofirma (file: {file:s})", "certmanager_unable_to_parse_self_CA_name": "Impossibile analizzare il nome dell'autorità di auto-firma (file: {file:s})",
"confirm_app_install_warning": "Attenzione: questa applicazione potrebbe funzionare ma non è ben integrata in YunoHost. Alcune funzionalità come l'accesso unico e il backup/ripristino potrebbero non essere disponibili. Installare comunque? [{answers:s}] ", "confirm_app_install_warning": "Attenzione: Questa applicazione potrebbe funzionare, ma non è ben integrata in YunoHost. Alcune funzionalità come il single sign-on e il backup/ripristino potrebbero non essere disponibili. Installare comunque? [{answers:s}] ",
"confirm_app_install_danger": "ATTENZIONE! Questa applicazione è ancora sperimentale (se non esplicitamente non funzionante) e probabilmente potrebbe danneggiare il tuo sistema! Probabilmente NON dovresti installarla a meno che tu non sappia cosa stai facendo. Sicuro di volerti prendere questo rischio? [{answers:s}] ", "confirm_app_install_danger": "ATTENZIONE! Questa applicazione è ancora sperimentale (se non esplicitamente dichiarata non funzionante)! Probabilmente NON dovresti installarla a meno che tu non sappia cosa stai facendo. NESSUN SUPPORTO verrà dato se quest'app non funziona o se rompe il tuo sistema... Se comunque accetti di prenderti questo rischio,digita '{answers:s}'",
"confirm_app_install_thirdparty": "ATTENZIONE! Installando applicazioni di terze parti potresti compromettere l'integrita e la sicurezza del tuo sistema. Probabilmente NON dovresti installarle a meno che tu non sappia cosa stai facendo. Sicuro di volerti prendere questo rischio? [{answers:s}] ", "confirm_app_install_thirdparty": "PERICOLO! Quest'applicazione non fa parte del catalogo Yunohost. Installando app di terze parti potresti compromettere l'integrita e la sicurezza del tuo sistema. Probabilmente NON dovresti installarla a meno che tu non sappia cosa stai facendo. NESSUN SUPPORTO verrà dato se quest'app non funziona o se rompe il tuo sistema... Se comunque accetti di prenderti questo rischio, digita '{answers:s}'",
"dpkg_is_broken": "Non puoi eseguire questo ora perchè dpkg/apt (i gestori di pacchetti del sistema) sembrano essere in stato danneggiato... Puoi provare a risolvere il problema connettendoti via SSH ed eseguire `sudo dpkg --configure -a`.", "dpkg_is_broken": "Non puoi eseguire questo ora perchè dpkg/APT (i gestori di pacchetti del sistema) sembrano essere in stato danneggiato... Puoi provare a risolvere il problema connettendoti via SSH ed eseguire `sudo apt install --fix-broken` e/o `sudo dpkg --configure -a`.",
"domain_cannot_remove_main": "Non è possibile rimuovere il dominio principale ora. Prima imposta un nuovo dominio principale", "domain_cannot_remove_main": "Non puoi rimuovere '{domain:s}' essendo il dominio principale, prima devi impostare un nuovo dominio principale con il comando 'yunohost domain main-domain -n <altro-dominio>'; ecco la lista dei domini candidati: {other_domains:s}",
"domain_dns_conf_is_just_a_recommendation": "Questo comando ti mostra qual è la configurazione *raccomandata*. Non ti imposta la configurazione DNS al tuo posto. È tua responsabilità configurare la tua zona DNS nel tuo registrar in accordo con queste raccomandazioni.", "domain_dns_conf_is_just_a_recommendation": "Questo comando ti mostra la configurazione *raccomandata*. Non ti imposta la configurazione DNS al tuo posto. È tua responsabilità configurare la tua zona DNS nel tuo registrar in accordo con queste raccomandazioni.",
"dyndns_could_not_check_provide": "Impossibile controllare se {provider:s} possano fornire {domain:s}.", "dyndns_could_not_check_provide": "Impossibile controllare se {provider:s} possano fornire {domain:s}.",
"dyndns_could_not_check_available": "Impossibile controllare se {domain:s} è disponibile su {provider:s}.", "dyndns_could_not_check_available": "Impossibile controllare se {domain:s} è disponibile su {provider:s}.",
"dyndns_domain_not_provided": "Il fornitore Dyndns {provider:s} non può fornire il dominio {domain:s}.", "dyndns_domain_not_provided": "Il fornitore DynDNS {provider:s} non può fornire il dominio {domain:s}.",
"experimental_feature": "Attenzione: questa funzionalità è sperimentale e non è considerata stabile, non dovresti utilizzarla a meno che tu non sappia cosa stai facendo.", "experimental_feature": "Attenzione: Questa funzionalità è sperimentale e non è considerata stabile, non dovresti utilizzarla a meno che tu non sappia cosa stai facendo.",
"file_does_not_exist": "Il file {path:s} non esiste.", "file_does_not_exist": "Il file {path:s} non esiste.",
"global_settings_bad_choice_for_enum": "Scelta sbagliata per l'impostazione {setting:s}, ricevuta '{choice:s}' ma le scelte disponibili sono : {available_choices:s}", "global_settings_bad_choice_for_enum": "Scelta sbagliata per l'impostazione {setting:s}, ricevuta '{choice:s}', ma le scelte disponibili sono: {available_choices:s}",
"global_settings_bad_type_for_setting": "Tipo errato per l'impostazione {setting:s}, ricevuto {received_type:s}, atteso {expected_type:s}", "global_settings_bad_type_for_setting": "Tipo errato per l'impostazione {setting:s}, ricevuto {received_type:s}, atteso {expected_type:s}",
"global_settings_cant_open_settings": "Apertura del file delle impostazioni non riuscita, motivo: {reason:s}", "global_settings_cant_open_settings": "Apertura del file delle impostazioni non riuscita, motivo: {reason:s}",
"global_settings_cant_serialize_settings": "Serializzazione dei dati delle impostazioni non riuscita, motivo: {reason:s}", "global_settings_cant_serialize_settings": "Serializzazione dei dati delle impostazioni non riuscita, motivo: {reason:s}",
"global_settings_cant_write_settings": "Scrittura del file delle impostazioni non riuscita, motivo: {reason:s}", "global_settings_cant_write_settings": "Scrittura del file delle impostazioni non riuscita, motivo: {reason:s}",
"global_settings_key_doesnt_exists": "La chiave '{settings_key:s}' non esiste nelle impostazioni globali, puoi vedere tutte le chiavi disponibili eseguendo 'yunohost settings list'", "global_settings_key_doesnt_exists": "La chiave '{settings_key:s}' non esiste nelle impostazioni globali, puoi vedere tutte le chiavi disponibili eseguendo 'yunohost settings list'",
"global_settings_reset_success": "Successo. Le tue impostazioni precedenti sono state salvate in {path:s}", "global_settings_reset_success": "Le impostazioni precedenti sono state salvate in {path:s}",
"global_settings_setting_example_bool": "Esempio di opzione booleana", "global_settings_setting_example_bool": "Esempio di opzione booleana",
"global_settings_setting_example_enum": "Esempio di opzione enum", "global_settings_setting_example_enum": "Esempio di opzione enum",
"already_up_to_date": "Niente da fare. Tutto è già aggiornato.", "already_up_to_date": "Niente da fare. Tutto è già aggiornato.",
"global_settings_setting_example_int": "Esempio di opzione int", "global_settings_setting_example_int": "Esempio di opzione int",
"global_settings_setting_example_string": "Esempio di opzione string", "global_settings_setting_example_string": "Esempio di opzione string",
"global_settings_setting_security_nginx_compatibility": "Bilanciamento tra compatibilità e sicurezza per il server web nginx. Riguarda gli algoritmi di cifratura (e altri aspetti legati alla sicurezza)", "global_settings_setting_security_nginx_compatibility": "Bilanciamento tra compatibilità e sicurezza per il server web NGIX. Riguarda gli algoritmi di cifratura (e altri aspetti legati alla sicurezza)",
"global_settings_setting_security_password_admin_strength": "Complessità della password di amministratore", "global_settings_setting_security_password_admin_strength": "Complessità della password di amministratore",
"global_settings_setting_security_password_user_strength": "Complessità della password utente", "global_settings_setting_security_password_user_strength": "Complessità della password utente",
"global_settings_setting_security_ssh_compatibility": "Bilanciamento tra compatibilità e sicurezza per il server SSH. Riguarda gli algoritmi di cifratura (e altri aspetti legati alla sicurezza)", "global_settings_setting_security_ssh_compatibility": "Bilanciamento tra compatibilità e sicurezza per il server SSH. Riguarda gli algoritmi di cifratura (e altri aspetti legati alla sicurezza)",
"global_settings_unknown_setting_from_settings_file": "Chiave sconosciuta nelle impostazioni: '{setting_key:s}', scartata e salvata in /etc/yunohost/settings-unknown.json", "global_settings_unknown_setting_from_settings_file": "Chiave sconosciuta nelle impostazioni: '{setting_key:s}', scartata e salvata in /etc/yunohost/settings-unknown.json",
"global_settings_setting_service_ssh_allow_deprecated_dsa_hostkey": "Consenti l'uso del (deprecato) hostkey DSA per la configurazione del demone SSH", "global_settings_setting_service_ssh_allow_deprecated_dsa_hostkey": "Consenti l'uso del hostkey DSA (deprecato) per la configurazione del demone SSH",
"global_settings_unknown_type": "Situazione inaspettata, l'impostazione {setting:s} sembra essere di tipo {unknown_type:s} ma non è un tipo supportato dal sistema.", "global_settings_unknown_type": "Situazione inaspettata, l'impostazione {setting:s} sembra essere di tipo {unknown_type:s} ma non è un tipo supportato dal sistema.",
"good_practices_about_admin_password": "Stai per definire una nuova password di amministratore. La password deve essere almeno di 8 caratteri - anche se è buona pratica utilizzare password più lunghe (es. una frase, una serie di parole) e/o utilizzare vari tipi di caratteri (maiuscole, minuscole, numeri e simboli).", "good_practices_about_admin_password": "Stai per definire una nuova password di amministratore. La password deve essere almeno di 8 caratteri - anche se è buona pratica utilizzare password più lunghe (es. una frase, una serie di parole) e/o utilizzare vari tipi di caratteri (maiuscole, minuscole, numeri e simboli).",
"log_corrupted_md_file": "Il file dei metadati yaml associato con i registri è corrotto: '{md_file}'", "log_corrupted_md_file": "Il file dei metadati YAML associato con i registri è danneggiato: '{md_file}'\nErrore: {error}",
"log_category_404": "La categoria di registrazione '{category}' non esiste", "log_category_404": "La categoria di registrazione '{category}' non esiste",
"log_link_to_log": "Registro completo di questa operazione: '<a href=\"#/tools/logs/{name}\" style=\"text-decoration:underline\">{desc}</a>'", "log_link_to_log": "Registro completo di questa operazione: '<a href=\"#/tools/logs/{name}\" style=\"text-decoration:underline\">{desc}</a>'",
"log_help_to_get_log": "Per vedere il registro dell'operazione '{desc}', usa il comando 'yunohost log display {name}'", "log_help_to_get_log": "Per vedere il registro dell'operazione '{desc}', usa il comando 'yunohost log display {name}'",
"global_settings_setting_security_postfix_compatibility": "Bilanciamento tra compatibilità e sicurezza per il server Postfix. Riguarda gli algoritmi di cifratura (e altri aspetti legati alla sicurezza)", "global_settings_setting_security_postfix_compatibility": "Bilanciamento tra compatibilità e sicurezza per il server Postfix. Riguarda gli algoritmi di cifratura (e altri aspetti legati alla sicurezza)",
"log_link_to_failed_log": "L'operazione '{desc}' è fallita! Per ottenere aiuto, per favore <a href=\"#/tools/logs/{name}\">fornisci il registro completo dell'operazione cliccando qui</a>", "log_link_to_failed_log": "Impossibile completare l'operazione '{desc}'! Per ricevere aiuto, per favore fornisci il registro completo dell'operazione <a href=\"#/tools/logs/{name}\">cliccando qui</a>",
"log_help_to_get_failed_log": "L'operazione '{desc}' è fallita! Per ottenere aiuto, per favore condividi il registro completo dell'operazione utilizzando il comando 'yunohost log display {name} --share'", "log_help_to_get_failed_log": "L'operazione '{desc}' non può essere completata. Per ottenere aiuto, per favore condividi il registro completo dell'operazione utilizzando il comando 'yunohost log display {name} --share'",
"log_does_exists": "Non esiste nessun registro delle operazioni chiamato '{log}', usa 'yunohost log list' per vedere tutti i registri delle operazioni disponibili", "log_does_exists": "Non esiste nessun registro delle operazioni chiamato '{log}', usa 'yunohost log list' per vedere tutti i registri delle operazioni disponibili",
"log_app_change_url": "Cambia l'url dell'applicazione '{}'", "log_app_change_url": "Cambia l'URL dell'app '{}'",
"log_app_install": "Installa l'applicazione '{}'", "log_app_install": "Installa l'app '{}'",
"log_app_remove": "Rimuovi l'applicazione '{}'", "log_app_remove": "Rimuovi l'app '{}'",
"log_app_upgrade": "Aggiorna l'applicazione '{}'", "log_app_upgrade": "Aggiorna l'app '{}'",
"log_app_makedefault": "Rendi predefinita l'applicazione '{}'", "log_app_makedefault": "Rendi '{}' l'app predefinita",
"log_available_on_yunopaste": "Questo registro è ora disponibile via {url}", "log_available_on_yunopaste": "Questo registro è ora disponibile via {url}",
"log_backup_restore_system": "Ripristina sistema da un archivio di backup", "log_backup_restore_system": "Ripristina sistema da un archivio di backup",
"log_backup_restore_app": "Ripristina '{}' da un archivio di backup", "log_backup_restore_app": "Ripristina '{}' da un archivio di backup",
@ -296,16 +296,16 @@
"log_domain_add": "Aggiungi il dominio '{}' nella configurazione di sistema", "log_domain_add": "Aggiungi il dominio '{}' nella configurazione di sistema",
"log_domain_remove": "Rimuovi il dominio '{}' dalla configurazione di sistema", "log_domain_remove": "Rimuovi il dominio '{}' dalla configurazione di sistema",
"log_dyndns_subscribe": "Sottoscrivi un sottodominio YunoHost '{}'", "log_dyndns_subscribe": "Sottoscrivi un sottodominio YunoHost '{}'",
"log_dyndns_update": "Aggiorna l'ip associato con il tuo sottodominio YunoHost '{}'", "log_dyndns_update": "Aggiorna l'IP associato con il tuo sottodominio YunoHost '{}'",
"log_letsencrypt_cert_install": "Installa un certificato Let's encrypt sul dominio '{}'", "log_letsencrypt_cert_install": "Installa un certificato Let's encrypt sul dominio '{}'",
"log_selfsigned_cert_install": "Installa un certificato autofirmato sul dominio '{}'", "log_selfsigned_cert_install": "Installa un certificato autofirmato sul dominio '{}'",
"log_letsencrypt_cert_renew": "Rinnova il certificato Let's encrypt sul dominio '{}'", "log_letsencrypt_cert_renew": "Rinnova il certificato Let's Encrypt sul dominio '{}'",
"log_regen_conf": "Rigenera configurazioni di sistema '{}'", "log_regen_conf": "Rigenera configurazioni di sistema '{}'",
"log_user_create": "Aggiungi l'utente '{}'", "log_user_create": "Aggiungi l'utente '{}'",
"log_user_delete": "Elimina l'utente '{}'", "log_user_delete": "Elimina l'utente '{}'",
"log_user_update": "Aggiornate le informazioni dell'utente '{}'", "log_user_update": "Aggiorna le informazioni dell'utente '{}'",
"log_domain_main_domain": "Rendi '{}' dominio principale", "log_domain_main_domain": "Rendi '{}' il dominio principale",
"log_tools_migrations_migrate_forward": "Migra avanti", "log_tools_migrations_migrate_forward": "Esegui le migrazioni",
"log_tools_postinstall": "Postinstallazione del tuo server YunoHost", "log_tools_postinstall": "Postinstallazione del tuo server YunoHost",
"log_tools_upgrade": "Aggiornamento dei pacchetti di sistema", "log_tools_upgrade": "Aggiornamento dei pacchetti di sistema",
"log_tools_shutdown": "Spegni il tuo server", "log_tools_shutdown": "Spegni il tuo server",
@ -334,12 +334,12 @@
"migration_0003_yunohost_upgrade": "Iniziando l'aggiornamento dei pacchetti yunohost… La migrazione terminerà, ma l'aggiornamento attuale avverrà subito dopo. Dopo che l'operazione sarà completata, probabilmente dovrai riaccedere all'interfaccia di amministrazione.", "migration_0003_yunohost_upgrade": "Iniziando l'aggiornamento dei pacchetti yunohost… La migrazione terminerà, ma l'aggiornamento attuale avverrà subito dopo. Dopo che l'operazione sarà completata, probabilmente dovrai riaccedere all'interfaccia di amministrazione.",
"migration_0003_not_jessie": "La distribuzione attuale non è Jessie!", "migration_0003_not_jessie": "La distribuzione attuale non è Jessie!",
"migration_0003_system_not_fully_up_to_date": "Il tuo sistema non è completamente aggiornato. Per favore prima esegui un aggiornamento normale prima di migrare a stretch.", "migration_0003_system_not_fully_up_to_date": "Il tuo sistema non è completamente aggiornato. Per favore prima esegui un aggiornamento normale prima di migrare a stretch.",
"this_action_broke_dpkg": "Questa azione ha danneggiato dpkg/apt (i gestori di pacchetti del sistema)… Puoi provare a risolvere questo problema connettendoti via SSH ed eseguendo `sudo dpkg --configure -a`.", "this_action_broke_dpkg": "Questa azione ha danneggiato dpkg/APT (i gestori di pacchetti del sistema)... Puoi provare a risolvere questo problema connettendoti via SSH ed eseguendo `sudo apt install --fix-broken` e/o `sudo dpkg --configure -a`.",
"app_action_broke_system": "Questa azione sembra avere rotto questi servizi importanti: {services}", "app_action_broke_system": "Questa azione sembra avere rotto questi servizi importanti: {services}",
"app_remove_after_failed_install": "Rimozione dell'applicazione a causa del fallimento dell'installazione...", "app_remove_after_failed_install": "Rimozione dell'applicazione a causa del fallimento dell'installazione...",
"app_install_script_failed": "Si è verificato un errore nello script di installazione dell'applicazione", "app_install_script_failed": "Si è verificato un errore nello script di installazione dell'applicazione",
"app_install_failed": "Impossibile installare {app}:{error}", "app_install_failed": "Impossibile installare {app}:{error}",
"app_full_domain_unavailable": "Spiacente, questa app deve essere installata su un proprio dominio, ma altre applicazioni sono state installate sul dominio '{domain}'. Dovresti invece usare un sotto-dominio dedicato per questa app.", "app_full_domain_unavailable": "Spiacente, questa app deve essere installata su un proprio dominio, ma altre applicazioni sono già installate sul dominio '{domain}'. Potresti usare invece un sotto-dominio dedicato per questa app.",
"app_upgrade_script_failed": "È stato trovato un errore nello script di aggiornamento dell'applicazione", "app_upgrade_script_failed": "È stato trovato un errore nello script di aggiornamento dell'applicazione",
"apps_already_up_to_date": "Tutte le applicazioni sono aggiornate", "apps_already_up_to_date": "Tutte le applicazioni sono aggiornate",
"apps_catalog_init_success": "Catalogo delle applicazioni inizializzato!", "apps_catalog_init_success": "Catalogo delle applicazioni inizializzato!",
@ -350,13 +350,327 @@
"backup_archive_corrupted": "Sembra che l'archivio di backup '{archive}' sia corrotto: {error}", "backup_archive_corrupted": "Sembra che l'archivio di backup '{archive}' sia corrotto: {error}",
"backup_archive_cant_retrieve_info_json": "Impossibile caricare informazione per l'archivio '{archive}'... Impossibile scaricare info.json (oppure non è un json valido).", "backup_archive_cant_retrieve_info_json": "Impossibile caricare informazione per l'archivio '{archive}'... Impossibile scaricare info.json (oppure non è un json valido).",
"app_packaging_format_not_supported": "Quest'applicazione non può essere installata perché il formato non è supportato dalla vostra versione di YunoHost. Dovreste considerare di aggiornare il vostro sistema.", "app_packaging_format_not_supported": "Quest'applicazione non può essere installata perché il formato non è supportato dalla vostra versione di YunoHost. Dovreste considerare di aggiornare il vostro sistema.",
"certmanager_domain_not_diagnosed_yet": "Non c'è ancora alcun risultato di diagnosi per il dominio {domain}. Riavvia una diagnosi per la categoria 'DNS records' e 'Web' nella sezione di diagnosi per verificare se il dominio è pronto per Let's Encrypt. (Oppure se sai quel che stai facendo puoi usare '--no-checks' per disabilitare questi controlli.)", "certmanager_domain_not_diagnosed_yet": "Non c'è ancora alcun risultato di diagnosi per il dominio {domain}. Riavvia una diagnosi per la categoria 'DNS records' e 'Web' nella sezione di diagnosi per verificare se il dominio è pronto per Let's Encrypt. (Se sai cosa stai facendo, usa '--no-checks' per disattivare i controlli.)",
"backup_permission": "Backup dei permessi per {app:s}", "backup_permission": "Backup dei permessi per {app:s}",
"ask_user_domain": "Dominio da usare per l'indirizzo email e l'account XMPP dell'utente", "ask_user_domain": "Dominio da usare per l'indirizzo email e l'account XMPP dell'utente",
"app_manifest_install_ask_is_public": "Quest'applicazione dovrà essere visibile ai visitatori anonimi?", "app_manifest_install_ask_is_public": "Quest'applicazione dovrà essere visibile ai visitatori anonimi?",
"app_manifest_install_ask_admin": "Scegli un utente amministratore per quest'applicazione", "app_manifest_install_ask_admin": "Scegli un utente amministratore per quest'applicazione",
"app_manifest_install_ask_password": "Scegli una password di amministrazione per quest'applicazione", "app_manifest_install_ask_password": "Scegli una password di amministrazione per quest'applicazione",
"app_manifest_install_ask_path": "Scegli il percorso dove installare quest'applicazione", "app_manifest_install_ask_path": "Scegli il percorso dove installare quest'applicazione",
"app_manifest_install_ask_domain": "Scegli il dominio sotto il quale installare quest'applicazione", "app_manifest_install_ask_domain": "Scegli il dominio dove installare quest'app",
"app_argument_password_no_default": "Errore nell'analisi dell'argomento '{name}': l'argomento di password non può avere un valore di default per ragioni di sicurezza" "app_argument_password_no_default": "Errore durante il parsing dell'argomento '{name}': l'argomento password non può avere un valore di default per ragioni di sicurezza",
"additional_urls_already_added": "L'URL aggiuntivo '{url:s}' è già utilizzato come URL aggiuntivo per il permesso '{permission:s}'",
"diagnosis_basesystem_ynh_inconsistent_versions": "Stai eseguendo versioni incompatibili dei pacchetti YunoHost... probabilmente a causa di aggiornamenti falliti o parziali.",
"diagnosis_basesystem_ynh_main_version": "Il server sta eseguendo YunoHost {main_version} ({repo})",
"diagnosis_basesystem_ynh_single_version": "Versione {package}: {version} ({repo})",
"diagnosis_basesystem_kernel": "Il server sta eseguendo Linux kernel {kernel_version}",
"diagnosis_basesystem_host": "Il server sta eseguendo Debian {debian_version}",
"diagnosis_basesystem_hardware_board": "Il modello della scheda server è {model}",
"diagnosis_basesystem_hardware": "L'architettura hardware del server è {virt} {arch}",
"certmanager_warning_subdomain_dns_record": "Il sottodominio '{subdomain:s}' non si risolve nello stesso indirizzo IP di '{domain:s}'. Alcune funzioni non saranno disponibili finchè questa cosa non verrà sistemata e rigenerato il certificato.",
"app_label_deprecated": "Questo comando è deprecato! Utilizza il nuovo comando 'yunohost user permission update' per gestire la label dell'app.",
"additional_urls_already_removed": "L'URL aggiuntivo '{url:s}' è già stato rimosso come URL aggiuntivo per il permesso '{permission:s}'",
"diagnosis_services_bad_status_tip": "Puoi provare a <a href='#/services/{service}'>riavviare il servizio</a>, e se non funziona, controlla ai <a href='#/services/{service}'>log del servizio in amministrazione</a> (dalla linea di comando, puoi farlo con <cmd>yunohost service restart {service}</cmd> e <cmd>yunohost service log {service}</cmd>).",
"diagnosis_services_bad_status": "Il servizio {service} è {status} :(",
"diagnosis_services_conf_broken": "Il servizio {service} è mal-configurato!",
"diagnosis_services_running": "Il servizio {service} sta funzionando!",
"diagnosis_domain_expires_in": "{domain} scadrà tra {days} giorni.",
"diagnosis_domain_expiration_error": "Alcuni domini scadranno MOLTO PRESTO!",
"diagnosis_domain_expiration_warning": "Alcuni domini scadranno a breve!",
"diagnosis_domain_expiration_success": "I tuoi domini sono registrati e non scadranno a breve.",
"diagnosis_domain_expiration_not_found_details": "Le informazioni WHOIS per il dominio {domain} non sembrano contenere la data di scadenza, giusto?",
"diagnosis_domain_not_found_details": "Il dominio {domain} non esiste nel database WHOIS o è scaduto!",
"diagnosis_domain_expiration_not_found": "Non riesco a controllare la data di scadenza di alcuni domini",
"diagnosis_dns_try_dyndns_update_force": "La configurazione DNS di questo dominio dovrebbe essere gestita automaticamente da Yunohost. Se non avviene, puoi provare a forzare un aggiornamento usando il comando <cmd>yunohost dyndns update --force</cmd>.",
"diagnosis_dns_point_to_doc": "Controlla la documentazione a <a href='https://yunohost.org/dns_config'>https://yunohost.org/dns_config</a> se hai bisogno di aiuto nel configurare i record DNS.",
"diagnosis_dns_discrepancy": "Il record DNS non sembra seguire la configurazione DNS raccomandata:<br>Type: <code>{type}</code><br>Name: <code>{name}</code><br>Current value: <code>{current}</value><br>Expected value: <code>{value}</value>",
"diagnosis_dns_missing_record": "Stando alla configurazione DNS raccomandata, dovresti aggiungere un record DNS con le seguenti informazioni.<br>Type: <code>{type}</code><br>Name: <code>{name}</code><br>Value: <code>{value}</value>",
"diagnosis_dns_bad_conf": "Alcuni record DNS sono mancanti o incorretti per il dominio {domain} (categoria {category})",
"diagnosis_dns_good_conf": "I recordDNS sono configurati correttamente per il dominio {domain} (categoria {category})",
"diagnosis_ip_weird_resolvconf_details": "Il file <code>/etc/resolv.conf</code> dovrebbe essere un symlink a <code>/etc/resolvconf/run/resolv.conf</code> che punta a <code>127.0.0.1</code> (dnsmasq). Se vuoi configurare manualmente i DNS, modifica <code>/etc/resolv.dnsmasq.conf</code>.",
"diagnosis_ip_weird_resolvconf": "La risoluzione dei nomi di rete sembra funzionare, ma mi pare che tu stia usando un <code>/etc/resolv.conf</code> personalizzato.",
"diagnosis_ip_broken_resolvconf": "La risoluzione dei nomi di rete sembra non funzionare sul tuo server, e sembra collegato a <code>/etc/resolv.conf</code> che non punta a <code>127.0.0.1</code>.",
"diagnosis_ip_broken_dnsresolution": "La risoluzione dei nomi di rete sembra non funzionare per qualche ragione... È presente un firewall che blocca le richieste DNS?",
"diagnosis_ip_dnsresolution_working": "Risoluzione dei nomi di rete funzionante!",
"diagnosis_ip_not_connected_at_all": "Sei sicuro che il server sia collegato ad Internet!?",
"diagnosis_ip_local": "IP locale: <code>{local}</code>",
"diagnosis_ip_global": "IP globale: <code>{global}</code>",
"diagnosis_ip_no_ipv6_tip": "Avere IPv6 funzionante non è obbligatorio per far funzionare il server, ma è un bene per Internet stesso. IPv6 dovrebbe essere configurato automaticamente dal sistema o dal tuo provider se è disponibile. Altrimenti, potresti aver bisogno di configurare alcune cose manualmente come è spiegato nella documentazione: <a href='https://yunohost.org/#/ipv6'> https://yunohost.org/#/ipv6</a>. Se non puoi abilitare IPv6 o se ti sembra troppo complicato per te, puoi tranquillamente ignorare questo avvertimento.",
"diagnosis_ip_no_ipv6": "Il server non ha IPv6 funzionante.",
"diagnosis_ip_connected_ipv6": "Il server è connesso ad Internet tramite IPv6!",
"diagnosis_ip_no_ipv4": "Il server non ha IPv4 funzionante.",
"diagnosis_ip_connected_ipv4": "Il server è connesso ad Internet tramite IPv4!",
"diagnosis_no_cache": "Nessuna diagnosi nella cache per la categoria '{category}'",
"diagnosis_found_warnings": "Trovato {warnings} oggetti che potrebbero essere migliorati per {category}.",
"diagnosis_failed": "Recupero dei risultati della diagnosi per la categoria '{category}' fallito: {error}",
"diagnosis_everything_ok": "Tutto ok per {category}!",
"diagnosis_found_errors_and_warnings": "Trovato {errors} problemi (e {warnings} alerts) significativi collegati a {category}!",
"diagnosis_found_errors": "Trovato {errors} problemi significativi collegati a {category}!",
"diagnosis_ignored_issues": "(+ {nb_ignored} problemi ignorati)",
"diagnosis_cant_run_because_of_dep": "Impossibile lanciare la diagnosi per {category} mentre ci sono problemi importanti collegati a {dep}.",
"diagnosis_cache_still_valid": "(La cache della diagnosi di {category} è ancora valida. Non la ricontrollo di nuovo per ora!)",
"diagnosis_failed_for_category": "Diagnosi fallita per la categoria '{category}:{error}",
"diagnosis_display_tip": "Per vedere i problemi rilevati, puoi andare alla sezione Diagnosi del amministratore, o eseguire 'yunohost diagnosis show --issues' dalla riga di comando.",
"diagnosis_package_installed_from_sury_details": "Alcuni pacchetti sono stati inavvertitamente installati da un repository di terze parti chiamato Sury. Il team di Yunohost ha migliorato la gestione di tali pacchetti, ma ci si aspetta che alcuni setup di app PHP7.3 abbiano delle incompatibilità anche se sono ancora in Stretch. Per sistemare questa situazione, dovresti provare a lanciare il seguente comando: <cmd>{cmd_to_fix}</cmd>",
"diagnosis_package_installed_from_sury": "Alcuni pacchetti di sistema dovrebbero fare il downgrade",
"diagnosis_mail_ehlo_bad_answer": "Un servizio diverso da SMTP ha risposto sulla porta 25 su IPv{ipversion}",
"diagnosis_mail_ehlo_unreachable_details": "Impossibile aprire una connessione sulla porta 25 sul tuo server su IPv{ipversion}. Sembra irraggiungibile.<br>1. La causa più probabile di questo problema è la porta 25 <a href='https://yunohost.org/isp_box_config'>non correttamente inoltrata al tuo server</a>.<br>2. Dovresti esser sicuro che il servizio postfix sia attivo.<br>3. Su setup complessi: assicuratu che nessun firewall o reverse-proxy stia interferendo.",
"diagnosis_mail_ehlo_unreachable": "Il server SMTP non è raggiungibile dall'esterno su IPv{ipversion}. Non potrà ricevere email.",
"diagnosis_mail_ehlo_ok": "Il server SMTP è raggiungibile dall'esterno e quindi può ricevere email!",
"diagnosis_mail_outgoing_port_25_blocked_relay_vpn": "Alcuni provider non ti permettono di aprire la porta 25 in uscita perché non gli importa della Net Neutrality.<br> - Alcuni mettono a disposizione un alternativa <a href='https://yunohost.org/#/smtp_relay'>attraverso un mail server relay</a> anche se implica che il relay ha la capacità di leggere il vostro traffico email.<br> - Un alternativa privacy-friendly è quella di usare una VPN *con un indirizzo IP pubblico dedicato* per bypassare questo tipo di limite. Vedi <a href='https://yunohost.org/#/vpn_advantage'>https://yunohost.org/#/vpn_advantage</a><br> - Puoi anche prendere in considerazione di cambiare <a href='https://yunohost.org/#/isp'>per un provider pro Net Neutrality</a>",
"diagnosis_mail_outgoing_port_25_blocked_details": "Come prima cosa dovresti sbloccare la porta 25 in uscita dall'interfaccia del tuo router internet o del tuo hosting provider. (Alcuni hosting provider potrebbero richiedere l'invio di un ticket di supporto per la richiesta).",
"diagnosis_mail_outgoing_port_25_blocked": "Il server SMTP non può inviare email ad altri server perché la porta 25 è bloccata in uscita su IPv{ipversion}.",
"diagnosis_mail_outgoing_port_25_ok": "Il server SMTP è abile all'invio delle email (porta 25 in uscita non bloccata).",
"diagnosis_swap_tip": "Attenzione. Sii consapevole che se il server ha lo swap su di una memoria SD o un disco SSD, potrebbe drasticamente ridurre la durata di vita del dispositivo.",
"diagnosis_swap_ok": "Il sistema ha {total} di memoria swap!",
"diagnosis_swap_notsomuch": "Il sistema ha solo {total} di swap. Dovresti considerare almeno di aggiungere {recommended} di memoria swap per evitare situazioni dove il sistema esaurisce la memoria.",
"diagnosis_swap_none": "Il sistema non ha lo swap. Dovresti considerare almeno di aggiungere {recommended} di memoria swap per evitare situazioni dove il sistema esaurisce la memoria.",
"diagnosis_ram_ok": "Il sistema ha ancora {available} ({available_percent}%) di RAM disponibile su {total}.",
"diagnosis_ram_low": "Il sistema ha solo {available} ({available_percent}%) di RAM disponibile (su {total}). Fa attenzione.",
"diagnosis_ram_verylow": "Il sistema ha solo {available} ({available_percent}%) di RAM disponibile (su {total})",
"diagnosis_diskusage_ok": "Lo storage <code>{mountpoint}</code> (nel device <code>{device}</code> ha solo {free} ({free_percent}%) di spazio libero rimanente (su {total})!",
"diagnosis_diskusage_low": "Lo storage <code>{mountpoint}</code> (nel device <code>{device}</code> ha solo {free} ({free_percent}%) di spazio libero rimanente (su {total}). Fa attenzione.",
"diagnosis_diskusage_verylow": "Lo storage <code>{mountpoint}</code> (nel device <code>{device}</code> ha solo {free} ({free_percent}%) di spazio libero rimanente (su {total}). Dovresti seriamente considerare di fare un po' di pulizia!",
"diagnosis_mail_fcrdns_nok_details": "Dovresti prima configurare il DNS inverso con <code>{ehlo_domain}</code> nell'interfaccia del tuo router internet o del tuo hosting provider. (Alcuni hosting provider potrebbero richiedere l'invio di un ticket di supporto per la richiesta).",
"diagnosis_mail_fcrdns_dns_missing": "Nessun DNS inverso è configurato per IPv{ipversion}. Alcune email potrebbero non essere inviate o segnalate come spam.",
"diagnosis_mail_fcrdns_ok": "Il tuo DNS inverso è configurato correttamente!",
"diagnosis_mail_ehlo_could_not_diagnose_details": "Errore: {error}",
"diagnosis_mail_ehlo_could_not_diagnose": "Non è possibile verificare se il server mail postfix è raggiungibile dall'esterno su IPv{ipversion}.",
"diagnosis_mail_ehlo_wrong": "Un server mail SMTP diverso sta rispondendo su IPv{ipversion}. Probabilmente il tuo server non può ricevere email.",
"diagnosis_mail_ehlo_bad_answer_details": "Potrebbe essere un'altra macchina a rispondere al posto del tuo server.",
"diagnosis_mail_fcrdns_nok_alternatives_4": "Alcuni provider non ti permettono di configurare un DNS inverso (o la loro configurazione non funziona...). Se stai avendo problemi a causa di ciò, considera le seguenti soluzioni:<br> - Alcuni ISP mettono a disposizione un alternativa <a href='https://yunohost.org/#/smtp_relay'>attraverso un mail server relay</a> anche se implica che il relay ha la capacità di leggere il vostro traffico email.<br> - Un alternativa privacy-friendly è quella di usare una VPN *con un indirizzo IP pubblico dedicato* per bypassare questo tipo di limite. Vedi <a href='https://yunohost.org/#/vpn_advantage'>https://yunohost.org/#/vpn_advantage</a><br> - Puoi anche prendere in considerazione di cambiare <a href='https://yunohost.org/#/isp'>internet provider</a>",
"diagnosis_mail_ehlo_wrong_details": "L'EHLO ricevuto dalla diagnostica remota su IPv{ipversion} è differente dal dominio del tuo server.<br>EHLO ricevuto: <code>{wrong_ehlo}</code><br>EHLO atteso: <code>{right_ehlo}</code><br>La causa più comune di questo problema è la porta 25 <a href='https://yunohost.org/isp_box_config'>non correttamente inoltrata al tuo server</a>. Oppure assicurati che nessun firewall o reverse-proxy stia interferendo.",
"diagnosis_mail_blacklist_ok": "Gli IP e i domini utilizzati da questo server non sembrano essere nelle blacklist",
"diagnosis_mail_fcrdns_different_from_ehlo_domain_details": "DNS invero corrente: <code>{rdns_domain}</code><br>Valore atteso: <code>{ehlo_domain}</code>",
"diagnosis_mail_fcrdns_different_from_ehlo_domain": "Il DNS inverso non è correttamente configurato su IPv{ipversion}. Alcune email potrebbero non essere spedite o segnalate come SPAM.",
"diagnosis_mail_fcrdns_nok_alternatives_6": "Alcuni provider non permettono di configurare un DNS inverso (o non è configurato bene...). Se il tuo DNS inverso è correttamente configurato per IPv4, puoi provare a disabilitare l'utilizzo di IPv6 durante l'invio mail eseguendo <cmd>yunohost settings set smtp.allow_ipv6 -v off</cmd>. NB: se esegui il comando non sarà più possibile inviare o ricevere email da i pochi IPv6-only server mail esistenti.",
"yunohost_postinstall_end_tip": "La post-installazione è completata! Per rifinire il tuo setup, considera di:\n\t- aggiungere il primo utente nella sezione 'Utenti' del webadmin (o eseguendo da terminale 'yunohost user create <username>');\n\t- eseguire una diagnosi alla ricerca di problemi nella sezione 'Diagnosi' del webadmin (o eseguendo da terminale 'yunohost diagnosis run');\n\t- leggere 'Finalizing your setup' e 'Getting to know Yunohost' nella documentazione admin: https://yunohost.org/admindoc.",
"user_already_exists": "L'utente '{user}' esiste già",
"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…",
"tools_upgrade_cant_both": "Impossibile aggiornare sia il sistema e le app nello stesso momento",
"tools_upgrade_at_least_one": "Specifica '--apps', o '--system'",
"show_tile_cant_be_enabled_for_regex": "Non puoi abilitare 'show_tile' in questo momento, perché l'URL del permesso '{permission}' è una regex",
"show_tile_cant_be_enabled_for_url_not_defined": "Non puoi abilitare 'show_tile' in questo momento, devi prima definire un URL per il permesso '{permission}'",
"service_reloaded_or_restarted": "Il servizio '{service:s}' è stato ricaricato o riavviato",
"service_reload_or_restart_failed": "Impossibile ricaricare o riavviare il servizio '{service:s}'\n\nUltimi registri del servizio: {logs:s}",
"service_restarted": "Servizio '{service:s}' riavviato",
"service_restart_failed": "Impossibile riavviare il servizio '{service:s}'\n\nUltimi registri del servizio: {logs:s}",
"service_reloaded": "Servizio '{service:s}' ricaricato",
"service_reload_failed": "Impossibile ricaricare il servizio '{service:s}'\n\nUltimi registri del servizio: {logs:s}",
"service_regen_conf_is_deprecated": "'yunohost service regen-conf' è obsoleto! Per favore usa 'yunohost tools regen-conf' al suo posto.",
"service_description_yunohost-firewall": "Gestisce l'apertura e la chiusura delle porte ai servizi",
"service_description_yunohost-api": "Gestisce l'interazione tra l'interfaccia web YunoHost ed il sistema",
"service_description_ssh": "Ti consente di accedere da remoto al tuo server attraverso il terminale (protocollo SSH)",
"service_description_slapd": "Memorizza utenti, domini e info correlate",
"service_description_rspamd": "Filtra SPAM, e altre funzionalità legate alle mail",
"service_description_redis-server": "Un database specializzato usato per un veloce accesso ai dati, task queue, e comunicazioni tra programmi",
"service_description_postfix": "Usato per inviare e ricevere email",
"service_description_php7.3-fpm": "Esegue app scritte in PHP con NGINX",
"service_description_nginx": "Serve o permette l'accesso a tutti i siti pubblicati sul tuo server",
"service_description_mysql": "Memorizza i dati delle app (database SQL)",
"service_description_metronome": "Gestisce gli account di messaggistica instantanea XMPP",
"service_description_fail2ban": "Ti protegge dal brute-force e altri tipi di attacchi da Internet",
"service_description_dovecot": "Consente ai client mail di accedere/recuperare le email (via IMAP e POP3)",
"service_description_dnsmasq": "Gestisce la risoluzione dei domini (DNS)",
"service_description_avahi-daemon": "Consente di raggiungere il tuo server eseguendo 'yunohost.local' sulla tua LAN",
"server_reboot_confirm": "Il server si riavvierà immediatamente, sei sicuro? [{answers:s}]",
"server_reboot": "Il server si riavvierà",
"server_shutdown_confirm": "Il server si spegnerà immediatamente, sei sicuro? [{answers:s}]",
"server_shutdown": "Il server si spegnerà",
"root_password_replaced_by_admin_password": "La tua password di root è stata sostituita dalla tua password d'amministratore.",
"root_password_desynchronized": "La password d'amministratore è stata cambiata, ma YunoHost non ha potuto propagarla alla password di root!",
"restore_system_part_failed": "Impossibile ripristinare la sezione di sistema '{part:s}'",
"restore_removing_tmp_dir_failed": "Impossibile rimuovere una vecchia directory temporanea",
"restore_not_enough_disk_space": "Spazio libero insufficiente (spazio: {free_space:d}B, necessario: {needed_space:d}B, margine di sicurezza: {margin:d}B)",
"restore_may_be_not_enough_disk_space": "Il tuo sistema non sembra avere abbastanza spazio (libero: {free_space:d}B, necessario: {needed_space:d}B, margine di sicurezza: {margin:d}B)",
"restore_extracting": "Sto estraendo i file necessari dall'archivio…",
"restore_already_installed_apps": "Le seguenti app non possono essere ripristinate perché sono già installate: {apps}",
"regex_with_only_domain": "Non puoi usare una regex per il dominio, solo per i percorsi",
"regex_incompatible_with_tile": "/!\\ Packagers! Il permesso '{permission}' ha show_tile impostato su 'true' e perciò non è possibile definire un URL regex per l'URL principale",
"regenconf_need_to_explicitly_specify_ssh": "La configurazione ssh è stata modificata manualmente, ma devi specificare la categoria 'ssh' con --force per applicare le modifiche.",
"regenconf_pending_applying": "Applico le configurazioni in attesa per la categoria '{category}'...",
"regenconf_failed": "Impossibile rigenerare la configurazione per le categorie: {categories}",
"regenconf_dry_pending_applying": "Controllo configurazioni in attesa che potrebbero essere applicate alla categoria '{category}'…",
"regenconf_would_be_updated": "La configurazione sarebbe stata aggiornata per la categoria '{category}'",
"regenconf_updated": "Configurazione aggiornata per '{category}'",
"regenconf_up_to_date": "Il file di configurazione è già aggiornato per la categoria '{category}'",
"regenconf_now_managed_by_yunohost": "Il file di configurazione '{conf}' da adesso è gestito da YunoHost (categoria {category}).",
"regenconf_file_updated": "File di configurazione '{conf}' aggiornato",
"regenconf_file_removed": "File di configurazione '{conf}' rimosso",
"regenconf_file_remove_failed": "Impossibile rimuovere il file di configurazione '{conf}'",
"regenconf_file_manually_removed": "Il file di configurazione '{conf}' è stato rimosso manualmente, e non sarà generato",
"regenconf_file_manually_modified": "Il file di configurazione '{conf}' è stato modificato manualmente e non sarà aggiornato",
"regenconf_file_kept_back": "Il file di configurazione '{conf}' dovrebbe esser stato cancellato da regen-conf (categoria {category}), ma non è così.",
"regenconf_file_copy_failed": "Impossibile copiare il nuovo file di configurazione da '{new}' a '{conf}'",
"regenconf_file_backed_up": "File di configurazione '{conf}' salvato in '{backup}'",
"permission_require_account": "Il permesso {permission} ha senso solo per gli utenti con un account, quindi non può essere attivato per i visitatori.",
"permission_protected": "Il permesso {permission} è protetto. Non puoi aggiungere o rimuovere il gruppo visitatori dal permesso.",
"permission_updated": "Permesso '{permission:s}' aggiornato",
"permission_update_failed": "Impossibile aggiornare il permesso '{permission}': {error}",
"permission_not_found": "Permesso '{permission:s}' non trovato",
"permission_deletion_failed": "Impossibile cancellare il permesso '{permission}': {error}",
"permission_deleted": "Permesso '{permission:s}' cancellato",
"permission_currently_allowed_for_all_users": "Il permesso è attualmente garantito a tutti gli utenti oltre gli altri gruppi. Probabilmente vuoi o rimuovere il permesso 'all_user' o rimuovere gli altri gruppi per cui è garantito attualmente.",
"permission_creation_failed": "Impossibile creare i permesso '{permission}': {error}",
"permission_created": "Permesso '{permission:s}' creato",
"permission_cannot_remove_main": "Non è possibile rimuovere un permesso principale",
"permission_already_up_to_date": "Il permesso non è stato aggiornato perché la richiesta di aggiunta/rimozione è già coerente con lo stato attuale.",
"permission_already_exist": "Permesso '{permission}' esiste già",
"permission_already_disallowed": "Il gruppo '{group}' ha già il permesso '{permission}' disabilitato",
"permission_already_allowed": "Il gruppo '{group}' ha già il permesso '{permission}' abilitato",
"pattern_password_app": "Mi spiace, le password non possono contenere i seguenti caratteri: {forbidden_chars}",
"pattern_email_forward": "Dev'essere un indirizzo mail valido, simbolo '+' accettato (es: tizio+tag@example.com)",
"operation_interrupted": "L'operazione è stata interrotta manualmente?",
"invalid_number": "Dev'essere un numero",
"migrations_to_be_ran_manually": "Migrazione {id} dev'essere eseguita manualmente. Vai in Strumenti → Migrazioni nella pagina webadmin, o esegui `yunohost tools migrations migrate`.",
"migrations_success_forward": "Migrazione {id} completata",
"migrations_skip_migration": "Salto migrazione {id}...",
"migrations_running_forward": "Eseguo migrazione {id}...",
"migrations_pending_cant_rerun": "Queste migrazioni sono ancora in attesa, quindi non possono essere eseguite nuovamente: {ids}",
"migrations_not_pending_cant_skip": "Queste migrazioni non sono in attesa, quindi non possono essere saltate: {ids}",
"migrations_no_such_migration": "Non esiste una migrazione chiamata '{id}'",
"migrations_no_migrations_to_run": "Nessuna migrazione da eseguire",
"migrations_need_to_accept_disclaimer": "Per eseguire la migrazione {id}, devi accettare il disclaimer seguente:\n---\n{disclaimer}\n---\nSe accetti di eseguire la migrazione, per favore reinserisci il comando con l'opzione '--accept-disclaimer'.",
"migrations_must_provide_explicit_targets": "Devi specificare i target quando utilizzi '--skip' o '--force-rerun'",
"migrations_migration_has_failed": "Migrazione {id} non completata, annullamento. Errore: {exception}",
"migrations_loading_migration": "Caricamento migrazione {id}...",
"migrations_list_conflict_pending_done": "Non puoi usare sia '--previous' e '--done' allo stesso tempo.",
"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}",
"migration_0019_slapd_config_will_be_overwritten": "Sembra che tu abbia modificato manualmente la configurazione slapd. Per questa importante migrazione, YunoHost deve forzare l'aggiornamento della configurazione slapd. I file originali verranno back-uppati in {conf_backup_folder}.",
"migration_0019_rollback_success": "Sistema ripristinato.",
"migration_0019_migration_failed_trying_to_rollback": "Impossibile migrare... sto cercando di ripristinare il sistema.",
"migration_0019_can_not_backup_before_migration": "Il backup del sistema non è stato completato prima della migrazione. Errore: {error:s}",
"migration_0019_backup_before_migration": "Creando un backup del database LDAP e delle impostazioni delle app prima dell'effettiva migrazione.",
"migration_0019_add_new_attributes_in_ldap": "Aggiungi nuovi attributi ai permessi nel database LDAP",
"migration_0018_failed_to_reset_legacy_rules": "Impossibile resettare le regole iptables legacy: {error}",
"migration_0018_failed_to_migrate_iptables_rules": "Migrazione fallita delle iptables legacy a nftables: {error}",
"migration_0017_not_enough_space": "Libera abbastanza spazio in {path} per eseguire la migrazione.",
"migration_0017_postgresql_11_not_installed": "PostgreSQL 9.6 è installato, ma non PostgreSQL 11 ?! Qualcosa di strano potrebbe esser successo al tuo sistema :'( ...",
"migration_0017_postgresql_96_not_installed": "PostgreSQL non è stato installato sul tuo sistema. Nulla da fare.",
"migration_0015_weak_certs": "I seguenti certificati utilizzano ancora un algoritmo di firma debole e dovrebbero essere aggiornati per essere compatibili con la prossima versione di nginx: {certs}",
"migration_0015_cleaning_up": "Sto pulendo la cache e i pacchetti non più utili...",
"migration_0015_specific_upgrade": "Inizio l'aggiornamento dei pacchetti di sistema che necessitano di essere aggiornati da soli...",
"migration_0015_modified_files": "Attenzioni, i seguenti file sembrano esser stati modificati manualmente, e potrebbero essere sovrascritti dopo l'aggiornamento: {manually_modified_files}",
"migration_0015_problematic_apps_warning": "Alcune applicazioni potenzialmente problematiche sono state rilevate nel sistema. Sembra che non siano state installate attraverso il catalogo app YunoHost, o non erano flaggate come 'working'/'funzionanti'. Di conseguenza, non è possibile garantire che funzioneranno ancora dopo l'aggiornamento: {problematic_apps}",
"migration_0015_general_warning": "Attenzione, sappi che questa migrazione è un'operazione delicata. Il team YunoHost ha fatto del suo meglio nel controllarla e testarla, ma le probabilità che il sistema e/o qualche app si danneggi non sono nulle.\n\nPerciò, ti raccomandiamo di:\n\t- Effettuare un backup di tutti i dati e app importanti. Maggiori informazioni su https://yunohost.org/backup;\n\t- Sii paziente dopo aver lanciato l'operazione: in base alla tua connessione internet e al tuo hardware, potrebbero volerci alcune ore per aggiornare tutto.",
"migration_0015_system_not_fully_up_to_date": "Il tuo sistema non è completamente aggiornato. Esegui un aggiornamento classico prima di lanciare la migrazione a Buster.",
"migration_0015_not_enough_free_space": "Poco spazio libero disponibile in /var/! Dovresti avere almeno 1GB libero per effettuare questa migrazione.",
"migration_0015_not_stretch": "La distribuzione Debian corrente non è Stretch!",
"migration_0015_yunohost_upgrade": "Inizio l'aggiornamento del core di YunoHost...",
"migration_0015_still_on_stretch_after_main_upgrade": "Qualcosa è andato storto durante l'aggiornamento principale, il sistema sembra essere ancora su Debian Stretch",
"migration_0015_main_upgrade": "Inizio l'aggiornamento principale...",
"migration_0015_patching_sources_list": "Applico le patch a sources.lists...",
"migration_0015_start": "Inizio migrazione a Buster",
"migration_0011_failed_to_remove_stale_object": "Impossibile rimuovere l'oggetto {dn}: {error}",
"migration_0011_update_LDAP_schema": "Aggiornado lo schema LDAP...",
"migration_0011_update_LDAP_database": "Aggiornando il database LDAP...",
"migration_0011_migrate_permission": "Migrando permessi dalle impostazioni delle app a LDAP...",
"migration_0011_LDAP_update_failed": "Impossibile aggiornare LDAP. Errore: {error:s}",
"migration_0011_create_group": "Sto creando un gruppo per ogni utente...",
"migration_description_0019_extend_permissions_features": "Estendi il sistema di gestione dei permessi app",
"migration_description_0018_xtable_to_nftable": "Migra le vecchie regole di traffico network sul nuovo sistema nftable",
"migration_description_0017_postgresql_9p6_to_11": "Migra i database da PostgreSQL 9.6 a 11",
"migration_description_0016_php70_to_php73_pools": "MIgra i file di configurazione 'pool' di php7.0-fpm su php7.3",
"migration_description_0015_migrate_to_buster": "Aggiorna il sistema a Debian Buster e YunoHost 4.X",
"migrating_legacy_permission_settings": "Impostando le impostazioni legacy dei permessi..",
"mailbox_disabled": "E-mail disabilitate per l'utente {user:s}",
"log_user_permission_reset": "Resetta il permesso '{}'",
"log_user_permission_update": "Aggiorna gli accessi del permesso '{}'",
"log_user_group_update": "Aggiorna il gruppo '{}'",
"log_user_group_delete": "Cancella il gruppo '{}'",
"log_user_group_create": "Crea il gruppo '[}'",
"log_permission_url": "Aggiorna l'URL collegato al permesso '{}'",
"log_permission_delete": "Cancella permesso '{}'",
"log_permission_create": "Crea permesso '{}'",
"log_app_config_apply": "Applica la configurazione all'app '{}'",
"log_app_config_show_panel": "Mostra il pannello di configurazione dell'app '{}'",
"log_app_action_run": "Esegui l'azione dell'app '{}'",
"log_operation_unit_unclosed_properly": "Operazion unit non è stata chiusa correttamente",
"invalid_regex": "Regex invalida:'{regex:s}'",
"hook_list_by_invalid": "Questa proprietà non può essere usata per listare gli hooks",
"hook_json_return_error": "Impossibile leggere la risposta del hook {path:s}. Errore: {msg:s}. Contenuto raw: {raw_content}",
"group_user_not_in_group": "L'utente {user} non è nel gruppo {group}",
"group_user_already_in_group": "L'utente {user} è già nel gruppo {group}",
"group_update_failed": "Impossibile aggiornare il gruppo '{group}': {error}",
"group_updated": "Gruppo '{group}' aggiornato",
"group_unknown": "Gruppo '{group:s}' sconosciuto",
"group_deletion_failed": "Impossibile cancellare il gruppo '{group}': {error}",
"group_deleted": "Gruppo '{group}' cancellato",
"group_cannot_be_deleted": "Il gruppo {group} non può essere eliminato manualmente.",
"group_cannot_edit_primary_group": "Il gruppo '{group}' non può essere modificato manualmente. È il gruppo principale con lo scopo di contenere solamente uno specifico utente.",
"group_cannot_edit_visitors": "Il gruppo 'visitatori' non può essere modificato manualmente. È un gruppo speciale che rappresenta i visitatori anonimi",
"group_cannot_edit_all_users": "Il gruppo 'all_users' non può essere modificato manualmente. È un gruppo speciale che contiene tutti gli utenti registrati in YunoHost",
"group_creation_failed": "Impossibile creare il gruppo '{group}': {error}",
"group_created": "Gruppo '{group}' creato",
"group_already_exist_on_system_but_removing_it": "Il gruppo {group} esiste già tra i gruppi di sistema, ma YunoHost lo cancellerà...",
"group_already_exist_on_system": "Il gruppo {group} esiste già tra i gruppi di sistema",
"group_already_exist": "Il gruppo {group} esiste già",
"global_settings_setting_backup_compress_tar_archives": "Quando creo nuovi backup, usa un archivio (.tar.gz) al posto di un archivio non compresso (.tar). NB: abilitare quest'opzione significa create backup più leggeri, ma la procedura durerà di più e il carico CPU sarà maggiore.",
"global_settings_setting_smtp_relay_password": "Password del relay SMTP",
"global_settings_setting_smtp_relay_user": "User account del relay SMTP",
"global_settings_setting_smtp_relay_port": "Porta del relay SMTP",
"global_settings_setting_smtp_relay_host": "Utilizza SMTP relay per inviare mail al posto di questa instanza yunohost. Utile se sei in una di queste situazioni: la tua porta 25 è bloccata dal tuo provider ISP o VPS; hai un IP residenziale listato su DUHL; non sei puoi configurare il DNS inverso; oppure questo server non è direttamente esposto a Internet e vuoi usarne un'altro per spedire email.",
"global_settings_setting_smtp_allow_ipv6": "Permetti l'utilizzo di IPv6 per ricevere e inviare mail",
"global_settings_setting_pop3_enabled": "Abilita il protocollo POP3 per il server mail",
"dyndns_provider_unreachable": "Incapace di raggiungere il provider DynDNS {provider}: o il tuo YunoHost non è connesso ad internet o il server dynette è down.",
"dpkg_lock_not_available": "Impossibile eseguire il comando in questo momento perché un altro programma sta bloccando dpkg (il package manager di sistema)",
"domain_name_unknown": "Dominio '{domain}' sconosciuto",
"domain_cannot_remove_main_add_new_one": "Non puoi rimuovere '{domain:s}' visto che è il dominio principale nonché il tuo unico dominio, devi prima aggiungere un altro dominio eseguendo 'yunohost domain add <altro-dominio.com>', impostarlo come dominio principale con 'yunohost domain main-domain n <altro-dominio.com>', e solo allora potrai rimuovere il dominio '{domain:s}' eseguendo 'yunohost domain remove {domain:s}'.'",
"domain_cannot_add_xmpp_upload": "Non puoi aggiungere domini che iniziano per 'xmpp-upload.'. Questo tipo di nome è riservato per la funzionalità di upload XMPP integrata in YunoHost.",
"diagnosis_processes_killed_by_oom_reaper": "Alcuni processi sono stati terminati dal sistema che era a corto di memoria. Questo è un sintomo di insufficienza di memoria nel sistema o di un processo che richiede troppa memoria. Lista dei processi terminati:\n{kills_summary}",
"diagnosis_never_ran_yet": "Sembra che questo server sia stato impostato recentemente e non è presente nessun report di diagnostica. Dovresti partire eseguendo una diagnostica completa, da webadmin o da terminale con il comando 'yunohost diagnosis run'.",
"diagnosis_unknown_categories": "Le seguenti categorie sono sconosciute: {categories}",
"diagnosis_http_nginx_conf_not_up_to_date_details": "Per sistemare, ispeziona le differenze nel terminale eseguendo <cmd>yunohost tools regen-conf nginx --dry-run --with-diff</cmd> e se ti va bene, applica le modifiche con <cmd>yunohost tools regen-conf ngix --force</cmd>.",
"diagnosis_http_nginx_conf_not_up_to_date": "La configurazione nginx di questo dominio sembra esser stato modificato manualmente, e impedisce a YunoHost di controlalre se è raggiungibile su HTTP.",
"diagnosis_http_partially_unreachable": "Il dominio {domain} sembra irraggiungibile attraverso HTTP dall'esterno della tua LAN su IPv{failed}, anche se funziona su IPv{passed}.",
"diagnosis_http_unreachable": "Il dominio {domain} sembra irraggiungibile attraverso HTTP dall'esterno della tua LAN.",
"diagnosis_http_bad_status_code": "Sembra che un altro dispositivo (forse il tuo router internet) abbia risposto al posto del tuo server<br> 1. La causa più comune è la porta 80 (e 443) <a href='https://yunohost.org/isp_box_config'>non correttamente inoltrata al tuo server</a>.<br> 2. Su setup più complessi: assicurati che nessun firewall o reverse-proxy stia interferendo.",
"diagnosis_http_connection_error": "Errore connessione: impossibile connettersi al dominio richiesto, probabilmente è irraggiungibile.",
"diagnosis_http_timeout": "Andato in time-out cercando di contattare il server dall'esterno. Sembra essere irraggiungibile.<br> 1. La causa più comune è la porta 80 (e 443) <a href='https://yunohost.org/isp_box_config'>non correttamente inoltrata al tuo server</a>.<br> 2. Dovresti accertarti che il servizio nginx sia attivo.<br> 3. Su setup più complessi: assicurati che nessun firewall o reverse-proxy stia interferendo.",
"diagnosis_http_ok": "Il dominio {domain} è raggiungibile attraverso HTTP al di fuori della tua LAN.",
"diagnosis_http_could_not_diagnose_details": "Errore: {error}",
"diagnosis_http_could_not_diagnose": "Non posso controllare se i domini sono raggiungibili dall'esterno su IPv{ipversion}.",
"diagnosis_http_hairpinning_issue_details": "Questo probabilmente è causato dal tuo ISP router. Come conseguenza, persone al di fuori della tua LAN saranno in grado di accedere al tuo server come atteso, ma non le persone all'interno della LAN (tipo te, immagino) utilizzando il dominio internet o l'IP globale. Dovresti essere in grado di migliorare la situazione visitando <a href='https://yunohost.org/dns_local_network'>https://yunohost.org/dns_local_network</a>",
"diagnosis_http_hairpinning_issue": "La tua rete locale sembra non avere \"hairpinning\" abilitato.",
"diagnosis_ports_forwarding_tip": "Per sistemare questo problema, probabilmente dovresti configurare l'inoltro della porta sul tuo router internet come descritto qui <a href='https://yunohost.org/isp_box_config'>https://yunohost.org/isp_box_config</a>",
"diagnosis_ports_needed_by": "Esporre questa porta è necessario per le feature di {category} (servizio {service})",
"diagnosis_ports_ok": "La porta {port} è raggiungibile dall'esterno.",
"diagnosis_ports_partially_unreachable": "La porta {port} non è raggiungibile dall'esterno su IPv{failed}.",
"diagnosis_ports_unreachable": "La porta {port} non è raggiungibile dall'esterno.",
"diagnosis_ports_could_not_diagnose_details": "Errore: {error}",
"diagnosis_ports_could_not_diagnose": "Impossibile diagnosticare se le porte sono raggiungibili dall'esterno su IPv{ipversion}.",
"diagnosis_description_regenconf": "Configurazioni sistema",
"diagnosis_description_mail": "Email",
"diagnosis_description_web": "Web",
"diagnosis_description_ports": "Esposizione porte",
"diagnosis_description_systemresources": "Risorse di sistema",
"diagnosis_description_services": "Check stato servizi",
"diagnosis_description_dnsrecords": "Record DNS",
"diagnosis_description_ip": "Connettività internet",
"diagnosis_description_basesystem": "Sistema base",
"diagnosis_security_vulnerable_to_meltdown_details": "Per sistemare, dovresti aggiornare il tuo sistema e fare il reboot per caricare il nuovo kernel linux (o contatta il tuo server provider se non funziona). Visita https://meltdownattack.com/ per maggiori info.",
"diagnosis_security_vulnerable_to_meltdown": "Sembra che tu sia vulnerabile alla vulnerabilità di sicurezza critica \"Meltdown\"",
"diagnosis_regenconf_manually_modified_details": "Questo è probabilmente OK se sai cosa stai facendo! YunoHost smetterà di aggiornare automaticamente questo file... Ma sappi che gli aggiornamenti di YunoHost potrebbero contenere importanti cambiamenti. Se vuoi, puoi controllare le differente con <cmd>yunohost tools regen-conf {category} --dry-run --with-diff</cmd> e forzare il reset della configurazione raccomandata con <cmd>yunohost tools regen-conf {category} --force</cmd>",
"diagnosis_regenconf_manually_modified": "Il file di configurazione <code>{file}</code> sembra esser stato modificato manualmente.",
"diagnosis_regenconf_allgood": "Tutti i file di configurazione sono allineati con le configurazioni raccomandate!",
"diagnosis_mail_queue_too_big": "Troppe email in attesa nella coda ({nb_pending} emails)",
"diagnosis_mail_queue_unavailable_details": "Errore: {error}",
"diagnosis_mail_queue_unavailable": "Impossibile consultare il numero di email in attesa",
"diagnosis_mail_queue_ok": "{nb_pending} emails in attesa nelle code",
"diagnosis_mail_blacklist_website": "Dopo aver identificato il motivo e averlo risolto, sentiti libero di chiedere di rimuovere il tuo IP o dominio da {blacklist_website}",
"diagnosis_mail_blacklist_reason": "Il motivo della blacklist è: {reason}",
"diagnosis_mail_blacklist_listed_by": "Il tuo IP o dominio <code>{item}</code> è nella blacklist {blacklist_name}"
} }

View file

@ -559,17 +559,17 @@
"diagnosis_services_running": "Lo servici {service} es lançat!", "diagnosis_services_running": "Lo servici {service} es lançat!",
"diagnosis_services_conf_broken": "La configuracion es copada pel servici {service}!", "diagnosis_services_conf_broken": "La configuracion es copada pel servici {service}!",
"diagnosis_ports_needed_by": "Es necessari quaqueste pòrt siá accessible pel servici {service}", "diagnosis_ports_needed_by": "Es necessari quaqueste pòrt siá accessible pel servici {service}",
"diagnosis_diskusage_low": "Lo lòc demmagazinatge {mountpoint} (sul periferic {device}) a solament {free} ({free_percent}%). Siatz prudent.", "diagnosis_diskusage_low": "Lo lòc demmagazinatge <code>{mountpoint}</code> (sul periferic <code>{device}</code>) a solament {free} ({free_percent}%). Siatz prudent.",
"migration_description_0014_remove_app_status_json": "Suprimir los fichièrs daplicacion status.json eretats", "migration_description_0014_remove_app_status_json": "Suprimir los fichièrs daplicacion status.json eretats",
"dyndns_provider_unreachable": "Impossible datenher lo provesidor Dyndns: siá vòstre YunoHost es pas corrèctament connectat a Internet siá lo servidor dynette es copat.", "dyndns_provider_unreachable": "Impossible datenher lo provesidor Dyndns: siá vòstre YunoHost es pas corrèctament connectat a Internet siá lo servidor dynette es copat.",
"diagnosis_services_bad_status_tip": "Podètz ensajar de reaviar lo servici, e se non fonciona pas, podètz agachar los jornals en utilizant «yunohost service log {service} » o via la seccion «Servicis» de pas la pagina web dadministracion.", "diagnosis_services_bad_status_tip": "Podètz ensajar de <a href='#/services/{service}'>reaviar lo servici</a>, e se non fonciona pas, podètz agachar <a href='#/services/{service}'>los jornals de servici a la pagina web dadministracion</a>(en linha de comanda podètz utilizar <cmd>yunohost service restart {service}</cmd> e <cmd>yunohost service log {service}</cmd>).",
"diagnosis_http_connection_error": "Error de connexion: connexion impossibla al domeni demandat, benlèu ques pas accessible.", "diagnosis_http_connection_error": "Error de connexion: connexion impossibla al domeni demandat, benlèu ques pas accessible.",
"group_user_already_in_group": "Lutilizaire {user} es ja dins lo grop « {group} »", "group_user_already_in_group": "Lutilizaire {user} es ja dins lo grop « {group} »",
"diagnosis_ip_broken_resolvconf": "La resolucion del nom de domeni sembla copada sul servidor, poiriá èsser ligada al fait que /etc/resolv.conf manda pas a 127.0.0.1.", "diagnosis_ip_broken_resolvconf": "La resolucion del nom de domeni sembla copada sul servidor, poiriá èsser ligada al fait que /etc/resolv.conf manda pas a 127.0.0.1.",
"diagnosis_ip_weird_resolvconf": "La resolucion del nom de domeni sembla foncionar, mas siatz prudent en utilizant un fichièr /etc/resolv.con personalizat.", "diagnosis_ip_weird_resolvconf": "La resolucion del nom de domeni sembla foncionar, mas siatz prudent en utilizant un fichièr /etc/resolv.con personalizat.",
"diagnosis_diskusage_verylow": "Lo lòc demmagazinatge {mountpoint} (sul periferic {device}) a solament {free} ({free_percent}%). Deuriatz considerar de liberar un pauc despaci.", "diagnosis_diskusage_verylow": "Lo lòc demmagazinatge <code>{mountpoint}</code> (sul periferic <code>{device}</code>) a solament {free} ({free_percent}%). Deuriatz considerar de liberar un pauc despaci.",
"global_settings_setting_pop3_enabled": "Activar lo protocòl POP3 pel servidor de corrièr", "global_settings_setting_pop3_enabled": "Activar lo protocòl POP3 pel servidor de corrièr",
"diagnosis_diskusage_ok": "Lo lòc demmagazinatge {mountpoint} (sul periferic {device}) a encara {free} ({free_percent}%) de liure!", "diagnosis_diskusage_ok": "Lo lòc demmagazinatge <code>{mountpoint}</code> (sul periferic <code>{device}</code>) a encara {free} ({free_percent}%) de liure!",
"diagnosis_swap_none": "Lo sistèma a pas cap de memòria descambi. Auriatz de considerar dajustar almens {recommended} descambi per evitar las situacions ont lo sistèma manca de memòria.", "diagnosis_swap_none": "Lo sistèma a pas cap de memòria descambi. Auriatz de considerar dajustar almens {recommended} descambi per evitar las situacions ont lo sistèma manca de memòria.",
"diagnosis_swap_notsomuch": "Lo sistèma a solament {total} de memòria descambi. Auriatz de considerar dajustar almens {recommended} descambi per evitar las situacions ont lo sistèma manca de memòria.", "diagnosis_swap_notsomuch": "Lo sistèma a solament {total} de memòria descambi. Auriatz de considerar dajustar almens {recommended} descambi per evitar las situacions ont lo sistèma manca de memòria.",
"diagnosis_description_web": "Web", "diagnosis_description_web": "Web",
@ -590,5 +590,8 @@
"app_manifest_install_ask_password": "Causissètz lo senhal administrator per aquesta aplicacion", "app_manifest_install_ask_password": "Causissètz lo senhal administrator per aquesta aplicacion",
"app_manifest_install_ask_path": "Causissètz lo camin ont volètz installar aquesta aplicacion", "app_manifest_install_ask_path": "Causissètz lo camin ont volètz installar aquesta aplicacion",
"app_manifest_install_ask_domain": "Causissètz lo domeni ont volètz installar aquesta aplicacion", "app_manifest_install_ask_domain": "Causissètz lo domeni ont volètz installar aquesta aplicacion",
"app_argument_password_no_default": "Error pendent lanalisi de largument del senhal « {name} » : largument de senhal pòt pas aver de valor per defaut per de rason de seguretat" "app_argument_password_no_default": "Error pendent lanalisi de largument del senhal « {name} » : largument de senhal pòt pas aver de valor per defaut per de rason de seguretat",
"app_label_deprecated": "Aquesta comanda es estada renduda obsolèta. Mercés d'utilizar lo nòva \"yunohost user permission update\" per gerir letiquetada de l'aplication",
"additional_urls_already_removed": "URL addicionala {url:s} es ja estada elimida per la permission «#permission:s»",
"additional_urls_already_added": "URL addicionadal «{url:s}'» es ja estada aponduda per la permission «{permission:s}»"
} }

View file

@ -139,5 +139,6 @@
"backup_copying_to_organize_the_archive": "Copiando {size:s}MB para organizar o arquivo", "backup_copying_to_organize_the_archive": "Copiando {size:s}MB para organizar o arquivo",
"app_change_url_identical_domains": "O antigo e o novo domínio / url_path são idênticos ('{domain:s}{path:s}'), nada para fazer.", "app_change_url_identical_domains": "O antigo e o novo domínio / url_path são idênticos ('{domain:s}{path:s}'), nada para fazer.",
"password_too_simple_1": "A senha precisa ter pelo menos 8 caracteres", "password_too_simple_1": "A senha precisa ter pelo menos 8 caracteres",
"admin_password_too_long": "Escolha uma senha que contenha menos de 127 caracteres" "admin_password_too_long": "Escolha uma senha que contenha menos de 127 caracteres",
} "aborting": "Abortando."
}

View file

@ -154,15 +154,19 @@ def app_info(app, full=False):
raise YunohostError('app_not_installed', app=app, all_apps=_get_all_installed_apps_id()) raise YunohostError('app_not_installed', app=app, all_apps=_get_all_installed_apps_id())
local_manifest = _get_manifest_of_app(os.path.join(APPS_SETTING_PATH, app)) local_manifest = _get_manifest_of_app(os.path.join(APPS_SETTING_PATH, app))
permissions = user_permission_list(full=True, absolute_urls=True)["permissions"]
settings = _get_app_settings(app) settings = _get_app_settings(app)
ret = { ret = {
'description': _value_for_locale(local_manifest['description']), 'description': _value_for_locale(local_manifest['description']),
'name': local_manifest['name'], 'name': permissions.get(app + ".main", {}).get("label", local_manifest['name']),
'version': local_manifest.get('version', '-'), 'version': local_manifest.get('version', '-'),
} }
if "domain" in settings and "path" in settings:
ret["domain_path"] = settings["domain"] + settings["path"]
if not full: if not full:
return ret return ret
@ -177,9 +181,10 @@ def app_info(app, full=False):
ret['supports_backup_restore'] = (os.path.exists(os.path.join(APPS_SETTING_PATH, app, "scripts", "backup")) and ret['supports_backup_restore'] = (os.path.exists(os.path.join(APPS_SETTING_PATH, app, "scripts", "backup")) and
os.path.exists(os.path.join(APPS_SETTING_PATH, app, "scripts", "restore"))) os.path.exists(os.path.join(APPS_SETTING_PATH, app, "scripts", "restore")))
ret['supports_multi_instance'] = is_true(local_manifest.get("multi_instance", False)) ret['supports_multi_instance'] = is_true(local_manifest.get("multi_instance", False))
permissions = user_permission_list(full=True, absolute_urls=True)["permissions"]
ret['permissions'] = {p: i for p, i in permissions.items() if p.startswith(app + ".")} ret['permissions'] = {p: i for p, i in permissions.items() if p.startswith(app + ".")}
ret['label'] = permissions.get(app + ".main", {}).get("label") ret['label'] = permissions.get(app + ".main", {}).get("label")
if not ret['label']: if not ret['label']:
logger.warning("Failed to get label for app %s ?" % app) logger.warning("Failed to get label for app %s ?" % app)
return ret return ret
@ -189,19 +194,29 @@ def _app_upgradable(app_infos):
from packaging import version from packaging import version
# Determine upgradability # Determine upgradability
# In case there is neither update_time nor install_time, we assume the app can/has to be upgraded
# Firstly use the version to know if an upgrade is available app_in_catalog = app_infos.get("from_catalog")
app_is_in_catalog = bool(app_infos.get("from_catalog"))
installed_version = version.parse(app_infos.get("version", "0~ynh0")) installed_version = version.parse(app_infos.get("version", "0~ynh0"))
version_in_catalog = version.parse(app_infos.get("from_catalog", {}).get("manifest", {}).get("version", "0~ynh0")) version_in_catalog = version.parse(app_infos.get("from_catalog", {}).get("manifest", {}).get("version", "0~ynh0"))
if app_is_in_catalog and '~ynh' in str(installed_version) and '~ynh' in str(version_in_catalog): if not app_in_catalog:
return "url_required"
# Do not advertise upgrades for bad-quality apps
if not app_in_catalog.get("level", -1) >= 5 or app_in_catalog.get("state") != "working":
return "bad_quality"
# If the app uses the standard version scheme, use it to determine
# upgradability
if '~ynh' in str(installed_version) and '~ynh' in str(version_in_catalog):
if installed_version < version_in_catalog: if installed_version < version_in_catalog:
return "yes" return "yes"
else:
return "no"
if not app_is_in_catalog: # Legacy stuff for app with old / non-standard version numbers...
return "url_required"
# In case there is neither update_time nor install_time, we assume the app can/has to be upgraded
if not app_infos["from_catalog"].get("lastUpdate") or not app_infos["from_catalog"].get("git"): if not app_infos["from_catalog"].get("lastUpdate") or not app_infos["from_catalog"].get("git"):
return "url_required" return "url_required"
@ -360,13 +375,7 @@ def app_change_url(operation_logger, app, domain, path):
args_list.append(app) args_list.append(app)
# Prepare env. var. to pass to script # Prepare env. var. to pass to script
env_dict = _make_environment_dict(args_odict) env_dict = _make_environment_for_app_script(app, args=args_odict)
app_id, app_instance_nb = _parse_app_instance_name(app)
env_dict["YNH_APP_ID"] = app_id
env_dict["YNH_APP_INSTANCE_NAME"] = app
env_dict["YNH_APP_INSTANCE_NUMBER"] = str(app_instance_nb)
env_dict["YNH_APP_MANIFEST_VERSION"] = manifest.get("version", "?")
env_dict["YNH_APP_OLD_DOMAIN"] = old_domain env_dict["YNH_APP_OLD_DOMAIN"] = old_domain
env_dict["YNH_APP_OLD_PATH"] = old_path env_dict["YNH_APP_OLD_PATH"] = old_path
env_dict["YNH_APP_NEW_DOMAIN"] = domain env_dict["YNH_APP_NEW_DOMAIN"] = domain
@ -528,11 +537,7 @@ def app_upgrade(app=[], url=None, file=None, force=False):
args_list.append(app_instance_name) args_list.append(app_instance_name)
# Prepare env. var. to pass to script # Prepare env. var. to pass to script
env_dict = _make_environment_dict(args_odict) env_dict = _make_environment_for_app_script(app_instance_name, args=args_odict)
app_id, app_instance_nb = _parse_app_instance_name(app_instance_name)
env_dict["YNH_APP_ID"] = app_id
env_dict["YNH_APP_INSTANCE_NAME"] = app_instance_name
env_dict["YNH_APP_INSTANCE_NUMBER"] = str(app_instance_nb)
env_dict["YNH_APP_UPGRADE_TYPE"] = upgrade_type env_dict["YNH_APP_UPGRADE_TYPE"] = upgrade_type
env_dict["YNH_APP_MANIFEST_VERSION"] = str(app_new_version) env_dict["YNH_APP_MANIFEST_VERSION"] = str(app_new_version)
env_dict["YNH_APP_CURRENT_VERSION"] = str(app_current_version) env_dict["YNH_APP_CURRENT_VERSION"] = str(app_current_version)
@ -658,7 +663,7 @@ def app_install(operation_logger, app, label=None, args=None, no_remove_on_failu
from yunohost.hook import hook_add, hook_remove, hook_exec, hook_callback from yunohost.hook import hook_add, hook_remove, hook_exec, hook_callback
from yunohost.log import OperationLogger from yunohost.log import OperationLogger
from yunohost.permission import user_permission_list, user_permission_info, user_permission_update, permission_create, permission_url, permission_delete, permission_sync_to_user from yunohost.permission import user_permission_list, permission_create, permission_delete, permission_sync_to_user
from yunohost.regenconf import manually_modified_files from yunohost.regenconf import manually_modified_files
# Fetch or extract sources # Fetch or extract sources
@ -762,16 +767,6 @@ def app_install(operation_logger, app, label=None, args=None, no_remove_on_failu
# Apply dirty patch to make php5 apps compatible with php7 # Apply dirty patch to make php5 apps compatible with php7
_patch_legacy_php_versions(extracted_app_folder) _patch_legacy_php_versions(extracted_app_folder)
# Prepare env. var. to pass to script
env_dict = _make_environment_dict(args_odict)
env_dict["YNH_APP_ID"] = app_id
env_dict["YNH_APP_INSTANCE_NAME"] = app_instance_name
env_dict["YNH_APP_INSTANCE_NUMBER"] = str(instance_number)
env_dict["YNH_APP_MANIFEST_VERSION"] = manifest.get("version", "?")
# Start register change on system
operation_logger.extra.update({'env': env_dict})
# We'll check that the app didn't brutally edit some system configuration # We'll check that the app didn't brutally edit some system configuration
manually_modified_files_before_install = manually_modified_files() manually_modified_files_before_install = manually_modified_files()
@ -818,9 +813,21 @@ def app_install(operation_logger, app, label=None, args=None, no_remove_on_failu
os.system('cp -R %s/%s %s' % (extracted_app_folder, file_to_copy, app_setting_path)) os.system('cp -R %s/%s %s' % (extracted_app_folder, file_to_copy, app_setting_path))
# Initialize the main permission for the app # Initialize the main permission for the app
# After the install, if apps don't have a domain and path defined, the default url '/' is removed from the permission # The permission is initialized with no url associated, and with tile disabled
# For web app, the root path of the app will be added as url and the tile
# will be enabled during the app install. C.f. 'app_register_url()' below.
permission_create(app_instance_name + ".main", allowed=["all_users"], label=label, show_tile=False, protected=False) permission_create(app_instance_name + ".main", allowed=["all_users"], label=label, show_tile=False, protected=False)
# Prepare env. var. to pass to script
env_dict = _make_environment_for_app_script(app_instance_name, args=args_odict)
env_dict_for_logging = env_dict.copy()
for arg_name, arg_value_and_type in args_odict.items():
if arg_value_and_type[1] == "password":
del env_dict_for_logging["YNH_APP_ARG_%s" % arg_name.upper()]
operation_logger.extra.update({'env': env_dict_for_logging})
# Execute the app install script # Execute the app install script
install_failed = True install_failed = True
try: try:
@ -940,17 +947,6 @@ def app_install(operation_logger, app, label=None, args=None, no_remove_on_failu
os.system('chown -R root: %s' % app_setting_path) os.system('chown -R root: %s' % app_setting_path)
os.system('chown -R admin: %s/scripts' % app_setting_path) os.system('chown -R admin: %s/scripts' % app_setting_path)
# If the app haven't set the url of the main permission and domain and path is set set / as main url
app_settings = _get_app_settings(app_instance_name)
domain = app_settings.get('domain', None)
path = app_settings.get('path', None)
if domain and path and user_permission_info(app_instance_name + '.main')['url'] is None:
permission_url(app_instance_name + ".main", url='/', sync_perm=False)
if domain and path:
user_permission_update(app_instance_name + ".main", show_tile=True, sync_perm=False)
permission_sync_to_user()
logger.success(m18n.n('installation_complete')) logger.success(m18n.n('installation_complete'))
hook_callback('post_app_install', args=args_list, env=env_dict) hook_callback('post_app_install', args=args_list, env=env_dict)
@ -1188,7 +1184,7 @@ def app_makedefault(operation_logger, app, domain=None):
ssowat_conf['redirected_urls'][domain + '/'] = app_domain + app_path ssowat_conf['redirected_urls'][domain + '/'] = app_domain + app_path
write_to_json('/etc/ssowat/conf.json.persistent', ssowat_conf) write_to_json('/etc/ssowat/conf.json.persistent', ssowat_conf, sort_keys=True, indent=4)
os.system('chmod 644 /etc/ssowat/conf.json.persistent') os.system('chmod 644 /etc/ssowat/conf.json.persistent')
logger.success(m18n.n('ssowat_conf_updated')) logger.success(m18n.n('ssowat_conf_updated'))
@ -1216,15 +1212,14 @@ def app_setting(app, key, value=None, delete=False):
if is_legacy_permission_setting: if is_legacy_permission_setting:
from permission import user_permission_list, user_permission_update, permission_create, permission_delete, permission_url from yunohost.permission import user_permission_list, user_permission_update, permission_create, permission_delete, permission_url
permissions = user_permission_list(full=True)['permissions'] permissions = user_permission_list(full=True)['permissions']
permission_name = "%s.legacy_%s_uris" % (app, key.split('_')[0]) permission_name = "%s.legacy_%s_uris" % (app, key.split('_')[0])
permission = permissions.get(permission_name) permission = permissions.get(permission_name)
# GET # GET
if value is None and not delete: if value is None and not delete:
# FIXME FIXME FIXME : what about the main url ...? return ','.join(permission.get('uris', []) + permission['additional_urls']) if permission else None
return ','.join(permission['additional_urls']) if permission else None
# DELETE # DELETE
if delete: if delete:
@ -1277,7 +1272,7 @@ def app_setting(app, key, value=None, delete=False):
permission_url(permission_name, clear_urls=True, sync_perm=False) permission_url(permission_name, clear_urls=True, sync_perm=False)
permission_url(permission_name, add_url=new_urls) permission_url(permission_name, add_url=new_urls)
else: else:
from utils.legacy import legacy_permission_label from yunohost.utils.legacy import legacy_permission_label
# Let's create a "special" permission for the legacy settings # Let's create a "special" permission for the legacy settings
permission_create(permission=permission_name, permission_create(permission=permission_name,
# FIXME find a way to limit to only the user allowed to the main permission # FIXME find a way to limit to only the user allowed to the main permission
@ -1289,6 +1284,8 @@ def app_setting(app, key, value=None, delete=False):
show_tile=False, show_tile=False,
protected=True) protected=True)
return
# #
# Regular setting management # Regular setting management
# #
@ -1320,6 +1317,7 @@ def app_register_url(app, domain, path):
domain -- The domain on which the app should be registered (e.g. your.domain.tld) domain -- The domain on which the app should be registered (e.g. your.domain.tld)
path -- The path to be registered (e.g. /coffee) path -- The path to be registered (e.g. /coffee)
""" """
from yunohost.permission import permission_url, user_permission_update, permission_sync_to_user
domain, path = _normalize_domain_path(domain, path) domain, path = _normalize_domain_path(domain, path)
@ -1337,6 +1335,16 @@ def app_register_url(app, domain, path):
app_setting(app, 'domain', value=domain) app_setting(app, 'domain', value=domain)
app_setting(app, 'path', value=path) app_setting(app, 'path', value=path)
# Initially, the .main permission is created with no url at all associated
# When the app register/books its web url, we also add the url '/'
# (meaning the root of the app, domain.tld/path/)
# and enable the tile to the SSO, and both of this should match 95% of apps
# For more specific cases, the app is free to change / add urls or disable
# the tile using the permission helpers.
permission_url(app + ".main", url='/', sync_perm=False)
user_permission_update(app + ".main", show_tile=True, sync_perm=False)
permission_sync_to_user()
def app_ssowatconf(): def app_ssowatconf():
""" """
@ -1411,14 +1419,16 @@ def app_ssowatconf():
'permissions': permissions, 'permissions': permissions,
} }
with open('/etc/ssowat/conf.json', 'w+') as f: write_to_json('/etc/ssowat/conf.json', conf_dict, sort_keys=True, indent=4)
json.dump(conf_dict, f, sort_keys=True, indent=4)
from utils.legacy import translate_legacy_rules_in_ssowant_conf_json_persistent
translate_legacy_rules_in_ssowant_conf_json_persistent()
logger.debug(m18n.n('ssowat_conf_generated')) logger.debug(m18n.n('ssowat_conf_generated'))
def app_change_label(app, new_label): def app_change_label(app, new_label):
from permission import user_permission_update from yunohost.permission import user_permission_update
installed = _is_installed(app) installed = _is_installed(app)
if not installed: if not installed:
raise YunohostError('app_not_installed', app=app, all_apps=_get_all_installed_apps_id()) raise YunohostError('app_not_installed', app=app, all_apps=_get_all_installed_apps_id())
@ -1465,12 +1475,7 @@ def app_action_run(operation_logger, app, action, args=None):
args_odict = _parse_args_for_action(actions[action], args=args_dict) args_odict = _parse_args_for_action(actions[action], args=args_dict)
args_list = [value[0] for value in args_odict.values()] args_list = [value[0] for value in args_odict.values()]
app_id, app_instance_nb = _parse_app_instance_name(app) env_dict = _make_environment_for_app_script(app, args=args_odict, args_prefix="ACTION_")
env_dict = _make_environment_dict(args_odict, prefix="ACTION_")
env_dict["YNH_APP_ID"] = app_id
env_dict["YNH_APP_INSTANCE_NAME"] = app
env_dict["YNH_APP_INSTANCE_NUMBER"] = str(app_instance_nb)
env_dict["YNH_ACTION"] = action env_dict["YNH_ACTION"] = action
_, path = tempfile.mkstemp() _, path = tempfile.mkstemp()
@ -1481,7 +1486,7 @@ def app_action_run(operation_logger, app, action, args=None):
os.chmod(path, 700) os.chmod(path, 700)
if action_declaration.get("cwd"): if action_declaration.get("cwd"):
cwd = action_declaration["cwd"].replace("$app", app_id) cwd = action_declaration["cwd"].replace("$app", app)
else: else:
cwd = "/etc/yunohost/apps/" + app cwd = "/etc/yunohost/apps/" + app
@ -1567,7 +1572,7 @@ def app_config_show_panel(operation_logger, app):
option["default"] = parsed_values[generated_name] option["default"] = parsed_values[generated_name]
args_dict = _parse_args_in_yunohost_format( args_dict = _parse_args_in_yunohost_format(
[{option["name"]: parsed_values[generated_name]}], {option["name"]: parsed_values[generated_name]},
[option] [option]
) )
option["default"] = args_dict[option["name"]][0] option["default"] = args_dict[option["name"]][0]
@ -2492,8 +2497,10 @@ class PasswordArgumentParser(YunoHostArgumentFormatParser):
if any(char in question.value for char in self.forbidden_chars): if any(char in question.value for char in self.forbidden_chars):
raise YunohostError('pattern_password_app', forbidden_chars=self.forbidden_chars) raise YunohostError('pattern_password_app', forbidden_chars=self.forbidden_chars)
from yunohost.utils.password import assert_password_is_strong_enough # If it's an optional argument the value should be empty or strong enough
assert_password_is_strong_enough('user', question.value) if not question.optional or question.value:
from yunohost.utils.password import assert_password_is_strong_enough
assert_password_is_strong_enough('user', question.value)
return super(PasswordArgumentParser, self)._post_parse_value(question) return super(PasswordArgumentParser, self)._post_parse_value(question)
@ -2583,6 +2590,29 @@ class UserArgumentParser(YunoHostArgumentFormatParser):
error=m18n.n('user_unknown', user=question.value)) error=m18n.n('user_unknown', user=question.value))
class NumberArgumentParser(YunoHostArgumentFormatParser):
argument_type = "number"
default_value = ""
def parse_question(self, question, user_answers):
question = super(NumberArgumentParser, self).parse_question(question, user_answers)
if question.default is None:
question.default = 0
return question
def _post_parse_value(self, question):
if isinstance(question.value, int):
return super(NumberArgumentParser, self)._post_parse_value(question)
if isinstance(question.value, str) and question.value.isdigit():
return int(question.value)
raise YunohostError('app_argument_invalid', name=question.name,
error=m18n.n('invalid_number'))
class DisplayTextArgumentParser(YunoHostArgumentFormatParser): class DisplayTextArgumentParser(YunoHostArgumentFormatParser):
argument_type = "display_text" argument_type = "display_text"
@ -2597,6 +2627,7 @@ ARGUMENTS_TYPE_PARSERS = {
"boolean": BooleanArgumentParser, "boolean": BooleanArgumentParser,
"domain": DomainArgumentParser, "domain": DomainArgumentParser,
"user": UserArgumentParser, "user": UserArgumentParser,
"number": NumberArgumentParser,
"display_text": DisplayTextArgumentParser, "display_text": DisplayTextArgumentParser,
} }
@ -2741,18 +2772,23 @@ def _assert_no_conflicting_apps(domain, path, ignore_app=None, full_domain=False
raise YunohostError('app_location_unavailable', apps="\n".join(apps)) raise YunohostError('app_location_unavailable', apps="\n".join(apps))
def _make_environment_dict(args_dict, prefix="APP_ARG_"): def _make_environment_for_app_script(app, args={}, args_prefix="APP_ARG_"):
"""
Convert a dictionnary containing manifest arguments
to a dictionnary of env. var. to be passed to scripts
Keyword arguments: app_setting_path = os.path.join(APPS_SETTING_PATH, app)
arg -- A key/value dictionnary of manifest arguments
manifest = _get_manifest_of_app(app_setting_path)
app_id, app_instance_nb = _parse_app_instance_name(app)
env_dict = {
"YNH_APP_ID": app_id,
"YNH_APP_INSTANCE_NAME": app,
"YNH_APP_INSTANCE_NUMBER": str(app_instance_nb),
"YNH_APP_MANIFEST_VERSION": manifest.get("version", "?")
}
for arg_name, arg_value_and_type in args.items():
env_dict["YNH_%s%s" % (args_prefix, arg_name.upper())] = arg_value_and_type[0]
"""
env_dict = {}
for arg_name, arg_value_and_type in args_dict.items():
env_dict["YNH_%s%s" % (prefix, arg_name.upper())] = arg_value_and_type[0]
return env_dict return env_dict

View file

@ -44,7 +44,7 @@ from moulinette.utils.filesystem import read_file, mkdir, write_to_yaml, read_ya
from yunohost.app import ( from yunohost.app import (
app_info, _is_installed, app_info, _is_installed,
_parse_app_instance_name, _make_environment_for_app_script,
dump_app_log_extract_for_debugging, dump_app_log_extract_for_debugging,
_patch_legacy_helpers, _patch_legacy_helpers,
_patch_legacy_php_versions, _patch_legacy_php_versions,
@ -553,13 +553,8 @@ class BackupManager():
env_var['YNH_BACKUP_CSV'] = tmp_csv env_var['YNH_BACKUP_CSV'] = tmp_csv
if app is not None: if app is not None:
app_id, app_instance_nb = _parse_app_instance_name(app) env_var.update(_make_environment_for_app_script(app))
env_var["YNH_APP_ID"] = app_id env_var["YNH_APP_BACKUP_DIR"] = os.path.join(self.work_dir, 'apps', app, 'backup')
env_var["YNH_APP_INSTANCE_NAME"] = app
env_var["YNH_APP_INSTANCE_NUMBER"] = str(app_instance_nb)
tmp_app_dir = os.path.join('apps/', app)
tmp_app_bkp_dir = os.path.join(self.work_dir, tmp_app_dir, 'backup')
env_var["YNH_APP_BACKUP_DIR"] = tmp_app_bkp_dir
return env_var return env_var
@ -1165,7 +1160,10 @@ class RestoreManager():
logger.debug(m18n.n('restore_running_hooks')) logger.debug(m18n.n('restore_running_hooks'))
env_dict = self._get_env_var() env_dict = {
'YNH_BACKUP_DIR': self.work_dir,
'YNH_BACKUP_CSV': os.path.join(self.work_dir, "backup.csv")
}
operation_logger.extra['env'] = env_dict operation_logger.extra['env'] = env_dict
operation_logger.flush() operation_logger.flush()
ret = hook_callback('restore', ret = hook_callback('restore',
@ -1345,8 +1343,8 @@ class RestoreManager():
additional_urls=permission_infos.get("additional_urls"), additional_urls=permission_infos.get("additional_urls"),
auth_header=permission_infos.get("auth_header"), auth_header=permission_infos.get("auth_header"),
label=permission_infos.get('label') if perm_name == "main" else permission_infos.get("sublabel"), label=permission_infos.get('label') if perm_name == "main" else permission_infos.get("sublabel"),
show_tile=permission_infos.get("show_tile", None), show_tile=permission_infos.get("show_tile", True),
protected=permission_infos.get("protected", True), protected=permission_infos.get("protected", False),
sync_perm=False) sync_perm=False)
permission_sync_to_user() permission_sync_to_user()
@ -1372,7 +1370,12 @@ class RestoreManager():
migrate_legacy_permission_settings(app=app_instance_name) migrate_legacy_permission_settings(app=app_instance_name)
# Prepare env. var. to pass to script # Prepare env. var. to pass to script
env_dict = self._get_env_var(app_instance_name) env_dict = _make_environment_for_app_script(app_instance_name)
env_dict.update({
'YNH_BACKUP_DIR': self.work_dir,
'YNH_BACKUP_CSV': os.path.join(self.work_dir, "backup.csv"),
'YNH_APP_BACKUP_DIR': os.path.join(self.work_dir, 'apps', app_instance_name, 'backup')
})
operation_logger.extra['env'] = env_dict operation_logger.extra['env'] = env_dict
operation_logger.flush() operation_logger.flush()
@ -1396,11 +1399,7 @@ class RestoreManager():
remove_script = os.path.join(app_scripts_in_archive, 'remove') remove_script = os.path.join(app_scripts_in_archive, 'remove')
# Setup environment for remove script # Setup environment for remove script
app_id, app_instance_nb = _parse_app_instance_name(app_instance_name) env_dict_remove = _make_environment_for_app_script(app_instance_name)
env_dict_remove = {}
env_dict_remove["YNH_APP_ID"] = app_id
env_dict_remove["YNH_APP_INSTANCE_NAME"] = app_instance_name
env_dict_remove["YNH_APP_INSTANCE_NUMBER"] = str(app_instance_nb)
operation_logger = OperationLogger('remove_on_failed_restore', operation_logger = OperationLogger('remove_on_failed_restore',
[('app', app_instance_name)], [('app', app_instance_name)],
@ -1432,26 +1431,6 @@ class RestoreManager():
# Cleaning temporary scripts directory # Cleaning temporary scripts directory
shutil.rmtree(tmp_folder_for_app_restore, ignore_errors=True) shutil.rmtree(tmp_folder_for_app_restore, ignore_errors=True)
def _get_env_var(self, app=None):
""" Define environment variable for hooks call """
env_var = {}
env_var['YNH_BACKUP_DIR'] = self.work_dir
env_var['YNH_BACKUP_CSV'] = os.path.join(self.work_dir, "backup.csv")
if app is not None:
app_dir_in_archive = os.path.join(self.work_dir, 'apps', app)
app_backup_in_archive = os.path.join(app_dir_in_archive, 'backup')
# Parse app instance name and id
app_id, app_instance_nb = _parse_app_instance_name(app)
env_var["YNH_APP_ID"] = app_id
env_var["YNH_APP_INSTANCE_NAME"] = app
env_var["YNH_APP_INSTANCE_NUMBER"] = str(app_instance_nb)
env_var["YNH_APP_BACKUP_DIR"] = app_backup_in_archive
return env_var
# #
# Backup methods # # Backup methods #
# #
@ -2109,11 +2088,22 @@ def backup_restore(name, system=[], apps=[], force=False):
system = [] system = []
apps = [] apps = []
# TODO don't ask this question when restoring apps only and certain system #
# parts # Initialize #
#
# Check if YunoHost is installed restore_manager = RestoreManager(name)
if system is not None and os.path.isfile('/etc/yunohost/installed'):
restore_manager.set_system_targets(system)
restore_manager.set_apps_targets(apps)
restore_manager.assert_enough_free_space()
#
# Add validation if restoring system parts on an already-installed system
#
if restore_manager.targets.targets["system"] != [] and os.path.isfile('/etc/yunohost/installed'):
logger.warning(m18n.n('yunohost_already_installed')) logger.warning(m18n.n('yunohost_already_installed'))
if not force: if not force:
try: try:
@ -2128,20 +2118,6 @@ def backup_restore(name, system=[], apps=[], force=False):
if not force: if not force:
raise YunohostError('restore_failed') raise YunohostError('restore_failed')
# TODO Partial app restore could not work if ldap is not restored before
# TODO repair mysql if broken and it's a complete restore
#
# Initialize #
#
restore_manager = RestoreManager(name)
restore_manager.set_system_targets(system)
restore_manager.set_apps_targets(apps)
restore_manager.assert_enough_free_space()
# #
# Mount the archive then call the restore for each system part / app # # Mount the archive then call the restore for each system part / app #
# #

View file

@ -61,7 +61,7 @@ KEY_SIZE = 3072
VALIDITY_LIMIT = 15 # days VALIDITY_LIMIT = 15 # days
# For tests # For tests
STAGING_CERTIFICATION_AUTHORITY = "https://acme-staging.api.letsencrypt.org" STAGING_CERTIFICATION_AUTHORITY = "https://acme-staging-v02.api.letsencrypt.org"
# For prod # For prod
PRODUCTION_CERTIFICATION_AUTHORITY = "https://acme-v02.api.letsencrypt.org" PRODUCTION_CERTIFICATION_AUTHORITY = "https://acme-v02.api.letsencrypt.org"
@ -483,6 +483,10 @@ def _check_acme_challenge_configuration(domain):
def _fetch_and_enable_new_certificate(domain, staging=False, no_checks=False): def _fetch_and_enable_new_certificate(domain, staging=False, no_checks=False):
if not os.path.exists(ACCOUNT_KEY_FILE):
_generate_account_key()
# Make sure tmp folder exists # Make sure tmp folder exists
logger.debug("Making sure tmp folders exists...") logger.debug("Making sure tmp folders exists...")
@ -633,6 +637,7 @@ def _get_status(domain):
cert_subject = cert.get_subject().CN cert_subject = cert.get_subject().CN
cert_issuer = cert.get_issuer().CN cert_issuer = cert.get_issuer().CN
organization_name = cert.get_issuer().O
valid_up_to = datetime.strptime(cert.get_notAfter(), "%Y%m%d%H%M%SZ") valid_up_to = datetime.strptime(cert.get_notAfter(), "%Y%m%d%H%M%SZ")
days_remaining = (valid_up_to - datetime.utcnow()).days days_remaining = (valid_up_to - datetime.utcnow()).days
@ -642,7 +647,7 @@ def _get_status(domain):
"verbose": "Self-signed", "verbose": "Self-signed",
} }
elif cert_issuer.startswith("Let's Encrypt"): elif organization_name == "Let's Encrypt":
CA_type = { CA_type = {
"code": "lets-encrypt", "code": "lets-encrypt",
"verbose": "Let's Encrypt", "verbose": "Let's Encrypt",

View file

@ -75,8 +75,6 @@ def domain_list(exclude_subdomains=False):
result_list = sorted(result_list, cmp_domain) result_list = sorted(result_list, cmp_domain)
return {'domains': result_list}
return { return {
'domains': result_list, 'domains': result_list,
'main': _get_maindomain() 'main': _get_maindomain()
@ -164,7 +162,7 @@ def domain_add(operation_logger, domain, dyndns=False):
# Force domain removal silently # Force domain removal silently
try: try:
domain_remove(domain, True) domain_remove(domain, True)
except: except Exception:
pass pass
raise raise
@ -184,7 +182,7 @@ def domain_remove(operation_logger, domain, force=False):
""" """
from yunohost.hook import hook_callback from yunohost.hook import hook_callback
from yunohost.app import app_ssowatconf from yunohost.app import app_ssowatconf, app_info
from yunohost.utils.ldap import _get_ldap_interface from yunohost.utils.ldap import _get_ldap_interface
if not force and domain not in domain_list()['domains']: if not force and domain not in domain_list()['domains']:
@ -206,11 +204,12 @@ def domain_remove(operation_logger, domain, force=False):
for app in _installed_apps(): for app in _installed_apps():
settings = _get_app_settings(app) settings = _get_app_settings(app)
label = app_info(app)["name"]
if settings.get("domain") == domain: if settings.get("domain") == domain:
apps_on_that_domain.append("%s (on https://%s%s)" % (app, domain, settings["path"]) if "path" in settings else app) apps_on_that_domain.append(" - %s \"%s\" on https://%s%s" % (app, label, domain, settings["path"]) if "path" in settings else app)
if apps_on_that_domain: if apps_on_that_domain:
raise YunohostError('domain_uninstall_app_first', apps=", ".join(apps_on_that_domain)) raise YunohostError('domain_uninstall_app_first', apps="\n".join(apps_on_that_domain))
operation_logger.start() operation_logger.start()
ldap = _get_ldap_interface() ldap = _get_ldap_interface()
@ -258,6 +257,9 @@ def domain_dns_conf(domain, ttl=None):
""" """
if domain not in domain_list()['domains']:
raise YunohostError('domain_name_unknown', domain=domain)
ttl = 3600 if ttl is None else ttl ttl = 3600 if ttl is None else ttl
dns_conf = _build_dns_conf(domain, ttl) dns_conf = _build_dns_conf(domain, ttl)

View file

@ -319,10 +319,27 @@ def hook_exec(path, args=None, raise_on_error=False, no_trace=False,
if not os.path.isfile(path): if not os.path.isfile(path):
raise YunohostError('file_does_not_exist', path=path) raise YunohostError('file_does_not_exist', path=path)
def is_relevant_warning(msg):
# Ignore empty warning messages...
if not msg:
return False
# Some of these are shit sent from apt and we don't give a shit about
# them because they ain't actual warnings >_>
irrelevant_warnings = [
r"invalid value for trace file descriptor",
r"Creating config file .* with new version",
r"Created symlink /etc/systemd",
r"dpkg: warning: while removing .* not empty so not removed",
r"apt-key output should not be parsed"
]
return all(not re.search(w, msg) for w in irrelevant_warnings)
# Define output loggers and call command # Define output loggers and call command
loggers = ( loggers = (
lambda l: logger.debug(l.rstrip() + "\r"), lambda l: logger.debug(l.rstrip() + "\r"),
lambda l: logger.warning(l.rstrip()) if "invalid value for trace file descriptor" not in l.rstrip() else logger.debug(l.rstrip()), lambda l: logger.warning(l.rstrip()) if is_relevant_warning(l.rstrip()) else logger.debug(l.rstrip()),
lambda l: logger.info(l.rstrip()) lambda l: logger.info(l.rstrip())
) )
@ -396,12 +413,7 @@ def _hook_exec_bash(path, args, no_trace, chdir, env, user, return_format, logge
for k, v in env.items()]), cmd) for k, v in env.items()]), cmd)
command.append(cmd.format(script=cmd_script, args=cmd_args)) command.append(cmd.format(script=cmd_script, args=cmd_args))
if logger.isEnabledFor(log.DEBUG): logger.debug("Executing command '%s'" % ' '.join(command))
logger.debug(m18n.n('executing_command', command=' '.join(command)))
else:
logger.debug(m18n.n('executing_script', script=path))
logger.debug("About to run the command '%s'" % command)
returncode = call_async_output( returncode = call_async_output(
command, loggers, shell=False, cwd=chdir, command, loggers, shell=False, cwd=chdir,

View file

@ -89,14 +89,14 @@ def log_list(limit=None, with_details=False, with_suboperations=False):
pass pass
try: try:
metadata = read_yaml(md_path) metadata = read_yaml(md_path) or {} # Making sure this is a dict and not None..?
except Exception as e: except Exception as e:
# If we can't read the yaml for some reason, report an error and ignore this entry... # If we can't read the yaml for some reason, report an error and ignore this entry...
logger.error(m18n.n('log_corrupted_md_file', md_file=md_path, error=e)) logger.error(m18n.n('log_corrupted_md_file', md_file=md_path, error=e))
continue continue
if with_details: if with_details:
entry["success"] = metadata.get("success", "?") if metadata else "?" entry["success"] = metadata.get("success", "?")
entry["parent"] = metadata.get("parent") entry["parent"] = metadata.get("parent")
if with_suboperations: if with_suboperations:
@ -565,6 +565,7 @@ class OperationLogger(object):
'operation': self.operation, 'operation': self.operation,
'parent': self.parent, 'parent': self.parent,
'yunohost_version': get_ynh_package_version("yunohost")["version"], 'yunohost_version': get_ynh_package_version("yunohost")["version"],
'interface': msettings.get('interface'),
} }
if self.related_to is not None: if self.related_to is not None:
data['related_to'] = self.related_to data['related_to'] = self.related_to

View file

@ -51,7 +51,7 @@ def user_permission_list(short=False, full=False, ignore_system_perms=False, abs
""" """
# Fetch relevant informations # Fetch relevant informations
from yunohost.app import app_setting, app_list from yunohost.app import app_setting, _installed_apps
from yunohost.utils.ldap import _get_ldap_interface, _ldap_path_extract from yunohost.utils.ldap import _get_ldap_interface, _ldap_path_extract
ldap = _get_ldap_interface() ldap = _get_ldap_interface()
permissions_infos = ldap.search('ou=permission,dc=yunohost,dc=org', permissions_infos = ldap.search('ou=permission,dc=yunohost,dc=org',
@ -60,7 +60,7 @@ def user_permission_list(short=False, full=False, ignore_system_perms=False, abs
'URL', 'additionalUrls', 'authHeader', 'label', 'showTile', 'isProtected']) 'URL', 'additionalUrls', 'authHeader', 'label', 'showTile', 'isProtected'])
# Parse / organize information to be outputed # Parse / organize information to be outputed
apps = [app["id"] for app in app_list()["apps"]] apps = sorted(_installed_apps())
apps_base_path = {app: app_setting(app, 'domain') + app_setting(app, 'path') apps_base_path = {app: app_setting(app, 'domain') + app_setting(app, 'path')
for app in apps for app in apps
if app_setting(app, 'domain') and app_setting(app, 'path')} if app_setting(app, 'domain') and app_setting(app, 'path')}
@ -668,6 +668,9 @@ def _validate_and_sanitize_permission_url(url, app_base_path, app):
For example: For example:
re:/api/[A-Z]*$ -> domain.tld/app/api/[A-Z]*$ re:/api/[A-Z]*$ -> domain.tld/app/api/[A-Z]*$
re:domain.tld/app/api/[A-Z]*$ -> domain.tld/app/api/[A-Z]*$ re:domain.tld/app/api/[A-Z]*$ -> domain.tld/app/api/[A-Z]*$
We can also have less-trivial regexes like:
re:^\/api\/.*|\/scripts\/api.js$
""" """
from yunohost.domain import domain_list from yunohost.domain import domain_list
@ -692,9 +695,9 @@ def _validate_and_sanitize_permission_url(url, app_base_path, app):
if url.startswith('re:'): if url.startswith('re:'):
# regex without domain # regex without domain
# we check for the first char after 're:'
if url.startswith('re:/'): if url[3] in ['/', '^', '\\']:
validate_regex(url[4:]) validate_regex(url[3:])
return url return url
# regex with domain # regex with domain

View file

@ -263,6 +263,7 @@ def _get_settings():
if unknown_settings: if unknown_settings:
try: try:
_save_settings(unknown_settings, location=unknown_settings_path) _save_settings(unknown_settings, location=unknown_settings_path)
_save_settings(settings)
except Exception as e: except Exception as e:
logger.warning("Failed to save unknown settings (because %s), aborting." % e) logger.warning("Failed to save unknown settings (because %s), aborting." % e)

View file

@ -95,6 +95,15 @@ def test_parse_args_in_yunohost_format_string_optional_with_input():
assert _parse_args_in_yunohost_format(answers, questions) == expected_result assert _parse_args_in_yunohost_format(answers, questions) == expected_result
def test_parse_args_in_yunohost_format_string_optional_with_empty_input():
questions = [{"name": "some_string", "ask": "some question", "optional": True, }]
answers = {}
expected_result = OrderedDict({"some_string": ("", "string")})
with patch.object(msignals, "prompt", return_value=""):
assert _parse_args_in_yunohost_format(answers, questions) == expected_result
def test_parse_args_in_yunohost_format_string_optional_with_input_without_ask(): def test_parse_args_in_yunohost_format_string_optional_with_input_without_ask():
questions = [{"name": "some_string", "optional": True, }] questions = [{"name": "some_string", "optional": True, }]
answers = {} answers = {}
@ -247,9 +256,9 @@ def test_parse_args_in_yunohost_format_password_input_no_ask():
def test_parse_args_in_yunohost_format_password_no_input_optional(): def test_parse_args_in_yunohost_format_password_no_input_optional():
questions = [{"name": "some_password", "type": "password", "optional": True, }] questions = [{"name": "some_password", "type": "password", "optional": True, }]
answers = {} answers = {}
expected_result = OrderedDict({"some_password": ("", "password")})
with pytest.raises(YunohostError): assert _parse_args_in_yunohost_format(answers, questions) == expected_result
_parse_args_in_yunohost_format(answers, questions)
def test_parse_args_in_yunohost_format_password_optional_with_input(): def test_parse_args_in_yunohost_format_password_optional_with_input():
@ -268,6 +277,22 @@ def test_parse_args_in_yunohost_format_password_optional_with_input():
assert _parse_args_in_yunohost_format(answers, questions) == expected_result assert _parse_args_in_yunohost_format(answers, questions) == expected_result
def test_parse_args_in_yunohost_format_password_optional_with_empty_input():
questions = [
{
"name": "some_password",
"ask": "some question",
"type": "password",
"optional": True,
}
]
answers = {}
expected_result = OrderedDict({"some_password": ("", "password")})
with patch.object(msignals, "prompt", return_value=""):
assert _parse_args_in_yunohost_format(answers, questions) == expected_result
def test_parse_args_in_yunohost_format_password_optional_with_input_without_ask(): def test_parse_args_in_yunohost_format_password_optional_with_input_without_ask():
questions = [{"name": "some_password", "type": "password", "optional": True, }] questions = [{"name": "some_password", "type": "password", "optional": True, }]
answers = {} answers = {}
@ -393,6 +418,24 @@ def test_parse_args_in_yunohost_format_password_strong_enough():
_parse_args_in_yunohost_format({"some_password": "password"}, questions) _parse_args_in_yunohost_format({"some_password": "password"}, questions)
def test_parse_args_in_yunohost_format_password_optional_strong_enough():
questions = [
{
"name": "some_password",
"ask": "some question",
"type": "password",
"optional": True,
}
]
with pytest.raises(YunohostError):
# too short
_parse_args_in_yunohost_format({"some_password": "a"}, questions)
with pytest.raises(YunohostError):
_parse_args_in_yunohost_format({"some_password": "password"}, questions)
def test_parse_args_in_yunohost_format_path(): def test_parse_args_in_yunohost_format_path():
questions = [{"name": "some_path", "type": "path", }] questions = [{"name": "some_path", "type": "path", }]
answers = {"some_path": "some_value"} answers = {"some_path": "some_value"}
@ -444,6 +487,17 @@ def test_parse_args_in_yunohost_format_path_optional_with_input():
assert _parse_args_in_yunohost_format(answers, questions) == expected_result assert _parse_args_in_yunohost_format(answers, questions) == expected_result
def test_parse_args_in_yunohost_format_path_optional_with_empty_input():
questions = [
{"name": "some_path", "ask": "some question", "type": "path", "optional": True, }
]
answers = {}
expected_result = OrderedDict({"some_path": ("", "path")})
with patch.object(msignals, "prompt", return_value=""):
assert _parse_args_in_yunohost_format(answers, questions) == expected_result
def test_parse_args_in_yunohost_format_path_optional_with_input_without_ask(): def test_parse_args_in_yunohost_format_path_optional_with_input_without_ask():
questions = [{"name": "some_path", "type": "path", "optional": True, }] questions = [{"name": "some_path", "type": "path", "optional": True, }]
answers = {} answers = {}
@ -663,6 +717,22 @@ def test_parse_args_in_yunohost_format_boolean_optional_with_input():
assert _parse_args_in_yunohost_format(answers, questions) == expected_result assert _parse_args_in_yunohost_format(answers, questions) == expected_result
def test_parse_args_in_yunohost_format_boolean_optional_with_empty_input():
questions = [
{
"name": "some_boolean",
"ask": "some question",
"type": "boolean",
"optional": True,
}
]
answers = {}
expected_result = OrderedDict({"some_boolean": (0, "boolean")}) # default to false
with patch.object(msignals, "prompt", return_value=""):
assert _parse_args_in_yunohost_format(answers, questions) == expected_result
def test_parse_args_in_yunohost_format_boolean_optional_with_input_without_ask(): def test_parse_args_in_yunohost_format_boolean_optional_with_input_without_ask():
questions = [{"name": "some_boolean", "type": "boolean", "optional": True, }] questions = [{"name": "some_boolean", "type": "boolean", "optional": True, }]
answers = {} answers = {}
@ -1021,6 +1091,165 @@ def test_parse_args_in_yunohost_format_user_two_users_default_input():
assert _parse_args_in_yunohost_format(answers, questions) == expected_result assert _parse_args_in_yunohost_format(answers, questions) == expected_result
def test_parse_args_in_yunohost_format_number():
questions = [{"name": "some_number", "type": "number", }]
answers = {"some_number": 1337}
expected_result = OrderedDict({"some_number": (1337, "number")})
assert _parse_args_in_yunohost_format(answers, questions) == expected_result
def test_parse_args_in_yunohost_format_number_no_input():
questions = [{"name": "some_number", "type": "number", }]
answers = {}
expected_result = OrderedDict({"some_number": (0, "number")})
assert _parse_args_in_yunohost_format(answers, questions) == expected_result
def test_parse_args_in_yunohost_format_number_bad_input():
questions = [{"name": "some_number", "type": "number", }]
answers = {"some_number": "stuff"}
with pytest.raises(YunohostError):
_parse_args_in_yunohost_format(answers, questions)
answers = {"some_number": 1.5}
with pytest.raises(YunohostError):
_parse_args_in_yunohost_format(answers, questions)
def test_parse_args_in_yunohost_format_number_input():
questions = [{"name": "some_number", "type": "number", "ask": "some question", }]
answers = {}
expected_result = OrderedDict({"some_number": (1337, "number")})
with patch.object(msignals, "prompt", return_value="1337"):
assert _parse_args_in_yunohost_format(answers, questions) == expected_result
with patch.object(msignals, "prompt", return_value=1337):
assert _parse_args_in_yunohost_format(answers, questions) == expected_result
expected_result = OrderedDict({"some_number": (0, "number")})
with patch.object(msignals, "prompt", return_value=""):
assert _parse_args_in_yunohost_format(answers, questions) == expected_result
def test_parse_args_in_yunohost_format_number_input_no_ask():
questions = [{"name": "some_number", "type": "number", }]
answers = {}
expected_result = OrderedDict({"some_number": (1337, "number")})
with patch.object(msignals, "prompt", return_value="1337"):
assert _parse_args_in_yunohost_format(answers, questions) == expected_result
def test_parse_args_in_yunohost_format_number_no_input_optional():
questions = [{"name": "some_number", "type": "number", "optional": True, }]
answers = {}
expected_result = OrderedDict({"some_number": (0, "number")}) # default to 0
assert _parse_args_in_yunohost_format(answers, questions) == expected_result
def test_parse_args_in_yunohost_format_number_optional_with_input():
questions = [
{
"name": "some_number",
"ask": "some question",
"type": "number",
"optional": True,
}
]
answers = {}
expected_result = OrderedDict({"some_number": (1337, "number")})
with patch.object(msignals, "prompt", return_value="1337"):
assert _parse_args_in_yunohost_format(answers, questions) == expected_result
def test_parse_args_in_yunohost_format_number_optional_with_input_without_ask():
questions = [{"name": "some_number", "type": "number", "optional": True, }]
answers = {}
expected_result = OrderedDict({"some_number": (0, "number")})
with patch.object(msignals, "prompt", return_value="0"):
assert _parse_args_in_yunohost_format(answers, questions) == expected_result
def test_parse_args_in_yunohost_format_number_no_input_default():
questions = [
{
"name": "some_number",
"ask": "some question",
"type": "number",
"default": 1337,
}
]
answers = {}
expected_result = OrderedDict({"some_number": (1337, "number")})
assert _parse_args_in_yunohost_format(answers, questions) == expected_result
def test_parse_args_in_yunohost_format_number_bad_default():
questions = [
{
"name": "some_number",
"ask": "some question",
"type": "number",
"default": "bad default",
}
]
answers = {}
with pytest.raises(YunohostError):
_parse_args_in_yunohost_format(answers, questions)
def test_parse_args_in_yunohost_format_number_input_test_ask():
ask_text = "some question"
questions = [{"name": "some_number", "type": "number", "ask": ask_text, }]
answers = {}
with patch.object(msignals, "prompt", return_value="1111") as prompt:
_parse_args_in_yunohost_format(answers, questions)
prompt.assert_called_with("%s (default: 0)" % (ask_text), False)
def test_parse_args_in_yunohost_format_number_input_test_ask_with_default():
ask_text = "some question"
default_value = 1337
questions = [{"name": "some_number", "type": "number", "ask": ask_text, "default": default_value, }]
answers = {}
with patch.object(msignals, "prompt", return_value="1111") as prompt:
_parse_args_in_yunohost_format(answers, questions)
prompt.assert_called_with("%s (default: %s)" % (ask_text, default_value), False)
@pytest.mark.skip # we should do something with this example
def test_parse_args_in_yunohost_format_number_input_test_ask_with_example():
ask_text = "some question"
example_value = 1337
questions = [{"name": "some_number", "type": "number", "ask": ask_text, "example": example_value, }]
answers = {}
with patch.object(msignals, "prompt", return_value="1111") as prompt:
_parse_args_in_yunohost_format(answers, questions)
assert ask_text in prompt.call_args[0][0]
assert example_value in prompt.call_args[0][0]
@pytest.mark.skip # we should do something with this help
def test_parse_args_in_yunohost_format_number_input_test_ask_with_help():
ask_text = "some question"
help_value = 1337
questions = [{"name": "some_number", "type": "number", "ask": ask_text, "help": help_value, }]
answers = {}
with patch.object(msignals, "prompt", return_value="1111") as prompt:
_parse_args_in_yunohost_format(answers, questions)
assert ask_text in prompt.call_args[0][0]
assert help_value in prompt.call_args[0][0]
def test_parse_args_in_yunohost_format_display_text(): def test_parse_args_in_yunohost_format_display_text():
questions = [{"name": "some_app", "type": "display_text", "ask": "foobar"}] questions = [{"name": "some_app", "type": "display_text", "ask": "foobar"}]
answers = {} answers = {}

View file

@ -107,7 +107,7 @@ def test_normalize_permission_path_with_unknown_domain():
def test_normalize_permission_path_conflicting_path(): def test_normalize_permission_path_conflicting_path():
app_install("./tests/apps/register_url_app_ynh", app_install(os.path.join(get_test_apps_dir(), "register_url_app_ynh"),
args="domain=%s&path=%s" % (maindomain, "/url/registerapp"), force=True) args="domain=%s&path=%s" % (maindomain, "/url/registerapp"), force=True)
with pytest.raises(YunohostError): with pytest.raises(YunohostError):

View file

@ -891,7 +891,7 @@ def test_permission_app_change_url():
@pytest.mark.other_domains(number=1) @pytest.mark.other_domains(number=1)
def test_permission_protection_management_by_helper(): def test_permission_protection_management_by_helper():
app_install("./tests/apps/permissions_app_ynh", app_install(os.path.join(get_test_apps_dir(), "permissions_app_ynh"),
args="domain=%s&domain_2=%s&path=%s&admin=%s" % (maindomain, other_domains[0], "/urlpermissionapp", "alice"), force=True) args="domain=%s&domain_2=%s&path=%s&admin=%s" % (maindomain, other_domains[0], "/urlpermissionapp", "alice"), force=True)
res = user_permission_list(full=True)['permissions'] res = user_permission_list(full=True)['permissions']
@ -899,7 +899,7 @@ def test_permission_protection_management_by_helper():
assert res['permissions_app.admin']['protected'] is True assert res['permissions_app.admin']['protected'] is True
assert res['permissions_app.dev']['protected'] is False assert res['permissions_app.dev']['protected'] is False
app_upgrade(["permissions_app"], file="./tests/apps/permissions_app_ynh") app_upgrade(["permissions_app"], file=os.path.join(get_test_apps_dir(), "permissions_app_ynh"))
res = user_permission_list(full=True)['permissions'] res = user_permission_list(full=True)['permissions']
assert res['permissions_app.main']['protected'] is False assert res['permissions_app.main']['protected'] is False

View file

@ -163,7 +163,10 @@ def tools_adminpw(new_password, check_strength=True):
with open('/etc/shadow', 'w') as after_file: with open('/etc/shadow', 'w') as after_file:
after_file.write(before.replace("root:" + hash_root, after_file.write(before.replace("root:" + hash_root,
"root:" + new_hash.replace('{CRYPT}', ''))) "root:" + new_hash.replace('{CRYPT}', '')))
except IOError: # An IOError may be thrown if for some reason we can't read/write /etc/passwd
# A KeyError could also be thrown if 'root' is not in /etc/passwd in the first place (for example because no password defined ?)
# (c.f. the line about getspnam)
except (IOError, KeyError):
logger.warning(m18n.n('root_password_desynchronized')) logger.warning(m18n.n('root_password_desynchronized'))
return return

View file

@ -155,6 +155,7 @@ def user_create(operation_logger, username, firstname, lastname, domain, passwor
'admin@' + main_domain, 'admin@' + main_domain,
'webmaster@' + main_domain, 'webmaster@' + main_domain,
'postmaster@' + main_domain, 'postmaster@' + main_domain,
'abuse@' + main_domain,
] ]
if mail in aliases: if mail in aliases:

View file

@ -1,7 +1,8 @@
import os
from moulinette import m18n from moulinette import m18n
from yunohost.utils.error import YunohostError from yunohost.utils.error import YunohostError
from moulinette.utils.log import getActionLogger from moulinette.utils.log import getActionLogger
from moulinette.utils.filesystem import read_yaml from moulinette.utils.filesystem import read_json, write_to_json, read_yaml
from yunohost.user import user_list, user_group_create, user_group_update from yunohost.user import user_list, user_group_create, user_group_update
from yunohost.app import app_setting, _installed_apps, _get_app_settings, _set_app_settings from yunohost.app import app_setting, _installed_apps, _get_app_settings, _set_app_settings
@ -103,7 +104,7 @@ class SetupGroupPermissions():
allowed = [user for user in permission.split(',') if user in known_users] allowed = [user for user in permission.split(',') if user in known_users]
else: else:
allowed = ["all_users"] allowed = ["all_users"]
permission_create(app + ".main", url=url, allowed=allowed, protected=False, sync_perm=False) permission_create(app + ".main", url=url, allowed=allowed, show_tile=True, protected=False, sync_perm=False)
app_setting(app, 'allowed_users', delete=True) app_setting(app, 'allowed_users', delete=True)
@ -206,3 +207,70 @@ def migrate_legacy_permission_settings(app=None):
_set_app_settings(app, settings) _set_app_settings(app, settings)
permission_sync_to_user() permission_sync_to_user()
def translate_legacy_rules_in_ssowant_conf_json_persistent():
if not os.path.exists("/etc/ssowat/conf.json.persistent"):
return
persistent = read_json("/etc/ssowat/conf.json.persistent")
legacy_rules = [
"skipped_urls",
"unprotected_urls",
"protected_urls",
"skipped_regex",
"unprotected_regex",
"protected_regex"
]
if not any(legacy_rule in persistent for legacy_rule in legacy_rules):
return
if not isinstance(persistent.get("permissions"), dict):
persistent["permissions"] = {}
skipped_urls = persistent.get("skipped_urls", []) + ["re:" + r for r in persistent.get("skipped_regex", [])]
protected_urls = persistent.get("protected_urls", []) + ["re:" + r for r in persistent.get("protected_regex", [])]
unprotected_urls = persistent.get("unprotected_urls", []) + ["re:" + r for r in persistent.get("unprotected_regex", [])]
known_users = user_list()["users"].keys()
for legacy_rule in legacy_rules:
if legacy_rule in persistent:
del persistent[legacy_rule]
if skipped_urls:
persistent["permissions"]['custom_skipped'] = {
"users": [],
"label": "Custom permissions - skipped",
"show_tile": False,
"auth_header": False,
"public": True,
"uris": skipped_urls + persistent["permissions"].get("custom_skipped", {}).get("uris", []),
}
if unprotected_urls:
persistent["permissions"]['custom_unprotected'] = {
"users": [],
"label": "Custom permissions - unprotected",
"show_tile": False,
"auth_header": True,
"public": True,
"uris": unprotected_urls + persistent["permissions"].get("custom_unprotected", {}).get("uris", []),
}
if protected_urls:
persistent["permissions"]['custom_protected'] = {
"users": known_users,
"label": "Custom permissions - protected",
"show_tile": False,
"auth_header": True,
"public": False,
"uris": protected_urls + persistent["permissions"].get("custom_protected", {}).get("uris", []),
}
write_to_json("/etc/ssowat/conf.json.persistent", persistent, sort_keys=True, indent=4)
logger.warning("Yunohost automatically translated some legacy rules in /etc/ssowat/conf.json.persistent to match the new permission system")