From 4b72aa6784c0dcfd5d6adc03109ac5b1d4d9c9b6 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=D0=92=D0=B8=D0=BA=D1=82=D0=BE=D1=80?=
<78488229+viktor138irk@users.noreply.github.com>
Date: Thu, 7 May 2026 09:50:02 +0900
Subject: [PATCH] =?UTF-8?q?=D0=9F=D0=B0=D1=82=D1=87=D0=B5=D1=80=20=D0=BF?=
=?UTF-8?q?=D0=BE=D1=80=D1=8F=D0=B4=D0=BA=D0=B0=20=D0=B7=D0=B0=D0=B3=D1=80?=
=?UTF-8?q?=D1=83=D0=B7=D0=BA=D0=B8=20VM=20=D0=B1=D1=8B=D0=BB=20=D0=B7?=
=?UTF-8?q?=D0=B0=D1=89=D0=B8=D1=89=D1=91=D0=BD=20=D0=BE=D1=82=20=D0=BE?=
=?UTF-8?q?=D1=82=D1=81=D1=83=D1=82=D1=81=D1=82=D0=B2=D1=83=D1=8E=D1=89?=
=?UTF-8?q?=D0=B8=D1=85=20=D0=BC=D0=B0=D1=80=D0=BA=D0=B5=D1=80=D0=BE=D0=B2?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
scripts/patch_vm_boot_order.py | 146 ++++++++++++++++++++++++---------
1 file changed, 105 insertions(+), 41 deletions(-)
diff --git a/scripts/patch_vm_boot_order.py b/scripts/patch_vm_boot_order.py
index 9fc88c6..c5a0a8a 100644
--- a/scripts/patch_vm_boot_order.py
+++ b/scripts/patch_vm_boot_order.py
@@ -10,6 +10,7 @@ if not app_path.exists():
app_dir = app_path.resolve().parent
template_path = app_dir / 'templates' / 'vm_create.html'
changed = []
+warnings = []
text = app_path.read_text()
@@ -47,65 +48,115 @@ def virt_boot_arg(boot_order: str, is_arm: bool) -> str:
return value
'''
+def replace_once(source: str, old: str, new: str, label: str) -> str:
+ if old in source:
+ changed.append(label)
+ return source.replace(old, new, 1)
+ warnings.append(f'{label}: marker not found, skipped')
+ return source
+
if 'def vm_boot_order_options()' not in text:
marker = '\n\ndef vm_form_context('
- if marker not in text:
- raise SystemExit('vm_form_context marker not found')
- text = text.replace(marker, helpers + marker, 1)
- changed.append('boot order helpers added')
+ if marker in text:
+ text = text.replace(marker, helpers + marker, 1)
+ changed.append('boot order helpers added')
+ else:
+ warnings.append('vm_form_context marker not found, helpers skipped')
else:
changed.append('boot order helpers already present')
if '"boot_options": vm_boot_order_options()' not in text:
- text = text.replace('"arch_options": vm_arch_options(),', '"arch_options": vm_arch_options(), "boot_options": vm_boot_order_options(),')
- text = text.replace('"guest_arch": "auto", "network_mode"', '"guest_arch": "auto", "boot_order": "auto", "network_mode"')
- changed.append('vm form context gets boot options')
+ if '"arch_options": vm_arch_options(),' in text:
+ text = text.replace('"arch_options": vm_arch_options(),', '"arch_options": vm_arch_options(), "boot_options": vm_boot_order_options(),', 1)
+ changed.append('vm form context gets boot options')
+ else:
+ warnings.append('arch_options marker not found, boot_options skipped')
else:
changed.append('vm form context already has boot options')
+if '"boot_order": "auto"' not in text:
+ if '"guest_arch": "auto", "network_mode"' in text:
+ text = text.replace('"guest_arch": "auto", "network_mode"', '"guest_arch": "auto", "boot_order": "auto", "network_mode"', 1)
+ changed.append('default form boot_order added')
+ elif '"guest_arch": "auto"' in text:
+ text = text.replace('"guest_arch": "auto"', '"guest_arch": "auto", "boot_order": "auto"', 1)
+ changed.append('default form boot_order added near guest_arch')
+ else:
+ warnings.append('default form marker not found, boot_order default skipped')
+else:
+ changed.append('default form boot_order already present')
+
if 'boot_order: str = Form("auto")' not in text:
- text = text.replace('guest_arch: str = Form("auto"), network_mode:', 'guest_arch: str = Form("auto"), boot_order: str = Form("auto"), network_mode:', 1)
- changed.append('vm create signature supports boot order')
+ signature_patterns = [
+ ('guest_arch: str = Form("auto"), network_mode:', 'guest_arch: str = Form("auto"), boot_order: str = Form("auto"), network_mode:'),
+ ('guest_arch: str = Form("auto"),\n network_mode:', 'guest_arch: str = Form("auto"),\n boot_order: str = Form("auto"),\n network_mode:'),
+ ]
+ for old, new in signature_patterns:
+ if old in text:
+ text = text.replace(old, new, 1)
+ changed.append('vm create signature supports boot order')
+ break
+ else:
+ warnings.append('vm create signature marker not found, skipped')
else:
changed.append('vm create signature already supports boot order')
if '"boot_order": boot_order' not in text:
- text = text.replace('"guest_arch": guest_arch, "network_mode"', '"guest_arch": guest_arch, "boot_order": boot_order, "network_mode"', 1)
- changed.append('vm create form state supports boot order')
+ if '"guest_arch": guest_arch, "network_mode"' in text:
+ text = text.replace('"guest_arch": guest_arch, "network_mode"', '"guest_arch": guest_arch, "boot_order": boot_order, "network_mode"', 1)
+ changed.append('vm create form state supports boot order')
+ elif '"guest_arch": guest_arch' in text:
+ text = text.replace('"guest_arch": guest_arch', '"guest_arch": guest_arch, "boot_order": boot_order', 1)
+ changed.append('vm create form state supports boot order near guest_arch')
+ else:
+ warnings.append('vm create form state marker not found, skipped')
else:
changed.append('vm create form state already supports boot order')
if 'boot_order not in ("auto", "disk", "cdrom_disk", "disk_cdrom", "network_disk")' not in text:
- text = text.replace(
- 'elif guest_arch not in ("auto", "x86_64", "aarch64", "generic"):\n error = "Некорректная архитектура VM."',
- 'elif guest_arch not in ("auto", "x86_64", "aarch64", "generic"):\n error = "Некорректная архитектура VM."\n elif boot_order not in ("auto", "disk", "cdrom_disk", "disk_cdrom", "network_disk"):\n error = "Некорректный порядок загрузки VM."',
- 1,
- )
- changed.append('vm create validation supports boot order')
+ validation_old = 'elif guest_arch not in ("auto", "x86_64", "aarch64", "generic"):\n error = "Некорректная архитектура VM."'
+ validation_new = validation_old + '\n elif boot_order not in ("auto", "disk", "cdrom_disk", "disk_cdrom", "network_disk"):\n error = "Некорректный порядок загрузки VM."'
+ if validation_old in text:
+ text = text.replace(validation_old, validation_new, 1)
+ changed.append('vm create validation supports boot order')
+ else:
+ warnings.append('vm create validation marker not found, skipped')
else:
changed.append('vm create validation already supports boot order')
if 'selected_boot_order = normalize_boot_order(boot_order, source_type)' not in text:
- text = text.replace('selected_arch = normalize_guest_arch(guest_arch, profile)\n', 'selected_arch = normalize_guest_arch(guest_arch, profile)\n selected_boot_order = normalize_boot_order(boot_order, source_type)\n', 1)
- changed.append('selected boot order added')
+ if 'selected_arch = normalize_guest_arch(guest_arch, profile)\n' in text:
+ text = text.replace('selected_arch = normalize_guest_arch(guest_arch, profile)\n', 'selected_arch = normalize_guest_arch(guest_arch, profile)\n selected_boot_order = normalize_boot_order(boot_order, source_type)\n', 1)
+ changed.append('selected boot order added')
+ else:
+ warnings.append('selected_arch marker not found, selected boot order skipped')
else:
changed.append('selected boot order already present')
-# Replace ARM-specific --boot uefi in architecture block with a later unified --boot argument.
-text = text.replace(', "--boot", "uefi"]', ']')
+# Replace legacy ARM-specific --boot uefi in architecture block with unified --boot argument if present.
+if ', "--boot", "uefi"]' in text:
+ text = text.replace(', "--boot", "uefi"]', ']')
+ changed.append('legacy ARM --boot uefi removed')
if 'cmd += ["--boot", virt_boot_arg(selected_boot_order, is_arm)]' not in text:
marker = ' if source_type == "disk_image":\n'
- if marker not in text:
- raise SystemExit('source_type command marker not found')
- text = text.replace(marker, ' cmd += ["--boot", virt_boot_arg(selected_boot_order, is_arm)]\n\n' + marker, 1)
- changed.append('virt-install boot argument added')
+ if marker in text:
+ text = text.replace(marker, ' cmd += ["--boot", virt_boot_arg(selected_boot_order, is_arm)]\n\n' + marker, 1)
+ changed.append('virt-install boot argument added')
+ else:
+ warnings.append('source_type command marker not found, boot argument skipped')
else:
changed.append('virt-install boot argument already present')
if '"boot_order": selected_boot_order' not in text:
- text = text.replace('"guest_arch": selected_arch, "host_profile"', '"guest_arch": selected_arch, "boot_order": selected_boot_order, "host_profile"')
- changed.append('operation metadata gets boot order')
+ if '"guest_arch": selected_arch, "host_profile"' in text:
+ text = text.replace('"guest_arch": selected_arch, "host_profile"', '"guest_arch": selected_arch, "boot_order": selected_boot_order, "host_profile"', 1)
+ changed.append('operation metadata gets boot order')
+ elif '"guest_arch": selected_arch' in text:
+ text = text.replace('"guest_arch": selected_arch', '"guest_arch": selected_arch, "boot_order": selected_boot_order', 1)
+ changed.append('operation metadata gets boot order near guest_arch')
+ else:
+ warnings.append('operation metadata marker not found, skipped')
else:
changed.append('operation metadata already has boot order')
@@ -117,21 +168,28 @@ if template_path.exists():
if 'name="boot_order"' not in tpl:
insert = r'''
-
+
'''
- marker = '''