mirror of
https://github.com/MacRimi/ProxMenux.git
synced 2026-10-08 14:36:38 +00:00
fix: previews and warnings promise only what always happens
This commit is contained in:
@@ -19,7 +19,8 @@ EMPTY_HOST = 'No host directories found in the available container configs or sa
|
||||
POST_HOST = 'Host directory listed in saved records (not targeted for removal):'
|
||||
UPDATE = ('All {count} containers of the application are updated together (main CT: {vmid}). If there are new '
|
||||
'versions, all images are downloaded and verified, the application is stopped, each container is backed '
|
||||
'up and replaced with its new image. If anything fails, the backups are restored.')
|
||||
'up and replaced with its new image. If the operation fails after a container was changed, the backups are '
|
||||
'restored. An operation that stops halfway is recovered from the OCI management menu.')
|
||||
PENDING = ('A coordinated operation has a saved journal. Continuing attempts to recover the previous stack '
|
||||
'where needed, or finish cleanup for a completed operation. Recovery or cleanup can fail.')
|
||||
KEYS = (PREVIEW_HOST, EMPTY_HOST, POST_HOST, UPDATE, PENDING)
|
||||
|
||||
@@ -24,7 +24,8 @@ GUARD = 'The current template changes the template identity or image repository;
|
||||
OLD_PREVIEW = ('The saved image channel is checked for a newer image. If replacement is needed, the CT is stopped and '
|
||||
'a native backup is verified before its root is replaced. Host directories are outside that backup.')
|
||||
PREVIEW = ('If the image channel has a new version, the CT is stopped, backed up and verified, and replaced with '
|
||||
'the new image to update the container. If anything fails, the backup is restored.')
|
||||
'the new image to update the container. If the update fails after the container was changed, the backup '
|
||||
'is restored. An update that stops halfway is recovered from the OCI management menu.')
|
||||
|
||||
|
||||
def extracted(path, name, scope):
|
||||
|
||||
@@ -0,0 +1,51 @@
|
||||
"""A preview or a warning promises only what the code always does."""
|
||||
import ast
|
||||
import json
|
||||
from pathlib import Path
|
||||
from unittest import TestCase
|
||||
|
||||
ROOT = Path(__file__).resolve().parents[3]
|
||||
LOCALES = ('en', 'es', 'de', 'fr', 'it', 'pt', 'sk', 'sv')
|
||||
|
||||
|
||||
def oci_menu_texts():
|
||||
tree = ast.parse((ROOT / 'oci/src/proxmenux_oci/management.py').read_text())
|
||||
return [node.args[0].value for node in ast.walk(tree)
|
||||
if isinstance(node, ast.Call) and getattr(node.func, 'id', '') == 'translate'
|
||||
and node.args and isinstance(node.args[0], ast.Constant)]
|
||||
|
||||
|
||||
class OutcomePromises(TestCase):
|
||||
def test_a_failure_is_not_promised_to_end_in_a_restore(self):
|
||||
texts = oci_menu_texts()
|
||||
self.assertEqual([text for text in texts if 'If anything fails' in text], [])
|
||||
previews = [text for text in texts if 'stops halfway is recovered from the OCI management menu' in text]
|
||||
self.assertEqual(len(previews), 3)
|
||||
|
||||
def test_the_recovery_preview_says_when_each_step_happens(self):
|
||||
preview = next(text for text in oci_menu_texts() if 'previous native backup' in text)
|
||||
self.assertIn('If the container had already been changed', preview)
|
||||
self.assertIn('when the cleanup succeeds', preview)
|
||||
|
||||
def test_a_rclone_mount_is_not_listed_as_a_registration_problem(self):
|
||||
prompt = next(text for text in oci_menu_texts() if text.startswith('Until they are registered again'))
|
||||
self.assertIn('does not prevent it', prompt)
|
||||
self.assertIn('not started automatically', prompt)
|
||||
|
||||
def test_an_empty_retention_is_the_one_of_the_storage(self):
|
||||
menu = (ROOT / 'scripts/backup_restore/vm_backup_jobs.sh').read_text()
|
||||
self.assertIn('Leave empty to use the retention of the storage.', menu)
|
||||
self.assertNotIn('keep every backup', menu)
|
||||
|
||||
def test_host_backups_are_said_to_follow_the_storage(self):
|
||||
menu = (ROOT / 'scripts/backup_restore/vm_backup_jobs.sh').read_text()
|
||||
self.assertNotIn('stop running', menu)
|
||||
self.assertIn('Another job that writes to the same storage still starts them.', menu)
|
||||
english = json.loads((ROOT / 'AppImage/messages/en/common.json').read_text())['backup']['vmJobs']
|
||||
self.assertNotIn('stop running', english['deleteAttached'] + english['storageAttached'])
|
||||
self.assertIn('scheduled runs', english['disableBody'])
|
||||
for locale in LOCALES:
|
||||
texts = json.loads((ROOT / f'AppImage/messages/{locale}/common.json').read_text())['backup']['vmJobs']
|
||||
for key in ('deleteAttached', 'storageAttached'):
|
||||
self.assertEqual(texts[key].count('{ids}'), 1, f'{locale} {key}')
|
||||
self.assertEqual(texts['disableBody'].count('. '), 1, f'{locale} disableBody')
|
||||
@@ -4656,11 +4656,11 @@
|
||||
"actionFailed": "Der Vorgang ist fehlgeschlagen",
|
||||
"deleteTitle": "Job {id} löschen",
|
||||
"deleteBody": "Nur der Zeitplan wird entfernt. Die bereits erstellten Backups bleiben im Speicher.",
|
||||
"deleteAttached": "Diese Host-Backups laufen mit diesem Job und werden nicht mehr ausgeführt: {ids}",
|
||||
"storageAttached": "Diese Host-Backups laufen mit diesem Job und erwarten dessen Speicher: {ids}. Mit einem anderen Speicher werden sie nicht mehr ausgeführt.",
|
||||
"deleteAttached": "Dieser Job startet diese Host-Backups nicht mehr: {ids}. Ein anderer Job, der in denselben Speicher schreibt, startet sie weiterhin.",
|
||||
"storageAttached": "Diese Host-Backups laufen mit diesem Job und erwarten dessen Speicher: {ids}. Mit einem anderen Speicher startet dieser Job sie nicht mehr; ein anderer Job, der in den ursprünglichen Speicher schreibt, startet sie weiterhin.",
|
||||
"deleteConfirm": "Job löschen",
|
||||
"disableTitle": "Job {id} deaktivieren",
|
||||
"disableBody": "Der Job bleibt konfiguriert, läuft aber erst wieder, wenn er aktiviert wird.",
|
||||
"disableBody": "Der Job bleibt konfiguriert, aber seine geplanten Läufe pausieren, bis er wieder aktiviert wird. Er kann weiterhin von Hand ausgeführt werden.",
|
||||
"runTitle": "Job {id} jetzt ausführen",
|
||||
"runBody": "Das Backup startet jetzt mit den Einstellungen des Jobs, als Proxmox-Task.",
|
||||
"runStop": "Der Modus dieses Jobs ist stop: seine Gäste werden während des Backups heruntergefahren.",
|
||||
|
||||
@@ -4655,11 +4655,11 @@
|
||||
"actionFailed": "The operation failed",
|
||||
"deleteTitle": "Delete job {id}",
|
||||
"deleteBody": "Only the schedule is removed. The backups already made stay in the storage.",
|
||||
"deleteAttached": "These host backups run with this job and will stop running: {ids}",
|
||||
"storageAttached": "These host backups run with this job and expect its storage: {ids}. With another storage they stop running.",
|
||||
"deleteAttached": "This job will no longer start these host backups: {ids}. Another job that writes to the same storage still starts them.",
|
||||
"storageAttached": "These host backups run with this job and expect its storage: {ids}. With another storage this job no longer starts them; another job that writes to the original storage still does.",
|
||||
"deleteConfirm": "Delete job",
|
||||
"disableTitle": "Disable job {id}",
|
||||
"disableBody": "The job stays configured but does not run until it is enabled again.",
|
||||
"disableBody": "The job stays configured, but its scheduled runs stop until it is enabled again. It can still be run by hand.",
|
||||
"runTitle": "Run job {id} now",
|
||||
"runBody": "The backup starts now with the settings of the job, as a Proxmox task.",
|
||||
"runStop": "The mode of this job is stop: its guests are shut down during the backup.",
|
||||
|
||||
@@ -4656,11 +4656,11 @@
|
||||
"actionFailed": "La operación falló",
|
||||
"deleteTitle": "Eliminar el trabajo {id}",
|
||||
"deleteBody": "Solo se elimina la programación. Los backups ya hechos siguen en el almacenamiento.",
|
||||
"deleteAttached": "Estos backups del host se ejecutan con este trabajo y dejarán de ejecutarse: {ids}",
|
||||
"storageAttached": "Estos backups del host se ejecutan con este trabajo y esperan su almacenamiento: {ids}. Con otro almacenamiento dejan de ejecutarse.",
|
||||
"deleteAttached": "Este trabajo dejará de lanzar estos backups del host: {ids}. Otro trabajo que escriba en el mismo almacenamiento los sigue lanzando.",
|
||||
"storageAttached": "Estos backups del host se ejecutan con este trabajo y esperan su almacenamiento: {ids}. Con otro almacenamiento este trabajo deja de lanzarlos; otro trabajo que escriba en el almacenamiento original los sigue lanzando.",
|
||||
"deleteConfirm": "Eliminar trabajo",
|
||||
"disableTitle": "Desactivar el trabajo {id}",
|
||||
"disableBody": "El trabajo queda configurado pero no se ejecuta hasta que se active de nuevo.",
|
||||
"disableBody": "El trabajo queda configurado, pero sus ejecuciones programadas se detienen hasta que se active de nuevo. Se puede seguir ejecutando a mano.",
|
||||
"runTitle": "Ejecutar ahora el trabajo {id}",
|
||||
"runBody": "El backup empieza ahora con los ajustes del trabajo, como tarea de Proxmox.",
|
||||
"runStop": "El modo de este trabajo es stop: sus VM y CT se apagan durante el backup.",
|
||||
|
||||
@@ -4656,11 +4656,11 @@
|
||||
"actionFailed": "L'opération a échoué",
|
||||
"deleteTitle": "Supprimer la tâche {id}",
|
||||
"deleteBody": "Seule la planification est supprimée. Les sauvegardes déjà faites restent dans le stockage.",
|
||||
"deleteAttached": "Ces sauvegardes de l'hôte s'exécutent avec cette tâche et ne s'exécuteront plus : {ids}",
|
||||
"storageAttached": "Ces sauvegardes de l'hôte s'exécutent avec cette tâche et attendent son stockage : {ids}. Avec un autre stockage, elles ne s'exécutent plus.",
|
||||
"deleteAttached": "Cette tâche ne lancera plus ces sauvegardes de l'hôte : {ids}. Une autre tâche qui écrit dans le même stockage continue de les lancer.",
|
||||
"storageAttached": "Ces sauvegardes de l'hôte s'exécutent avec cette tâche et attendent son stockage : {ids}. Avec un autre stockage, cette tâche ne les lance plus ; une autre tâche qui écrit dans le stockage d'origine continue de les lancer.",
|
||||
"deleteConfirm": "Supprimer la tâche",
|
||||
"disableTitle": "Désactiver la tâche {id}",
|
||||
"disableBody": "La tâche reste configurée mais ne s'exécute plus tant qu'elle n'est pas réactivée.",
|
||||
"disableBody": "La tâche reste configurée, mais ses exécutions planifiées s'arrêtent tant qu'elle n'est pas réactivée. Elle peut toujours être lancée à la main.",
|
||||
"runTitle": "Exécuter la tâche {id} maintenant",
|
||||
"runBody": "La sauvegarde démarre maintenant avec les réglages de la tâche, comme tâche Proxmox.",
|
||||
"runStop": "Le mode de cette tâche est stop : ses VM et CT sont arrêtés pendant la sauvegarde.",
|
||||
|
||||
@@ -4656,11 +4656,11 @@
|
||||
"actionFailed": "Operazione non riuscita",
|
||||
"deleteTitle": "Elimina job {id}",
|
||||
"deleteBody": "Viene rimossa solo la pianificazione. Gli archivi di backup già creati restano sullo storage.",
|
||||
"deleteAttached": "Questi backup dell’host vengono eseguiti con questo job e non verranno più eseguiti: {ids}",
|
||||
"storageAttached": "Questi backup dell’host vengono eseguiti con questo job e si aspettano il suo storage: {ids}. Con un altro storage non vengono più eseguiti.",
|
||||
"deleteAttached": "Questo job non avvierà più questi backup dell’host: {ids}. Un altro job che scrive sullo stesso storage continua ad avviarli.",
|
||||
"storageAttached": "Questi backup dell’host vengono eseguiti con questo job e si aspettano il suo storage: {ids}. Con un altro storage questo job non li avvia più; un altro job che scrive sullo storage originale continua ad avviarli.",
|
||||
"deleteConfirm": "Elimina job",
|
||||
"disableTitle": "Disattiva job {id}",
|
||||
"disableBody": "Il job resta configurato ma non viene eseguito finché non viene riattivato.",
|
||||
"disableBody": "Il job resta configurato, ma le esecuzioni pianificate si fermano finché non viene riattivato. Può comunque essere eseguito a mano.",
|
||||
"runTitle": "Esegui ora il job {id}",
|
||||
"runBody": "Il backup parte ora con le impostazioni del job, come task di Proxmox.",
|
||||
"runStop": "La modalità di questo job è stop: i guest vengono arrestati durante il backup.",
|
||||
|
||||
@@ -4656,11 +4656,11 @@
|
||||
"actionFailed": "A operação falhou",
|
||||
"deleteTitle": "Eliminar a tarefa {id}",
|
||||
"deleteBody": "Só o agendamento é removido. Os backups já feitos ficam no armazenamento.",
|
||||
"deleteAttached": "Estes backups do host são executados com esta tarefa e deixarão de ser executados: {ids}",
|
||||
"storageAttached": "Estes backups do host são executados com esta tarefa e esperam o seu armazenamento: {ids}. Com outro armazenamento deixam de ser executados.",
|
||||
"deleteAttached": "Esta tarefa deixará de lançar estes backups do host: {ids}. Outra tarefa que escreva no mesmo armazenamento continua a lançá-los.",
|
||||
"storageAttached": "Estes backups do host são executados com esta tarefa e esperam o seu armazenamento: {ids}. Com outro armazenamento esta tarefa deixa de os lançar; outra tarefa que escreva no armazenamento original continua a lançá-los.",
|
||||
"deleteConfirm": "Eliminar tarefa",
|
||||
"disableTitle": "Desativar a tarefa {id}",
|
||||
"disableBody": "A tarefa fica configurada mas não é executada até ser ativada de novo.",
|
||||
"disableBody": "A tarefa fica configurada, mas as execuções agendadas param até ser ativada de novo. Pode continuar a ser executada à mão.",
|
||||
"runTitle": "Executar agora a tarefa {id}",
|
||||
"runBody": "O backup começa agora com as definições da tarefa, como tarefa do Proxmox.",
|
||||
"runStop": "O modo desta tarefa é stop: as suas VM e CT são desligadas durante o backup.",
|
||||
|
||||
@@ -4655,11 +4655,11 @@
|
||||
"actionFailed": "Operácia zlyhala",
|
||||
"deleteTitle": "Odstrániť úlohu {id}",
|
||||
"deleteBody": "Odstráni sa iba plán. Už vytvorené zálohy zostanú v úložisku.",
|
||||
"deleteAttached": "Tieto zálohy hostiteľa sa spúšťajú s touto úlohou a prestanú sa spúšťať: {ids}",
|
||||
"storageAttached": "Tieto zálohy hostiteľa sa spúšťajú s touto úlohou a očakávajú jej úložisko: {ids}. S iným úložiskom sa prestanú spúšťať.",
|
||||
"deleteAttached": "Táto úloha už nebude spúšťať tieto zálohy hostiteľa: {ids}. Iná úloha, ktorá zapisuje do rovnakého úložiska, ich spúšťa naďalej.",
|
||||
"storageAttached": "Tieto zálohy hostiteľa sa spúšťajú s touto úlohou a očakávajú jej úložisko: {ids}. S iným úložiskom ich táto úloha prestane spúšťať; iná úloha, ktorá zapisuje do pôvodného úložiska, ich spúšťa naďalej.",
|
||||
"deleteConfirm": "Odstrániť úlohu",
|
||||
"disableTitle": "Zakázať úlohu {id}",
|
||||
"disableBody": "Úloha zostane nakonfigurovaná, ale nespustí sa, kým ju znova nepovolíte.",
|
||||
"disableBody": "Úloha zostane nakonfigurovaná, ale jej plánované spustenia sa zastavia, kým ju znova nepovolíte. Stále ju možno spustiť ručne.",
|
||||
"runTitle": "Spustiť úlohu {id} teraz",
|
||||
"runBody": "Záloha sa spustí teraz s nastaveniami úlohy, ako úloha Proxmoxu.",
|
||||
"runStop": "Režim tejto úlohy je stop: jej VM a CT sa počas zálohy vypnú.",
|
||||
|
||||
@@ -4656,11 +4656,11 @@
|
||||
"actionFailed": "Åtgärden misslyckades",
|
||||
"deleteTitle": "Ta bort jobb {id}",
|
||||
"deleteBody": "Endast schemat tas bort. Redan skapade säkerhetskopior ligger kvar i lagringen.",
|
||||
"deleteAttached": "De här värdsäkerhetskopiorna körs med det här jobbet och slutar köras: {ids}",
|
||||
"storageAttached": "De här värdsäkerhetskopiorna körs med det här jobbet och förväntar sig dess lagring: {ids}. Med en annan lagring slutar de köras.",
|
||||
"deleteAttached": "Det här jobbet startar inte längre de här värdsäkerhetskopiorna: {ids}. Ett annat jobb som skriver till samma lagring startar dem fortfarande.",
|
||||
"storageAttached": "De här värdsäkerhetskopiorna körs med det här jobbet och förväntar sig dess lagring: {ids}. Med en annan lagring startar det här jobbet dem inte längre; ett annat jobb som skriver till den ursprungliga lagringen gör det fortfarande.",
|
||||
"deleteConfirm": "Ta bort jobb",
|
||||
"disableTitle": "Inaktivera jobb {id}",
|
||||
"disableBody": "Jobbet finns kvar men körs inte förrän det aktiveras igen.",
|
||||
"disableBody": "Jobbet finns kvar, men dess schemalagda körningar stoppas tills det aktiveras igen. Det kan fortfarande köras manuellt.",
|
||||
"runTitle": "Kör jobb {id} nu",
|
||||
"runBody": "Säkerhetskopieringen startar nu med jobbets inställningar, som en Proxmox-uppgift.",
|
||||
"runStop": "Det här jobbets läge är stop: dess VM och CT stängs av under säkerhetskopieringen.",
|
||||
|
||||
+9
-10
@@ -335,8 +335,8 @@
|
||||
"All types (images, backup, iso, vztmpl, snippets)": "Todos los tipos (images, backup, iso, vztmpl, snippets)",
|
||||
"All user-installed packages from the backup are present on this host": "Todos los paquetes instalados por el usuario desde el backup están presentes en este host",
|
||||
"All users with UID and GID": "Todos los usuarios con UID y GID",
|
||||
"All {count} containers of the application are updated together (main CT: {vmid}). If there are new versions, all images are downloaded and verified, the application is stopped, each container is backed up and replaced with its new image. If anything fails, the backups are restored.": "Se actualizan juntos los {count} contenedores de la aplicación (CT principal: {vmid}). Si hay versiones nuevas, se descargan y verifican todas las imágenes, se detiene la aplicación, se hace un backup de cada contenedor y se sustituyen por las nuevas imágenes. Si algo falla, se restauran los backups.",
|
||||
"All {count} containers of the application will be recreated from their saved image digests (main CT: {vmid}). The stack is stopped, every container is backed up and replaced, then checked. If anything fails, the backups are restored.": "Los {count} contenedores de la aplicación se recrearán desde los digest de imagen guardados (CT principal: {vmid}). La pila se detiene, se hace un backup de cada contenedor, se sustituye y se comprueba. Si algo falla, se restauran los backups.",
|
||||
"All {count} containers of the application are updated together (main CT: {vmid}). If there are new versions, all images are downloaded and verified, the application is stopped, each container is backed up and replaced with its new image. If the operation fails after a container was changed, the backups are restored. An operation that stops halfway is recovered from the OCI management menu.": "Se actualizan juntos los {count} contenedores de la aplicación (CT principal: {vmid}). Si hay versiones nuevas, se descargan y verifican todas las imágenes, se detiene la aplicación, se hace un backup de cada contenedor y se sustituyen por las nuevas imágenes. Si la operación falla después de modificar un contenedor, se restauran los backups. Una operación que se queda a medias se recupera desde el menú de gestión OCI.",
|
||||
"All {count} containers of the application will be recreated from their saved image digests (main CT: {vmid}). The stack is stopped, every container is backed up and replaced, then checked. If the operation fails after a container was changed, the backups are restored. An operation that stops halfway is recovered from the OCI management menu.": "Los {count} contenedores de la aplicación se recrearán desde los digest de imagen guardados (CT principal: {vmid}). La pila se detiene, se hace un backup de cada contenedor, se sustituye y se comprueba. Si la operación falla después de modificar un contenedor, se restauran los backups. Una operación que se queda a medias se recupera desde el menú de gestión OCI.",
|
||||
"Allocate CPU Cores": "Asignar núcleos de CPU",
|
||||
"Allocate RAM in MiB": "Asignar RAM en MiB",
|
||||
"Allow TCP port {port} from {subnet} through the host firewall? Existing firewall rules are not changed.": "¿Permitir el puerto TCP {port} desde {subnet} en el cortafuegos del host? Las reglas existentes no se modifican.",
|
||||
@@ -383,6 +383,7 @@
|
||||
"Another OCI operation is using the registry. This operation was not started.": "Otra operación OCI está utilizando el registro. Esta operación no se inició.",
|
||||
"Another device of the network already answers on this address:": "Otro dispositivo de la red ya responde en esta dirección:",
|
||||
"Another instance uses": "Otro caso utiliza",
|
||||
"Another job that writes to the same storage still starts them.": "Otro trabajo que escriba en el mismo almacenamiento los sigue lanzando.",
|
||||
"Another node, typed by hand": "Otro nodo, escrito a mano",
|
||||
"Another stack operation is pending": "Hay otra operación de pila pendiente",
|
||||
"Application": "Aplicación",
|
||||
@@ -2814,8 +2815,9 @@
|
||||
"If pvesm path returned a DEVICE (LVM):": "Si pvesm path devolvió un DISPOSITIVO (LVM):",
|
||||
"If pvesm path returned a DIRECTORY (ZFS/BTRFS):": "Si pvesm path devolvió un DIRECTORIO (ZFS/BTRFS):",
|
||||
"If repositories error:": "Si hay error en los repositorios:",
|
||||
"If the container had already been changed, its previous native backup is restored. Shared host directories are not reverted. The disks of the failed attempt are removed when the cleanup succeeds.": "Si el contenedor ya se había modificado, se restaura su backup nativo anterior. Los directorios compartidos del host no se revierten. Los discos del intento fallido se eliminan si la limpieza termina bien.",
|
||||
"If the host freezes, remove hostpci entries from": "Si el host se congela, elimine las entradas hostpci de",
|
||||
"If the image channel has a new version, the CT is stopped, backed up and verified, and replaced with the new image to update the container. If anything fails, the backup is restored.": "Si el canal de imagen tiene una versión nueva, el CT se detiene, se hace un backup, se verifica y se sustituye por la nueva imagen, actualizando el contenedor. Si algo falla, se restaura el backup.",
|
||||
"If the image channel has a new version, the CT is stopped, backed up and verified, and replaced with the new image to update the container. If the update fails after the container was changed, the backup is restored. An update that stops halfway is recovered from the OCI management menu.": "Si el canal de imagen tiene una versión nueva, el CT se detiene, se hace un backup, se verifica y se sustituye por la nueva imagen, actualizando el contenedor. Si la actualización falla después de modificar el contenedor, se restaura el backup. Una actualización que se queda a medias se recupera desde el menú de gestión OCI.",
|
||||
"If this happens, you can restore the backup from the 'Subscription Banner Removal' option in 'Uninstall optimizations'.": "Si esto sucede, puede restaurar el backup desde la opción 'Eliminación del banner de suscripción' en 'Desinstalar optimizaciones Post-Install'.",
|
||||
"If this node runs hyper-converged Ceph: ensure Ceph is 19.x (Squid) BEFORE upgrading PVE.": "Si este nodo ejecuta Ceph hiperconvergente: asegúrese de que Ceph sea 19.x (Squid) ANTES de actualizar PVE.",
|
||||
"If upgrade fails:": "Si la actualización falla:",
|
||||
@@ -3396,7 +3398,7 @@
|
||||
"Lazylibrarian is a program to follow authors and grab metadata for all your digital reading needs. It uses a combination of Goodreads Librarything and optionally GoogleBooks as sources for author info and book info. This container is based on the DobyTang fork.": "Lazylibrarian es un programa para seguir autores y obtener metadatos para todas tus lecturas digitales. Combina Goodreads, Librarything y, opcionalmente, GoogleBooks como fuentes de información de autores y libros. Este contenedor se basa en el fork de DobyTang.",
|
||||
"Ldap-auth software is for authenticating users who request protected resources from servers proxied by nginx. It includes a daemon (ldap-auth) that communicates with an authentication server, and a webserver daemon that generates an authentication cookie based on the user’s credentials. The daemons are written in Python for use with a Lightweight Directory Access Protocol (LDAP) authentication server (OpenLDAP or Microsoft Windows Active Directory 2003 and 2012).": "Ldap-auth autentica a los usuarios que piden recursos protegidos en servidores tras un proxy nginx. Incluye un daemon (ldap-auth) que se comunica con un servidor de autenticación y un daemon de servidor web que genera una cookie de autenticación a partir de las credenciales del usuario. Los daemons están escritos en Python para usarse con un servidor de autenticación LDAP (OpenLDAP o Microsoft Windows Active Directory 2003 y 2012).",
|
||||
"Leave empty to auto-generate one.": "Déjelo vacío para generarlo automáticamente.",
|
||||
"Leave empty to keep every backup (not recommended).": "Déjelo vacío para conservar todos los backups (no recomendado).",
|
||||
"Leave empty to use the retention of the storage.": "Déjelo vacío para usar la retención del almacenamiento.",
|
||||
"Legacy PVE 8 .list files commented or not present": "Archivos .list de PVE 8 heredados comentados o no presentes",
|
||||
"Legacy ceph.list commented or not present": "Legacy ceph.list comentado o no presente",
|
||||
"Legacy gasket-dkms cleanup could not be verified as complete.": "No se ha podido verificar que la limpieza del paquete heredado gasket-dkms haya finalizado correctamente.",
|
||||
@@ -6363,8 +6365,6 @@
|
||||
"The postgres user was not found in the image": "El usuario postgres no fue encontrado en la imagen",
|
||||
"The prepared directory escapes the rootfs:": "El directorio preparado escapa a los rootfs:",
|
||||
"The preselected VMID does not exist on this host:": "El VMID preseleccionado no existe en este host:",
|
||||
"The previous native backup will be restored. Shared host directories are not reverted. Displaced disks are kept.": "Se restaurará el backup nativo anterior. Los directorios compartidos del host no se revierten. Los discos desplazados se conservan.",
|
||||
"The previous native backup will be restored. Shared host directories are not reverted. The disks of the failed attempt are removed.": "Se restaurará el backup nativo anterior. Los directorios compartidos del host no se revierten. Los discos del intento fallido se eliminan.",
|
||||
"The previous recognition choice could not be put back:": "No se pudo volver a la opción de reconocimiento anterior:",
|
||||
"The previous stack contract is not safe; review it before reusing it": "El contrato de pila anterior no es seguro; revíselo antes de reutilizarlo",
|
||||
"The previous stack contract is not valid; it is not archived automatically": "El contrato de pila anterior no es válido; no se archiva automáticamente",
|
||||
@@ -6538,7 +6538,6 @@
|
||||
"These container mount paths have an extension-like suffix:": "Estas rutas de montaje del contenedor tienen un sufijo parecido a una extensión:",
|
||||
"These containers were restored from a backup and this host has no record of their OCI application:": "Estos contenedores se restauraron desde un backup y este host no tiene el registro de su aplicación OCI:",
|
||||
"These host backups run with this job and expect its storage:": "Estos backups del host se ejecutan con este trabajo y esperan su almacenamiento:",
|
||||
"These host backups run with this job and will stop running:": "Estos backups del host se ejecutan con este trabajo y dejarán de ejecutarse:",
|
||||
"These interface configurations will be removed": "Estas configuraciones de interfaz serán eliminadas",
|
||||
"These manual changes cannot be adopted safely:": "Estos cambios manuales no se pueden incorporar con seguridad:",
|
||||
"These paths will not be restored live and will be extracted for manual recovery.": "Estas rutas no se restaurarán en vivo y se extraerán para su recuperación manual.",
|
||||
@@ -6591,6 +6590,7 @@
|
||||
"This is not a valid image reference:": "Esta no es una referencia de imagen válida:",
|
||||
"This is unexpected since credentials were validated.": "Esto es inesperado ya que se validaron las credenciales.",
|
||||
"This is what ProxMenux understood from the": "Esto es lo que ProxMenux entendió del",
|
||||
"This job will no longer start these host backups:": "Este trabajo dejará de lanzar estos backups del host:",
|
||||
"This marks the container as unprivileged": "Esto marca el contenedor como sin privilegios",
|
||||
"This may be normal for a fresh installation": "Esto puede ser normal para una instalación nueva",
|
||||
"This may take a few minutes. Press OK to proceed.": "Esto puede tardar unos minutos. Presione Aceptar para continuar.",
|
||||
@@ -6871,8 +6871,7 @@
|
||||
"Unsupported storage mode:": "Modo de almacenamiento sin soporte:",
|
||||
"Unsupported tmpfs options": "Opciones de tmpfs sin soporte",
|
||||
"Unsupported volume options:": "Opciones de volumen no admitidas:",
|
||||
"Until they are registered again they cannot be updated or managed from here. The recovery checks first that everything they need is on this host and changes nothing otherwise.": "Hasta que se registren de nuevo no se pueden actualizar ni gestionar desde aquí. La recuperación comprueba antes que este host tiene todo lo que necesitan y, si no es así, no cambia nada.",
|
||||
"Until they are registered again they cannot be updated or managed from here. The recovery checks first that everything they need is on this host; an application that lacks something is not registered.": "Hasta que se registren de nuevo no se pueden actualizar ni gestionar desde aquí. La recuperación comprueba antes que este host tiene todo lo que necesitan; una aplicación a la que le falta algo no se registra.",
|
||||
"Until they are registered again they cannot be updated or managed from here. The recovery checks first what prevents their registration; an application with such a problem is not registered. A Rclone mount that has to be enabled again does not prevent it, but then the applications are not started automatically.": "Hasta que se registren de nuevo no se pueden actualizar ni gestionar desde aquí. La recuperación comprueba antes qué impide registrarlas; una aplicación con un problema así no se registra. Un montaje de Rclone que haya que activar de nuevo no lo impide, pero entonces las aplicaciones no se inician automáticamente.",
|
||||
"Untrusted or modified NVIDIA hook": "Hook NVIDIA sin confianza o modificado",
|
||||
"Unused image removed from the cache:": "Imagen sin uso eliminada de la caché:",
|
||||
"Unused images removed from the cache:": "Imágenes sin uso eliminadas de la caché:",
|
||||
@@ -7248,7 +7247,7 @@
|
||||
"Wired NICs in backup missing on target:": "NIC cableadas del backup que faltan en el destino:",
|
||||
"Wireless Controller": "Controlador inalámbrico",
|
||||
"Wireshark is the world’s foremost and widely-used network protocol analyzer. It lets you see what’s happening on your network at a microscopic level and is the de facto (and often de jure) standard across many commercial and non-profit enterprises, government agencies, and educational institutions. Wireshark development thrives thanks to the volunteer contributions of networking experts around the globe and is the continuation of a project started by Gerald Combs in 1998.": "Wireshark es el analizador de protocolo de red más importante y ampliamente utilizado del mundo. Le permite ver lo que está sucediendo en su red a nivel microscópico y es el estándar de facto (y a menudo de jure) en muchas empresas comerciales y sin fines de lucro, agencias gubernamentales e instituciones educativas. El desarrollo de Wireshark prospera gracias a las contribuciones voluntarias de expertos en redes en todo el mundo y es la continuación de un proyecto iniciado por Gerald Combs en 1998.",
|
||||
"With another storage they stop running.": "Con otro almacenamiento dejan de ejecutarse.",
|
||||
"With another storage this job no longer starts them. Another job that writes to the original storage still does.": "Con otro almacenamiento este trabajo deja de lanzarlos. Otro trabajo que escriba en el almacenamiento original los sigue lanzando.",
|
||||
"With dns validation, the DNSPLUGIN variable names the provider plugin. The advanced installation asks for it; otherwise add the line lxc.environment.runtime: DNSPLUGIN=<plugin> to /etc/pve/lxc/<CTID>.conf with the container stopped.": "Con la validación dns, la variable DNSPLUGIN indica el plugin del proveedor. La instalación avanzada la pide; si no, añade la línea lxc.environment.runtime: DNSPLUGIN=<plugin> a /etc/pve/lxc/<CTID>.conf con el contenedor detenido.",
|
||||
"With dns validation, write the provider credentials in /config/dns-conf/<plugin>.ini inside the container and restart it.": "Con la validación dns, escribe las credenciales del proveedor en /config/dns-conf/<plugin>.ini dentro del contenedor y reinícialo.",
|
||||
"With http validation, port 80 of the router must be forwarded to port 80 of this container.": "Con la validación http, el puerto 80 del router debe estar redirigido al puerto 80 de este contenedor.",
|
||||
|
||||
@@ -186,7 +186,7 @@ def offer_recovery(project, ui):
|
||||
lines = '\n'.join(f" CT {row['vmid']} {row['hostname']}" for row in found)
|
||||
text = (f"{translate('These containers were restored from a backup and this host has no record of their OCI application:')}"
|
||||
f"\n\n{lines}\n\n"
|
||||
f"{translate('Until they are registered again they cannot be updated or managed from here. The recovery checks first that everything they need is on this host; an application that lacks something is not registered.')}"
|
||||
f"{translate('Until they are registered again they cannot be updated or managed from here. The recovery checks first what prevents their registration; an application with such a problem is not registered. A Rclone mount that has to be enabled again does not prevent it, but then the applications are not started automatically.')}"
|
||||
f"\n\n{translate('Recover them now?')}")
|
||||
if not ui.confirm(text, default=True):
|
||||
return
|
||||
@@ -346,7 +346,7 @@ def manage_instance(project, ui, row, action=None, lifecycle_args=()):
|
||||
wizard.close()
|
||||
if not approved:
|
||||
return False
|
||||
elif not ui.review(translate('If the image channel has a new version, the CT is stopped, backed up and verified, and replaced with the new image to update the container. If anything fails, the backup is restored.'),
|
||||
elif not ui.review(translate('If the image channel has a new version, the CT is stopped, backed up and verified, and replaced with the new image to update the container. If the update fails after the container was changed, the backup is restored. An update that stops halfway is recovered from the OCI management menu.'),
|
||||
translate('Update OCI'), question=translate('Update now?'), default=True):
|
||||
return False
|
||||
command = [sys.executable, str(project / 'remote/oci_update_current.py'), str(row['vmid']),
|
||||
@@ -372,7 +372,7 @@ def manage_instance(project, ui, row, action=None, lifecycle_args=()):
|
||||
if action is None:
|
||||
return False
|
||||
if action == 'recover' and not ui.review(
|
||||
translate('The previous native backup will be restored. Shared host directories are not reverted. The disks of the failed attempt are removed.'),
|
||||
translate('If the container had already been changed, its previous native backup is restored. Shared host directories are not reverted. The disks of the failed attempt are removed when the cleanup succeeds.'),
|
||||
translate('Recover OCI'), question=translate('Recover now?'), default=True):
|
||||
return False
|
||||
return _run_lifecycle([sys.executable, str(project / 'remote/oci_instance_transaction.py'),
|
||||
@@ -501,15 +501,18 @@ def _manage_stack(project, ui, row, action=None, lifecycle_args=()):
|
||||
if action == 'recreate':
|
||||
if not ui.review(translate('All {count} containers of the application will be recreated from their saved '
|
||||
'image digests (main CT: {vmid}). The stack is stopped, every container is '
|
||||
'backed up and replaced, then checked. If anything fails, the backups are restored.')
|
||||
'backed up and replaced, then checked. If the operation fails after a container was '
|
||||
'changed, the backups are restored. An operation that stops halfway is recovered from '
|
||||
'the OCI management menu.')
|
||||
.format(count=len(members), vmid=primary_id), translate('Recreate OCI stack'),
|
||||
question=translate('Recreate the whole stack?'), default=False):
|
||||
return False
|
||||
else:
|
||||
if not ui.review(translate('All {count} containers of the application are updated together (main CT: {vmid}). '
|
||||
'If there are new versions, all images are downloaded and verified, the application '
|
||||
'is stopped, each container is backed up and replaced with its new image. If anything '
|
||||
'fails, the backups are restored.').format(count=len(members), vmid=primary_id),
|
||||
'is stopped, each container is backed up and replaced with its new image. If the operation '
|
||||
'fails after a container was changed, the backups are restored. An operation that stops '
|
||||
'halfway is recovered from the OCI management menu.').format(count=len(members), vmid=primary_id),
|
||||
translate('Update OCI stack'), question=translate('Update the whole stack?'), default=True):
|
||||
return False
|
||||
else:
|
||||
|
||||
@@ -254,7 +254,7 @@ select_compress() {
|
||||
input_retention() {
|
||||
local default="${1:-keep-last=3}"
|
||||
JOB_PRUNE=$(dialog --backtitle "$BACKTITLE" --title "$(translate "Retention")" \
|
||||
--inputbox "\n$(translate "Retention policy (prune-backups syntax).")\n$(translate "Examples:")\n keep-last=3\n keep-daily=7,keep-weekly=4,keep-monthly=6\n\n$(translate "Leave empty to keep every backup (not recommended).")" \
|
||||
--inputbox "\n$(translate "Retention policy (prune-backups syntax).")\n$(translate "Examples:")\n keep-last=3\n keep-daily=7,keep-weekly=4,keep-monthly=6\n\n$(translate "Leave empty to use the retention of the storage.")" \
|
||||
14 74 "$default" 3>&1 1>&2 2>&3)
|
||||
[[ $? -ne 0 ]] && return 1
|
||||
return 0
|
||||
@@ -366,7 +366,7 @@ edit_job_wizard() {
|
||||
attached=$(attached_host_backups "$job_id")
|
||||
if [[ -n "$attached" && "$JOB_STORAGE" != "$cur_storage" ]]; then
|
||||
dialog --backtitle "$BACKTITLE" --title "$(translate "Storage")" \
|
||||
--msgbox "\n$(translate "These host backups run with this job and expect its storage:") $attached\n\n$(translate "With another storage they stop running.")" 12 70
|
||||
--msgbox "\n$(translate "These host backups run with this job and expect its storage:") $attached\n\n$(translate "With another storage this job no longer starts them. Another job that writes to the original storage still does.")" 14 70
|
||||
fi
|
||||
cur_storage="$JOB_STORAGE"
|
||||
fi
|
||||
@@ -419,9 +419,9 @@ delete_job() {
|
||||
local job_id="$1"
|
||||
local attached warning=""
|
||||
attached=$(attached_host_backups "$job_id")
|
||||
[[ -n "$attached" ]] && warning="\n\n$(translate "These host backups run with this job and will stop running:") $attached"
|
||||
[[ -n "$attached" ]] && warning="\n\n$(translate "This job will no longer start these host backups:") $attached\n$(translate "Another job that writes to the same storage still starts them.")"
|
||||
dialog --backtitle "$BACKTITLE" --title "$(translate "Confirm Delete")" \
|
||||
--yesno "\n$(translate "Delete backup job") '$job_id'?\n\n$(translate "This only removes the schedule. Existing backup archives are NOT deleted.")${warning}" 14 70
|
||||
--yesno "\n$(translate "Delete backup job") '$job_id'?\n\n$(translate "This only removes the schedule. Existing backup archives are NOT deleted.")${warning}" 16 70
|
||||
[[ $? -ne 0 ]] && return 1
|
||||
|
||||
header
|
||||
|
||||
Reference in New Issue
Block a user