Implement system-specific EFI data support

fixes
Vadim vtroshchinskiy 2024-10-27 11:13:04 +01:00
parent a6242b4b39
commit 2ffdd51110
1 changed files with 52 additions and 9 deletions

View File

@ -633,6 +633,13 @@ class OpengnsysGitLibrary:
else: else:
raise RequirementException("Couldn't find /usr/sbin/grub2-install or /usr/sbin/grub-install") raise RequirementException("Couldn't find /usr/sbin/grub2-install or /usr/sbin/grub-install")
def _get_system_uuid(self):
self.logger.debug("Obtaining system UUID...")
result = subprocess.run(["/usr/sbin/dmidecode", "-s", "system-uuid"], check=True, capture_output=True)
uuid = result.stdout.strip()
self.logger.debug("UUID is %s", uuid)
return uuid
def _efi_install(self, boot_device, root_directory): def _efi_install(self, boot_device, root_directory):
""" """
Install EFI data on the specified boot device. Install EFI data on the specified boot device.
@ -648,12 +655,48 @@ class OpengnsysGitLibrary:
shutil.Error: If an error occurs during the copying of the EFI data. shutil.Error: If an error occurs during the copying of the EFI data.
""" """
self.logger.info(f"Instalando datos EFI en {boot_device}") self.logger.info(f"Installing EFI files in {boot_device}")
meta_dir = os.path.join(root_directory, ".opengnsys-metadata") meta_dir = os.path.join(root_directory, ".opengnsys-metadata")
efi_files_dir = os.path.join(meta_dir, "efi_data") efi_files_dir = os.path.join(meta_dir, "efi_data")
shutil.copytree(efi_files_dir, boot_device) shutil.copytree(efi_files_dir, boot_device)
uuid = self._get_system_uuid()
self.logger.debug("Checking if we have system-specific EFI data...")
sys_efi_files_dir = os.path.join(meta_dir, f"efi_data.{uuid}")
if os.path.exists(sys_efi_files_dir):
self.logger.info("This system has specific EFI data, overriding default...")
shutil.copytree(sys_efi_files_dir, boot_device)
else:
self.logger.debug("No system-specific EFI data.")
def _efi_copy(self, root_directory, system_specific = False):
meta_dir = os.path.join(root_directory, ".opengnsys-metadata")
if not system_specific:
self.logger.debug("Copying default EFI data")
efi_files_dir = os.path.join(meta_dir, "efi_data")
if os.path.exists(efi_files_dir):
shutil.rmtree(efi_files_dir)
boot_device = self._find_boot_device
shutil.copytree(boot_device, efi_files_dir)
else:
uuid = self._get_system_uuid()
self.logger.debug("Copying EFI data for system %s", uuid)
# TODO: On Windows we can probably get away with just copying:
# EFI/Microsoft/Boot/BCD*
efi_files_dir = os.path.join(meta_dir, f"efi_data.{uuid}")
if os.path.exists(efi_files_dir):
shutil.rmtree(efi_files_dir)
boot_device = self._find_boot_device
shutil.copytree(boot_device, efi_files_dir)
def _find_boot_device(self): def _find_boot_device(self):
""" """
@ -873,13 +916,13 @@ class OpengnsysGitLibrary:
metadata["efi_boot"] = self._is_efi() metadata["efi_boot"] = self._is_efi()
if self._is_efi(): if self._is_efi():
self.logger.debug("Copying EFI data") self._efi_copy(path)
efi_files_dir = os.path.join(meta_dir, "efi_data") #self.logger.debug("Copying EFI data")
if os.path.exists(efi_files_dir): #efi_files_dir = os.path.join(meta_dir, "efi_data")
shutil.rmtree(efi_files_dir) #if os.path.exists(efi_files_dir):
# shutil.rmtree(efi_files_dir)
boot_device = self._find_boot_device # boot_device = self._find_boot_device
shutil.copytree(boot_device, efi_files_dir) # shutil.copytree(boot_device, efi_files_dir)