Commit graph

107 commits

Author SHA1 Message Date
550b2ff3a7 refactor: remove disk shrink from frontend — user handles resizing manually if needed 2026-07-27 14:04:34 +00:00
446f3ec979 feat: skip qemu-img convert — import VMDK directly via qm importdisk, only convert if per-disk shrink requested 2026-07-27 14:02:46 +00:00
7aaa0d1553 fix: resilient file lookup — walk directory if exact path not found; use resume_file for sessions 2026-07-27 12:37:38 +00:00
b257ada9a8 fix: remove pvesm config content check — show all compatible pools, user can pick 2026-07-27 12:35:16 +00:00
f5755827d5 fix: add PYTHONDONTWRITEBYTECODE=1 and -B flag to prevent stale bytecode 2026-07-27 12:30:22 +00:00
6fce3e0c97 fix: rename job status page to /session/job/{id} to avoid collision with JSON polling endpoint /session/status/{id} 2026-07-27 11:56:11 +00:00
0f60e22612 fix: pass vmid=0 to analyze — vmid removed from session_analyze params but still needed by backend 2026-07-27 11:29:29 +00:00
cc3130a1d1 fix: remove VMID validation from /session/analyze and /session/upload — ID now set on configure page 2026-07-27 11:12:49 +00:00
13dc96375d refactor: remove VM Name/ID from download and SCP forms — moved to configure page 2026-07-27 10:48:59 +00:00
41059b128d fix: add Clear button to all session entries — resumable ones get Resume + Clear, stale get Clear only 2026-07-27 10:44:04 +00:00
6445d8894a fix: add debug logging for pvesm config per-pool to trace why images filter excludes pools 2026-07-27 10:43:10 +00:00
4082250740 feat: VMware VMX config detection — parse .vmx files for CPU, RAM, firmware, OS type
- _parse_vmx_config reads numvcpus, memSize, firmware, guestOS from .vmx
- Configure page pre-fills CPU cores, RAM, boot type, VM name from VMX
- Banner shows detected config: 'VMware VMX config detected. Settings pre-filled'
- Works alongside OVF detection — OVF takes priority if both present
2026-07-27 10:29:38 +00:00
5c8d5ea4b4 feat: OVA/OVF import via qm importovf — reads VM config from appliance descriptor
- Analysis detects .ovf file in extracted directory, stores ovf_path
- _import_ovf uses qm importovf + --format qcow2 (replaces manual disk-by-disk)
- Applies user overrides: cores, memory, name, bios, network via qm set
- Configure page shows OVF note, disables per-disk shrink for OVF
- ovf_path flows through analysis → configure → job submission
2026-07-27 10:27:32 +00:00
8ee3c78449 feat: add .vdi (VirtualBox) disk format support 2026-07-27 10:24:17 +00:00
b000641827 feat: unified configure page — VM settings + multi-disk selection with per-disk shrink
- New /session/configure/{analysis_id} page with VM config + disk table
- Each disk has radio (boot selection) + shrink checkbox + size input
- Per-disk shrink control — check to enable, set custom size
- Disks sorted smallest first, boot disk pre-selected as largest
- Submit via /session/configure/submit, then /session/status/{job_id} polling
- Landpage download/SCP flow redirects to configure after analysis completes
2026-07-27 10:22:39 +00:00
d4726acd65 fix: use full path /usr/sbin/pvesm, add debug logging, remove local-lvm fallback 2026-07-27 09:18:08 +00:00
ae53d2fbd8 fix: disk resize now opt-in — pre-filled with current size, disabled by default, checkbox to enable
- Backend: None = keep current size (no auto-shrink); only resize when value explicitly provided
- Frontend: Target Disk Size field shows detected size, disabled (not submitted)
- Checkbox 'Enable disk resize' unlocks the field for editing
2026-07-27 08:57:58 +00:00
75f90f16bb feat: multi-disk support — discover all disks in archive, select boot disk, additional disks included in job
- Storage pool discovery now uses pvesm status (reliable) with Custom... option
- discover_all_disks returns all found disk images sorted by size
- Analysis shows all disks with radio button for boot disk selection
- Confirm form passes boot disk + additional disks to job payload
2026-07-27 08:53:53 +00:00
2e0c6cdba7 fix: replace storage.cfg parser with pvesm status for reliable pool discovery; add Custom... dropdown option 2026-07-27 08:52:34 +00:00
e53fcacaa6 fix: show all leftover sessions — resumable ones get Resume, stale ones get Clean Up 2026-07-27 07:52:48 +00:00
df6b8085ca feat: landing page with Download, SCP Pull, and Resume cards
- Hero header at top describing the app
- Two side-by-side cards: Download (URL) and SCP Pull
- Resume sessions section appears above cards when sessions exist
- Download card expands to inline form
- Resume asks for VM Name/ID only, skips URL field
- Clean separation of entry points
2026-07-27 07:48:14 +00:00
162110b4b1 fix: only show resumable sessions with archives or disk images; pass single first file name not joined list 2026-07-27 07:46:02 +00:00
a030a83207 fix: session scanner now walks in/ recursively — finds files inside extracted subdirectories 2026-07-27 07:41:10 +00:00
8eb1def62b feat: session resume — detect leftover staging dirs and offer to resume analysis
- GET /api/v1/sessions scans tmp/ for session dirs with staged files
- Index page shows resumable sessions with filenames and sizes
- Resume button skips download and starts analysis with stored session_id
- session_id carried through analysis → confirm → job for correct file paths
2026-07-27 07:38:00 +00:00
631f08fc31 fix: SCP polling page now shows reuse section + clone/copy/cleanup buttons work 2026-07-27 07:33:05 +00:00
9bab8e95a1 fix: storage.cfg parser was stripping indentation before checking line.startswith(' ') — property lines never parsed 2026-07-27 07:26:32 +00:00
dc023c8572 fix: show storage dropdown even when only one pool available 2026-07-27 07:24:56 +00:00
e3bc7929c6 fix: storage pool list now filters by content type — only pools with 'images' support are shown 2026-07-27 07:08:02 +00:00
7eb2d6bb45 feat: storage pool dropdown populated from /etc/pve/storage.cfg
- New GET /api/v1/storage/pools returns available lvmthin/zfspool/rbd/dir pools
- Analysis result template now shows dropdown when >1 pool available
- Falls back to text input with single pool or on discovery failure
2026-07-27 06:55:10 +00:00
878bc66da8 feat: add .ova support — OVA files are tar archives containing .vmdk disks 2026-07-26 07:42:06 +00:00
0c2b11f2d2 fix: guard against missing analysis_id and limit poll error retries 2026-07-26 07:03:41 +00:00
1ecaefe1d8 feat: async analysis with polling + nested archive extraction
- Backend /api/v1/analyze now returns 202 with analysis_id immediately
- New GET /api/v1/analyze/{id} for polling analysis status
- Background thread handles extraction, disk discovery, OS/EFI detection
- Nested archive extraction: handles chained zips and split zips (.z01-.zNN)
- Frontend polls /session/analyze/status/{id} every 2s until complete
- SCP page now has complete confirm form flow with job polling
2026-07-26 00:13:14 +00:00
1e14d96052 docs: update README with current directory layout, install script download link, SCP/clone features, and session isolation 2026-07-25 18:17:09 +00:00
f1978008bd fix: use relative paths for STAGING_ROOT and LOG_DIR so backend works on host regardless of install location 2026-07-25 17:50:13 +00:00
f7c6527d3d chore: add AGENTS.md, move install.sh to root, rename frontend install.sh → setup.sh 2026-07-25 17:40:59 +00:00
root
ef2d74a62b fix: remove qemu-utils from installer + configurable storage path
1. Removed qemu-utils from required packages — Proxmox ships its own
   qemu-img and installing Debian's version breaks VMs. Added preflight
   check: if qemu-img missing, exits with clear error message.

2. Installer now prompts for host storage path (default:
   /mnt/pve/hosted-thin). Uses it for the LXC bind mount mp0.
   The LXC always sees /mnt/converter internally — no symlinks needed.
2026-07-25 11:23:26 +00:00
b33ab1605e fix: auto-cleanup staging files to minimize disk usage
Deletes intermediate files as conversion progresses:
- Archive (.7z/.zip) after extraction
- Source VMDK after qemu-img convert
- Local QCOW2 after qm disk import

Reduces peak storage from zip+VMDK+QCOW2 to just the largest
single file — critical for the 94 GB rootfs with 87 GB images.
2026-07-24 10:06:12 +00:00
a7ab9243c0 feat: SCP probes remote file size via SSH before pull
Runs 'ssh stat -c%s' or 'ls -l' to get total bytes before starting
SCP transfer. Progress bar now shows real percentage and ETA
instead of indeterminate spinner.
2026-07-24 09:48:43 +00:00
cd5f31505a fix: capture SCP stderr for better error messages 2026-07-24 09:43:19 +00:00
6e161a6105 fix: STAGING → _staging() in SCP disk check 2026-07-24 09:17:54 +00:00
6d4066784d ux: show exact auto-shrink target + warning about complex layouts 2026-07-23 13:04:00 +00:00
cd8d86a98c fix: auto-shrink to 10% of virtual size, min 20 GB
Replaces flat 30 GB default with proportional sizing:
- 500 GB → 50 GB, 200 GB → 20 GB, 80 GB → 20 GB
- Less aggressive for large disks, safer for GRUB boot
- Update UI hint and README to reflect new rule
2026-07-23 12:45:32 +00:00
778e929985 refactor: remove browser file upload — download + SCP only
- Removed UploadFile handling, upload-raw endpoint, source type selector
- index.html: single URL input, 'Download & Analyse' button
- session_upload simplified to download-only (aria2c)
- Removed dead code: _check_disk_space, UPLOAD_PROGRESS_INTERVAL,
  MIN_FREE_DISK_GB, UploadFile/File imports
- SCP Pull remains as separate /scp page
2026-07-23 12:33:23 +00:00
2d347692db fix: indentation error from aria2c edit 2026-07-23 11:21:07 +00:00
9110eb41bd feat: use aria2c for parallel downloads (8 connections, resumable)
Replaces wget with aria2c -x8 -s8 for significantly faster
downloads, especially on high-latency connections. Falls back to
single-connection if the server doesn't support range requests.
2026-07-23 11:19:13 +00:00
d050b8e6ed fix: progress bar min 1% + spinner for first 5% 2026-07-23 11:11:47 +00:00
344b3b189f debug: console.log upload progress events 2026-07-23 11:01:49 +00:00
5f2cb3dc64 fix: show MB during upload for values <100MB, GiB after
0.00008 GiB rounded to 0.0 — looked like no progress. Now shows
'16 MB' → '128 MB' → '0.5 GiB' → '1.9 GiB' as upload progresses.
2026-07-23 10:59:24 +00:00
39cf91cbc4 fix: corrupted event listeners and undefined sessionId from overzealous string replace
The Python replacement script changed ALL 'error' strings to
'pve-alert pve-alert-error', including:
- addEventListener('error', ...) → broken event listener
- data.phase === 'error' → never matched
- sessionId variable definition was lost/doubled

Restored proper event names and phase comparisons.
2026-07-23 10:56:50 +00:00
6db69f434c fix: Clean Up now deletes entire session directory tmp/{guid}/
- Backend cleanup_staging accepts session_id, deletes whole
  STAGING_ROOT/{guid}/ dir when provided
- CleanupRequest model gets session_id field
- Frontend cleanup proxy passes session_id from body
- api_client passes session_id to backend
- reuseImage JS includes session_id in cleanup payload
2026-07-23 10:54:42 +00:00