mirror of
https://github.com/MacRimi/ProxMenux.git
synced 2026-11-01 10:22:08 +00:00
feat(oci): offer access to an existing host directory and gather the file-sharing applications
feat(oci): offer access to a host directory that already exists feat(oci): gather the file-sharing applications in Files & Sharing fix(oci): ShareCoveX keeps its settings in a 1 GB volume, and the new translations are mended
This commit is contained in:
@@ -47,6 +47,7 @@ class InventoryMessages(unittest.TestCase):
|
||||
remover.members_of = lambda root, vmid: (101, {}, [102, 101])
|
||||
remover.guest_config = lambda vmid: configs.get(vmid)
|
||||
remover.host_directories = lambda root, members: cache or []
|
||||
remover.granted_directories = lambda root, members: []
|
||||
remover.private_bridge = lambda primary: None
|
||||
state = ModuleType('oci_installation_state')
|
||||
state.parse_config = lambda raw: dict(line.split(': ', 1) for line in raw.decode().splitlines())
|
||||
@@ -73,7 +74,7 @@ class InventoryMessages(unittest.TestCase):
|
||||
'instances': SimpleNamespace(read=lambda root, vmid: {'installation_id': 'owned'},
|
||||
identity=lambda raw: 'owned', location=lambda root, vmid: Path('/inert/absent/record.json')),
|
||||
'guest_config': lambda vmid: b'description: owned',
|
||||
'host_directories': lambda root, members: ['/bind/saved'],
|
||||
'host_directories': lambda root, members: ['/bind/saved'], 'granted_directories': lambda *args: [],
|
||||
'private_bridge': lambda primary: None,
|
||||
'remove_owned_host_firewall': lambda primary: True,
|
||||
'run': lambda *args: events.append(('run', args)),
|
||||
|
||||
@@ -50,6 +50,7 @@ class RemovalWordings(unittest.TestCase):
|
||||
{'host_firewall': {'port': 8080}} if firewall else {}}, [102, 101])
|
||||
remover.guest_config = lambda member: None
|
||||
remover.host_directories = lambda root, members: []
|
||||
remover.granted_directories = lambda root, members: []
|
||||
remover.private_bridge = lambda primary: bridge
|
||||
remover.bridge_in_use = lambda bridge, removed: False
|
||||
state = ModuleType('oci_installation_state')
|
||||
@@ -79,6 +80,7 @@ class RemovalWordings(unittest.TestCase):
|
||||
remover.members_of = lambda root, vmid: (101, {'stack': {}}, [102, 101])
|
||||
remover.guest_config = lambda member: None
|
||||
remover.host_directories = lambda root, members: []
|
||||
remover.granted_directories = lambda root, members: []
|
||||
remover.private_bridge = lambda primary: None
|
||||
state = ModuleType('oci_installation_state')
|
||||
state.parse_config = lambda raw: {}
|
||||
@@ -108,7 +110,7 @@ class RemovalWordings(unittest.TestCase):
|
||||
identity=lambda raw: 'reassigned' if raw == b'reassigned' else 'owned',
|
||||
location=lambda root, vmid: Path('/inert/absent/record.json')),
|
||||
'guest_config': lambda vmid: b'reassigned' if vmid == 102 else b'owned',
|
||||
'host_directories': lambda root, members: [], 'private_bridge': lambda primary: 'vmbr9',
|
||||
'host_directories': lambda root, members: [], 'granted_directories': lambda *args: [], 'private_bridge': lambda primary: 'vmbr9',
|
||||
'bridge_in_use': lambda bridge, removed: True,
|
||||
'release_bridge': lambda bridge: self.fail('shared bridge release'),
|
||||
'remove_owned_host_firewall': lambda record: None,
|
||||
@@ -179,7 +181,7 @@ class RemovalWordings(unittest.TestCase):
|
||||
location=lambda root, vmid: Path('/inert/absent/record.json')),
|
||||
'guest_config': lambda vmid: (None if missing else b'reassigned' if reassigned else b'owned')
|
||||
if vmid == 102 else b'primary',
|
||||
'host_directories': lambda *args: ['/retained'] if kept else [],
|
||||
'host_directories': lambda *args: ['/retained'] if kept else [], 'granted_directories': lambda *args: [],
|
||||
'private_bridge': lambda primary: 'vmbr9' if bridge != 'none' else None,
|
||||
'bridge_in_use': lambda *args: bridge == 'shared',
|
||||
'run': lambda *args: commands.append(args), 'subprocess': fake_subprocess,
|
||||
@@ -258,7 +260,7 @@ class RemovalWordings(unittest.TestCase):
|
||||
scope = {'members_of': lambda root, vmid: (101, {}, [101]),
|
||||
'instances': SimpleNamespace(read=lambda root, vmid: {'installation_id': 'owned'},
|
||||
identity=lambda cfg: 'owned', location=lambda root, vmid: Path('/inert/absent/record.json')),
|
||||
'guest_config': lambda vmid: b'owned', 'host_directories': lambda *args: [],
|
||||
'guest_config': lambda vmid: b'owned', 'host_directories': lambda *args: [], 'granted_directories': lambda *args: [],
|
||||
'private_bridge': lambda primary: 'vmbr9', 'bridge_in_use': lambda *args: False,
|
||||
'release_bridge': lambda bridge: events.append(('attempt', bridge)),
|
||||
'remove_owned_host_firewall': lambda record: None, 'run': lambda *args: None,
|
||||
|
||||
+3
-3
@@ -4869,7 +4869,7 @@
|
||||
"Rebooting the system...": "Neustart des Systems...",
|
||||
"Rebuilding initramfs after vfio.conf cleanup...": "Initramfs nach der Bereinigung von vfio.conf neu erstellen ...",
|
||||
"Rebuilding initramfs to apply nouveau blacklist before installation...": "Initramfs neu erstellen, um vor der Installation die Nouveau-Blacklist anzuwenden ...",
|
||||
"Rebuilding the container and recovering it from its backup are tested on the same image; the first update to a newer image is still to be observed.": "Die Neuerstellung des Containers und die Wiederherstellung aus seinem Backup werden auf demselben Image getestet.das erste Update auf ein neueres Image steht noch aus.",
|
||||
"Rebuilding the container and recovering it from its backup are tested on the same image; the first update to a newer image is still to be observed.": "Die Neuerstellung des Containers und die Wiederherstellung aus seinem Backup werden auf demselben Image getestet. Das erste Update auf ein neueres Image steht noch aus.",
|
||||
"Recent": "Jüngste",
|
||||
"Recent Samba Servers": "Aktuelle Samba-Server",
|
||||
"Recent Samba server": "Aktueller Samba-Server",
|
||||
@@ -6356,7 +6356,7 @@
|
||||
"The mount source or options were not kept": "Die Mount-Quelle oder Optionen wurden nicht gehalten",
|
||||
"The mounted source differs from the configured directory": "Die gespeicherte Quelle unterscheidet sich vom konfigurierten Verzeichnis",
|
||||
"The mounts of the new container do not match the proposal": "Die Halterungen des neuen Containers entsprechen nicht dem Vorschlag",
|
||||
"The name must start with a lowercase letter and use only lowercase letters, digits, - or _": "Der Name muss mit einem Kleinbuchstaben beginnen und darf nur Kleinbuchstaben, Ziffern, - oder _ enthalten.",
|
||||
"The name must start with a lowercase letter and use only lowercase letters, digits, - or _": "Der Name muss mit einem Kleinbuchstaben beginnen und darf nur Kleinbuchstaben, Ziffern, - oder _ enthalten",
|
||||
"The native GPU permissions were not kept": "Die nativen GPU-Berechtigungen wurden nicht eingehalten",
|
||||
"The native unprivileged idmap is required": "Die native unprivilegierte idmap ist required",
|
||||
"The new SSH key was installed and is now authorized on the server.\nKey file:": "Der neue SSH-Schlüssel wurde installiert und ist nun auf dem Server autorisiert.\nSchlüsseldatei:",
|
||||
@@ -6606,7 +6606,7 @@
|
||||
"This application is under watchdog: it is restarted automatically when it crashes. Turn the watchdog off?": "Diese Anwendung steht unter Watchdog: Sie wird automatisch neu gestartet, wenn sie abstürzt. Den Watchdog ausschalten?",
|
||||
"This archive does not contain a recognized backup layout.": "Dieses Archiv enthält kein anerkanntes Backup-Layout.",
|
||||
"This backup does not contain any restorable paths.": "Dieses Backup enthält keine wiederherstellbaren Pfade.",
|
||||
"This backup does not fit on the system disk of the host; it is made on the storage:": "Dieses Backup passt nicht auf die Systemfestplatte des Hosts.es wird auf dem Speicher gemacht:",
|
||||
"This backup does not fit on the system disk of the host; it is made on the storage:": "Dieses Backup passt nicht auf die Systemfestplatte des Hosts. Es wird auf dem Speicher gemacht:",
|
||||
"This backup includes /etc/zfs/zpool.cache (host-specific ZFS state).": "Dieses Backup umfasst /etc/zfs/zpool.cache (hostspezifischer ZFS-Status).",
|
||||
"This backup is encrypted.": "Dieses Backup ist verschlüsselt.",
|
||||
"This backup was taken on kernel": "Dieses Backup wurde im Kernel erstellt",
|
||||
|
||||
+45
-41
@@ -131,7 +131,7 @@
|
||||
"ACL Status:": "Estado de ACL:",
|
||||
"ACL permissions applied for local access for user:": "Permisos ACL aplicados para el acceso local del usuario:",
|
||||
"ADVANCED SETTINGS COMPLETE": "CONFIGURACIÓN AVANZADA COMPLETA",
|
||||
"AI / Coding & Dev-Tools": "IA, programación y desarrollo",
|
||||
"AI / Coding & Dev-Tools": "AI / Coding & Dev-Tools",
|
||||
"ALL DATA ON": "TODOS LOS DATOS SOBRE",
|
||||
"ALL DATA ON THIS DISK WILL BE PERMANENTLY LOST!": "¡TODOS LOS DATOS DE ESTE DISCO SE PERDERÁN PERMANENTEMENTE!",
|
||||
"ALL Utilities": "TODAS las utilidades",
|
||||
@@ -203,7 +203,7 @@
|
||||
"Actual device path on the host": "Ruta real del dispositivo en el host",
|
||||
"Adaptation file too large": "Archivo de adaptación demasiado grande",
|
||||
"Adaptation file with unexpected permissions or owner": "Archivo de adaptación con permisos inesperados o propietario",
|
||||
"Adblock & DNS": "Adblock y DNS",
|
||||
"Adblock & DNS": "Adblock & DNS",
|
||||
"Add Audio Passthrough": "Agregar passthrough de audio",
|
||||
"Add CIFS storage:": "Agregue almacenamiento CIFS:",
|
||||
"Add Controller or NVMe (PCI passthrough)": "Agregar controlador o NVMe (passthrough PCI)",
|
||||
@@ -224,10 +224,10 @@
|
||||
"Add Samba share as Proxmox Storage": "Agregar recurso compartido Samba como almacenamiento en Proxmox",
|
||||
"Add a Coral PCIe/M.2 device?": "¿Añadir un dispositivo Coral PCIe/M.2?",
|
||||
"Add a custom data path?": "¿Añadir una ruta de datos personalizada?",
|
||||
"Add a directory to share": "agregar un directorio para compartir",
|
||||
"Add a directory to share": "Añadir un directorio para compartir",
|
||||
"Add an extra custom path": "Añadir una ruta personalizada adicional",
|
||||
"Add another GPU or USB device manually?": "¿Añadir manualmente otra GPU u otro dispositivo USB?",
|
||||
"Add another directory to share?": "¿Agregar otro directorio para compartir?",
|
||||
"Add another directory to share?": "¿Añadir otro directorio para compartir?",
|
||||
"Add another extra path to this stack": "Añadir otra ruta adicional a esta pila",
|
||||
"Add as IDE": "Agregar como IDE",
|
||||
"Add as SATA": "Agregar como SATA",
|
||||
@@ -480,7 +480,7 @@
|
||||
"Auth key is required.": "Se requiere clave de autenticación.",
|
||||
"Auth:": "Autenticación:",
|
||||
"Authentication": "Autenticación",
|
||||
"Authentication & Security": "Autenticación y seguridad",
|
||||
"Authentication & Security": "Authentication & Security",
|
||||
"Authentication Error": "Error de autenticación",
|
||||
"Authentication failed.": "La autenticación falló.",
|
||||
"Authentication required:": "Se requiere autenticación:",
|
||||
@@ -504,7 +504,7 @@
|
||||
"Automatic private network allocation requires a /24 subnet": "Asignación automática de red privada requiere una subred /24",
|
||||
"Automatic video library manager for TV Shows": "Gestor automático de videoteca para series de TV",
|
||||
"Automatic/Unattended": "Automático/desatendido",
|
||||
"Automation & Scheduling": "Automatización y programación",
|
||||
"Automation & Scheduling": "Automation & Scheduling",
|
||||
"Available": "Disponible",
|
||||
"Available Borg archives (newest first):": "Archivos Borg disponibles (los más nuevos primero):",
|
||||
"Available Borg targets:": "Destinos Borg disponibles:",
|
||||
@@ -543,7 +543,7 @@
|
||||
"Backend:": "Parte trasera:",
|
||||
"Background archive extraction for Arr download queues. No web interface.": "Extracción de archivos comprimidos en segundo plano para las colas de descarga de Arr. Sin interfaz web.",
|
||||
"Backup — VM and CT backups": "Backup — backups de VM y CT",
|
||||
"Backup & Recovery": "Backups y recuperación",
|
||||
"Backup & Recovery": "Backup & Recovery",
|
||||
"Backup Created": "Backup creado",
|
||||
"Backup ID (group name in PBS):": "ID del backup (nombre del grupo en PBS):",
|
||||
"Backup ID for this job:": "ID del backup para este trabajo:",
|
||||
@@ -652,11 +652,11 @@
|
||||
"Broken gasket-dkms package state recovered.": "Se ha recuperado el estado dañado del paquete gasket-dkms.",
|
||||
"Browse Your Life in Images": "Explora tu vida en imágenes",
|
||||
"Browse manually (advanced)...": "Navegar manualmente (avanzado)...",
|
||||
"Browsers & Web Desktops": "Navegadores y escritorios web",
|
||||
"Browsers & Web Desktops": "Browsers & Web Desktops",
|
||||
"Build and install the gasket and apex kernel modules (DKMS)": "Compilar e instalar los módulos del kernel gasket y apex (DKMS)",
|
||||
"Build dependencies installed.": "Construya dependencias instaladas.",
|
||||
"Build your personal knowledge base with TriliumNext Notes": "Crea tu base de conocimiento personal con TriliumNext Notes",
|
||||
"Business & ERP": "Empresa y ERP",
|
||||
"Business & ERP": "Business & ERP",
|
||||
"CDC Data": "Datos CDC",
|
||||
"CHANGES APPLIED SUCCESSFULLY": "CAMBIOS APLICADOS CORRECTAMENTE",
|
||||
"CIFS Client Tools: AVAILABLE": "Herramientas de cliente CIFS: DISPONIBLES",
|
||||
@@ -933,7 +933,7 @@
|
||||
"Commenting legacy ceph.list (if present)...": "Comentando ceph.list heredado (si está presente)...",
|
||||
"Common Issues Check": "Verificación de problemas comunes",
|
||||
"Common root for the published views": "Raíz común para las vistas publicadas",
|
||||
"Communication & Community": "Comunicación y comunidad",
|
||||
"Communication & Community": "Communication & Community",
|
||||
"Communications": "Comunicaciones",
|
||||
"Community Scripts": "Scripts comunitarios",
|
||||
"Community single-container Home Assistant OS image": "Imagen comunitaria de Home Assistant OS en un solo contenedor",
|
||||
@@ -1157,7 +1157,7 @@
|
||||
"Container will pick up the mount on next start": "El contenedor verá el montaje en el próximo inicio",
|
||||
"Container with ID": "Contenedor con ID",
|
||||
"Container:": "Contenedor:",
|
||||
"Containers & Docker": "Contenedores y Docker",
|
||||
"Containers & Docker": "Containers & Docker",
|
||||
"Containers created from an OCI image are not listed.": "Los contenedores creados desde una imagen OCI no aparecen en la lista.",
|
||||
"Containers created from an OCI image are not listed: their devices are changed in OCI manager Apps.": "Los contenedores creados desde una imagen OCI no aparecen: sus dispositivos se cambian en OCI manager Apps.",
|
||||
"Containers created from an OCI image are not listed: their paths are changed in OCI manager Apps.": "Los contenedores creados desde una imagen OCI no aparecen: sus rutas se cambian en OCI manager Apps.",
|
||||
@@ -1443,7 +1443,7 @@
|
||||
"Creating the initial administrator...": "Crear el administrador inicial...",
|
||||
"Creating the private network...": "Creando la red privada...",
|
||||
"Creating the temporary data container": "Creando el contenedor temporal para los datos",
|
||||
"Creative & Design": "Creatividad y diseño",
|
||||
"Creative & Design": "Creative & Design",
|
||||
"Credentials are correct": "Las credenciales son correctas",
|
||||
"Credentials cleared. jwt_secret and API tokens preserved.": "Credenciales borradas. Se conservan jwt_secret y los tokens de API.",
|
||||
"Credentials file created securely.": "Archivo de credenciales creado de forma segura.",
|
||||
@@ -1557,7 +1557,7 @@
|
||||
"Data wiped from": "Datos borrados de",
|
||||
"Database management in a single PHP file": "Gestión de bases de datos en un solo archivo PHP",
|
||||
"Database server proposed on the login page (empty = typed at each login)": "Servidor de base de datos propuesto en la página de inicio de sesión (vacío = se escribe en cada inicio de sesión)",
|
||||
"Databases": "Bases de datos",
|
||||
"Databases": "Databases",
|
||||
"Datastore name:": "Nombre del almacén de datos:",
|
||||
"Davos is an FTP automation tool that periodically scans given host locations for new files. It can be configured for various purposes, including listening for specific files to appear in the host location, ready for it to download and then move, if required. It also supports completion notifications as well as downstream API calls, to further the workflow.": "Davos es una herramienta de automatización de FTP que examina periódicamente ubicaciones de un servidor en busca de archivos nuevos. Se puede configurar para distintos fines, como esperar a que aparezcan archivos concretos para descargarlos y, si hace falta, moverlos. También admite notificaciones de finalización y llamadas a API posteriores para continuar el flujo de trabajo.",
|
||||
"Ddclient is a Perl client used to update dynamic DNS entries for accounts on Dynamic DNS Network Service Provider. It was originally written by Paul Burry and is now mostly by wimpunk. It has the capability to update more than just dyndns and it can fetch your WAN-ipaddress in a few different ways.": "Ddclient es un cliente en Perl que actualiza entradas de DNS dinámico en cuentas de proveedores de DNS dinámico. Lo escribió originalmente Paul Burry y hoy lo mantiene sobre todo wimpunk. Puede actualizar más servicios que dyndns y obtener tu dirección IP WAN de varias formas.",
|
||||
@@ -1808,7 +1808,7 @@
|
||||
"Docker Mods are only offered for compatible LinuxServer images": "Docker Mods solo se ofrecen para imágenes compatibles de LinuxServer",
|
||||
"Docker Volume Backup": "Docker Volume Backup",
|
||||
"Docker/CLI not available yet or no valid answer": "Docker/CLI aún no está disponible o no hay respuesta válida",
|
||||
"Documents & Notes": "Documentos y notas",
|
||||
"Documents & Notes": "Documents & Notes",
|
||||
"Documents volume size in GB": "Tamaño del volumen de documentos en GB",
|
||||
"Dokuwiki is a simple to use and highly versatile Open Source wiki software that doesn't require a database. It is loved by users for its clean and readable syntax. The ease of maintenance, backup and integration makes it an administrator's favorite. Built in access controls and authentication connectors make DokuWiki especially useful in the enterprise context and the large number of plugins contributed by its vibrant community allow for a broad range of use cases beyond a traditional wiki.": "Dokuwiki es un software de wiki de código abierto, fácil de usar y muy versátil, que no necesita base de datos. Sus usuarios lo aprecian por su sintaxis limpia y legible. La facilidad de mantenimiento, backup e integración lo convierte en el favorito de los administradores. Los controles de acceso y conectores de autenticación integrados lo hacen especialmente útil en entornos de empresa, y los numerosos plugins de su activa comunidad permiten muchos usos más allá de una wiki tradicional.",
|
||||
"Dolphin Emulator lets you play GameCube and Wii games with various graphical enhancements and other features are available to improve your game experience.": "Dolphin Emulator permite jugar a juegos de GameCube y Wii con diversas mejoras gráficas y otras funciones que mejoran la experiencia de juego.",
|
||||
@@ -2358,7 +2358,7 @@
|
||||
"FileBrowser Quantum": "FileBrowser Quantum",
|
||||
"FileBrowser Quantum (new installation)": "FileBrowser Quantum (nueva instalación)",
|
||||
"FileDrop is a free, open source file sharing service": "FileDrop es un servicio gratuito y de código abierto para compartir archivos",
|
||||
"Files & Downloads": "Archivos y descargas",
|
||||
"Files & Downloads": "Files & Downloads",
|
||||
"Files & Sharing": "Files & Sharing",
|
||||
"Files volume size in GB": "Tamaño del volumen de archivos en GB",
|
||||
"Filesystem": "Sistema de archivos",
|
||||
@@ -2368,7 +2368,7 @@
|
||||
"Final cleanup of the stack operation completed": "Limpieza final de la operación de pila completada",
|
||||
"Final confirmation": "Confirmación final",
|
||||
"Final storage health/status check": "Comprobación final del estado/salud del almacenamiento",
|
||||
"Finance & Budgeting": "Finanzas y presupuestos",
|
||||
"Finance & Budgeting": "Finance & Budgeting",
|
||||
"Find your device using https://finds.synology.com": "Encuentre su dispositivo usando https://finds.synology.com",
|
||||
"Fingerprint:": "Huella digital:",
|
||||
"Firefly, the easiest using of WireGuard VPN server, plus version of wg-easy.": "Firefly, la forma más sencilla de usar un servidor VPN WireGuard; versión plus de wg-easy.",
|
||||
@@ -2522,7 +2522,7 @@
|
||||
"GUI mode (if available)": "Modo GUI (si está disponible)",
|
||||
"GZDoom is a feature centric port for all Doom engine games, based on ZDoom, adding an OpenGL renderer and powerful scripting capabilities.": "GZDoom es un port centrado en funciones para todos los juegos del motor Doom, basado en ZDoom, que añade un renderizador OpenGL y potentes capacidades de scripting.",
|
||||
"GZIP - slower, widely compatible": "GZIP - más lento, muy compatible",
|
||||
"Gaming & Leisure": "Juegos y ocio",
|
||||
"Gaming & Leisure": "Gaming & Leisure",
|
||||
"Gateway is not installed.": "La puerta de enlace no está instalada.",
|
||||
"Gateway removed.": "Puerta de enlace eliminada.",
|
||||
"Gateway restarted.": "La puerta de enlace se reinició.",
|
||||
@@ -2667,7 +2667,7 @@
|
||||
"Host GPU detected": "GPU del host detectada",
|
||||
"Host GPU is already bound to vfio-pci. Host reconfiguration/reboot should not be required for this VM-to-VM reassignment.": "La GPU del host ya está vinculada a vfio-pci. No debería ser necesario reconfigurar/reiniciar el host para esta reasignación de VM a VM.",
|
||||
"Host IP": "IP del host",
|
||||
"Host Management": "Gestión del host",
|
||||
"Host Management": "Host Management",
|
||||
"Host Mount Path": "Ruta de montaje del host",
|
||||
"Host NFS/Samba as Proxmox Storage (pvesm)": "Aloje NFS/Samba como almacenamiento en Proxmox (pvesm)",
|
||||
"Host Path": "Ruta del host",
|
||||
@@ -3257,7 +3257,7 @@
|
||||
"Invalid volume size": "Tamaño del volumen inválido",
|
||||
"Invalid volume size:": "Tamaño de volumen inválido:",
|
||||
"Invalid volume target": "Destino de volumen no válido",
|
||||
"IoT & Smart Home": "IoT y domótica",
|
||||
"IoT & Smart Home": "IoT & Smart Home",
|
||||
"Is the value a password or secret?": "¿Es el valor una contraseña o secreto?",
|
||||
"Issue": "Problema",
|
||||
"Issues found": "Problemas encontrados",
|
||||
@@ -3572,7 +3572,7 @@
|
||||
"Max user watches configured": "Número máximo de relojes de usuario configurados",
|
||||
"Maximum auto-repair attempts reached (3). Please review the log and run any remaining commands manually.": "Se alcanzó el número máximo de intentos de reparación automática (3). Revise el log y ejecute los comandos restantes manualmente.",
|
||||
"May need to restart terminal": "Puede que sea necesario reiniciar el terminal",
|
||||
"Media & Streaming": "Multimedia y streaming",
|
||||
"Media & Streaming": "Media & Streaming",
|
||||
"Media discovery and request management for Jellyfin, Plex and Emby.": "Descubrimiento de contenido y gestión de solicitudes para Jellyfin, Plex y Emby.",
|
||||
"Media library transcoding and health checking, with an internal worker node.": "Transcodificación y comprobación de estado de la biblioteca multimedia, con un nodo worker interno.",
|
||||
"Media server": "Servidor multimedia",
|
||||
@@ -3587,7 +3587,7 @@
|
||||
"Memory settings optimized successfully": "Configuración de memoria optimizada con éxito",
|
||||
"Memory:": "Memoria:",
|
||||
"Memos is a lightweight, self-hosted memo hub. Open Source and Free forever.": "Memos es un centro de notas ligero y autoalojado. De código abierto y gratuito para siempre.",
|
||||
"Messaging & Notifications": "Mensajería y notificaciones",
|
||||
"Messaging & Notifications": "Messaging & Notifications",
|
||||
"Messaging & Queues": "Mensajería y Colas",
|
||||
"Messenger for the Decentralized Web": "Mensajería para la web descentralizada",
|
||||
"Method:": "Método:",
|
||||
@@ -3599,7 +3599,7 @@
|
||||
"MineOS web interface": "Interfaz web de MineOS",
|
||||
"Minisatip is a multi-threaded satip server version 1.2 that runs under Linux and it was tested with DVB-S, DVB-S2, DVB-T, DVB-T2, DVB-C, DVB-C2, ATSC and ISDB-T cards.": "Minisatip es un servidor satip multihilo, versión 1.2, que funciona en Linux y se ha probado con tarjetas DVB-S, DVB-S2, DVB-T, DVB-T2, DVB-C, DVB-C2, ATSC e ISDB-T.",
|
||||
"Mirror URL not available for this script.": "No hay URL de mirror disponible para este script.",
|
||||
"Miscellaneous": "Varios",
|
||||
"Miscellaneous": "Miscellaneous",
|
||||
"Missing": "Desaparecido",
|
||||
"Missing OCI metadata:": "Desapareciendo los metadatos de la OCI:",
|
||||
"Missing commands after installation:": "Comandos que faltan después de la instalación:",
|
||||
@@ -3633,7 +3633,7 @@
|
||||
"Monitor progress:": "Supervisar el progreso:",
|
||||
"Monitor, analyze, and alert on network performance.": "Monitoriza y analiza el rendimiento de la red y recibe alertas.",
|
||||
"Monitoring": "Monitorización",
|
||||
"Monitoring & Analytics": "Monitorización y analítica",
|
||||
"Monitoring & Analytics": "Monitoring & Analytics",
|
||||
"Most common cause: the archive is corrupted (interrupted write, partial copy, or storage issue).": "Causa más común: el archivo está dañado (escritura interrumpida, copia parcial o problema de almacenamiento).",
|
||||
"Mount Added Successfully:": "Montaje añadido correctamente:",
|
||||
"Mount CIFS share:": "Monte el recurso compartido CIFS:",
|
||||
@@ -3776,7 +3776,7 @@
|
||||
"NFS share unmount completed.": "Se completó el desmontaje del recurso compartido NFS.",
|
||||
"NFS storage added successfully!": "¡El almacenamiento NFS se agregó correctamente!",
|
||||
"NFS storage adding in progress...": "Almacenamiento NFS agregando en progreso...",
|
||||
"NFSv4 needs a privileged container without AppArmor or seccomp confinement: a compromised image could affect the host. NFSv3, SMB and Time Machine work without it.\n\nPrepare this container for NFSv4?": "NFSv4 necesita un contenedor privilegiado sin AppArmor o confinamiento de seccomp: una imagen comprometida podría afectar al host. NFSv3, SMB y Time Machine funcionan sin él.\n\n¿Preparar este contenedor para NFSv4?",
|
||||
"NFSv4 needs a privileged container without AppArmor or seccomp confinement: a compromised image could affect the host. NFSv3, SMB and Time Machine work without it.\n\nPrepare this container for NFSv4?": "NFSv4 necesita un contenedor privilegiado sin confinamiento de AppArmor ni seccomp: una imagen comprometida podría afectar al host. NFSv3, SMB y Time Machine funcionan sin él.\n\n¿Preparar este contenedor para NFSv4?",
|
||||
"NIC": "Tarjeta de red",
|
||||
"NIC changes detected — adjusted automatically": "Cambios de NIC detectados: ajustados automáticamente",
|
||||
"NICs:": "NIC:",
|
||||
@@ -3850,7 +3850,7 @@
|
||||
"NVMe health status: WARNING (critical_warning =": "Estado de salud de NVMe: ADVERTENCIA (critical_warning =",
|
||||
"NVMe skipped (to add as PCIe use 'Add Controller or NVMe PCIe to VM'):": "NVMe omitido (para agregar como PCIe use 'Agregar controlador o NVMe PCIe a VM'):",
|
||||
"NVMe-specific SMART log": "Log SMART específico de NVMe",
|
||||
"NVR & Cameras": "NVR y cámaras",
|
||||
"NVR & Cameras": "NVR & Cameras",
|
||||
"NVR with optional VA-API video acceleration and hardware object detectors": "NVR con aceleración de vídeo VA-API opcional y detectores de objetos por hardware",
|
||||
"NZBGet web interface": "Interfaz web de NZBGet",
|
||||
"Name": "Nombre",
|
||||
@@ -3858,7 +3858,7 @@
|
||||
"Name for this target:": "Nombre para este destino:",
|
||||
"Name of the PostgreSQL user created on the first start": "Nombre del usuario de PostgreSQL creado en el primer arranque",
|
||||
"Name of the database created on the first start": "Nombre de la base de datos creada en el primer arranque",
|
||||
"Name of the directory to share (lowercase letters, digits, - or _)": "Nombre del directorio a compartir (letras minúsculas, dígitos, - o _)",
|
||||
"Name of the directory to share (lowercase letters, digits, - or _)": "Nombre del directorio a compartir (minúsculas, números, - o _)",
|
||||
"Name of the internal worker node": "Nombre del nodo worker interno",
|
||||
"Name of this wallabag instance, shown in the interface and in 2FA codes": "Nombre de esta instancia de wallabag, mostrado en la interfaz y en los códigos 2FA",
|
||||
"Name or part of the description of the application": "Nombre o parte de la descripción de la aplicación",
|
||||
@@ -3874,7 +3874,7 @@
|
||||
"Netbox is an IP address management (IPAM) and data center infrastructure management (DCIM) tool. Initially conceived by the network engineering team at DigitalOcean, NetBox was developed specifically to address the needs of network and infrastructure engineers. It is intended to function as a domain-specific source of truth for network operations.": "Netbox es una herramienta de gestión de direcciones IP (IPAM) y de infraestructura de centros de datos (DCIM). Concebida por el equipo de ingeniería de redes de DigitalOcean, se desarrolló para cubrir las necesidades de los ingenieros de redes e infraestructura. Está pensada como fuente de verdad específica para las operaciones de red.",
|
||||
"Network": "Red",
|
||||
"Network :": "Red :",
|
||||
"Network & Firewall": "Red y cortafuegos",
|
||||
"Network & Firewall": "Network & Firewall",
|
||||
"Network (interfaces, DNS)": "Red (interfaces, DNS)",
|
||||
"Network Bridge": "Puente de red",
|
||||
"Network Commands": "Comandos de red",
|
||||
@@ -4487,7 +4487,7 @@
|
||||
"Password of the OpenList admin user": "Contraseña del usuario administrador de OpenList",
|
||||
"Password of the PhotoPrism admin user (at least 8 characters)": "Contraseña del usuario administrador de PhotoPrism (al menos 8 caracteres)",
|
||||
"Password of the PostgreSQL user": "Contraseña del usuario de PostgreSQL",
|
||||
"Password of the ShareCoveX panel administrator (8 characters or more)": "Contraseña del administrador del panel ShareCoveX (8 caracteres o más)",
|
||||
"Password of the ShareCoveX panel administrator (8 characters or more)": "Contraseña del administrador del panel de ShareCoveX (8 caracteres o más)",
|
||||
"Password of the SnapOtter admin user": "Contraseña del usuario administrador de SnapOtter",
|
||||
"Password of the deprecated Flowise application login (only read by Flowise versions before 3.0.1)": "Contraseña del acceso antiguo de la aplicación Flowise (solo la leen las versiones de Flowise anteriores a 3.0.1)",
|
||||
"Password of the main AdGuard Home": "Contraseña del AdGuard Home principal",
|
||||
@@ -4698,7 +4698,7 @@
|
||||
"Process may take several minutes depending on container size": "El proceso puede tardar varios minutos dependiendo del tamaño del contenedor",
|
||||
"Process may take several minutes for large containers": "El proceso puede tardar varios minutos para contenedores grandes",
|
||||
"Processes using NVIDIA:": "Procesos usando NVIDIA:",
|
||||
"Productivity & Workflows": "Productividad y flujos de trabajo",
|
||||
"Productivity & Workflows": "Productivity & Workflows",
|
||||
"Profile": "Perfil",
|
||||
"Profile:": "Perfil:",
|
||||
"Projectsend is a self-hosted application that lets you upload files and assign them to specific clients that you create yourself. Secure, private and easy. No more depending on external services or e-mail to send those files.": "Projectsend es una aplicación autoalojada que te permite subir archivos y asignarlos a los clientes que tú mismo creas. Segura, privada y sencilla. Sin depender ya de servicios externos ni del correo para enviar esos archivos.",
|
||||
@@ -4775,7 +4775,7 @@
|
||||
"Public URL of phpMyAdmin when it is served behind a reverse proxy": "URL pública de phpMyAdmin cuando se sirve detrás de un proxy inverso",
|
||||
"Public address clients connect to (vpn.example.com or a public IP)": "Dirección pública a la que se conectan los clientes (vpn.example.com o una IP pública)",
|
||||
"Public address peers connect to, or auto to detect it (vpn.example.com)": "Dirección pública a la que se conectan los peers, o auto para detectarla (vpn.example.com)",
|
||||
"Publish each directory from Resources: open it, switch on SMB, NFS or both, and save.": "publique cada directorio desde Recursos: ábralo, active SMB, NFS o ambos y guárdelo.",
|
||||
"Publish each directory from Resources: open it, switch on SMB, NFS or both, and save.": "Publica cada directorio desde Recursos: ábrelo, activa SMB, NFS o ambos y guarda.",
|
||||
"Pulling latest changes from GitHub...": "Sacando los últimos cambios de GitHub...",
|
||||
"Purge the gasket-dkms package": "Purgar el paquete gasket-dkms",
|
||||
"Purging gasket-dkms package...": "Purgando el paquete gasket-dkms...",
|
||||
@@ -4860,7 +4860,7 @@
|
||||
"Rebooting the system...": "Reiniciando el sistema...",
|
||||
"Rebuilding initramfs after vfio.conf cleanup...": "Reconstrucción de initramfs después de la limpieza de vfio.conf...",
|
||||
"Rebuilding initramfs to apply nouveau blacklist before installation...": "Reconstruyendo initramfs para aplicar la lista negra de nouveau antes de la instalación...",
|
||||
"Rebuilding the container and recovering it from its backup are tested on the same image; the first update to a newer image is still to be observed.": "La reconstrucción del contenedor y la recuperación desde su copia de seguridad se prueban en la misma imagen;La primera actualización a una imagen más nueva aún está por observarse.",
|
||||
"Rebuilding the container and recovering it from its backup are tested on the same image; the first update to a newer image is still to be observed.": "La reconstrucción del contenedor y su recuperación desde el backup están probadas con la misma imagen; la primera actualización a una imagen más nueva está aún por observar.",
|
||||
"Recent": "Reciente",
|
||||
"Recent Samba Servers": "Servidores Samba recientes",
|
||||
"Recent Samba server": "Servidor Samba reciente",
|
||||
@@ -4945,7 +4945,7 @@
|
||||
"Remapped users:": "Usuarios reasignados:",
|
||||
"Reminder: You must install the QEMU Guest Agent inside the Windows VM": "Recordatorio: debe instalar QEMU Guest Agent dentro de la VM de Windows",
|
||||
"Remmina is a remote desktop client written in GTK, aiming to be useful for system administrators and travellers, who need to work with lots of remote computers in front of either large or tiny screens. Remmina supports multiple network protocols, in an integrated and consistent user interface. Currently RDP, VNC, SPICE, SSH and EXEC are supported.": "Remmina es un cliente de escritorio remoto escrito en GTK, pensado para administradores de sistemas y viajeros que trabajan con muchos ordenadores remotos desde pantallas grandes o pequeñas. Admite varios protocolos de red en una interfaz integrada y coherente. Actualmente soporta RDP, VNC, SPICE, SSH y EXEC.",
|
||||
"Remote Access & VPN": "Acceso remoto y VPN",
|
||||
"Remote Access & VPN": "Remote Access & VPN",
|
||||
"Remote dry run completed; no container was created.": "Simulación remota completada; no se ha creado ningún contenedor.",
|
||||
"Remote repository path:": "Ruta del repositorio remoto:",
|
||||
"Remote server via SSH (recommended — off-host, dedup across machines)": "Servidor remoto a través de SSH (recomendado: fuera del host, desduplicación entre máquinas)",
|
||||
@@ -5241,7 +5241,7 @@
|
||||
"SMB Error": "Error de PYME",
|
||||
"SMB port 445:": "Puerto SMB 445:",
|
||||
"SMB ports:": "Puertos PYME:",
|
||||
"SMB, NFS and Time Machine shares from a web panel": "SMB, NFS y Time Machine comparten desde un panel web",
|
||||
"SMB, NFS and Time Machine shares from a web panel": "Recursos SMB, NFS y Time Machine desde un panel web",
|
||||
"SR-IOV Configuration Detected": "Configuración SR-IOV detectada",
|
||||
"SSD Emulation": "Emulación de SSD",
|
||||
"SSH access": "Acceso SSH",
|
||||
@@ -5618,7 +5618,7 @@
|
||||
"Share path:": "Compartir ruta:",
|
||||
"Share updated successfully.": "Compartir actualizado con éxito.",
|
||||
"Share:": "Compartir:",
|
||||
"ShareCoveX panel": "panel ShareCoveX",
|
||||
"ShareCoveX panel": "Panel de ShareCoveX",
|
||||
"Shared Directory Ready:": "Directorio compartido listo:",
|
||||
"Shared Group": "Grupo compartido",
|
||||
"Shared directory created:": "Directorio compartido creado:",
|
||||
@@ -5691,7 +5691,7 @@
|
||||
"Shutdown timeout": "Tiempo de espera de apagado",
|
||||
"SiYuan access code": "Código de acceso de SiYuan",
|
||||
"SickGear provides management of TV shows and/or Anime, it detects new episodes, links downloader apps, and more..": "SickGear gestiona series de TV y anime, detecta nuevos episodios, enlaza con aplicaciones de descarga y más..",
|
||||
"Sign in to the panel and create a Samba user in Settings before publishing a directory over SMB.": "inicie sesión en el panel y cree un usuario de Samba en Configuración antes de publicar un directorio en SMB.",
|
||||
"Sign in to the panel and create a Samba user in Settings before publishing a directory over SMB.": "Inicia sesión en el panel y crea un usuario Samba en Ajustes antes de publicar un directorio por SMB.",
|
||||
"Signal is a messaging app with privacy at its core. It is free and easy to use, with strong end-to-end encryption that keeps your communication completely private.": "Signal es una aplicación de mensajería con la privacidad como base. Es gratuita y fácil de usar, con un sólido cifrado de extremo a extremo que mantiene tus comunicaciones totalmente privadas.",
|
||||
"Signatures removed. Partition table preserved.": "Firmas eliminadas. Se conserva la tabla de particiones.",
|
||||
"Simple and easy to use DDNS": "DDNS simple y fácil de usar",
|
||||
@@ -6336,7 +6336,7 @@
|
||||
"The mount source or options were not kept": "La fuente de montaje o las opciones no se guardaron",
|
||||
"The mounted source differs from the configured directory": "La fuente montada difiere del directorio configurado",
|
||||
"The mounts of the new container do not match the proposal": "Los montajes del nuevo contenedor no coinciden con la propuesta",
|
||||
"The name must start with a lowercase letter and use only lowercase letters, digits, - or _": "el nombre debe comenzar con una letra minúscula y usar solo letras minúsculas, dígitos, - o _",
|
||||
"The name must start with a lowercase letter and use only lowercase letters, digits, - or _": "El nombre debe empezar por una letra minúscula y usar solo minúsculas, números, - o _",
|
||||
"The native GPU permissions were not kept": "Los permisos de GPU nativos no se conservaron",
|
||||
"The native unprivileged idmap is required": "El idmap nativo no privilegiado es necesario",
|
||||
"The new SSH key was installed and is now authorized on the server.\nKey file:": "La nueva clave SSH se instaló y ahora está autorizada en el servidor.\nArchivo clave:",
|
||||
@@ -6401,7 +6401,7 @@
|
||||
"The private network of the application is already in use on this host:": "La red privada de la aplicación ya está en uso en este host:",
|
||||
"The privileged deployment does not include the required explicit consent": "El despliegue privilegiado no incluye el consentimiento explícito necesario",
|
||||
"The prlimit soft value exceeds the hard value": "El valor prlimit blando supera el valor duro",
|
||||
"The profile sets SETUP_PORT=8123. Port 80 is only used when that variable is emptied.": "el perfil establece SETUP_PORT=8123. El puerto 80 sólo se utiliza cuando se vacía esa variable.",
|
||||
"The profile sets SETUP_PORT=8123. Port 80 is only used when that variable is emptied.": "El perfil establece SETUP_PORT=8123. El puerto 80 solo se usa cuando esa variable se deja vacía.",
|
||||
"The proposal changes the identity of the instance": "La propuesta cambia la identidad de la instancia",
|
||||
"The proposed ARC maximum is below Proxmox VE's pool-size guideline:": "El máximo de ARC propuesto está por debajo de la pauta de tamaño de grupo de Proxmox VE:",
|
||||
"The proposed changes no longer match; nothing was adopted": "Los cambios propuestos ya no coinciden; no se ha incorporado nada",
|
||||
@@ -6599,7 +6599,7 @@
|
||||
"This converts all file UIDs/GIDs by adding 100000": "Esto convierte todos los archivos UID/GID agregando 100000",
|
||||
"This creates a backup in case you need to revert changes": "Esto crea un backup en caso de que necesite revertir los cambios",
|
||||
"This device is already attached": "Este dispositivo ya está añadido",
|
||||
"This directory is already shared:": "este directorio ya está compartido:",
|
||||
"This directory is already shared:": "Este directorio ya está compartido:",
|
||||
"This erases existing metadata.": "Esto borra los metadatos existentes.",
|
||||
"This explicitly marks the container as privileged": "Esto marca explícitamente el contenedor como privilegiado",
|
||||
"This guarantees that device nodes are available before applying LXC GPU config.": "Esto garantiza que los nodos del dispositivo estén disponibles antes de aplicar la configuración de GPU LXC.",
|
||||
@@ -6721,7 +6721,7 @@
|
||||
"To use this share from an LXC, bind-mount it via:": "Para usar este recurso compartido desde un LXC, móntelo mediante enlace:",
|
||||
"Tool exit code:": "Código de salida de la herramienta:",
|
||||
"Tool output:": "Salida de herramienta:",
|
||||
"Tools": "Herramientas",
|
||||
"Tools": "Tools",
|
||||
"Top memory processes in CT": "Principales procesos de memoria en CT",
|
||||
"Top-level configs, secrets and other global options are not yet supported": "Las opciones globales de nivel superior —configs, secrets y otras— aún no se admiten",
|
||||
"Top-level volume options are not yet supported": "Todavía no se admiten opciones de volumen de alto nivel",
|
||||
@@ -7239,7 +7239,7 @@
|
||||
"Web interface to manage devices running Tasmota firmware.": "Interfaz web para gestionar dispositivos con firmware Tasmota.",
|
||||
"WebCord can be summarized as a pack of security and privacy hardenings, Discord features reimplementations, Electron / Chromium / Discord bugs workarounds, stylesheets, internal pages and wrapped https://discord.com page, designed to conform with ToS as much as it is possible (or hide the changes that might violate it from Discord's eyes).": "WebCord puede resumirse como un conjunto de medidas de hardening de seguridad y privacidad, reimplementaciones de funciones de Discord, soluciones a fallos de Electron / Chromium / Discord, hojas de estilo, páginas internas y la página https://discord.com encapsulada, diseñado para cumplir los ToS en lo posible (u ocultar a Discord los cambios que podrían incumplirlos).",
|
||||
"Webgrabplus is a multi-site incremental xmltv epg grabber. It collects tv-program guide data from selected tvguide sites for your favourite channels.": "Webgrabplus es un capturador incremental de EPG xmltv para múltiples sitios. Recoge los datos de la guía de programación de los sitios de guías de TV seleccionados para tus canales favoritos.",
|
||||
"Webservers & Proxies": "Servidores web y proxies",
|
||||
"Webservers & Proxies": "Webservers & Proxies",
|
||||
"Website": "Sitio web",
|
||||
"Webstation is a web native emulation focused LXQt desktop based on Ubuntu.": "Webstation es un escritorio LXQt nativo web, centrado en la emulación y basado en Ubuntu.",
|
||||
"Webtop - Alpine, Ubuntu, Fedora, and Arch based containers containing full desktop environments in officially supported flavors accessible via any modern web browser.": "Webtop - Contenedores basados en Alpine, Ubuntu, Fedora y Arch con entornos de escritorio completos, en variantes con soporte oficial, accesibles desde cualquier navegador web moderno.",
|
||||
@@ -7912,5 +7912,9 @@
|
||||
"⚠ Disk data will NOT be erased.": "⚠ Los datos del disco NO se borrarán.",
|
||||
"⚠ Disk will be unmounted and removed from /etc/fstab.": "⚠ El disco se desmontará y se eliminará de /etc/fstab.",
|
||||
"⚠ The /etc/fstab entry will be removed.": "⚠ Se eliminará la entrada /etc/fstab.",
|
||||
"⚠ The disk will be unmounted.": "⚠ El disco se desmontará."
|
||||
"⚠ The disk will be unmounted.": "⚠ El disco se desmontará.",
|
||||
"{path} already exists and belongs to another user of the host, so {app} cannot write to it.\n\nProxMenux can add an access rule (ACL) for the identity {app} uses on the host (UID {uid}). Nothing that is there changes owner or permissions: whatever reads or writes those files today keeps doing so, and the owner of the directory also gets access to the files {app} creates.\n\nGrant {app} access to this directory?": "{path} ya existe y pertenece a otro usuario del host, así que {app} no puede escribir en él.\n\nProxMenux puede añadir una regla de acceso (ACL) para la identidad que {app} usa en el host (UID {uid}). Nada de lo que hay cambia de propietario ni de permisos: lo que hoy lee o escribe esos archivos lo sigue haciendo, y el propietario del directorio también tiene acceso a los archivos que cree {app}.\n\n¿Dar acceso a {app} a este directorio?",
|
||||
"Access granted to the application on:": "Acceso concedido a la aplicación en:",
|
||||
"Access could not be granted; the application cannot write to:": "No se pudo conceder el acceso; la aplicación no puede escribir en:",
|
||||
"The access rule added to this host directory is kept:": "La regla de acceso añadida a este directorio del host se conserva:"
|
||||
}
|
||||
|
||||
+9
-9
@@ -762,7 +762,7 @@
|
||||
"Changes prepared": "Modifications préparées",
|
||||
"Changes will apply after reboot.": "Les modifications s'appliqueront après le redémarrage.",
|
||||
"Changing Release Channel": "Changer le canal de publication",
|
||||
"Changing between a privileged and an unprivileged container, or the host monitor mode, requires installing the application again": "Le passage d'un conteneur privilégié à un conteneur non privilégié, ou au mode moniteur hôte, nécessite de réinstaller l'application.",
|
||||
"Changing between a privileged and an unprivileged container, or the host monitor mode, requires installing the application again": "Le passage d'un conteneur privilégié à un conteneur non privilégié, ou au mode moniteur hôte, nécessite de réinstaller l'application",
|
||||
"Changing the machine type on an existing installed VM is not safe: it changes the chipset and PCI slot layout, which typically prevents the guest OS from booting.": "Changer le type de machine sur une VM installée existante n'est pas sûr : cela modifie la disposition du chipset et des emplacements PCI, ce qui empêche généralement le système d'exploitation invité de démarrer.",
|
||||
"Changing the rootfs or its storage requires a separate migration": "Modification des rootfs ou de leur stockage requires une migration séparée",
|
||||
"Changing the storage or size of a disk requires a migration; empty disks are not created": "Modification du stockage ou de la taille d'un disque requires une migration; les disques vides ne sont pas créés",
|
||||
@@ -2362,7 +2362,7 @@
|
||||
"FileBrowser Quantum (new installation)": "FileBrowser Quantum (nouvelle installation)",
|
||||
"FileDrop is a free, open source file sharing service": "FileDrop est un service gratuit de partage de fichiers open source",
|
||||
"Files & Downloads": "Fichiers et téléchargements",
|
||||
"Files & Sharing": "fichiers et partage",
|
||||
"Files & Sharing": "Fichiers et partage",
|
||||
"Files volume size in GB": "Taille du volume des fichiers en GB",
|
||||
"Filesystem": "Système de fichiers",
|
||||
"Filesystem Tools Required": "Outils de système de fichiers requis",
|
||||
@@ -4155,7 +4155,7 @@
|
||||
"No new Controller/NVMe entries were added.": "Aucune nouvelle entrée Contrôleur/NVMe n’a été ajoutée.",
|
||||
"No online node has a guest of this job.": "Aucun nœud en ligne n'a d'invité pour cette tâche.",
|
||||
"No optimizations detected to uninstall.": "Aucune optimisation détectée à désinstaller.",
|
||||
"No other storage of this host that accepts backups has that much free space. Free space and try again; the application was not modified.": "Aucun autre stockage de cet hôte acceptant les sauvegardes ne dispose d'autant d'espace libre. Libérez de l'espace et réessayez ;la demande n'a pas été modifiée.",
|
||||
"No other storage of this host that accepts backups has that much free space. Free space and try again; the application was not modified.": "Aucun autre stockage de cet hôte acceptant les sauvegardes ne dispose d'autant d'espace libre. Libérez de l'espace et réessayez ; la demande n'a pas été modifiée.",
|
||||
"No partitions found on disk. Nothing was wiped.": "Aucune partition trouvée sur le disque. Rien n'a été effacé.",
|
||||
"No password provided.": "Aucun mot de passe fourni.",
|
||||
"No paths available": "Aucun chemin disponible",
|
||||
@@ -4784,7 +4784,7 @@
|
||||
"Public URL of phpMyAdmin when it is served behind a reverse proxy": "URL publique de phpMyAdmin quand elle est servie derrière un proxy inversé",
|
||||
"Public address clients connect to (vpn.example.com or a public IP)": "Les clients d'adresses publiques se connectent à (vpn.example.com ou à un IP public)",
|
||||
"Public address peers connect to, or auto to detect it (vpn.example.com)": "Pairs d'adresse publique se connectent, ou auto pour le détecter (vpn.example.com)",
|
||||
"Publish each directory from Resources: open it, switch on SMB, NFS or both, and save.": "publiez chaque répertoire à partir des ressources : ouvrez-le, activez SMB, NFS ou les deux et enregistrez.",
|
||||
"Publish each directory from Resources: open it, switch on SMB, NFS or both, and save.": "Publiez chaque répertoire à partir des ressources : ouvrez-le, activez SMB, NFS ou les deux et enregistrez.",
|
||||
"Pulling latest changes from GitHub...": "Extraction des dernières modifications de GitHub...",
|
||||
"Purge the gasket-dkms package": "Purger le paquet gasket-dkms",
|
||||
"Purging gasket-dkms package...": "Purge du paquet gasket-dkms...",
|
||||
@@ -4869,7 +4869,7 @@
|
||||
"Rebooting the system...": "Redémarrage du système...",
|
||||
"Rebuilding initramfs after vfio.conf cleanup...": "Reconstruire initramfs après le nettoyage de vfio.conf...",
|
||||
"Rebuilding initramfs to apply nouveau blacklist before installation...": "Reconstruction d'initramfs pour appliquer la liste noire de nouveau avant l'installation...",
|
||||
"Rebuilding the container and recovering it from its backup are tested on the same image; the first update to a newer image is still to be observed.": "La reconstruction du conteneur et sa récupération à partir de sa sauvegarde sont testées sur la même image ;la première mise à jour vers une image plus récente reste à observer.",
|
||||
"Rebuilding the container and recovering it from its backup are tested on the same image; the first update to a newer image is still to be observed.": "La reconstruction du conteneur et sa récupération à partir de sa sauvegarde sont testées sur la même image ; la première mise à jour vers une image plus récente reste à observer.",
|
||||
"Recent": "Récent",
|
||||
"Recent Samba Servers": "Serveurs Samba récents",
|
||||
"Recent Samba server": "Serveur Samba récent",
|
||||
@@ -5634,7 +5634,7 @@
|
||||
"Share path:": "Chemin de partage :",
|
||||
"Share updated successfully.": "Partage mis à jour avec succès.",
|
||||
"Share:": "Partager:",
|
||||
"ShareCoveX panel": "panneau ShareCoveX",
|
||||
"ShareCoveX panel": "Panneau ShareCoveX",
|
||||
"Shared Directory Ready:": "Répertoire partagé prêt :",
|
||||
"Shared Group": "Groupe partagé",
|
||||
"Shared directory created:": "Répertoire partagé créé & #160;:",
|
||||
@@ -5707,7 +5707,7 @@
|
||||
"Shutdown timeout": "Délai d'arrêt",
|
||||
"SiYuan access code": "Code d'accès SiYuan",
|
||||
"SickGear provides management of TV shows and/or Anime, it detects new episodes, links downloader apps, and more..": "SickGear assure la gestion d'émissions TV et/ou Anime, détecte de nouveaux épisodes, links downloader apps, etc.",
|
||||
"Sign in to the panel and create a Samba user in Settings before publishing a directory over SMB.": "connectez-vous au panneau et créez un utilisateur Samba dans Paramètres avant de publier un répertoire via SMB.",
|
||||
"Sign in to the panel and create a Samba user in Settings before publishing a directory over SMB.": "Connectez-vous au panneau et créez un utilisateur Samba dans Paramètres avant de publier un répertoire via SMB.",
|
||||
"Signal is a messaging app with privacy at its core. It is free and easy to use, with strong end-to-end encryption that keeps your communication completely private.": "Signal est une application de messagerie avec la confidentialité à son cœur. Il est gratuit et facile à utiliser, avec un cryptage de bout en bout fort qui maintient votre communication complètement privée.",
|
||||
"Signatures removed. Partition table preserved.": "Signatures supprimées. Table de partition conservée.",
|
||||
"Simple and easy to use DDNS": "Simple et facile à utiliser DDNS",
|
||||
@@ -6355,7 +6355,7 @@
|
||||
"The mount source or options were not kept": "La source de montage ou les options n'ont pas été conservées",
|
||||
"The mounted source differs from the configured directory": "La source montée diffère du répertoire configuré",
|
||||
"The mounts of the new container do not match the proposal": "Les montages du nouveau conteneur ne correspondent pas à la proposition",
|
||||
"The name must start with a lowercase letter and use only lowercase letters, digits, - or _": "le nom doit commencer par une lettre minuscule et utiliser uniquement des lettres minuscules, des chiffres - ou _",
|
||||
"The name must start with a lowercase letter and use only lowercase letters, digits, - or _": "Le nom doit commencer par une lettre minuscule et utiliser uniquement des lettres minuscules, des chiffres - ou _",
|
||||
"The native GPU permissions were not kept": "Les permissions GPU natives n'ont pas été conservées",
|
||||
"The native unprivileged idmap is required": "L'idmap natif non privilégié est required",
|
||||
"The new SSH key was installed and is now authorized on the server.\nKey file:": "La nouvelle clé SSH a été installée et est désormais autorisée sur le serveur.\nFichier clé :",
|
||||
@@ -6605,7 +6605,7 @@
|
||||
"This application is under watchdog: it is restarted automatically when it crashes. Turn the watchdog off?": "Cette application est sous surveillance : elle est redémarrée automatiquement lorsqu'elle plante. Désactiver la surveillance ?",
|
||||
"This archive does not contain a recognized backup layout.": "Cette archive ne contient pas de présentation de sauvegarde reconnue.",
|
||||
"This backup does not contain any restorable paths.": "Cette sauvegarde ne contient aucun chemin restaurable.",
|
||||
"This backup does not fit on the system disk of the host; it is made on the storage:": "Cette sauvegarde ne tient pas sur le disque système de l'hôte ;il est effectué sur le stockage :",
|
||||
"This backup does not fit on the system disk of the host; it is made on the storage:": "Cette sauvegarde ne tient pas sur le disque système de l'hôte ; il est effectué sur le stockage :",
|
||||
"This backup includes /etc/zfs/zpool.cache (host-specific ZFS state).": "Cette sauvegarde inclut /etc/zfs/zpool.cache (état ZFS spécifique à l'hôte).",
|
||||
"This backup is encrypted.": "Cette sauvegarde est cryptée.",
|
||||
"This backup was taken on kernel": "Cette sauvegarde a été effectuée sur le noyau",
|
||||
|
||||
+22
-22
@@ -225,10 +225,10 @@
|
||||
"Add Samba share as Proxmox Storage": "Aggiungi condivisione Samba come storage Proxmox",
|
||||
"Add a Coral PCIe/M.2 device?": "Aggiungere un dispositivo Coral PCIe/M.2?",
|
||||
"Add a custom data path?": "Aggiungere un percorso dati personalizzato?",
|
||||
"Add a directory to share": "aggiungi una directory da condividere",
|
||||
"Add a directory to share": "Aggiungi una directory da condividere",
|
||||
"Add an extra custom path": "Aggiungi un altro percorso personalizzato",
|
||||
"Add another GPU or USB device manually?": "Aggiungere manualmente un altro dispositivo GPU o USB?",
|
||||
"Add another directory to share?": "aggiungi un'altra directory da condividere?",
|
||||
"Add another directory to share?": "Aggiungi un'altra directory da condividere?",
|
||||
"Add another extra path to this stack": "Aggiungi un altro percorso aggiuntivo a questo stack",
|
||||
"Add as IDE": "Aggiungi come IDE",
|
||||
"Add as SATA": "Aggiungi come SATA",
|
||||
@@ -762,7 +762,7 @@
|
||||
"Changes prepared": "Modifiche preparate",
|
||||
"Changes will apply after reboot.": "Le modifiche saranno applicate dopo il riavvio.",
|
||||
"Changing Release Channel": "Modifica del canale di rilascio",
|
||||
"Changing between a privileged and an unprivileged container, or the host monitor mode, requires installing the application again": "il passaggio da un contenitore privilegiato a uno non privilegiato o dalla modalità monitor host richiede l'installazione di una nuova applicazione",
|
||||
"Changing between a privileged and an unprivileged container, or the host monitor mode, requires installing the application again": "Il passaggio da un contenitore privilegiato a uno non privilegiato o dalla modalità monitor host richiede l'installazione di una nuova applicazione",
|
||||
"Changing the machine type on an existing installed VM is not safe: it changes the chipset and PCI slot layout, which typically prevents the guest OS from booting.": "La modifica del tipo di macchina su una VM esistente con un sistema operativo già installato non è sicura: modifica il chipset e la disposizione degli slot PCI, impedendo in genere l'avvio del sistema operativo guest.",
|
||||
"Changing the rootfs or its storage requires a separate migration": "La modifica del rootfs o del relativo storage richiede una migrazione separata",
|
||||
"Changing the storage or size of a disk requires a migration; empty disks are not created": "Cambiare lo storage o le dimensioni di un disco richiede una migrazione; non vengono creati dischi vuoti",
|
||||
@@ -2362,7 +2362,7 @@
|
||||
"FileBrowser Quantum (new installation)": "FileBrowser Quantum (nuova installazione)",
|
||||
"FileDrop is a free, open source file sharing service": "FileDrop è un servizio gratuito e open source per la condivisione di file",
|
||||
"Files & Downloads": "File e download",
|
||||
"Files & Sharing": "file e condivisione",
|
||||
"Files & Sharing": "File e condivisione",
|
||||
"Files volume size in GB": "Dimensione del volume file in GB",
|
||||
"Filesystem": "File system",
|
||||
"Filesystem Tools Required": "Strumenti filesystem richiesti",
|
||||
@@ -2441,7 +2441,7 @@
|
||||
"Free and easy to use Minecraft server management tool.": "Strumento gratuito e facile da usare per gestire server Minecraft.",
|
||||
"Free public Proxmox repository enabled": "Repository Proxmox pubblico gratuito abilitato",
|
||||
"Free space OK:": "Spazio libero OK:",
|
||||
"Free space on the host, or choose another storage for this backup from Manage installed OCI applications.": "libera spazio sull'host o scegli un altro spazio di archiviazione per questo backup da Gestisci applicazioni OCI installate.",
|
||||
"Free space on the host, or choose another storage for this backup from Manage installed OCI applications.": "Libera spazio sull'host o scegli un altro spazio di archiviazione per questo backup da Gestisci applicazioni OCI installate.",
|
||||
"Free up disk space": "Libera spazio su disco",
|
||||
"Free:": "Spazio libero:",
|
||||
"FreeCAD is a general-purpose parametric 3D computer-aided design (CAD) modeler and a building information modeling (BIM) software application with finite element method (FEM) support.": "FreeCAD è un modellatore CAD 3D parametrico generico e un'applicazione per la modellazione delle informazioni edilizie (BIM), con supporto per il metodo degli elementi finiti (FEM).",
|
||||
@@ -3270,7 +3270,7 @@
|
||||
"It asks for a system directory of the host:": "Richiede una directory di sistema host:",
|
||||
"It asks for capabilities or a relaxed confinement profile.": "Richiede capacità o un profilo di confinamento rilassato.",
|
||||
"It asks to see the processes of the host.": "Il file Compose richiede l’accesso ai processi dell’host.",
|
||||
"It can be made on another storage of this host. This backup is temporary: it is deleted when the operation ends. The choice is remembered for the next operations of this application.": "può essere effettuato su un altro archivio di questo host. Questo backup è temporaneo: viene eliminato al termine dell'operazione. La scelta viene ricordata per le successive operazioni di questa applicazione.",
|
||||
"It can be made on another storage of this host. This backup is temporary: it is deleted when the operation ends. The choice is remembered for the next operations of this application.": "Può essere effettuato su un altro archivio di questo host. Questo backup è temporaneo: viene eliminato al termine dell'operazione. La scelta viene ricordata per le successive operazioni di questa applicazione.",
|
||||
"It cannot be removed on its own, because the application would stop working: continuing removes the whole application.": "Non può essere rimosso da solo senza interrompere l’applicazione: proseguendo, sarà richiesta la rimozione dell’intera applicazione.",
|
||||
"It cannot be removed on its own, because the application would stop working: continuing targets the whole application for removal.": "Non può essere rimosso singolarmente perché l'applicazione smetterebbe di funzionare: proseguendo si tenterà di rimuovere l'intera applicazione.",
|
||||
"It is created empty; existing data is not migrated automatically.": "Viene creato vuoto; i dati esistenti non vengono migrati automaticamente.",
|
||||
@@ -3862,7 +3862,7 @@
|
||||
"Name for this target:": "Nome per questa destinazione:",
|
||||
"Name of the PostgreSQL user created on the first start": "Nome dell'utente PostgreSQL creato al primo avvio",
|
||||
"Name of the database created on the first start": "Nome del database creato al primo avvio",
|
||||
"Name of the directory to share (lowercase letters, digits, - or _)": "nome della directory da condividere (lettere minuscole, cifre, - o _)",
|
||||
"Name of the directory to share (lowercase letters, digits, - or _)": "Nome della directory da condividere (lettere minuscole, cifre, - o _)",
|
||||
"Name of the internal worker node": "Nome nodo worker interno",
|
||||
"Name of this wallabag instance, shown in the interface and in 2FA codes": "Nome istanza wallabag, mostrato nell'interfaccia e nei codici 2FA",
|
||||
"Name or part of the description of the application": "Nome o parte della descrizione dell'applicazione",
|
||||
@@ -4155,7 +4155,7 @@
|
||||
"No new Controller/NVMe entries were added.": "Non sono state aggiunte nuove voci Controller/NVMe.",
|
||||
"No online node has a guest of this job.": "Nessun nodo online ospita un guest di questo job.",
|
||||
"No optimizations detected to uninstall.": "Nessuna ottimizzazione rilevata da disinstallare.",
|
||||
"No other storage of this host that accepts backups has that much free space. Free space and try again; the application was not modified.": "nessun altro spazio di archiviazione di questo host che accetta i backup dispone di così tanto spazio libero. Libera spazio e riprova;l'applicazione non è stata modificata.",
|
||||
"No other storage of this host that accepts backups has that much free space. Free space and try again; the application was not modified.": "Nessun altro spazio di archiviazione di questo host che accetta i backup dispone di così tanto spazio libero. Libera spazio e riprova; l'applicazione non è stata modificata.",
|
||||
"No partitions found on disk. Nothing was wiped.": "Nessuna partizione trovata sul disco. Niente è stato cancellato.",
|
||||
"No password provided.": "Nessuna password fornita.",
|
||||
"No paths available": "Nessun percorso disponibile",
|
||||
@@ -4784,7 +4784,7 @@
|
||||
"Public URL of phpMyAdmin when it is served behind a reverse proxy": "URL pubblico di phpMyAdmin quando viene servito dietro un proxy inverso",
|
||||
"Public address clients connect to (vpn.example.com or a public IP)": "Indirizzo pubblico a cui si connettono i client (vpn.example.com o un IP pubblico)",
|
||||
"Public address peers connect to, or auto to detect it (vpn.example.com)": "Indirizzo pubblico a cui si connettono i peer, oppure auto per rilevarlo (vpn.example.com)",
|
||||
"Publish each directory from Resources: open it, switch on SMB, NFS or both, and save.": "pubblica ciascuna directory da Risorse: aprila, attiva SMB, NFS o entrambi e salva.",
|
||||
"Publish each directory from Resources: open it, switch on SMB, NFS or both, and save.": "Pubblica ciascuna directory da Risorse: aprila, attiva SMB, NFS o entrambi e salva.",
|
||||
"Pulling latest changes from GitHub...": "Recupero delle ultime modifiche da GitHub...",
|
||||
"Purge the gasket-dkms package": "Elimina completamente il pacchetto gasket-dkms",
|
||||
"Purging gasket-dkms package...": "Eliminazione completa del pacchetto gasket-dkms...",
|
||||
@@ -4869,7 +4869,7 @@
|
||||
"Rebooting the system...": "Riavvio del sistema...",
|
||||
"Rebuilding initramfs after vfio.conf cleanup...": "Ricostruzione di initramfs dopo la pulizia di vfio.conf...",
|
||||
"Rebuilding initramfs to apply nouveau blacklist before installation...": "Ricostruzione di initramfs per applicare la blacklist di nouveau prima dell'installazione...",
|
||||
"Rebuilding the container and recovering it from its backup are tested on the same image; the first update to a newer image is still to be observed.": "la ricostruzione del contenitore e il ripristino dal backup vengono testati sulla stessa immagine;il primo aggiornamento ad un'immagine più recente è ancora da osservare.",
|
||||
"Rebuilding the container and recovering it from its backup are tested on the same image; the first update to a newer image is still to be observed.": "La ricostruzione del contenitore e il ripristino dal backup vengono testati sulla stessa immagine; il primo aggiornamento ad un'immagine più recente è ancora da osservare.",
|
||||
"Recent": "Recente",
|
||||
"Recent Samba Servers": "Server Samba recenti",
|
||||
"Recent Samba server": "Server Samba recente",
|
||||
@@ -5257,7 +5257,7 @@
|
||||
"SMB Error": "Errore SMB",
|
||||
"SMB port 445:": "Porta SMB 445:",
|
||||
"SMB ports:": "Porte SMB:",
|
||||
"SMB, NFS and Time Machine shares from a web panel": "condivisioni SMB, NFS e Time Machine da un pannello web",
|
||||
"SMB, NFS and Time Machine shares from a web panel": "Condivisioni SMB, NFS e Time Machine da un pannello web",
|
||||
"SR-IOV Configuration Detected": "Rilevata configurazione SR-IOV",
|
||||
"SSD Emulation": "Emulazione SSD",
|
||||
"SSH access": "Accesso SSH",
|
||||
@@ -5634,7 +5634,7 @@
|
||||
"Share path:": "Percorso condivisione:",
|
||||
"Share updated successfully.": "Condivisione aggiornata con successo.",
|
||||
"Share:": "Condivisione:",
|
||||
"ShareCoveX panel": "pannello ShareCoveX",
|
||||
"ShareCoveX panel": "Pannello ShareCoveX",
|
||||
"Shared Directory Ready:": "Directory condivisa pronta:",
|
||||
"Shared Group": "Gruppo condiviso",
|
||||
"Shared directory created:": "Directory condivisa creata:",
|
||||
@@ -5707,7 +5707,7 @@
|
||||
"Shutdown timeout": "Timeout di spegnimento",
|
||||
"SiYuan access code": "Codice di accesso SiYuan",
|
||||
"SickGear provides management of TV shows and/or Anime, it detects new episodes, links downloader apps, and more..": "SickGear gestisce serie TV e/o anime, rileva nuovi episodi, si collega alle applicazioni di download e altro ancora.",
|
||||
"Sign in to the panel and create a Samba user in Settings before publishing a directory over SMB.": "accedi al pannello e crea un utente Samba in Impostazioni prima di pubblicare una directory su SMB.",
|
||||
"Sign in to the panel and create a Samba user in Settings before publishing a directory over SMB.": "Accedi al pannello e crea un utente Samba in Impostazioni prima di pubblicare una directory su SMB.",
|
||||
"Signal is a messaging app with privacy at its core. It is free and easy to use, with strong end-to-end encryption that keeps your communication completely private.": "Signal è un'app di messaggistica che mette la privacy al centro. È gratuita e facile da usare, con una robusta crittografia end-to-end che protegge la riservatezza delle comunicazioni.",
|
||||
"Signatures removed. Partition table preserved.": "Firme rimosse. Tabella delle partizioni conservata.",
|
||||
"Simple and easy to use DDNS": "DDNS semplice e facile da usare",
|
||||
@@ -5918,7 +5918,7 @@
|
||||
"Storage for the Immich library": "Storage per libreria Immich",
|
||||
"Storage for the Nextcloud data": "Storage per dati Nextcloud",
|
||||
"Storage for the OCI image cache": "Storage per cache immagini OCI",
|
||||
"Storage for the backup of this operation": "spazio di archiviazione per il backup di questa operazione",
|
||||
"Storage for the backup of this operation": "Spazio di archiviazione per il backup di questa operazione",
|
||||
"Storage for the consume and export folders": "Storage per le cartelle consume ed export",
|
||||
"Storage for the container and its data": "Storage per container e relativi dati",
|
||||
"Storage for the containers and their data": "Storage per container e relativi dati",
|
||||
@@ -6152,10 +6152,10 @@
|
||||
"The backup could not be identified; the image is not replaced": "Impossibile identificare il backup; l'immagine non verrà sostituita",
|
||||
"The backup could not be started on node": "Impossibile avviare il backup sul nodo",
|
||||
"The backup did not pass its integrity check; creating it again...": "Il backup non ha superato il controllo di integrità; ne viene creato un altro...",
|
||||
"The backup made before changing the application does not fit on the system disk of the host.": "il backup effettuato prima della modifica dell'applicazione non può essere contenuto nel disco di sistema dell'host.",
|
||||
"The backup made before changing the application does not fit on the system disk of the host.": "Il backup effettuato prima della modifica dell'applicazione non può essere contenuto nel disco di sistema dell'host.",
|
||||
"The backup metadata was compared against this host. The following items will be SKIPPED to keep the boot safe:": "I metadati del backup sono stati confrontati con questo host. I seguenti elementi verranno SALTATI per garantire un avvio sicuro:",
|
||||
"The backup of a member could not be identified": "Impossibile identificare il backup di un membro",
|
||||
"The backup of this operation cannot be read. If it is on another storage, make it available and recover the operation again:": "il backup di questa operazione non può essere letto. Se si trova su un altro archivio, rendilo disponibile e ripristina nuovamente l'operazione:",
|
||||
"The backup of this operation cannot be read. If it is on another storage, make it available and recover the operation again:": "Il backup di questa operazione non può essere letto. Se si trova su un altro archivio, rendilo disponibile e ripristina nuovamente l'operazione:",
|
||||
"The backup runs as a Proxmox task; follow it in the task log of Proxmox.": "Il backup viene eseguito come task di Proxmox; seguilo nel log dei task di Proxmox.",
|
||||
"The backup storage does not exist:": "Lo storage per i backup non esiste:",
|
||||
"The backup was altered; recovery blocked": "Il backup è stato alterato; ripristino bloccato",
|
||||
@@ -6356,7 +6356,7 @@
|
||||
"The mount source or options were not kept": "La sorgente o le opzioni di mount non sono state conservate",
|
||||
"The mounted source differs from the configured directory": "La sorgente montata differisce dalla directory configurata",
|
||||
"The mounts of the new container do not match the proposal": "I mount del nuovo container non corrispondono alla proposta",
|
||||
"The name must start with a lowercase letter and use only lowercase letters, digits, - or _": "il nome deve iniziare con una lettera minuscola e utilizzare solo lettere minuscole, cifre - o _",
|
||||
"The name must start with a lowercase letter and use only lowercase letters, digits, - or _": "Il nome deve iniziare con una lettera minuscola e utilizzare solo lettere minuscole, cifre - o _",
|
||||
"The native GPU permissions were not kept": "I permessi originali della GPU non sono stati mantenuti",
|
||||
"The native unprivileged idmap is required": "È necessaria la mappatura ID nativa del LXC non privilegiato",
|
||||
"The new SSH key was installed and is now authorized on the server.\nKey file:": "La nuova chiave SSH è installata e autorizzata sul server.\nFile chiave:",
|
||||
@@ -6368,7 +6368,7 @@
|
||||
"The new image changes the PostgreSQL major version; the data must be migrated before updating": "La nuova immagine passa a una versione principale diversa di PostgreSQL; i dati devono essere migrati prima dell'aggiornamento",
|
||||
"The new image could not be installed": "Impossibile installare la nuova immagine",
|
||||
"The new image could not be installed:": "Impossibile installare la nuova immagine:",
|
||||
"The new image does not fit on the storage where images are downloaded:": "la nuova immagine non si adatta allo spazio di archiviazione in cui vengono scaricate le immagini:",
|
||||
"The new image does not fit on the storage where images are downloaded:": "La nuova immagine non si adatta allo spazio di archiviazione in cui vengono scaricate le immagini:",
|
||||
"The new image does not keep a required executable": "La nuova immagine non conserva un eseguibile necessario",
|
||||
"The new image is more recent than the minimum age set for scheduled updates; it is not installed yet.": "La nuova immagine è più recente dell’età minima prevista per gli aggiornamenti pianificati; non è ancora stata installata.",
|
||||
"The new image requires additional persistent paths": "La nuova immagine richiede altri percorsi persistenti",
|
||||
@@ -6425,7 +6425,7 @@
|
||||
"The private network of the application is already in use on this host:": "La rete privata dell’applicazione è già in uso su questo host:",
|
||||
"The privileged deployment does not include the required explicit consent": "La distribuzione privilegiata non include il consenso esplicito richiesto",
|
||||
"The prlimit soft value exceeds the hard value": "Il valore soft di prlimit supera il valore hard",
|
||||
"The profile sets SETUP_PORT=8123. Port 80 is only used when that variable is emptied.": "Messaggio tecnico per Proxmox e IT.Traduzione: il profilo imposta SETUP_PORT=8123. La porta 80 viene utilizzata solo quando quella variabile viene svuotata.",
|
||||
"The profile sets SETUP_PORT=8123. Port 80 is only used when that variable is emptied.": "Il profilo imposta SETUP_PORT=8123. La porta 80 viene utilizzata solo quando quella variabile viene svuotata.",
|
||||
"The proposal changes the identity of the instance": "La proposta cambia l'identità dell'istanza",
|
||||
"The proposed ARC maximum is below Proxmox VE's pool-size guideline:": "Il limite massimo ARC proposto è inferiore al valore indicato da Proxmox VE in base alle dimensioni del pool:",
|
||||
"The proposed changes no longer match; nothing was adopted": "Le modifiche proposte non corrispondono più; non è stata acquisita alcuna modifica",
|
||||
@@ -6545,7 +6545,7 @@
|
||||
"The startup differs from the declared Nextcloud adapter": "La procedura di avvio differisce da quella dichiarata nell’adattatore Nextcloud",
|
||||
"The startup differs from the declared adapter": "La configurazione di avvio è diversa da quella dell'adattatore dichiarato",
|
||||
"The staticfiles volume needs at least 1 GB": "Il volume staticfiles richiede almeno 1 GB",
|
||||
"The storage chosen for this backup cannot be written:": "non è possibile scrivere lo spazio di archiviazione scelto per questo backup:",
|
||||
"The storage chosen for this backup cannot be written:": "Non è possibile scrivere lo spazio di archiviazione scelto per questo backup:",
|
||||
"The storage chosen for this backup has no room either:": "Anche lo spazio di archiviazione scelto per questo backup non ha spazio:",
|
||||
"The storage does not accept backups:": "Lo storage non accetta backup:",
|
||||
"The storage has been removed and the disk unmounted.": "Lo storage è stato rimosso e il disco smontato.",
|
||||
@@ -6606,7 +6606,7 @@
|
||||
"This application is under watchdog: it is restarted automatically when it crashes. Turn the watchdog off?": "Watchdog attivo per questa applicazione: riavvio automatico in caso di arresto anomalo. Disattivare il watchdog?",
|
||||
"This archive does not contain a recognized backup layout.": "Questo archivio non contiene un layout di backup riconosciuto.",
|
||||
"This backup does not contain any restorable paths.": "Questo backup non contiene percorsi ripristinabili.",
|
||||
"This backup does not fit on the system disk of the host; it is made on the storage:": "questo backup non entra nel disco di sistema dell'host;è fatto sullo storage:",
|
||||
"This backup does not fit on the system disk of the host; it is made on the storage:": "Questo backup non entra nel disco di sistema dell'host; è fatto sullo storage:",
|
||||
"This backup includes /etc/zfs/zpool.cache (host-specific ZFS state).": "Questo backup include /etc/zfs/zpool.cache (stato ZFS specifico dell'host).",
|
||||
"This backup is encrypted.": "Questo backup è crittografato.",
|
||||
"This backup was taken on kernel": "Questo backup è stato eseguito con il kernel",
|
||||
@@ -6624,7 +6624,7 @@
|
||||
"This converts all file UIDs/GIDs by adding 100000": "Questo converte tutti gli UID/GID dei file aggiungendo 100000",
|
||||
"This creates a backup in case you need to revert changes": "Crea un backup per annullare le modifiche, se necessario",
|
||||
"This device is already attached": "Questo dispositivo è già associato",
|
||||
"This directory is already shared:": "questa directory è già condivisa:",
|
||||
"This directory is already shared:": "Questa directory è già condivisa:",
|
||||
"This erases existing metadata.": "Ciò cancella i metadati esistenti.",
|
||||
"This explicitly marks the container as privileged": "Ciò contrassegna esplicitamente il container come privilegiato",
|
||||
"This guarantees that device nodes are available before applying LXC GPU config.": "Garantisce la disponibilità dei nodi dispositivo prima di applicare la configurazione GPU LXC.",
|
||||
|
||||
+6
-6
@@ -3780,7 +3780,7 @@
|
||||
"NFS share unmount completed.": "Desmontagem do compartilhamento NFS concluída.",
|
||||
"NFS storage added successfully!": "Armazenamento NFS adicionado com sucesso!",
|
||||
"NFS storage adding in progress...": "Adição de armazenamento NFS em andamento...",
|
||||
"NFSv4 needs a privileged container without AppArmor or seccomp confinement: a compromised image could affect the host. NFSv3, SMB and Time Machine work without it.\n\nPrepare this container for NFSv4?": "o NFSv4 precisa de um contêiner privilegiado sem AppArmor ou confinamento seccomp: uma imagem comprometida pode afetar o host. NFSv3, SMB e Time Machine funcionam sem ele.\n\nPreparar este contêiner para NFSv4?",
|
||||
"NFSv4 needs a privileged container without AppArmor or seccomp confinement: a compromised image could affect the host. NFSv3, SMB and Time Machine work without it.\n\nPrepare this container for NFSv4?": "O NFSv4 precisa de um contêiner privilegiado sem AppArmor ou confinamento seccomp: uma imagem comprometida pode afetar o host. NFSv3, SMB e Time Machine funcionam sem ele.\n\nPreparar este contêiner para NFSv4?",
|
||||
"NIC": "NIC",
|
||||
"NIC changes detected — adjusted automatically": "alterações de NIC detectadas – ajustadas automaticamente",
|
||||
"NICs:": "Placas de rede:",
|
||||
@@ -4155,7 +4155,7 @@
|
||||
"No new Controller/NVMe entries were added.": "Nenhuma nova entrada de Controlador/NVMe foi adicionada.",
|
||||
"No online node has a guest of this job.": "Nenhum nó online tem convidado neste trabalho.",
|
||||
"No optimizations detected to uninstall.": "Nenhuma otimização detectada para desinstalar.",
|
||||
"No other storage of this host that accepts backups has that much free space. Free space and try again; the application was not modified.": "Nenhum outro armazenamento deste host que aceita backups possui tanto espaço livre. Libere espaço e tente novamente;o aplicativo não foi modificado.",
|
||||
"No other storage of this host that accepts backups has that much free space. Free space and try again; the application was not modified.": "Nenhum outro armazenamento deste host que aceita backups possui tanto espaço livre. Libere espaço e tente novamente; o aplicativo não foi modificado.",
|
||||
"No partitions found on disk. Nothing was wiped.": "Nenhuma partição encontrada no disco. Nada foi apagado.",
|
||||
"No password provided.": "Nenhuma senha fornecida.",
|
||||
"No paths available": "Nenhum caminho disponível",
|
||||
@@ -4869,7 +4869,7 @@
|
||||
"Rebooting the system...": "Reiniciando o sistema...",
|
||||
"Rebuilding initramfs after vfio.conf cleanup...": "Reconstruindo o initramfs após a limpeza do vfio.conf...",
|
||||
"Rebuilding initramfs to apply nouveau blacklist before installation...": "Reconstruindo o initramfs para aplicar a lista negra do nouveau antes da instalação...",
|
||||
"Rebuilding the container and recovering it from its backup are tested on the same image; the first update to a newer image is still to be observed.": "A reconstrução do contêiner e a recuperação do backup são testadas na mesma imagem;a primeira atualização para uma imagem mais recente ainda está para ser observada.",
|
||||
"Rebuilding the container and recovering it from its backup are tested on the same image; the first update to a newer image is still to be observed.": "A reconstrução do contêiner e a recuperação do backup são testadas na mesma imagem; a primeira atualização para uma imagem mais recente ainda está para ser observada.",
|
||||
"Recent": "Recente",
|
||||
"Recent Samba Servers": "Servidores Samba recentes",
|
||||
"Recent Samba server": "Servidor Samba recente",
|
||||
@@ -5257,7 +5257,7 @@
|
||||
"SMB Error": "Erro SMB",
|
||||
"SMB port 445:": "Porta SMB 445:",
|
||||
"SMB ports:": "Portas SMB:",
|
||||
"SMB, NFS and Time Machine shares from a web panel": "compartilhamentos SMB, NFS e Time Machine de um painel da web",
|
||||
"SMB, NFS and Time Machine shares from a web panel": "Compartilhamentos SMB, NFS e Time Machine de um painel da web",
|
||||
"SR-IOV Configuration Detected": "Configuração SR-IOV detectada",
|
||||
"SSD Emulation": "Emulação SSD",
|
||||
"SSH access": "Acesso SSH",
|
||||
@@ -5634,7 +5634,7 @@
|
||||
"Share path:": "Compartilhar caminho:",
|
||||
"Share updated successfully.": "Compartilhamento atualizado com sucesso.",
|
||||
"Share:": "Compartilhar:",
|
||||
"ShareCoveX panel": "painel ShareCoveX",
|
||||
"ShareCoveX panel": "Painel ShareCoveX",
|
||||
"Shared Directory Ready:": "Diretório compartilhado pronto:",
|
||||
"Shared Group": "Grupo Compartilhado",
|
||||
"Shared directory created:": "Directório partilhado criado:",
|
||||
@@ -6606,7 +6606,7 @@
|
||||
"This application is under watchdog: it is restarted automatically when it crashes. Turn the watchdog off?": "Esta aplicação está sob vigilância: é reiniciada automaticamente quando falha. Desativar a vigilância?",
|
||||
"This archive does not contain a recognized backup layout.": "Este arquivo não contém um layout de backup reconhecido.",
|
||||
"This backup does not contain any restorable paths.": "Este backup não contém nenhum caminho restaurável.",
|
||||
"This backup does not fit on the system disk of the host; it is made on the storage:": "Este backup não cabe no disco do sistema do host;é feito no armazenamento:",
|
||||
"This backup does not fit on the system disk of the host; it is made on the storage:": "Este backup não cabe no disco do sistema do host; é feito no armazenamento:",
|
||||
"This backup includes /etc/zfs/zpool.cache (host-specific ZFS state).": "Este backup inclui /etc/zfs/zpool.cache (estado ZFS específico do host).",
|
||||
"This backup is encrypted.": "Este backup está criptografado.",
|
||||
"This backup was taken on kernel": "Este backup foi feito no kernel",
|
||||
|
||||
+5
-5
@@ -4155,7 +4155,7 @@
|
||||
"No new Controller/NVMe entries were added.": "Neboli pridané žiadne nové položky Controller/NVMe.",
|
||||
"No online node has a guest of this job.": "Žiadny online uzol nemá hosťa tejto práce.",
|
||||
"No optimizations detected to uninstall.": "Nenašli sa žiadne optimalizácie na odinštalovanie.",
|
||||
"No other storage of this host that accepts backups has that much free space. Free space and try again; the application was not modified.": "Žiadne iné úložisko tohto hostiteľa, ktoré prijíma zálohy, nemá toľko voľného miesta. Uvoľnite miesto a skúste to znova;aplikácia nebola upravená.",
|
||||
"No other storage of this host that accepts backups has that much free space. Free space and try again; the application was not modified.": "Žiadne iné úložisko tohto hostiteľa, ktoré prijíma zálohy, nemá toľko voľného miesta. Uvoľnite miesto a skúste to znova; aplikácia nebola upravená.",
|
||||
"No partitions found on disk. Nothing was wiped.": "Na disku sa nenašli žiadne oddiely. Nič sa nevymazalo.",
|
||||
"No password provided.": "Nebolo zadané heslo.",
|
||||
"No paths available": "Nie sú dostupné žiadne cesty",
|
||||
@@ -4869,7 +4869,7 @@
|
||||
"Rebooting the system...": "Reštartujem systém...",
|
||||
"Rebuilding initramfs after vfio.conf cleanup...": "Prebudovanie initramfs po vyčistení vfio.conf...",
|
||||
"Rebuilding initramfs to apply nouveau blacklist before installation...": "Znovu vytváram initramfs, aby sa blacklist nouveau použil ešte pred inštaláciou...",
|
||||
"Rebuilding the container and recovering it from its backup are tested on the same image; the first update to a newer image is still to be observed.": "Prebudovanie kontajnera a jeho obnovenie zo zálohy sa testuje na rovnakom obrázku;prvá aktualizácia na novší obrázok je ešte potrebné pozorovať.",
|
||||
"Rebuilding the container and recovering it from its backup are tested on the same image; the first update to a newer image is still to be observed.": "Prebudovanie kontajnera a jeho obnovenie zo zálohy sa testuje na rovnakom obrázku; prvá aktualizácia na novší obrázok je ešte potrebné pozorovať.",
|
||||
"Recent": "Nedávne",
|
||||
"Recent Samba Servers": "Posledné Samba servery",
|
||||
"Recent Samba server": "Posledný Samba server",
|
||||
@@ -5257,7 +5257,7 @@
|
||||
"SMB Error": "Chyba SMB",
|
||||
"SMB port 445:": "SMB port 445:",
|
||||
"SMB ports:": "SMB porty:",
|
||||
"SMB, NFS and Time Machine shares from a web panel": "zdieľania SMB, NFS a Time Machine z webového panela",
|
||||
"SMB, NFS and Time Machine shares from a web panel": "Zdieľania SMB, NFS a Time Machine z webového panela",
|
||||
"SR-IOV Configuration Detected": "Zistené nastavenie SR-IOV",
|
||||
"SSD Emulation": "Emulácia SSD",
|
||||
"SSH access": "Prístup SSH",
|
||||
@@ -5634,7 +5634,7 @@
|
||||
"Share path:": "Cesta zdieľania:",
|
||||
"Share updated successfully.": "Zdieľanie bolo úspešne aktualizované.",
|
||||
"Share:": "Zdieľanie:",
|
||||
"ShareCoveX panel": "panel ShareCoveX",
|
||||
"ShareCoveX panel": "Panel ShareCoveX",
|
||||
"Shared Directory Ready:": "Zdieľaný priečinok je pripravený:",
|
||||
"Shared Group": "Zdieľaná skupina",
|
||||
"Shared directory created:": "Vytvorený zdieľaný adresár:",
|
||||
@@ -6605,7 +6605,7 @@
|
||||
"This application is under watchdog: it is restarted automatically when it crashes. Turn the watchdog off?": "Táto aplikácia je pod watchdogom: pri zlyhaní sa automaticky reštartuje. Vypnúť watchdog?",
|
||||
"This archive does not contain a recognized backup layout.": "Tento archív neobsahuje rozpoznané rozloženie zálohy.",
|
||||
"This backup does not contain any restorable paths.": "Táto záloha neobsahuje žiadne obnoviteľné cesty.",
|
||||
"This backup does not fit on the system disk of the host; it is made on the storage:": "Táto záloha sa nezmestí na systémový disk hostiteľa;vyrába sa na sklade:",
|
||||
"This backup does not fit on the system disk of the host; it is made on the storage:": "Táto záloha sa nezmestí na systémový disk hostiteľa; vyrába sa na sklade:",
|
||||
"This backup includes /etc/zfs/zpool.cache (host-specific ZFS state).": "Táto záloha obsahuje /etc/zfs/zpool.cache (stav ZFS špecifický pre hosta).",
|
||||
"This backup is encrypted.": "Táto záloha je šifrovaná.",
|
||||
"This backup was taken on kernel": "Táto záloha bola vytvorená na kerneli",
|
||||
|
||||
+3
-3
@@ -4155,7 +4155,7 @@
|
||||
"No new Controller/NVMe entries were added.": "Inga nya kontroller/NVMe-poster har lagts till.",
|
||||
"No online node has a guest of this job.": "Ingen onlinenod har en gäst på det här jobbet.",
|
||||
"No optimizations detected to uninstall.": "Inga optimeringar upptäcktes för att avinstallera.",
|
||||
"No other storage of this host that accepts backups has that much free space. Free space and try again; the application was not modified.": "Ingen annan lagring av denna värd som accepterar säkerhetskopior har så mycket ledigt utrymme. Frigör utrymme och försök igen;applikationen ändrades inte.",
|
||||
"No other storage of this host that accepts backups has that much free space. Free space and try again; the application was not modified.": "Ingen annan lagring av denna värd som accepterar säkerhetskopior har så mycket ledigt utrymme. Frigör utrymme och försök igen; applikationen ändrades inte.",
|
||||
"No partitions found on disk. Nothing was wiped.": "Inga partitioner hittades på disken. Ingenting torkades.",
|
||||
"No password provided.": "Inget lösenord angett.",
|
||||
"No paths available": "Inga vägar tillgängliga",
|
||||
@@ -4869,7 +4869,7 @@
|
||||
"Rebooting the system...": "Startar om systemet...",
|
||||
"Rebuilding initramfs after vfio.conf cleanup...": "Bygger om initramfs efter vfio.conf-rensning...",
|
||||
"Rebuilding initramfs to apply nouveau blacklist before installation...": "Bygger om initramfs för att tillämpa nouveau blacklist före installation...",
|
||||
"Rebuilding the container and recovering it from its backup are tested on the same image; the first update to a newer image is still to be observed.": "Att bygga om behållaren och återställa den från dess säkerhetskopia testas på samma bild;den första uppdateringen av en nyare bild är fortfarande att observera.",
|
||||
"Rebuilding the container and recovering it from its backup are tested on the same image; the first update to a newer image is still to be observed.": "Att bygga om behållaren och återställa den från dess säkerhetskopia testas på samma bild; den första uppdateringen av en nyare bild är fortfarande att observera.",
|
||||
"Recent": "Ny",
|
||||
"Recent Samba Servers": "Senaste Samba-servrar",
|
||||
"Recent Samba server": "Senaste Samba-servern",
|
||||
@@ -6606,7 +6606,7 @@
|
||||
"This application is under watchdog: it is restarted automatically when it crashes. Turn the watchdog off?": "Den här applikationen är under watchdog: den startas om automatiskt när den kraschar. Stänga av watchdog?",
|
||||
"This archive does not contain a recognized backup layout.": "Det här arkivet innehåller inte en känd backuplayout.",
|
||||
"This backup does not contain any restorable paths.": "Denna säkerhetskopia innehåller inga återställbara sökvägar.",
|
||||
"This backup does not fit on the system disk of the host; it is made on the storage:": "Denna säkerhetskopia får inte plats på värdens systemdisk;den är gjord på förrådet:",
|
||||
"This backup does not fit on the system disk of the host; it is made on the storage:": "Denna säkerhetskopia får inte plats på värdens systemdisk; den är gjord på förrådet:",
|
||||
"This backup includes /etc/zfs/zpool.cache (host-specific ZFS state).": "Denna säkerhetskopia inkluderar /etc/zfs/zpool.cache (värdspecifikt ZFS-tillstånd).",
|
||||
"This backup is encrypted.": "Denna säkerhetskopia är krypterad.",
|
||||
"This backup was taken on kernel": "Denna säkerhetskopia togs på kärnan",
|
||||
|
||||
+4
-4
@@ -35,16 +35,16 @@ Questions and ideas about OCI testing go in [discussion #360](https://github.com
|
||||
| AdGuard Home | Adblock & DNS |
|
||||
| Adguardhome Sync | Adblock & DNS |
|
||||
| Alby Hub ✨ | Finance & Budgeting |
|
||||
| Alist | Productivity & Workflows |
|
||||
| Alist | Files & Sharing |
|
||||
| aMule | Files & Downloads |
|
||||
| Chromium | Browsers & Web Desktops |
|
||||
| CodeProject.AI Server | AI |
|
||||
| CopyParty | Files & Downloads |
|
||||
| CopyParty | Files & Sharing |
|
||||
| Crafty | Gaming & Leisure |
|
||||
| Ddclient | Adblock & DNS |
|
||||
| Duplicati | Backup & Recovery |
|
||||
| Etherpad | Documents & Notes |
|
||||
| FileBrowser Quantum | Tools |
|
||||
| FileBrowser Quantum | Files & Sharing |
|
||||
| FlareSolverr | *Arr Suite |
|
||||
| Flexget | *Arr Suite |
|
||||
| Frigate | NVR & Cameras |
|
||||
@@ -58,7 +58,7 @@ Questions and ideas about OCI testing go in [discussion #360](https://github.com
|
||||
| Motioneye | NVR & Cameras |
|
||||
| Nextcloud | Productivity & Workflows |
|
||||
| Nextcloud Stack | Productivity & Workflows |
|
||||
| OpenList | Productivity & Workflows |
|
||||
| OpenList | Files & Sharing |
|
||||
| Openssh Server | Remote Access & VPN |
|
||||
| Paperless-ngx | Productivity & Workflows |
|
||||
| Phpmyadmin | Databases |
|
||||
|
||||
@@ -13,8 +13,8 @@
|
||||
"description": {
|
||||
"en_US": "Official image with managed persistent configuration and selectable content storage. Validated on amd64: clean install, authenticated login, same-digest recreation and interrupted-candidate recovery. Cross-release migration and arm64 runtime not tested."
|
||||
},
|
||||
"category": "tools",
|
||||
"category_label": "Tools",
|
||||
"category": "sharing",
|
||||
"category_label": "Files & Sharing",
|
||||
"author": "gtsteffaniak",
|
||||
"developer": "gtsteffaniak",
|
||||
"icon": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/filebrowser-quantum.webp",
|
||||
|
||||
@@ -89,7 +89,7 @@
|
||||
"default": "managed-volume",
|
||||
"managed_volume": {
|
||||
"backup": true,
|
||||
"default_size_gb": 16
|
||||
"default_size_gb": 1
|
||||
}
|
||||
}
|
||||
],
|
||||
|
||||
@@ -34,6 +34,8 @@
|
||||
"adguard-home": "adblock",
|
||||
"adminer": "databases",
|
||||
"airsonic-advanced": "media",
|
||||
"alist": "sharing",
|
||||
"alist-sync": "sharing",
|
||||
"altus": "communication",
|
||||
"ardour": "creative",
|
||||
"audacity": "creative",
|
||||
@@ -53,6 +55,7 @@
|
||||
"cloudbeaver": "databases",
|
||||
"code-server": "ai",
|
||||
"cops": "media",
|
||||
"copyparty": "sharing",
|
||||
"crafty": "gaming",
|
||||
"cura": "creative",
|
||||
"darktable": "creative",
|
||||
@@ -74,6 +77,8 @@
|
||||
"emulatorjs": "gaming",
|
||||
"faster-whisper": "ai",
|
||||
"ferdium": "communication",
|
||||
"filebrowser-quantum": "sharing",
|
||||
"filedrop": "sharing",
|
||||
"filezilla": "downloads",
|
||||
"firefox": "desktop",
|
||||
"flexget": "arr",
|
||||
@@ -126,6 +131,7 @@
|
||||
"ngircd": "communication",
|
||||
"nzbhydra2": "arr",
|
||||
"obsidian": "documents",
|
||||
"openlist": "sharing",
|
||||
"openshot": "creative",
|
||||
"openspeedtest": "monitoring",
|
||||
"openssh-server": "remote",
|
||||
@@ -133,22 +139,25 @@
|
||||
"opera": "desktop",
|
||||
"orcaslicer": "creative",
|
||||
"oscam": "media",
|
||||
"pairdrop": "sharing",
|
||||
"pcsx2": "gaming",
|
||||
"pelorus": "ai",
|
||||
"pidgin": "communication",
|
||||
"pingvin-share": "sharing",
|
||||
"piper": "ai",
|
||||
"piwigo": "media",
|
||||
"playit-agent": "web",
|
||||
"ppsspp": "gaming",
|
||||
"pwndrop": "downloads",
|
||||
"psitransfer": "sharing",
|
||||
"pwndrop": "sharing",
|
||||
"pycharm": "ai",
|
||||
"pydio-cells": "downloads",
|
||||
"pydio-cells": "sharing",
|
||||
"pyload-ng": "downloads",
|
||||
"qdirstat": "tools",
|
||||
"raneto": "documents",
|
||||
"rawtherapee": "creative",
|
||||
"remmina": "remote",
|
||||
"resilio-sync": "downloads",
|
||||
"resilio-sync": "sharing",
|
||||
"retroarch": "gaming",
|
||||
"retroarch-inglebard": "gaming",
|
||||
"rpcs3": "gaming",
|
||||
@@ -162,12 +171,14 @@
|
||||
"sickgear": "arr",
|
||||
"signal": "communication",
|
||||
"smokeping": "monitoring",
|
||||
"snapdrop": "sharing",
|
||||
"speedtest-tracker": "monitoring",
|
||||
"spotube": "media",
|
||||
"sqlitebrowser": "databases",
|
||||
"steam": "gaming",
|
||||
"swag": "web",
|
||||
"synclounge": "media",
|
||||
"syncthing": "sharing",
|
||||
"syslog-ng": "monitoring",
|
||||
"tailscale": "remote",
|
||||
"telegram": "communication",
|
||||
@@ -193,7 +204,7 @@
|
||||
"winegui": "desktop",
|
||||
"wireshark": "network",
|
||||
"wps-office": "documents",
|
||||
"xbackbone": "downloads",
|
||||
"xbackbone": "sharing",
|
||||
"xemu": "gaming",
|
||||
"yaak": "ai",
|
||||
"your_spotify": "media",
|
||||
|
||||
@@ -13,8 +13,8 @@
|
||||
"description": {
|
||||
"en_US": "Official image with managed persistent configuration and selectable content storage. Validated on amd64: clean install, authenticated login, same-digest recreation and interrupted-candidate recovery. Cross-release migration and arm64 runtime not tested."
|
||||
},
|
||||
"category": "tools",
|
||||
"category_label": "Tools",
|
||||
"category": "sharing",
|
||||
"category_label": "Files & Sharing",
|
||||
"author": "gtsteffaniak",
|
||||
"developer": "gtsteffaniak",
|
||||
"icon": null,
|
||||
|
||||
@@ -89,7 +89,7 @@
|
||||
"default": "managed-volume",
|
||||
"managed_volume": {
|
||||
"backup": true,
|
||||
"default_size_gb": 16
|
||||
"default_size_gb": 1
|
||||
}
|
||||
}
|
||||
],
|
||||
|
||||
+30
-30
@@ -269,8 +269,8 @@
|
||||
"pushed_at": "2026-09-11T10:43:22Z",
|
||||
"updated_at": "2024-11-22",
|
||||
"main_image": "xhofe/alist:latest",
|
||||
"category": "productivity",
|
||||
"category_label": "Productivity & Workflows",
|
||||
"category": "sharing",
|
||||
"category_label": "Files & Sharing",
|
||||
"template": "apps/alist.json",
|
||||
"template_status": "laboratory-validated",
|
||||
"automatic_install_candidate": true,
|
||||
@@ -305,8 +305,8 @@
|
||||
"pushed_at": "2026-09-11T10:43:22Z",
|
||||
"updated_at": "2025-03-15",
|
||||
"main_image": "xjxjin/alist-sync:latest",
|
||||
"category": "productivity",
|
||||
"category_label": "Productivity & Workflows",
|
||||
"category": "sharing",
|
||||
"category_label": "Files & Sharing",
|
||||
"template": "apps/alist-sync.json",
|
||||
"template_status": "generated-unvalidated",
|
||||
"automatic_install_candidate": true,
|
||||
@@ -1680,8 +1680,8 @@
|
||||
"pushed_at": "2026-09-11T10:43:22Z",
|
||||
"updated_at": "2026-03-25",
|
||||
"main_image": "icewhaletech/copyparty:latest",
|
||||
"category": "downloads",
|
||||
"category_label": "Files & Downloads",
|
||||
"category": "sharing",
|
||||
"category_label": "Files & Sharing",
|
||||
"template": "apps/copyparty.json",
|
||||
"template_status": "laboratory-validated",
|
||||
"automatic_install_candidate": true,
|
||||
@@ -2964,8 +2964,8 @@
|
||||
],
|
||||
"updated_at": "2026-09-16",
|
||||
"main_image": "gtstef/filebrowser:latest",
|
||||
"category": "tools",
|
||||
"category_label": "Tools",
|
||||
"category": "sharing",
|
||||
"category_label": "Files & Sharing",
|
||||
"replaces_discovered_ids": [],
|
||||
"curated_path": "catalog/curated/filebrowser-quantum.json",
|
||||
"template": "apps/filebrowser-quantum.json",
|
||||
@@ -3002,8 +3002,8 @@
|
||||
"pushed_at": "2026-09-11T10:43:22Z",
|
||||
"updated_at": "2023-09-13",
|
||||
"main_image": "noecl/filedrop:latest",
|
||||
"category": "productivity",
|
||||
"category_label": "Productivity & Workflows",
|
||||
"category": "sharing",
|
||||
"category_label": "Files & Sharing",
|
||||
"template": "apps/filedrop.json",
|
||||
"template_status": "generated-unvalidated",
|
||||
"automatic_install_candidate": true,
|
||||
@@ -7576,8 +7576,8 @@
|
||||
"pushed_at": "2026-09-11T10:43:22Z",
|
||||
"updated_at": "2026-05-25",
|
||||
"main_image": "openlistteam/openlist:latest",
|
||||
"category": "productivity",
|
||||
"category_label": "Productivity & Workflows",
|
||||
"category": "sharing",
|
||||
"category_label": "Files & Sharing",
|
||||
"template": "apps/openlist.json",
|
||||
"template_status": "laboratory-validated",
|
||||
"automatic_install_candidate": true,
|
||||
@@ -7906,8 +7906,8 @@
|
||||
"pushed_at": "2026-09-12T14:37:28Z",
|
||||
"updated_at": "2025-07-05",
|
||||
"main_image": "lscr.io/linuxserver/pairdrop:latest",
|
||||
"category": "downloads",
|
||||
"category_label": "Files & Downloads",
|
||||
"category": "sharing",
|
||||
"category_label": "Files & Sharing",
|
||||
"template": "apps/pairdrop.json",
|
||||
"template_status": "generated-unvalidated",
|
||||
"automatic_install_candidate": true,
|
||||
@@ -8317,8 +8317,8 @@
|
||||
"pushed_at": "2026-09-11T10:43:22Z",
|
||||
"updated_at": "2025-05-25",
|
||||
"main_image": "stonith404/pingvin-share:latest",
|
||||
"category": "productivity",
|
||||
"category_label": "Productivity & Workflows",
|
||||
"category": "sharing",
|
||||
"category_label": "Files & Sharing",
|
||||
"template": "apps/pingvin-share.json",
|
||||
"template_status": "generated-unvalidated",
|
||||
"automatic_install_candidate": true,
|
||||
@@ -8791,8 +8791,8 @@
|
||||
"pushed_at": "2026-09-11T10:43:22Z",
|
||||
"updated_at": "2026-02-14",
|
||||
"main_image": "psitrax/psitransfer:latest",
|
||||
"category": "productivity",
|
||||
"category_label": "Productivity & Workflows",
|
||||
"category": "sharing",
|
||||
"category_label": "Files & Sharing",
|
||||
"template": "apps/psitransfer.json",
|
||||
"template_status": "generated-unvalidated",
|
||||
"automatic_install_candidate": true,
|
||||
@@ -8823,8 +8823,8 @@
|
||||
"pushed_at": "2026-09-07T20:21:35Z",
|
||||
"updated_at": "2026-07-17",
|
||||
"main_image": "lscr.io/linuxserver/pwndrop:latest",
|
||||
"category": "downloads",
|
||||
"category_label": "Files & Downloads",
|
||||
"category": "sharing",
|
||||
"category_label": "Files & Sharing",
|
||||
"template": "apps/pwndrop.json",
|
||||
"template_status": "generated-unvalidated",
|
||||
"automatic_install_candidate": true,
|
||||
@@ -8886,8 +8886,8 @@
|
||||
"pushed_at": "2026-08-27T14:24:17Z",
|
||||
"updated_at": "2026-07-17",
|
||||
"main_image": "lscr.io/linuxserver/pydio-cells:latest",
|
||||
"category": "downloads",
|
||||
"category_label": "Files & Downloads",
|
||||
"category": "sharing",
|
||||
"category_label": "Files & Sharing",
|
||||
"template": "apps/pydio-cells.json",
|
||||
"template_status": "generated-unvalidated",
|
||||
"automatic_install_candidate": true,
|
||||
@@ -9359,8 +9359,8 @@
|
||||
"pushed_at": "2026-09-08T01:30:09Z",
|
||||
"updated_at": "2024-08-21",
|
||||
"main_image": "lscr.io/linuxserver/resilio-sync:latest",
|
||||
"category": "downloads",
|
||||
"category_label": "Files & Downloads",
|
||||
"category": "sharing",
|
||||
"category_label": "Files & Sharing",
|
||||
"template": "apps/resilio-sync.json",
|
||||
"template_status": "generated-unvalidated",
|
||||
"automatic_install_candidate": true,
|
||||
@@ -10016,8 +10016,8 @@
|
||||
"pushed_at": "2026-09-11T10:43:22Z",
|
||||
"updated_at": "2024-07-18",
|
||||
"main_image": "linuxserver/snapdrop:latest",
|
||||
"category": "productivity",
|
||||
"category_label": "Productivity & Workflows",
|
||||
"category": "sharing",
|
||||
"category_label": "Files & Sharing",
|
||||
"template": "apps/snapdrop.json",
|
||||
"template_status": "generated-unvalidated",
|
||||
"automatic_install_candidate": true,
|
||||
@@ -10486,8 +10486,8 @@
|
||||
"pushed_at": "2026-09-10T15:29:13Z",
|
||||
"updated_at": "2026-09-10",
|
||||
"main_image": "lscr.io/linuxserver/syncthing:latest",
|
||||
"category": "downloads",
|
||||
"category_label": "Files & Downloads",
|
||||
"category": "sharing",
|
||||
"category_label": "Files & Sharing",
|
||||
"template": "apps/syncthing.json",
|
||||
"template_status": "generated-unvalidated",
|
||||
"automatic_install_candidate": true,
|
||||
@@ -12077,8 +12077,8 @@
|
||||
"pushed_at": "2026-09-13T07:29:57Z",
|
||||
"updated_at": "2026-07-05",
|
||||
"main_image": "lscr.io/linuxserver/xbackbone:latest",
|
||||
"category": "downloads",
|
||||
"category_label": "Files & Downloads",
|
||||
"category": "sharing",
|
||||
"category_label": "Files & Sharing",
|
||||
"template": "apps/xbackbone.json",
|
||||
"template_status": "generated-unvalidated",
|
||||
"automatic_install_candidate": true,
|
||||
|
||||
@@ -116,5 +116,10 @@
|
||||
"unpackerr": [
|
||||
"/data"
|
||||
]
|
||||
},
|
||||
"sizes": {
|
||||
"sharecovex": {
|
||||
"/config": 1
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1779,12 +1779,42 @@ fi
|
||||
if [[ $SELINUX_LABEL_DISABLED == true ]]; then
|
||||
oci_log "label:disable kept as metadata; Proxmox uses AppArmor, not SELinux, for this LXC"
|
||||
fi
|
||||
# Gives the identity the application writes with access to a host directory
|
||||
# that belongs to someone else, with an ACL: the owner and the permissions of
|
||||
# what is there stay as they are, and the owner of the directory keeps access
|
||||
# to what the application creates in it.
|
||||
grant_shared_access() {
|
||||
local source=$1 owner group triplet default_spec
|
||||
command -v setfacl >/dev/null 2>&1 && command -v getfacl >/dev/null 2>&1 || return 1
|
||||
# Granted already: an update or a modification installs the container again.
|
||||
if getfacl -cpn "$source" 2>/dev/null | grep -q "^user:${HOST_BIND_UID}:rwx" \
|
||||
&& getfacl -cpn "$source" 2>/dev/null | grep -q "^default:user:${HOST_BIND_UID}:rwx"; then
|
||||
return 0
|
||||
fi
|
||||
owner=$(stat -c '%u' "$source") || return 1
|
||||
group=$(stat -c '%g' "$source") || return 1
|
||||
default_spec="d:u:${HOST_BIND_UID}:rwx,d:g:${HOST_BIND_GID}:rwx"
|
||||
if [[ $owner != 0 && $owner != "$HOST_BIND_UID" ]]; then
|
||||
default_spec="${default_spec},d:u:${owner}:rwx"
|
||||
fi
|
||||
if [[ $group != 0 && $group != "$HOST_BIND_GID" ]]; then
|
||||
triplet=$(stat -c '%A' "$source")
|
||||
triplet=${triplet:4:3}
|
||||
triplet=${triplet//s/x}
|
||||
triplet=${triplet//S/-}
|
||||
default_spec="${default_spec},d:g:${group}:${triplet}"
|
||||
fi
|
||||
setfacl -R -P -m "u:${HOST_BIND_UID}:rwX,g:${HOST_BIND_GID}:rwX" "$source" 2>>"${OCI_LOG:-/dev/null}" || return 1
|
||||
find "$source" -xdev -type d -exec setfacl -m "$default_spec" {} + 2>>"${OCI_LOG:-/dev/null}" || return 1
|
||||
}
|
||||
|
||||
MOUNT_ENTRIES=$(jq '.mounts | if type == "array" then length else 0 end' "$DEPLOYMENT_FILE")
|
||||
MOUNT_NOTES=()
|
||||
MOUNT_WARNINGS=()
|
||||
if (( MOUNT_ENTRIES > 0 )); then
|
||||
msg_info "$(translate "Adding the mount points...")"
|
||||
fi
|
||||
while IFS=$'\t' read -r TYPE TARGET SOURCE SIZE BACKUP READ_ONLY CREATE_IF_MISSING; do
|
||||
while IFS=$'\t' read -r TYPE TARGET SOURCE SIZE BACKUP READ_ONLY CREATE_IF_MISSING GRANT_ACCESS; do
|
||||
[[ -n $TYPE ]] || continue
|
||||
[[ $TARGET == /* && $TARGET != *","* ]] || die "$(translate "Invalid container path:") $TARGET"
|
||||
RO_OPT=""
|
||||
@@ -1821,6 +1851,15 @@ while IFS=$'\t' read -r TYPE TARGET SOURCE SIZE BACKUP READ_ONLY CREATE_IF_MISSI
|
||||
MOUNT_NOTES+=("$(translate "Shared directory created:") $SOURCE")
|
||||
fi
|
||||
[[ -e $SOURCE ]] || die "$(translate "The host bind source does not exist:") $SOURCE"
|
||||
if [[ -d $SOURCE && $GRANT_ACCESS == true ]]; then
|
||||
if grant_shared_access "$SOURCE"; then
|
||||
oci_log "Access granted with an ACL: $SOURCE (uid=$HOST_BIND_UID gid=$HOST_BIND_GID)"
|
||||
MOUNT_NOTES+=("$(translate "Access granted to the application on:") $SOURCE")
|
||||
else
|
||||
oci_log "Could not grant access with an ACL: $SOURCE"
|
||||
MOUNT_WARNINGS+=("$(translate "Access could not be granted; the application cannot write to:") $SOURCE")
|
||||
fi
|
||||
fi
|
||||
if [[ -d $SOURCE ]]; then
|
||||
if [[ -n ${PROXMENUX_OCI_TRANSACTION:-} ]]; then
|
||||
python3 "${SCRIPT_DIR}/oci_instance_transaction.py" --root "$INSTANCE_ROOT" \
|
||||
@@ -1847,13 +1886,16 @@ while IFS=$'\t' read -r TYPE TARGET SOURCE SIZE BACKUP READ_ONLY CREATE_IF_MISSI
|
||||
oci_quiet pct set "$VMID" "--mp${MOUNT_INDEX}" "$MP_VALUE" \
|
||||
|| die "$(translate "Could not add the mount point:") $TARGET"
|
||||
MOUNT_INDEX=$((MOUNT_INDEX + 1))
|
||||
done < <(jq -r '.mounts[] | [.type,.container_path,.source,(.size_gb // "-"),(.backup | if . then 1 else 0 end),.read_only,(.create_if_missing // false)] | @tsv' "$DEPLOYMENT_FILE")
|
||||
done < <(jq -r '.mounts[] | [.type,.container_path,.source,(.size_gb // "-"),(.backup | if . then 1 else 0 end),.read_only,(.create_if_missing // false),(.grant_access // false)] | @tsv' "$DEPLOYMENT_FILE")
|
||||
if (( MOUNT_ENTRIES > 0 )); then
|
||||
msg_ok "$(translate "Mount points added:") $MOUNT_ENTRIES"
|
||||
fi
|
||||
for MOUNT_NOTE in ${MOUNT_NOTES[@]+"${MOUNT_NOTES[@]}"}; do
|
||||
msg_ok "$MOUNT_NOTE"
|
||||
done
|
||||
for MOUNT_WARNING in ${MOUNT_WARNINGS[@]+"${MOUNT_WARNINGS[@]}"}; do
|
||||
msg_warn "$MOUNT_WARNING"
|
||||
done
|
||||
|
||||
while IFS=$'\t' read -r TARGET SIZE_MB OPTIONS; do
|
||||
[[ -n $TARGET ]] || continue
|
||||
|
||||
@@ -79,6 +79,20 @@ def host_directories(root, members):
|
||||
return paths
|
||||
|
||||
|
||||
def granted_directories(root, members):
|
||||
"""The host directories the installation was given access to with an ACL."""
|
||||
paths = []
|
||||
for vmid in members:
|
||||
try:
|
||||
record = instances.read(root, vmid)
|
||||
except (OSError, ValueError, KeyError):
|
||||
continue
|
||||
for mount in record.get('deployment', {}).get('mounts', []):
|
||||
if mount.get('grant_access') is True and mount.get('source') not in paths:
|
||||
paths.append(mount['source'])
|
||||
return paths
|
||||
|
||||
|
||||
def private_bridge(primary):
|
||||
network = (primary.get('stack') or {}).get('deployment', {}).get('network', {})
|
||||
bridge = network.get('private_bridge')
|
||||
@@ -313,6 +327,7 @@ def remove(root, vmid):
|
||||
raise ValueError(f"{translate('The container runs on another node of the cluster; migrate it back to this node to remove it:')} "
|
||||
f"CT {member} ({node})")
|
||||
kept = host_directories(root, members)
|
||||
granted = granted_directories(root, members)
|
||||
bridge = private_bridge(primary)
|
||||
incomplete = False
|
||||
msg_info(translate('Removing the containers...'))
|
||||
@@ -359,6 +374,9 @@ def remove(root, vmid):
|
||||
msg_ok(f"{translate('Unused image removed from the cache:')} {path.name}")
|
||||
for path in kept:
|
||||
msg_info(f"{translate('Host directory listed in saved records (not targeted for removal):')} {path}")
|
||||
for path in granted:
|
||||
# Another container may write to it with the same identity.
|
||||
msg_info(f"{translate('The access rule added to this host directory is kept:')} {path}")
|
||||
return incomplete
|
||||
|
||||
|
||||
|
||||
@@ -368,7 +368,8 @@ class Catalog:
|
||||
except (OSError, json.JSONDecodeError):
|
||||
data = {}
|
||||
self._volume_policy = {"shared_paths": set(data.get("shared_paths", [])),
|
||||
"applications": data.get("applications", {})}
|
||||
"applications": data.get("applications", {}),
|
||||
"sizes": data.get("sizes", {})}
|
||||
return self._volume_policy
|
||||
|
||||
def _apply_volume_policy(self, app_id: str, contract: dict[str, Any]) -> None:
|
||||
@@ -377,6 +378,8 @@ class Catalog:
|
||||
state of the application stays in a container volume without asking."""
|
||||
policy = self.volume_policy()
|
||||
shared = policy["shared_paths"] | set(policy["applications"].get(app_id, []))
|
||||
# A volume known to stay small is created at its stated size.
|
||||
sizes = policy.get("sizes", {}).get(app_id, {})
|
||||
for volume in contract.get("volumes", []):
|
||||
choices = volume.get("installation_choice", [])
|
||||
if "managed-volume" not in choices:
|
||||
@@ -390,7 +393,9 @@ class Catalog:
|
||||
volume["default"] = "managed-volume"
|
||||
managed = volume.get("managed_volume")
|
||||
if isinstance(managed, dict):
|
||||
managed["default_size_gb"] = max(int(managed.get("default_size_gb") or 0), MINIMUM_VOLUME_GB)
|
||||
stated = sizes.get(volume["container_path"])
|
||||
managed["default_size_gb"] = (int(stated) if stated else
|
||||
max(int(managed.get("default_size_gb") or 0), MINIMUM_VOLUME_GB))
|
||||
|
||||
def _enrich_index_from_templates(self, payload: dict[str, Any]) -> None:
|
||||
for item in payload.get("applications", []):
|
||||
|
||||
@@ -4,6 +4,7 @@ from __future__ import annotations
|
||||
|
||||
import ipaddress
|
||||
import json
|
||||
import os
|
||||
import re
|
||||
import shutil
|
||||
import subprocess
|
||||
@@ -81,6 +82,33 @@ def ipv4_subnet(bridge: str) -> str | None:
|
||||
return str(interface.network) if interface.version == 4 else None
|
||||
|
||||
|
||||
def can_write(path: str, uid: int, gid: int) -> bool:
|
||||
"""Whether this identity of the host can create files in an existing
|
||||
directory, by its owner, its group, everybody else or an ACL entry."""
|
||||
try:
|
||||
status = os.stat(path)
|
||||
except OSError:
|
||||
return False
|
||||
if status.st_uid == uid:
|
||||
bits = status.st_mode >> 6
|
||||
elif status.st_gid == gid:
|
||||
bits = status.st_mode >> 3
|
||||
else:
|
||||
bits = status.st_mode
|
||||
if bits & 3 == 3:
|
||||
return True
|
||||
try:
|
||||
listing = subprocess.run(["getfacl", "-cpn", path], capture_output=True, text=True, check=False).stdout
|
||||
except OSError:
|
||||
return False
|
||||
for line in listing.splitlines():
|
||||
fields = line.split(":")
|
||||
if (len(fields) >= 3 and fields[0] in ("user", "group") and fields[1] == str(uid if fields[0] == "user" else gid)
|
||||
and "w" in fields[2][:3] and "x" in fields[2][:3]):
|
||||
return True
|
||||
return False
|
||||
|
||||
|
||||
def timezone() -> str:
|
||||
try:
|
||||
value = Path("/etc/timezone").read_text(encoding="utf-8").strip()
|
||||
|
||||
@@ -17,7 +17,7 @@ from typing import Any
|
||||
|
||||
from . import host
|
||||
from . import network as access
|
||||
from .i18n import translate
|
||||
from .i18n import source_text, translate
|
||||
from .ui import DialogUI, TerminalUI, UserCancelled
|
||||
from .custom_mounts import ask_custom_mounts
|
||||
from .extra_devices import device_permissions
|
||||
@@ -141,7 +141,7 @@ SHARED_DIRECTORY_NAME = re.compile(r"[a-z][a-z0-9_-]{0,31}")
|
||||
|
||||
|
||||
def ask_shared_directories(ui, template: dict[str, Any], mounts: list[dict[str, Any]], storage: str,
|
||||
advanced: bool, optional: bool = False) -> list[dict[str, Any]]:
|
||||
advanced: bool, optional: bool = False, unprivileged: bool = True) -> list[dict[str, Any]]:
|
||||
"""The directories an application exists to share. Its profile declares one
|
||||
container directory, and each directory the user names is mounted below
|
||||
it, on a container volume or from a directory of the host. A new
|
||||
@@ -185,6 +185,22 @@ def ask_shared_directories(ui, template: dict[str, Any], mounts: list[dict[str,
|
||||
else:
|
||||
mount["source"] = ui.ask(f"{translate('Host path for')} {target}",
|
||||
f"/mnt/oci-shared/{app_id}/{name}")
|
||||
# A directory that is already there belongs to whoever made it. The
|
||||
# identity the application writes with is the one of its volumes,
|
||||
# shifted by the range of an unprivileged container.
|
||||
owner = profile.get("volume_owner") or {}
|
||||
shift = 100000 if unprivileged else 0
|
||||
uid, gid = int(owner.get("uid", 0)) + shift, int(owner.get("gid", 0)) + shift
|
||||
if os.path.isdir(mount["source"]) and not host.can_write(mount["source"], uid, gid):
|
||||
title = source_text(template["catalog_ui"]["title"]) or app_id
|
||||
if ui.confirm(translate(
|
||||
"{path} already exists and belongs to another user of the host, so {app} cannot "
|
||||
"write to it.\n\nProxMenux can add an access rule (ACL) for the identity {app} uses "
|
||||
"on the host (UID {uid}). Nothing that is there changes owner or permissions: "
|
||||
"whatever reads or writes those files today keeps doing so, and the owner of the "
|
||||
"directory also gets access to the files {app} creates.\n\nGrant {app} access to "
|
||||
"this directory?").format(path=mount["source"], app=title, uid=uid), True):
|
||||
mount["grant_access"] = True
|
||||
from .custom_mounts import validate_mount
|
||||
mount["container_path"] = validate_mount(mount, [*mounts, *added])
|
||||
added.append(mount)
|
||||
@@ -485,7 +501,8 @@ def build_deployment(
|
||||
)
|
||||
|
||||
if installer_profile.get("shared_directories"):
|
||||
mounts += ask_shared_directories(ui, template, mounts, volume_storage, advanced)
|
||||
mounts += ask_shared_directories(ui, template, mounts, volume_storage, advanced,
|
||||
unprivileged=unprivileged)
|
||||
|
||||
if advanced:
|
||||
mounts = ask_custom_mounts(ui, mounts, volume_storage)
|
||||
|
||||
@@ -115,7 +115,8 @@ def edit_recreation(record, ui):
|
||||
if template.get('proxmox', {}).get('installer_profile', {}).get('shared_directories'):
|
||||
from .installer import ask_shared_directories
|
||||
deployment['mounts'] += ask_shared_directories(
|
||||
ui, template, deployment['mounts'], deployment['rootfs']['storage'], True, optional=True)
|
||||
ui, template, deployment['mounts'], deployment['rootfs']['storage'], True, optional=True,
|
||||
unprivileged=deployment.get('security', {}).get('unprivileged', True))
|
||||
from .custom_mounts import ask_custom_mounts
|
||||
deployment['mounts'] = ask_custom_mounts(
|
||||
ui, deployment['mounts'], deployment['rootfs']['storage'])
|
||||
|
||||
@@ -2,7 +2,9 @@
|
||||
installation, and its privileged profile is offered by the advanced one only."""
|
||||
|
||||
from pathlib import Path
|
||||
import os
|
||||
import sys
|
||||
import tempfile
|
||||
import unittest
|
||||
from unittest.mock import patch
|
||||
|
||||
@@ -10,6 +12,7 @@ ROOT = Path(__file__).resolve().parents[1]
|
||||
sys.path.insert(0, str(ROOT / "src"))
|
||||
sys.path.insert(0, str(Path(__file__).resolve().parent))
|
||||
|
||||
from proxmenux_oci import host
|
||||
from proxmenux_oci.catalog import Catalog
|
||||
from proxmenux_oci.installer import ADVANCED_MODE, DEFAULT_MODE, InstallError, build_deployment
|
||||
from proxmenux_oci.recreation import edit_recreation
|
||||
@@ -101,6 +104,10 @@ class SharedDirectoriesTests(unittest.TestCase):
|
||||
self.assertFalse(any("ShareCoveX panel administrator" in text for text in ui.asked))
|
||||
self.assertEqual([m["container_path"] for m in plan["mounts"]], ["/config", "/shares/media"])
|
||||
self.assertEqual(plan["mounts"][1]["size_gb"], 32)
|
||||
# The settings stay small: their volume is created at the size the policy states.
|
||||
self.assertEqual(plan["mounts"][0]["size_gb"], 1)
|
||||
other = self.catalog.compose("seerr")["container_contract"]["volumes"][0]["managed_volume"]
|
||||
self.assertGreaterEqual(other["default_size_gb"], 16)
|
||||
|
||||
def test_only_the_advanced_installation_offers_nfsv4_and_it_makes_the_container_privileged(self, *_):
|
||||
ui, _template, plan = self.build({NAME: ["media"]}, ADVANCED_MODE)
|
||||
@@ -125,6 +132,70 @@ class SharedDirectoriesTests(unittest.TestCase):
|
||||
with self.assertRaisesRegex(InstallError, "minimum number of characters is 8"):
|
||||
self.build({NAME: ["media"], "(empty = generate)": ["short"]}, ADVANCED_MODE)
|
||||
|
||||
def test_an_existing_directory_the_application_cannot_write_to_offers_access(self, *_):
|
||||
with tempfile.TemporaryDirectory() as directory:
|
||||
answers = {NAME: ["media"], "Where to store /shares/media": ["host-bind"],
|
||||
"Host path for /shares/media": [directory]}
|
||||
with patch("proxmenux_oci.installer.host.can_write", return_value=False) as check:
|
||||
ui, _template, plan = self.build(answers)
|
||||
question = next(text for text in ui.asked if "Grant ShareCoveX access" in text)
|
||||
# The identity is the one of the volumes, in the range of an unprivileged container.
|
||||
check.assert_called_once_with(directory, 101000, 101000)
|
||||
self.assertIn("UID 101000", question)
|
||||
self.assertIn("changes owner or permissions", question)
|
||||
self.assertIs(plan["mounts"][1]["grant_access"], True)
|
||||
_ui, _template, declined = self.build({**answers, question: [False]})
|
||||
self.assertNotIn("grant_access", declined["mounts"][1])
|
||||
with patch("proxmenux_oci.installer.host.can_write", return_value=True):
|
||||
ui, _template, plan = self.build(answers)
|
||||
self.assertFalse(any("Grant ShareCoveX access" in text for text in ui.asked))
|
||||
self.assertNotIn("grant_access", plan["mounts"][1])
|
||||
# A privileged container writes with the identity as it is.
|
||||
nfsv4 = "NFSv4 needs a privileged container"
|
||||
with patch("proxmenux_oci.installer.host.can_write", return_value=False) as check:
|
||||
ui = ScriptedUI(answers)
|
||||
template = self.catalog.compose("sharecovex")
|
||||
first = build_deployment(template, ui, ADVANCED_MODE)
|
||||
prompt = next(text for text in ui.asked if nfsv4 in text)
|
||||
check.reset_mock()
|
||||
build_deployment(self.catalog.compose("sharecovex"), ScriptedUI({**answers, prompt: [True]}),
|
||||
ADVANCED_MODE)
|
||||
check.assert_called_once_with(directory, 1000, 1000)
|
||||
self.assertIsNotNone(first)
|
||||
|
||||
def test_a_directory_that_does_not_exist_yet_is_created_for_the_application(self, *_):
|
||||
with patch("proxmenux_oci.installer.host.can_write") as check:
|
||||
ui, _template, plan = self.build({NAME: ["media"], "Where to store /shares/media": ["host-bind"],
|
||||
"Host path for /shares/media": ["/nonexistent/proxmenux-test/media"]})
|
||||
check.assert_not_called()
|
||||
self.assertNotIn("grant_access", plan["mounts"][1])
|
||||
self.assertIs(plan["mounts"][1]["create_if_missing"], True)
|
||||
|
||||
def test_write_access_is_read_from_the_mode_bits(self, *_):
|
||||
with tempfile.TemporaryDirectory() as directory:
|
||||
status = os.stat(directory)
|
||||
os.chmod(directory, 0o750)
|
||||
self.assertTrue(host.can_write(directory, status.st_uid, 99999))
|
||||
self.assertFalse(host.can_write(directory, 99998, status.st_gid))
|
||||
self.assertFalse(host.can_write(directory, 99998, 99999))
|
||||
os.chmod(directory, 0o770)
|
||||
self.assertTrue(host.can_write(directory, 99998, status.st_gid))
|
||||
os.chmod(directory, 0o757)
|
||||
self.assertTrue(host.can_write(directory, 99998, 99999))
|
||||
os.chmod(directory, 0o700)
|
||||
self.assertFalse(host.can_write("/nonexistent/proxmenux-test", 0, 0))
|
||||
|
||||
def test_the_installer_script_grants_access_only_when_asked(self, *_):
|
||||
script = (ROOT / "remote/install_oci.sh").read_text()
|
||||
self.assertIn("(.grant_access // false)] | @tsv", script)
|
||||
self.assertIn('if [[ -d $SOURCE && $GRANT_ACCESS == true ]]; then', script)
|
||||
# The owner is never changed, and the rule is not applied twice.
|
||||
grant = script[script.index("grant_shared_access() {"):script.index("MOUNT_ENTRIES=")]
|
||||
self.assertNotIn("chown", grant)
|
||||
self.assertNotIn("chmod", grant)
|
||||
self.assertIn('grep -q "^default:user:${HOST_BIND_UID}:rwx"', grant)
|
||||
self.assertIn('setfacl -R -P -m "u:${HOST_BIND_UID}:rwX,g:${HOST_BIND_GID}:rwX"', grant)
|
||||
|
||||
def test_a_name_that_cannot_identify_a_share_is_refused(self, *_):
|
||||
for name in ("Media", "my files", "9lives", "config", "", "a" * 33):
|
||||
with self.assertRaisesRegex(ValueError, "lowercase"):
|
||||
|
||||
Reference in New Issue
Block a user