diff --git a/README.md b/README.md index 1b28e72..f9a687b 100644 --- a/README.md +++ b/README.md @@ -24,6 +24,7 @@ paravis/ patch_ventoy_grubcfg.py патч grub.cfg (поиск раздела данных по маркеру) patch_ventoy_hook.py патч initramfs hook для раздела данных не 1 patch_vtoyjump.py обход проверки MBR в vtoyjump32/64 + patch_ventoy_paravis_return.py пункт «Возврат в главное меню Paravis Flash» patch-ventoy-lang.sh язык меню по умолчанию → ru_RU build-theme-main.py сборка темы GRUB из PSD-макета theme/ ресурсы темы GRUB и ventoy.json @@ -50,8 +51,18 @@ python3 paravis/patch_vtoyjump.py <каталог-с-бинарниками-vtoy # 5. язык меню по умолчанию ./paravis/patch-ventoy-lang.sh vtoyefi/grub/grub.cfg + +# 6. пункт «Возврат в главное меню Paravis Flash» (legacy + UEFI) +python3 paravis/patch_ventoy_paravis_return.py vtoyefi/grub/grub.cfg ``` +`patch_ventoy_paravis_return.py` добавляет в `grub.cfg` функцию +`paravis_return` и пункт меню, который возвращает в главное меню Paravis: +в UEFI — через `grubx64.efi`, в BIOS — через MBR диска +(`chainloader (${vtoydev})+1`). Результат копируется в `grbp.cfg` — его +загружает UEFI-сборка `grubx64_parv.efi`, которую запускает меню Paravis; +legacy `core.img` загружает обычный `grub.cfg`. + `patch_vtoyjump.py` патчит скомпилированные бинарники; его можно запускать повторно — уже пропатченные файлы пропускаются. diff --git a/paravis/patch_ventoy_paravis_return.py b/paravis/patch_ventoy_paravis_return.py new file mode 100644 index 0000000..22dc25f --- /dev/null +++ b/paravis/patch_ventoy_paravis_return.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python3 +"""Add the "return to Paravis main menu" item to Ventoy's grub.cfg. + +The extra menu entry chainloads the Paravis boot menu: + + * UEFI -> /efi/Paravis/Boot/grub2/grubx64.efi + * BIOS -> MBR of the Ventoy disk: chainloader (${vtoydev})+1 + +Usage: + python3 patch_ventoy_paravis_return.py + +The patched file is written back to grub.cfg and copied to grbp.cfg in the +same directory. grbp.cfg is loaded by the UEFI build (grubx64_parv.efi) that +the Paravis menu chainloads; the legacy core.img loads grub.cfg. +""" + +import io +import os +import sys + +FUNC = '''function paravis_return { + if [ "$grub_platform" = "efi" ]; then + search --no-floppy --file --set=root /efi/Paravis/Boot/grub2/grub.cfg + if [ "$grub_cpu" = "x86_64" ]; then + chainloader /efi/Paravis/Boot/grub2/grubx64.efi + else + chainloader /EFI/Boot/bootia32.efi + fi + else + chainloader (${vtoydev})+1 + fi + boot +} +''' + +MENU = '''menuentry "Возврат в главное меню Paravis Flash" --id="paravis_return" --class="vtoyret" { + paravis_return +} + +set default="paravis_return" +''' + + +def main(): + if len(sys.argv) != 2: + print(__doc__) + return 1 + + path = sys.argv[1] + text = io.open(path, encoding='utf-8', newline='').read() + + if 'function paravis_return' in text: + print('already patched: ' + path) + else: + anchor = 'function ventoy_ext_menu {' + if text.count(anchor) != 1: + print('anchor not found or not unique: ' + anchor) + return 1 + text = text.replace(anchor, FUNC + '\n' + anchor, 1) + + anchor = '#special VTOY_DEFAULT_IMAGE process' + if text.count(anchor) != 1: + print('anchor not found or not unique: ' + anchor) + return 1 + text = text.replace(anchor, MENU + '\n' + anchor, 1) + + io.open(path, 'w', encoding='utf-8', newline='').write(text) + print('patched: ' + path) + + grbp = os.path.join(os.path.dirname(path), 'grbp.cfg') + io.open(grbp, 'w', encoding='utf-8', newline='').write(text) + print('written: ' + grbp) + return 0 + + +if __name__ == '__main__': + sys.exit(main())