Установщик Windows узнаётся по метке ISO и имени файла: форма создания машины сама выбирает тип Windows, иначе диск был virtio и установщик его не видел
Этот коммит содержится в:
+15
-1
@@ -553,6 +553,19 @@ def parse_pool_list() -> list[dict[str, str]]:
|
||||
return rows
|
||||
|
||||
|
||||
def iso_volume_label(path: Path) -> str:
|
||||
"""Метка тома ISO 9660: 32 байта в первичном дескрипторе по смещению 0x8028."""
|
||||
try:
|
||||
with path.open("rb") as handle:
|
||||
handle.seek(0x8000)
|
||||
descriptor = handle.read(0x48)
|
||||
except OSError:
|
||||
return ""
|
||||
if descriptor[1:6] != b"CD001":
|
||||
return ""
|
||||
return descriptor[0x28:0x48].decode("ascii", "replace").strip()
|
||||
|
||||
|
||||
def list_iso_files() -> list[dict[str, str]]:
|
||||
ISO_DIR.mkdir(parents=True, exist_ok=True)
|
||||
files = []
|
||||
@@ -564,7 +577,7 @@ def list_iso_files() -> list[dict[str, str]]:
|
||||
except OSError:
|
||||
size_mb = 0
|
||||
updated = "unknown"
|
||||
files.append({"name": item.name, "path": str(item), "size": f"{size_mb:.1f} MB", "updated": updated})
|
||||
files.append({"name": item.name, "path": str(item), "size": f"{size_mb:.1f} MB", "updated": updated, "os_type": catalog.guess_os_type(iso_volume_label(item), item.name)})
|
||||
return files
|
||||
|
||||
|
||||
@@ -1819,6 +1832,7 @@ def vm_create_page(request: Request, iso: str = "", image: str = ""):
|
||||
form = {"memory": 4096, "vcpus": 2, "disk_size": 40, "source_type": "disk_image" if image else "iso", "boot_order": "auto", "network_mode": profile.get("recommended_network", "nat"), "bridge": DEFAULT_BRIDGE}
|
||||
if iso:
|
||||
form["iso_path"] = str(ISO_DIR / Path(iso).name)
|
||||
form["os_type"] = catalog.guess_os_type(iso_volume_label(ISO_DIR / Path(iso).name), Path(iso).name) or "linux"
|
||||
if image:
|
||||
form["disk_image_path"] = str(DISK_IMAGES_DIR / Path(image).name)
|
||||
return vm_form_context(request, form=form)
|
||||
|
||||
Ссылка в новой задаче
Block a user