mirror of
https://github.com/YunoHost/yunohost.git
synced 2024-09-03 20:06:10 +02:00
Merge remote-tracking branch 'origin/dev' into bookworm
This commit is contained in:
commit
883bb2b498
14 changed files with 186 additions and 54 deletions
21
debian/changelog
vendored
21
debian/changelog
vendored
|
@ -4,6 +4,27 @@ yunohost (12.0.0) unstable; urgency=low
|
|||
|
||||
-- Alexandre Aubin <alex.aubin@mailoo.org> Thu, 04 May 2023 20:30:19 +0200
|
||||
|
||||
yunohost (11.2.4) stable; urgency=low
|
||||
|
||||
- doc: Improve --help for 'yunohost app install' ([#1702](https://github.com/yunohost/yunohost/pull/1702))
|
||||
- helpers: add new --group option for ynh_add_fpm_config to customize the Group parameter (65d25710)
|
||||
- apps: allow to use jinja {% if foobar %} blocks in their notifications/doc pages (57699289)
|
||||
- apps: BACKUP_CORE_ONLY was not set for pre-upgrade safety backups, resulting in unecessarily large pre-upgrade backups (07daa687)
|
||||
- apps: Use the existing db_name setting for database provising to ease v1->v2 transition with specific db_name ([#1704](https://github.com/yunohost/yunohost/pull/1704))
|
||||
- configpanels/forms: more edge cases with some questions not implementing some methods/attributes (b0fe49ae)
|
||||
- diagnosis: reverse DNS check should be case-insensitive #2235 ([#1705](https://github.com/yunohost/yunohost/pull/1705))
|
||||
- i18n: Translations updated for Galician, Indonesian, Polish, Spanish, Turkish
|
||||
|
||||
Thanks to all contributors <3 ! (Grzegorz Cichocki, José M, Kuba Bazan, ljf (zamentur), massyas, Neko Nekowazarashi, selfhoster1312, Suleyman Harmandar, taco, Tagada)
|
||||
|
||||
-- Alexandre Aubin <alex.aubin@mailoo.org> Thu, 31 Aug 2023 17:30:21 +0200
|
||||
|
||||
yunohost (11.2.3) stable; urgency=low
|
||||
|
||||
- apps: fix another case of no attribute 'value' due to config panels/questions refactoring (4fda8ed49)
|
||||
|
||||
-- Alexandre Aubin <alex.aubin@mailoo.org> Sat, 22 Jul 2023 16:48:22 +0200
|
||||
|
||||
yunohost (11.2.2) stable; urgency=low
|
||||
|
||||
- domains: Gandi's `api_protocol` field should be a `select` type ([#1693](https://github.com/yunohost/yunohost/pull/1693))
|
||||
|
|
|
@ -70,13 +70,15 @@ YNH_PHP_VERSION=${YNH_PHP_VERSION:-$YNH_DEFAULT_PHP_VERSION}
|
|||
ynh_add_fpm_config() {
|
||||
local _globalphpversion=${phpversion-:}
|
||||
# Declare an array to define the options of this helper.
|
||||
local legacy_args=vuf
|
||||
local -A args_array=([v]=phpversion= [u]=usage= [f]=footprint=)
|
||||
local legacy_args=vufg
|
||||
local -A args_array=([v]=phpversion= [u]=usage= [f]=footprint= [g]=group=)
|
||||
local group
|
||||
local phpversion
|
||||
local usage
|
||||
local footprint
|
||||
# Manage arguments with getopts
|
||||
ynh_handle_getopts_args "$@"
|
||||
group=${group:-}
|
||||
|
||||
# The default behaviour is to use the template.
|
||||
local autogenconf=false
|
||||
|
@ -146,12 +148,13 @@ ynh_add_fpm_config() {
|
|||
# Define the values to use for the configuration of PHP.
|
||||
ynh_get_scalable_phpfpm --usage=$usage --footprint=$footprint
|
||||
|
||||
local phpfpm_group=$([[ -n "$group" ]] && echo "$group" || echo "$app")
|
||||
local phpfpm_path="$YNH_APP_BASEDIR/conf/php-fpm.conf"
|
||||
echo "
|
||||
[__APP__]
|
||||
|
||||
user = __APP__
|
||||
group = __APP__
|
||||
group = __PHPFPM_GROUP__
|
||||
|
||||
chdir = __INSTALL_DIR__
|
||||
|
||||
|
|
|
@ -75,7 +75,7 @@ fi
|
|||
# usage: ynh_setup_source --dest_dir=dest_dir [--source_id=source_id] [--keep="file1 file2"] [--full_replace]
|
||||
# | arg: -d, --dest_dir= - Directory where to setup sources
|
||||
# | arg: -s, --source_id= - Name of the source, defaults to `main` (when the sources resource exists in manifest.toml) or (legacy) `app` otherwise
|
||||
# | arg: -k, --keep= - Space-separated list of files/folders that will be backup/restored in $dest_dir, such as a config file you don't want to overwrite. For example 'conf.json secrets.json logs/'
|
||||
# | arg: -k, --keep= - Space-separated list of files/folders that will be backup/restored in $dest_dir, such as a config file you don't want to overwrite. For example 'conf.json secrets.json logs' (no trailing `/` for folders)
|
||||
# | arg: -r, --full_replace= - Remove previous sources before installing new sources
|
||||
#
|
||||
# #### New 'sources' resources
|
||||
|
@ -244,9 +244,11 @@ ynh_setup_source() {
|
|||
|
||||
if [ "$src_format" = "docker" ]; then
|
||||
src_platform="${src_platform:-"linux/$YNH_ARCH"}"
|
||||
elif test -e "$local_src"; then
|
||||
cp $local_src $src_filename
|
||||
else
|
||||
if test -e "$local_src"; then
|
||||
cp $local_src $src_filename
|
||||
fi
|
||||
|
||||
[ -n "$src_url" ] || ynh_die "Couldn't parse SOURCE_URL from $src_file_path ?"
|
||||
|
||||
# If the file was prefetched but somehow doesn't match the sum, rm and redownload it
|
||||
|
|
|
@ -522,8 +522,8 @@
|
|||
"diagnosis_mail_outgoing_port_25_blocked_relay_vpn": "Algunos proveedores de internet no le permitirán desbloquear el puerto 25 porque no les importa la Neutralidad de la Red.<br> - Algunos proporcionan una alternativa usando <a href='https://yunohost.org/#/email_configure_relay'>un relay como servidor de correo</a> lo que implica que el relay podrá espiar tu tráfico de correo.<br>- Una alternativa buena para la privacidad es utilizar una VPN *con una IP pública dedicada* para evitar estas limitaciones. Mira en <a href='https://yunohost.org/#/vpn_advantage'>https://yunohost.org/#/vpn_advantage</a><br>- Otra alternativa es cambiar de proveedor de internet a <a href='https://yunohost.org/#/isp'>uno más amable con la Neutralidad de la Red</a>",
|
||||
"diagnosis_backports_in_sources_list": "Parece que apt (el gestor de paquetes) está configurado para usar el repositorio backports. A menos que realmente sepas lo que estás haciendo, desaconsejamos absolutamente instalar paquetes desde backports, ya que pueden provocar comportamientos intestables o conflictos en el sistema.",
|
||||
"diagnosis_basesystem_hardware_model": "El modelo de servidor es {model}",
|
||||
"additional_urls_already_removed": "La URL adicional '{url}' ya se ha eliminado para el permiso «{permission}»",
|
||||
"additional_urls_already_added": "La URL adicional '{url}' ya se ha añadido para el permiso «{permission}»",
|
||||
"additional_urls_already_removed": "URL adicional '{url}' ya eliminada en la URL adicional para permiso «{permission}»",
|
||||
"additional_urls_already_added": "URL adicional '{url}' ya añadida en la URL adicional para permiso «{permission}»",
|
||||
"config_apply_failed": "Falló la aplicación de la nueva configuración: {error}",
|
||||
"app_restore_script_failed": "Ha ocurrido un error dentro del script de restauración de aplicaciones",
|
||||
"app_config_unable_to_apply": "No se pudieron aplicar los valores del panel configuración.",
|
||||
|
@ -747,5 +747,10 @@
|
|||
"global_settings_setting_smtp_relay_host": "Host de retransmisión SMTP",
|
||||
"migration_0024_rebuild_python_venv_disclaimer_rebuild": "Se intentará reconstruir el virtualenv para las siguientes apps (NB: ¡la operación puede llevar algún tiempo!): {rebuild_apps}",
|
||||
"migration_description_0025_global_settings_to_configpanel": "Migración de la nomenclatura de ajustes globales heredada a la nomenclatura nueva y moderna",
|
||||
"registrar_infos": "Información sobre el registrador"
|
||||
}
|
||||
"registrar_infos": "Información sobre el registrador",
|
||||
"app_failed_to_download_asset": "Error al descargar el recurso '{source_id}' ({url}) para {app}: {out}",
|
||||
"app_corrupt_source": "YunoHost ha podido descargar el recurso '{source_id}' ({url}) para {app}, pero no coincide con la suma de comprobación esperada. Esto puede significar que ocurrió un fallo de red en tu servidor, o que el recurso ha sido modificado por el responsable de la aplicación (¿o un actor malicioso?) y los responsables de empaquetar esta aplicación para YunoHost necesitan investigar y actualizar el manifesto de la aplicación para reflejar estos cambios. \n Suma de control sha256 esperada: {expected_sha256}\n Suma de control sha256 descargada: {computed_sha256}\n Tamaño del archivo descargado: {size}",
|
||||
"app_change_url_failed": "No es possible cambiar la URL para {app}: {error}",
|
||||
"app_change_url_require_full_domain": "{app} no se puede mover a esta nueva URL porque requiere un dominio completo (es decir, con una ruta = /)",
|
||||
"app_change_url_script_failed": "Se ha producido un error en el script de modificación de la url"
|
||||
}
|
||||
|
|
|
@ -612,7 +612,7 @@
|
|||
"domain_config_auth_consumer_key": "Chave consumidora",
|
||||
"log_domain_dns_push": "Enviar rexistros DNS para o dominio '{}'",
|
||||
"other_available_options": "... e outras {n} opcións dispoñibles non mostradas",
|
||||
"domain_dns_registrar_yunohost": "Este dominio un dos de nohost.me / nohost.st / ynh.fr e a configuración DNS xestionaa directamente YunoHost se máis requisitos. (mira o comando 'yunohost dyndns update')",
|
||||
"domain_dns_registrar_yunohost": "Este dominio é un dos de nohost.me / nohost.st / ynh.fr e a configuración DNS xestionaa directamente YunoHost sen máis requisitos. (mira o comando 'yunohost dyndns update')",
|
||||
"domain_dns_registrar_supported": "YunoHost detectou automáticamente que este dominio está xestionado pola rexistradora **{registrar}**. Se queres, YunoHost pode configurar automáticamente as súas zonas DNS, se proporcionas as credenciais de acceso á API. Podes ver a documentación sobre como obter as credenciais da API nesta páxina: https://yunohost.org/registrar_api_{registrar}. (Tamén podes configurar manualmente os rexistros DNS seguindo a documentación en https://yunohost.org/dns )",
|
||||
"domain_dns_push_partial_failure": "Actualización parcial dos rexistros DNS: informouse dalgúns avisos/erros.",
|
||||
"domain_config_auth_token": "Token de autenticación",
|
||||
|
@ -654,7 +654,7 @@
|
|||
"global_settings_setting_admin_strength": "Fortaleza do contrasinal de Admin",
|
||||
"global_settings_setting_user_strength": "Fortaleza do contrasinal da usuaria",
|
||||
"global_settings_setting_postfix_compatibility_help": "Compromiso entre compatibilidade e seguridade para o servidor Postfix. Aféctalle ao cifrado (e outros aspectos da seguridade)",
|
||||
"global_settings_setting_ssh_compatibility_help": "Compromiso entre compatibilidade e seguridade para o servidor SSH. Aféctalle ao cifrado (e outros aspectos da seguridade)",
|
||||
"global_settings_setting_ssh_compatibility_help": "Compromiso entre compatibilidade e seguridade para o servidor SSH. Aféctalle ao cifrado (e outros aspectos da seguridade). Le https://infosec.mozilla.org/guidelines/openssh for more info.",
|
||||
"global_settings_setting_ssh_password_authentication_help": "Permitir autenticación con contrasinal para SSH",
|
||||
"global_settings_setting_ssh_port": "Porto SSH",
|
||||
"global_settings_setting_webadmin_allowlist_help": "Enderezos IP con permiso para acceder á webadmin. Separados por vírgulas.",
|
||||
|
|
|
@ -391,5 +391,54 @@
|
|||
"log_letsencrypt_cert_renew": "Memperbarui sertifikat Let's Encrypt '{}'",
|
||||
"log_selfsigned_cert_install": "Memasang sertifikat ditandai sendiri pada domain '{}'",
|
||||
"log_user_permission_reset": "Mengatur ulang izin '{}'",
|
||||
"domain_config_xmpp": "Pesan Langsung (XMPP)"
|
||||
"domain_config_xmpp": "Pesan Langsung (XMPP)",
|
||||
"diagnosis_http_connection_error": "Masalah jaringan: tidak dapat terhubung dengan domain yang diminta, sangat mungkin terputus.",
|
||||
"dyndns_ip_updated": "IP Anda diperbarui di DynDNS",
|
||||
"ask_dyndns_recovery_password_explain": "Pilih kata sandi pemulihan untuk domain DynDNS Anda.",
|
||||
"ask_dyndns_recovery_password": "Kata sandi pemulihan DynDNS",
|
||||
"backup_output_directory_not_empty": "Anda harus memilih direktori yang kosong",
|
||||
"service_reload_or_restart_failed": "Tidak dapat memuat atau memulai ulang layanan '{service}'\n\nLog layanan baru-baru ini:{logs}",
|
||||
"service_reload_failed": "Tidak dapat memuat ulang layanan '{service}'\n\nLog layanan baru-baru ini:{logs}",
|
||||
"service_start_failed": "Tidak dapat memulai layanan '{service}'\n\nLog layanan baru-baru ini: {logs}",
|
||||
"diagnosis_apps_deprecated_practices": "Versi aplikasi yang dipasang ini masih menggunakan praktik pengemasan yang lama. Anda lebih baik untuk memperbarui aplikasi tersebut.",
|
||||
"diagnosis_dns_bad_conf": "Beberapa rekaman DNS untuk domain {domain} ada yang tidak ada atau salah (kategori {category})",
|
||||
"diagnosis_dns_good_conf": "Rekaman DNS untuk domain {domain} sudah diatur dengan benar (kategori {category})",
|
||||
"dyndns_unavailable": "Domain '{domain}' tidak tersedia.",
|
||||
"dyndns_set_recovery_password_denied": "Tidak dapat menyetel kata sandi pemulihan: tidak valid",
|
||||
"dyndns_set_recovery_password_unknown_domain": "Tidak dapat menyetel kata sandi pemulihan: domain belum terdaftar",
|
||||
"dyndns_set_recovery_password_invalid_password": "Tidak dapat menyetel kata sandi pemulihan: kata sandi tidak cukup kuat",
|
||||
"dyndns_set_recovery_password_failed": "Tidak dapat menyetel kata sandi pemulihan: {error}",
|
||||
"dyndns_set_recovery_password_success": "Kata sandi pemulihan berhasil disetel!",
|
||||
"file_does_not_exist": "Berkas {path} tidak ada.",
|
||||
"firewall_reload_failed": "Tidak dapat memuat ulang tembok api",
|
||||
"firewall_reloaded": "Tembok api dimuat ulang",
|
||||
"migration_description_0023_postgresql_11_to_13": "Migrasi basis data dari PostgreSQL 11 ke 13",
|
||||
"service_enabled": "Layanan '{service}' akan secara mandiri dimulai saat pemulaian.",
|
||||
"service_reloaded_or_restarted": "Layanan {service} dimuat atau dimulai ulang",
|
||||
"service_stopped": "Layanan '{service}' diberhentikan",
|
||||
"service_unknown": "Layanan yang tidak diketahui: '{service}'",
|
||||
"updating_apt_cache": "Mengambil pembaruan yang tersedia untuk paket sistem...",
|
||||
"group_mailalias_remove": "Alias surel '{mail}' akan dihapus dari kelompok '{group}'",
|
||||
"migration_description_0021_migrate_to_bullseye": "Peningkatan sistem ke Debian Bullseye dan YunoHost 11.x",
|
||||
"migration_description_0024_rebuild_python_venv": "Memperbaiki aplikasi Python setelah migrasi Bullseye",
|
||||
"service_disable_failed": "Tidak dapat membuat layanan '{service}' dimulai saat pemulaian.\n\nLog layanan baru-baru ini:{logs}",
|
||||
"service_disabled": "Layanan '{service}' tidak akan dimulai kembali saat pemulaian.",
|
||||
"tools_upgrade_failed": "Tidak dapat memperbarui paket: {packages_list}",
|
||||
"global_settings_setting_nginx_redirect_to_https": "Paksa HTTPS",
|
||||
"backup_archive_system_part_not_available": "Segmen '{part}' tidak tersedia di cadangan ini",
|
||||
"backup_output_directory_forbidden": "Pilih direktori yang berbeda. Cadangan tidak dapat dibuat di /bin, /boot, /dev, /etc, /lib, /root, /run, /sbin, /sys, /usr, /var, atau subfolder dari /home/yunohost.backup/archives",
|
||||
"ask_dyndns_recovery_password_explain_during_unsubscribe": "Masukkan kata sandi pemulihan untuk domain DynDNS ini.",
|
||||
"backup_output_symlink_dir_broken": "Direktori arsip Anda '{path}' rusak penautannya. Mungkin Anda lupa untuk menambatkan ulang atau memasukkan kembali penyimpanan tujuan penautan direktori arsip tersebut.",
|
||||
"diagnosis_apps_not_in_app_catalog": "Aplikasi ini tidak ada di katalog aplikasi YunoHost. Jika aplikasi ini ada di sana sebelumnya dan dihapus, Anda disarankan untuk melepas aplikasi ini dikarenakan ini tidak akan menerima pembaruan dan mungkin bisa menghancurkan integritas dan keamanan sistem Anda.",
|
||||
"dyndns_ip_update_failed": "Tidak dapat memperbarui IP Anda di DynDNS",
|
||||
"service_restarted": "Layanan {service} dimulai ulang",
|
||||
"service_started": "Layanan '{service}' dimulai",
|
||||
"service_stop_failed": "Tidak dapat menghentikan layanan '{service}'\n\nLog layanan baru-baru ini: {logs}",
|
||||
"apps_catalog_failed_to_download": "Tidak dapat mengunduh katalog aplikasi {apps_catalog}: {error}",
|
||||
"backup_archive_corrupted": "Sepertinya arsip cadangan '{archive}' rusak: {error}",
|
||||
"diagnosis_found_errors": "{errors} masalah signifikan ditemukan terkait dengan {category}!",
|
||||
"restore_system_part_failed": "Tidak dapat memulihkan segmen '{part}'",
|
||||
"service_enable_failed": "Tidak dapat membuat layanan '{service}' dimulai mandiri saat pemulaian.\n\nLog layanan baru-baru ini:{logs}",
|
||||
"service_not_reloading_because_conf_broken": "Tidak memuat atau memulai ulang layanan '{name}' karena konfigurasinya rusak: {errors}",
|
||||
"service_reloaded": "Layanan {service} dimuat ulang"
|
||||
}
|
||||
|
|
|
@ -103,7 +103,7 @@
|
|||
"backup_applying_method_custom": "Wywołuję niestandardową metodę tworzenia kopii zapasowych '{method}'...",
|
||||
"app_remove_after_failed_install": "Usuwanie aplikacji po niepowodzeniu instalacji...",
|
||||
"app_upgrade_script_failed": "Wystąpił błąd w skrypcie aktualizacji aplikacji",
|
||||
"apps_catalog_init_success": "Zainicjowano system katalogu aplikacji!",
|
||||
"apps_catalog_init_success": "System katalogu aplikacji został zainicjowany!",
|
||||
"apps_catalog_obsolete_cache": "Pamięć podręczna katalogu aplikacji jest pusta lub przestarzała.",
|
||||
"app_extraction_failed": "Nie można wyodrębnić plików instalacyjnych",
|
||||
"app_packaging_format_not_supported": "Ta aplikacja nie może zostać zainstalowana, ponieważ jej format opakowania nie jest obsługiwany przez twoją wersję YunoHost. Prawdopodobnie powinieneś rozważyć aktualizację swojego systemu.",
|
||||
|
@ -183,7 +183,7 @@
|
|||
"app_failed_to_download_asset": "Nie udało się pobrać zasobu '{source_id}' ({url}) dla {app}: {out}",
|
||||
"backup_with_no_backup_script_for_app": "Aplikacja '{app}' nie posiada skryptu kopii zapasowej. Ignorowanie.",
|
||||
"backup_with_no_restore_script_for_app": "Aplikacja {app} nie posiada skryptu przywracania, co oznacza, że nie będzie można automatycznie przywrócić kopii zapasowej tej aplikacji.",
|
||||
"certmanager_acme_not_configured_for_domain": "Wyzwanie ACME nie może zostać uruchomione dla domeny {domain}, ponieważ jej konfiguracja nginx nie zawiera odpowiedniego fragmentu kodu... Upewnij się, że konfiguracja nginx jest aktualna, używając polecenia yunohost tools regen-conf nginx --dry-run --with-diff.",
|
||||
"certmanager_acme_not_configured_for_domain": "Wyzwanie ACME nie może być teraz uruchomione dla {domain}, ponieważ jego konfiguracja nginx nie zawiera odpowiedniego fragmentu kodu… Upewnij się, że twoja konfiguracja nginx jest aktualna, używając `yunohost tools regen-conf nginx --dry-run --with-diff`.",
|
||||
"certmanager_domain_dns_ip_differs_from_public_ip": "Rekordy DNS dla domeny '{domain}' różnią się od adresu IP tego serwera. Sprawdź kategorię 'Rekordy DNS' (podstawowe) w diagnozie, aby uzyskać więcej informacji. Jeśli niedawno dokonałeś zmiany rekordu A, poczekaj, aż zostanie on zaktualizowany (można skorzystać z narzędzi online do sprawdzania propagacji DNS). (Jeśli wiesz, co robisz, użyj opcji '--no-checks', aby wyłączyć te sprawdzania.)",
|
||||
"confirm_app_install_danger": "UWAGA! Ta aplikacja jest wciąż w fazie eksperymentalnej (jeśli nie działa jawnie)! Prawdopodobnie NIE powinieneś jej instalować, chyba że wiesz, co robisz. NIE ZOSTANIE udzielone wsparcie, jeśli ta aplikacja nie będzie działać poprawnie lub spowoduje uszkodzenie systemu... Jeśli mimo to jesteś gotów podjąć to ryzyko, wpisz '{answers}",
|
||||
"confirm_app_install_thirdparty": "UWAGA! Ta aplikacja nie jest częścią katalogu aplikacji YunoHost. Instalowanie aplikacji innych firm może naruszyć integralność i bezpieczeństwo systemu. Prawdopodobnie NIE powinieneś jej instalować, chyba że wiesz, co robisz. NIE ZOSTANIE udzielone wsparcie, jeśli ta aplikacja nie będzie działać poprawnie lub spowoduje uszkodzenie systemu... Jeśli mimo to jesteś gotów podjąć to ryzyko, wpisz '{answers}'",
|
||||
|
@ -192,19 +192,19 @@
|
|||
"config_no_panel": "Nie znaleziono panelu konfiguracji.",
|
||||
"config_unknown_filter_key": "Klucz filtru '{filter_key}' jest niepoprawny.",
|
||||
"config_validate_email": "Proszę podać poprawny adres e-mail",
|
||||
"backup_hook_unknown": "Nieznany jest hook kopii zapasowej '{hook}'.",
|
||||
"backup_no_uncompress_archive_dir": "Nie istnieje taki katalog nieskompresowanego archiwum.",
|
||||
"backup_output_symlink_dir_broken": "Twój katalog archiwum '{path}' to uszkodzony dowiązanie symboliczne. Być może zapomniałeś o ponownym zamontowaniu lub podłączeniu nośnika przechowującego, do którego on wskazuje.",
|
||||
"backup_system_part_failed": "Nie można wykonać kopii zapasowej części systemu '{part}'",
|
||||
"backup_hook_unknown": "Nieznany jest hook kopii zapasowej '{hook}'",
|
||||
"backup_no_uncompress_archive_dir": "Nie istnieje taki katalog nieskompresowanego archiwum",
|
||||
"backup_output_symlink_dir_broken": "Twój katalog archiwum ‘{path}’ to uszkodzony symlink. Być może zapomniałeś o ponownym zamontowaniu lub podłączeniu nośnika przechowującego, do którego on wskazuje.",
|
||||
"backup_system_part_failed": "Nie udało się wykonać kopii zapasowej części systemu ‘{part}’",
|
||||
"config_validate_color": "Powinien być poprawnym szesnastkowym kodem koloru RGB.",
|
||||
"config_validate_date": "Data powinna być poprawna w formacie RRRR-MM-DD",
|
||||
"config_validate_time": "Podaj poprawny czas w formacie GG:MM",
|
||||
"certmanager_domain_not_diagnosed_yet": "Nie ma jeszcze wyników diagnozy dla domeny {domain}. Proszę ponownie uruchomić diagnozę dla kategorii 'Rekordy DNS' i 'Strona internetowa' w sekcji diagnozy, aby sprawdzić, czy domena jest gotowa do użycia Let's Encrypt. (Jeśli wiesz, co robisz, użyj opcji '--no-checks', aby wyłączyć te sprawdzania.)",
|
||||
"certmanager_cannot_read_cert": "Wystąpił problem podczas próby otwarcia bieżącego certyfikatu dla domeny {domain} (plik: {file}), przyczyna: {reason}",
|
||||
"certmanager_no_cert_file": "Nie można odczytać pliku certyfikatu dla domeny {domain} (plik: {file}).",
|
||||
"certmanager_self_ca_conf_file_not_found": "Nie można znaleźć pliku konfiguracyjnego dla autorytetu samopodpisującego (plik: {file})",
|
||||
"backup_running_hooks": "Uruchamianie hooków kopii zapasowej...",
|
||||
"backup_permission": "Uprawnienia kopii zapasowej dla aplikacji {app}",
|
||||
"certmanager_no_cert_file": "Nie można odczytać pliku certyfikatu dla domeny {domain} (plik: {file})",
|
||||
"certmanager_self_ca_conf_file_not_found": "Nie można znaleźć pliku konfiguracyjnego dla samodzielnie podpisanego upoważnienia do (file: {file})",
|
||||
"backup_running_hooks": "Uruchamianie kopii zapasowej hooków...",
|
||||
"backup_permission": "Uprawnienia do tworzenia kopii zapasowej dla aplikacji {app}",
|
||||
"certmanager_domain_cert_not_selfsigned": "Certyfikat dla domeny {domain} nie jest samopodpisany. Czy na pewno chcesz go zastąpić? (Użyj opcji '--force', aby to zrobić.)",
|
||||
"config_action_disabled": "Nie można uruchomić akcji '{action}', ponieważ jest ona wyłączona. Upewnij się, że spełnione są jej ograniczenia. Pomoc: {help}",
|
||||
"config_action_failed": "Nie udało się uruchomić akcji '{action}': {error}",
|
||||
|
@ -214,7 +214,7 @@
|
|||
"confirm_app_insufficient_ram": "UWAGA! Ta aplikacja wymaga {required} pamięci RAM do zainstalowania/aktualizacji, a obecnie dostępne jest tylko {current}. Nawet jeśli aplikacja mogłaby działać, proces instalacji/aktualizacji wymaga dużej ilości pamięci RAM, więc serwer może się zawiesić i niepowodzenie może być katastrofalne. Jeśli mimo to jesteś gotów podjąć to ryzyko, wpisz '{answers}'",
|
||||
"app_not_upgraded_broken_system": "Aplikacja '{failed_app}' nie powiodła się w procesie aktualizacji i spowodowała uszkodzenie systemu. W rezultacie anulowane zostały aktualizacje następujących aplikacji: {apps}",
|
||||
"app_not_upgraded_broken_system_continue": "Aplikacja '{failed_app}' nie powiodła się w procesie aktualizacji i spowodowała uszkodzenie systemu (parametr --continue-on-failure jest ignorowany). W rezultacie anulowane zostały aktualizacje następujących aplikacji: {apps}",
|
||||
"certmanager_domain_http_not_working": "Domena {domain} wydaje się niedostępna przez HTTP. Sprawdź kategorię 'Strona internetowa' diagnostyki, aby uzyskać więcej informacji. (Jeśli wiesz, co robisz, użyj opcji '--no-checks', aby wyłączyć te sprawdzania.)",
|
||||
"certmanager_domain_http_not_working": "Domena {domain} nie wydaje się być dostępna przez HTTP. Sprawdź kategorię 'Strona internetowa' diagnostyki, aby uzyskać więcej informacji. (Jeśli wiesz, co robisz, użyj opcji '--no-checks', aby wyłączyć te sprawdzania.)",
|
||||
"migration_0021_system_not_fully_up_to_date": "Twój system nie jest w pełni zaktualizowany! Proszę, wykonaj zwykłą aktualizację oprogramowania zanim rozpoczniesz migrację na system Bullseye.",
|
||||
"global_settings_setting_smtp_relay_port": "Port przekaźnika SMTP",
|
||||
"domain_config_cert_renew": "Odnów certyfikat Let's Encrypt",
|
||||
|
@ -274,5 +274,12 @@
|
|||
"global_settings_setting_smtp_allow_ipv6_help": "Zezwól na wykorzystywanie IPv7 do odbierania i wysyłania maili",
|
||||
"global_settings_setting_ssh_password_authentication": "Logowanie hasłem",
|
||||
"diagnosis_backports_in_sources_list": "Wygląda na to że apt (menedżer pakietów) został skonfigurowany tak, aby wykorzystywać repozytorium backported. Nie zalecamy wykorzystywania repozytorium backported, ponieważ może powodować problemy ze stabilnością i/lub konflikty z konfiguracją. No chyba, że wiesz co robisz.",
|
||||
"domain_config_xmpp_help": "Uwaga: niektóre funkcje XMPP będą wymagały aktualizacji rekordów DNS i odnowienia certyfikatu Lets Encrypt w celu ich włączenia"
|
||||
"domain_config_xmpp_help": "Uwaga: niektóre funkcje XMPP będą wymagały aktualizacji rekordów DNS i odnowienia certyfikatu Lets Encrypt w celu ich włączenia",
|
||||
"ask_dyndns_recovery_password_explain": "Proszę wybrać hasło odzyskiwania dla swojej domeny DynDNS, na wypadek gdybyś musiał go później zresetować.",
|
||||
"ask_dyndns_recovery_password_explain_during_unsubscribe": "Proszę wprowadzić hasło odzyskiwania dla tej domeny DynDNS.",
|
||||
"certmanager_unable_to_parse_self_CA_name": "Nie można spasować nazwy organu samopodpisywanego (pliku: {file})",
|
||||
"app_corrupt_source": "YunoHost był w stanie pobrać zasób ‘{source_id}’ ({url}) dla {app}, ale zasób nie pasuje do oczekiwanego sumy kontrolnej. Może to oznaczać, że na twoim serwerze wystąpiła tymczasowa awaria sieci, LUB zasób został jakoś zmieniony przez dostawcę usługi (lub złośliwego aktora?) i pakowacze YunoHost muszą zbadać sprawę i zaktualizować manifest aplikacji, aby odzwierciedlić tę zmianę. \nOczekiwana suma kontrolna sha256: {expected_sha256} \nPobrana suma kontrolna sha256: {computed_sha256} \nRozmiar pobranego pliku: {size}”",
|
||||
"ask_dyndns_recovery_password": "Hasło odzyskiwania DynDNS",
|
||||
"certmanager_hit_rate_limit": "Zbyt wiele certyfikatów zostało ostatnio wydanych dla tej dokładnej grupy domen {domain}. Spróbuj ponownie później. Zobacz https://letsencrypt.org/docs/rate-limits/ aby uzyskać więcej informacji",
|
||||
"apps_failed_to_upgrade_line": "\n * {app_id} (aby zobaczyć odpowiedni dziennik, wykonaj ‘yunohost log show {operation_logger_name}’)"
|
||||
}
|
||||
|
|
|
@ -15,5 +15,10 @@
|
|||
"additional_urls_already_added": "Ek URL '{url}' zaten '{permission}' izni için ek URL'ye eklendi",
|
||||
"additional_urls_already_removed": "Ek URL '{url}', '{permission}' izni için ek URL'de zaten kaldırıldı",
|
||||
"app_action_cannot_be_ran_because_required_services_down": "Bu eylemi gerçekleştirmek için şu servisler çalışıyor olmalıdır: {services}. Devam etmek için onları yeniden başlatın (ve muhtemelen neden çalışmadığını araştırın).",
|
||||
"app_arch_not_supported": "Bu uygulama yalnızca {required} işlemci mimarisi üzerine kurulabilir ancak sunucunuzun işlemci mimarisi {current}."
|
||||
}
|
||||
"app_arch_not_supported": "Bu uygulama yalnızca {required} işlemci mimarisi üzerine kurulabilir ancak sunucunuzun işlemci mimarisi {current}.",
|
||||
"app_argument_choice_invalid": "'{name}'' için geçerli bir değer giriniz '{value}' mevcut seçimlerin arasında değil ({choices})",
|
||||
"app_change_url_failed": "{app}: {error} için url değiştirilemedi",
|
||||
"app_argument_required": "'{name}' değeri gerekli",
|
||||
"app_argument_invalid": "'{name}': {error} için geçerli bir değer giriniz",
|
||||
"app_argument_password_no_default": "'{name}': çözümlenirken bir hata meydana geldi. Parola argümanı güvenlik nedeniyle varsayılan değer alamaz"
|
||||
}
|
||||
|
|
|
@ -849,14 +849,14 @@ app:
|
|||
help: Custom name for the app
|
||||
-a:
|
||||
full: --args
|
||||
help: Serialized arguments for app script (i.e. "domain=domain.tld&path=/path")
|
||||
help: Serialized arguments for app script (i.e. "domain=domain.tld&path=/path&init_main_permission=visitors")
|
||||
-n:
|
||||
full: --no-remove-on-failure
|
||||
help: Debug option to avoid removing the app on a failed installation
|
||||
action: store_true
|
||||
-f:
|
||||
full: --force
|
||||
help: Do not ask confirmation if the app is not safe to use (low quality, experimental or 3rd party)
|
||||
help: Do not ask confirmation if the app is not safe to use (low quality, experimental or 3rd party), or when the app displays a post-install notification
|
||||
action: store_true
|
||||
|
||||
### app_remove()
|
||||
|
@ -895,7 +895,7 @@ app:
|
|||
action: store_true
|
||||
-c:
|
||||
full: --continue-on-failure
|
||||
help: Continue to upgrade apps event if one or more upgrade failed
|
||||
help: Continue to upgrade apps even if one or more upgrade failed
|
||||
action: store_true
|
||||
|
||||
### app_change_url()
|
||||
|
|
55
src/app.py
55
src/app.py
|
@ -186,11 +186,17 @@ def app_info(app, full=False, upgradable=False):
|
|||
ret["from_catalog"] = from_catalog
|
||||
|
||||
# Hydrate app notifications and doc
|
||||
rendered_doc = {}
|
||||
for pagename, content_per_lang in ret["manifest"]["doc"].items():
|
||||
for lang, content in content_per_lang.items():
|
||||
ret["manifest"]["doc"][pagename][lang] = _hydrate_app_template(
|
||||
content, settings
|
||||
)
|
||||
rendered_content = _hydrate_app_template(content, settings)
|
||||
# Rendered content may be empty because of conditional blocks
|
||||
if not rendered_content:
|
||||
continue
|
||||
if pagename not in rendered_doc:
|
||||
rendered_doc[pagename] = {}
|
||||
rendered_doc[pagename][lang] = rendered_content
|
||||
ret["manifest"]["doc"] = rendered_doc
|
||||
|
||||
# Filter dismissed notification
|
||||
ret["manifest"]["notifications"] = {
|
||||
|
@ -201,9 +207,16 @@ def app_info(app, full=False, upgradable=False):
|
|||
|
||||
# Hydrate notifications (also filter uneeded post_upgrade notification based on version)
|
||||
for step, notifications in ret["manifest"]["notifications"].items():
|
||||
rendered_notifications = {}
|
||||
for name, content_per_lang in notifications.items():
|
||||
for lang, content in content_per_lang.items():
|
||||
notifications[name][lang] = _hydrate_app_template(content, settings)
|
||||
rendered_content = _hydrate_app_template(content, settings)
|
||||
if not rendered_content:
|
||||
continue
|
||||
if name not in rendered_notifications:
|
||||
rendered_notifications[name] = {}
|
||||
rendered_notifications[name][lang] = rendered_content
|
||||
ret["manifest"]["notifications"][step] = rendered_notifications
|
||||
|
||||
ret["is_webapp"] = "domain" in settings and "path" in settings
|
||||
|
||||
|
@ -678,9 +691,17 @@ def app_upgrade(
|
|||
safety_backup_name = f"{app_instance_name}-pre-upgrade2"
|
||||
other_safety_backup_name = f"{app_instance_name}-pre-upgrade1"
|
||||
|
||||
backup_create(
|
||||
name=safety_backup_name, apps=[app_instance_name], system=None
|
||||
)
|
||||
tweaked_backup_core_only = False
|
||||
if "BACKUP_CORE_ONLY" not in os.environ:
|
||||
tweaked_backup_core_only = True
|
||||
os.environ["BACKUP_CORE_ONLY"] = "1"
|
||||
try:
|
||||
backup_create(
|
||||
name=safety_backup_name, apps=[app_instance_name], system=None
|
||||
)
|
||||
finally:
|
||||
if tweaked_backup_core_only:
|
||||
del os.environ["BACKUP_CORE_ONLY"]
|
||||
|
||||
if safety_backup_name in backup_list()["archives"]:
|
||||
# if the backup suceeded, delete old safety backup to save space
|
||||
|
@ -772,7 +793,7 @@ def app_upgrade(
|
|||
and not no_safety_backup
|
||||
):
|
||||
logger.warning(
|
||||
"Upgrade failed ... attempting to restore the satefy backup (Yunohost first need to remove the app for this) ..."
|
||||
"Upgrade failed ... attempting to restore the safety backup (Yunohost first need to remove the app for this) ..."
|
||||
)
|
||||
|
||||
app_remove(app_instance_name, force_workdir=extracted_app_folder)
|
||||
|
@ -1082,7 +1103,7 @@ def app_install(
|
|||
args = {
|
||||
question.id: question.value
|
||||
for question in questions
|
||||
if question.value is not None
|
||||
if not question.readonly and question.value is not None
|
||||
}
|
||||
|
||||
# Validate domain / path availability for webapps
|
||||
|
@ -2099,6 +2120,13 @@ def _parse_app_doc_and_notifications(path):
|
|||
|
||||
|
||||
def _hydrate_app_template(template, data):
|
||||
|
||||
# Apply jinja for stuff like {% if .. %} blocks,
|
||||
# but only if there's indeed an if block (to try to reduce overhead or idk)
|
||||
if "{%" in template:
|
||||
from jinja2 import Template
|
||||
template = Template(template).render(**data)
|
||||
|
||||
stuff_to_replace = set(re.findall(r"__[A-Z0-9]+?[A-Z0-9_]*?[A-Z0-9]*?__", template))
|
||||
|
||||
for stuff in stuff_to_replace:
|
||||
|
@ -2107,7 +2135,7 @@ def _hydrate_app_template(template, data):
|
|||
if varname in data:
|
||||
template = template.replace(stuff, str(data[varname]))
|
||||
|
||||
return template
|
||||
return template.strip()
|
||||
|
||||
|
||||
def _convert_v1_manifest_to_v2(manifest):
|
||||
|
@ -3010,7 +3038,7 @@ def _filter_and_hydrate_notifications(notifications, current_version=None, data=
|
|||
current_version = str(current_version)
|
||||
return _parse_app_version(name) > _parse_app_version(current_version)
|
||||
|
||||
return {
|
||||
out = {
|
||||
# Should we render the markdown maybe? idk
|
||||
name: _hydrate_app_template(_value_for_locale(content_per_lang), data)
|
||||
for name, content_per_lang in notifications.items()
|
||||
|
@ -3019,6 +3047,9 @@ def _filter_and_hydrate_notifications(notifications, current_version=None, data=
|
|||
or is_version_more_recent_than_current_version(name, current_version)
|
||||
}
|
||||
|
||||
# Filter out empty notifications (notifications may be empty because of if blocks)
|
||||
return {name:content for name, content in out.items() if content and content.strip()}
|
||||
|
||||
|
||||
def _display_notifications(notifications, force=False):
|
||||
if not notifications:
|
||||
|
@ -3095,7 +3126,7 @@ def regen_mail_app_user_config_for_dovecot_and_postfix(only=None):
|
|||
if dovecot:
|
||||
hashed_password = _hash_user_password(settings["mail_pwd"])
|
||||
dovecot_passwd.append(
|
||||
f"{app}:{hashed_password}::::::allow_nets=127.0.0.1/24"
|
||||
f"{app}:{hashed_password}::::::allow_nets=::1,127.0.0.1/24,local"
|
||||
)
|
||||
if postfix:
|
||||
mail_user = settings.get("mail_user", app)
|
||||
|
|
|
@ -215,6 +215,11 @@ class MyDiagnoser(Diagnoser):
|
|||
for part in current
|
||||
if not part.startswith("ip4:") and not part.startswith("ip6:")
|
||||
}
|
||||
if "v=DMARC1" in r["value"]:
|
||||
for param in current:
|
||||
key, value = param.split("=")
|
||||
if key == "p":
|
||||
return value in ["none", "quarantine", "reject"]
|
||||
return expected == current
|
||||
elif r["type"] == "MX":
|
||||
# For MX, we want to ignore the priority
|
||||
|
|
|
@ -43,7 +43,7 @@ class MyDiagnoser(Diagnoser):
|
|||
dependencies: List[str] = ["ip"]
|
||||
|
||||
def run(self):
|
||||
self.ehlo_domain = _get_maindomain()
|
||||
self.ehlo_domain = _get_maindomain().lower()
|
||||
self.mail_domains = domain_list()["domains"]
|
||||
self.ipversions, self.ips = self.get_ips_checked()
|
||||
|
||||
|
@ -132,7 +132,7 @@ class MyDiagnoser(Diagnoser):
|
|||
summary=summary,
|
||||
details=[summary + "_details"],
|
||||
)
|
||||
elif r["helo"] != self.ehlo_domain:
|
||||
elif r["helo"].lower() != self.ehlo_domain:
|
||||
yield dict(
|
||||
meta={"test": "mail_ehlo", "ipversion": ipversion},
|
||||
data={"wrong_ehlo": r["helo"], "right_ehlo": self.ehlo_domain},
|
||||
|
@ -185,7 +185,7 @@ class MyDiagnoser(Diagnoser):
|
|||
rdns_domain = ""
|
||||
if len(value) > 0:
|
||||
rdns_domain = value[0][:-1] if value[0].endswith(".") else value[0]
|
||||
if rdns_domain != self.ehlo_domain:
|
||||
if rdns_domain.lower() != self.ehlo_domain:
|
||||
details = [
|
||||
"diagnosis_mail_fcrdns_different_from_ehlo_domain_details"
|
||||
] + details
|
||||
|
@ -194,7 +194,7 @@ class MyDiagnoser(Diagnoser):
|
|||
data={
|
||||
"ip": ip,
|
||||
"ehlo_domain": self.ehlo_domain,
|
||||
"rdns_domain": rdns_domain,
|
||||
"rdns_domain": rdns_domain.lower(),
|
||||
},
|
||||
status="ERROR",
|
||||
summary="diagnosis_mail_fcrdns_different_from_ehlo_domain",
|
||||
|
|
|
@ -160,11 +160,15 @@ class ConfigPanel:
|
|||
result[key] = {"ask": ask}
|
||||
if "current_value" in option:
|
||||
question_class = OPTIONS[option.get("type", OptionType.string)]
|
||||
result[key]["value"] = question_class.humanize(
|
||||
option["current_value"], option
|
||||
)
|
||||
if hasattr(question_class, "humanize"):
|
||||
result[key]["value"] = question_class.humanize(
|
||||
option["current_value"], option
|
||||
)
|
||||
else:
|
||||
result[key]["value"] = option["current_value"]
|
||||
|
||||
# FIXME: semantics, technically here this is not about a prompt...
|
||||
if question_class.hide_user_input_in_prompt:
|
||||
if getattr(question_class, "hide_user_input_in_prompt", None):
|
||||
result[key][
|
||||
"value"
|
||||
] = "**************" # Prevent displaying password in `config get`
|
||||
|
|
|
@ -1337,8 +1337,8 @@ class DatabaseAppResource(AppResource):
|
|||
|
||||
def provision_or_update(self, context: Dict = {}):
|
||||
# This is equivalent to ynh_sanitize_dbid
|
||||
db_name = self.app.replace("-", "_").replace(".", "_")
|
||||
db_user = db_name
|
||||
db_user = self.app.replace("-", "_").replace(".", "_")
|
||||
db_name = self.get_setting("db_name") or db_user
|
||||
self.set_setting("db_name", db_name)
|
||||
self.set_setting("db_user", db_user)
|
||||
|
||||
|
@ -1372,8 +1372,8 @@ class DatabaseAppResource(AppResource):
|
|||
)
|
||||
|
||||
def deprovision(self, context: Dict = {}):
|
||||
db_name = self.app.replace("-", "_").replace(".", "_")
|
||||
db_user = db_name
|
||||
db_user = self.app.replace("-", "_").replace(".", "_")
|
||||
db_name = self.get_setting("db_name") or db_user
|
||||
|
||||
if self.dbtype == "mysql":
|
||||
self._run_script(
|
||||
|
|
Loading…
Add table
Reference in a new issue