mirror of https://git.48k.eu/ogclient
utils: drop ogCopyEfiBootLoader script
Implement a Python equivalent of ogCopyEfiBootLoader as the function copy_efi_bootloader. This function copies the contents of the folder of the EFI loader in the ESP into a ogBoot folder at the root of the partition target of an image creation. copy_efi_bootloader is a Windows only functionality.master
parent
57787dab54
commit
55fadef718
|
@ -461,7 +461,7 @@ class OgLiveOperations:
|
|||
if os.access(f'{image_path}', os.R_OK) == True:
|
||||
logging.info(f'image file {image_path} already exists, updating.')
|
||||
|
||||
ogCopyEfiBootLoader(disk, partition)
|
||||
copy_windows_efi_bootloader(disk, partition)
|
||||
if ogReduceFs(disk, partition) == -1:
|
||||
raise ValueError(f'Failed to shrink {fstype} filesystem in {padev}')
|
||||
|
||||
|
|
|
@ -243,13 +243,3 @@ def configureOs(disk, partition):
|
|||
raise OSError(f'Error processing configureOsCustom: {e}') from e
|
||||
|
||||
return out
|
||||
|
||||
|
||||
def ogCopyEfiBootLoader(disk, partition):
|
||||
cmd = f'ogCopyEfiBootLoader {disk} {partition}'
|
||||
try:
|
||||
proc = subprocess.run(cmd,
|
||||
shell=True,
|
||||
check=True)
|
||||
except OSError as e:
|
||||
raise OSError(f'Error processing ogCopyEfiBootLoader: {e}') from e
|
||||
|
|
|
@ -11,6 +11,10 @@ import logging
|
|||
import os
|
||||
import shlex
|
||||
import subprocess
|
||||
import shutil
|
||||
from src.utils.disk import *
|
||||
from src.utils.fs import *
|
||||
from src.utils.probe import *
|
||||
|
||||
import fdisk
|
||||
|
||||
|
@ -96,3 +100,51 @@ def efibootmgr_create_bootentry(disk, part, loader, label, add_to_bootorder=True
|
|||
proc = subprocess.run(shlex.split(efibootmgr_cmd), check=True, text=True)
|
||||
except OSError as e:
|
||||
raise OSError(f'Unexpected error adding boot entry to nvram. UEFI firmware might be buggy') from e
|
||||
|
||||
|
||||
def copy_windows_efi_bootloader(disk, partition):
|
||||
device = get_partition_device(disk, partition)
|
||||
mountpoint = device.replace('dev', 'mnt')
|
||||
if not mount_mkdir(device, mountpoint):
|
||||
raise RuntimeError(f'Cannot probe OS family. Unable to mount {device} at {esp_mountpoint}')
|
||||
|
||||
os_family = get_os_family(mountpoint)
|
||||
is_uefi = is_uefi_supported()
|
||||
|
||||
if not is_uefi or os_family != OSFamily.WINDOWS:
|
||||
return
|
||||
|
||||
bootlabel = f'Part-{disk:02d}-{partition:02d}'
|
||||
esp, esp_disk, esp_part_number = get_efi_partition(disk, enforce_gpt=True)
|
||||
esp_mountpoint = esp.replace('dev', 'mnt')
|
||||
if not mount_mkdir(esp, esp_mountpoint):
|
||||
umount(mountpoint)
|
||||
raise RuntimeError(f'Unable to mount detected EFI System Partition at {esp} into {esp_mountpoint}')
|
||||
|
||||
loader_paths = [f'{esp_mountpoint}/EFI/{bootlabel}/Boot/bootmgfw.efi',
|
||||
f'{esp_mountpoint}/EFI/Microsoft/Boot/bootmgfw.efi']
|
||||
try:
|
||||
for efi_app in loader_paths:
|
||||
logging.info(f'Searching for {efi_app}')
|
||||
if os.path.exists(efi_app):
|
||||
loader = efi_app
|
||||
logging.info(f'Found bootloader at ESP partition: {loader}')
|
||||
break
|
||||
else:
|
||||
raise RuntimeError(f'Unable to locate Windows EFI bootloader bootmgfw.efi')
|
||||
|
||||
loader_dir = os.path.dirname(loader)
|
||||
destination_dir = f'{mountpoint}/ogBoot'
|
||||
if os.path.exists(destination_dir):
|
||||
try:
|
||||
shutil.rmtree(destination_dir)
|
||||
except Exception as e:
|
||||
raise OSError(f'Failed to delete {destination_dir}: {e}') from e
|
||||
logging.info(f'Copying {loader_dir} into {destination_dir}')
|
||||
try:
|
||||
shutil.copytree(loader_dir, destination_dir)
|
||||
except Exception as e:
|
||||
raise OSError(f'Failed to copy {loader_dir} into {destination_dir}: {e}') from e
|
||||
finally:
|
||||
umount(mountpoint)
|
||||
umount(esp_mountpoint)
|
||||
|
|
Loading…
Reference in New Issue