Update modal lxc

This commit is contained in:
MacRimi
2026-02-02 18:49:18 +01:00
parent f159ee77cd
commit 8d34119e7a
2 changed files with 113 additions and 114 deletions

View File

@@ -1239,14 +1239,15 @@ const handleDownloadLogs = async (vmid: number, vmName: string) => {
<div className="flex-1 overflow-hidden px-6 py-4">
{/* Mobile carousel container */}
<div className="sm:hidden relative overflow-hidden">
<div className="sm:hidden flex flex-col h-full">
<div className="flex-1 relative overflow-hidden">
<div
className="flex transition-transform duration-300 ease-in-out w-[200%]"
style={{ transform: `translateX(-${modalPage * 50}%)` }}
className="flex transition-transform duration-300 ease-in-out h-full"
style={{ transform: `translateX(-${modalPage * 100}%)` }}
>
{/* Page 0: Main content */}
<div className="w-1/2 flex-shrink-0 overflow-y-auto pr-2" style={{ maxHeight: 'calc(100vh - 280px)' }}>
<div className="space-y-6 pr-1">
<div className="w-full flex-shrink-0 overflow-y-auto" style={{ maxHeight: 'calc(100vh - 320px)' }}>
<div className="space-y-6">
{selectedVM && (
<>
<div key={`metrics-mobile-${selectedVM.vmid}`}>
@@ -1369,7 +1370,7 @@ const handleDownloadLogs = async (vmid: number, vmName: string) => {
</div>
{/* Page 1: Backups */}
<div className="w-1/2 flex-shrink-0 overflow-y-auto pl-2" style={{ maxHeight: 'calc(100vh - 280px)' }}>
<div className="w-full flex-shrink-0 overflow-y-auto" style={{ maxHeight: 'calc(100vh - 320px)' }}>
<div className="space-y-4">
<Card className="border border-border bg-card/50">
<CardContent className="p-4">
@@ -1439,6 +1440,7 @@ const handleDownloadLogs = async (vmid: number, vmName: string) => {
</div>
</div>
</div>
</div>
{/* Mobile pagination dots */}
<div className="flex justify-center gap-2 mt-4">

View File

@@ -5666,6 +5666,10 @@ def api_vm_backups(vmid):
try:
backups = []
# Get current node name
node_result = subprocess.run(['hostname'], capture_output=True, text=True, timeout=5)
node = node_result.stdout.strip() if node_result.returncode == 0 else 'localhost'
# Get list of storage locations
result = subprocess.run(['pvesh', 'get', '/storage', '--output-format', 'json'],
capture_output=True, text=True, timeout=10)
@@ -5681,9 +5685,11 @@ def api_vm_backups(vmid):
# Only check storages that can contain backups
if 'backup' in content or storage_type == 'pbs':
try:
# Use --vmid filter to get only backups for this VM
content_result = subprocess.run(
['pvesh', 'get', f'/nodes/$(hostname)/storage/{storage_id}/content', '--output-format', 'json'],
capture_output=True, text=True, timeout=15, shell=True
['pvesh', 'get', f'/nodes/{node}/storage/{storage_id}/content',
'--vmid', str(vmid), '--output-format', 'json'],
capture_output=True, text=True, timeout=30
)
if content_result.returncode == 0:
@@ -5691,39 +5697,30 @@ def api_vm_backups(vmid):
for item in contents:
if item.get('content') == 'backup':
# Get backup type from subtype field (PBS) or parse volid (local)
backup_type = item.get('subtype', '')
if not backup_type:
volid = item.get('volid', '')
# Check if this backup belongs to the requested vmid
backup_vmid = None
backup_type = None
if 'vzdump-qemu-' in volid:
backup_type = 'qemu'
try:
backup_vmid = int(volid.split('vzdump-qemu-')[1].split('-')[0])
except:
pass
elif 'vzdump-lxc-' in volid:
backup_type = 'lxc'
try:
backup_vmid = int(volid.split('vzdump-lxc-')[1].split('-')[0])
except:
pass
if backup_vmid == vmid:
size = item.get('size', 0)
ctime = item.get('ctime', 0)
notes = item.get('notes', '')
backups.append({
'volid': volid,
'volid': item.get('volid', ''),
'storage': storage_id,
'type': backup_type,
'size': size,
'size_human': format_bytes(size),
'timestamp': ctime,
'date': datetime.fromtimestamp(ctime).strftime('%Y-%m-%d %H:%M') if ctime else ''
'date': datetime.fromtimestamp(ctime).strftime('%Y-%m-%d %H:%M') if ctime else '',
'notes': notes
})
except:
except Exception as e:
continue
# Sort by timestamp (newest first)