Fix and refactor slightly EFI implementation

Allow for system-specific EFI storage
fixes
Vadim vtroshchinskiy 2024-10-27 23:29:56 +01:00
parent 174c108879
commit 46fb6bc93b
1 changed files with 50 additions and 35 deletions

View File

@ -601,7 +601,7 @@ class OpengnsysGitLibrary:
self.logger.debug(f"stdout: {result.stdout}")
self.logger.debug(f"stderr: {result.stderr}")
def _grub_install(self, boot_device, root_directory):
def _grub_install(self, root_directory, boot_device):
"""
Install GRUB bootloader on the specified boot device.
@ -640,39 +640,51 @@ class OpengnsysGitLibrary:
self.logger.debug("UUID is %s", uuid)
return uuid
def _efi_install(self, boot_device, root_directory):
def _efi_install(self, root_directory):
"""
Install EFI data on the specified boot device.
Copies EFI data from a metadata directory within the root directory
to the specified boot device. It logs the process of installing the EFI data.
Boot device is detected automatically
Args:
boot_device (str): The path to the boot device where EFI data will be installed.
root_directory (str): The root directory containing the metadata and EFI data.
Raises:
shutil.Error: If an error occurs during the copying of the EFI data.
"""
self.logger.info(f"Installing EFI files in {boot_device}")
boot_device = self._find_boot_device()
boot_mount = self._find_mountpoint(boot_device)
self.logger.info(f"Installing EFI files in {boot_mount}")
meta_dir = os.path.join(root_directory, ".opengnsys-metadata")
efi_files_dir = os.path.join(meta_dir, "efi_data")
shutil.copytree(efi_files_dir, boot_device)
if os.path.exists(efi_files_dir):
self.logger.debug("Copying EFI files")
shutil.copytree(efi_files_dir, boot_mount, dirs_exist_ok=True)
else:
self.logger.error("No general EFI files found")
uuid = self._get_system_uuid()
self.logger.debug("Checking if we have system-specific EFI data...")
self.logger.debug("Checking if we have system-specific EFI data for system id %s...", uuid)
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)
shutil.copytree(sys_efi_files_dir, boot_mount, dirs_exist_ok=True)
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")
boot_device = self._find_boot_device()
boot_mount = self._find_mountpoint(boot_device)
if not system_specific:
self.logger.debug("Copying default EFI data")
@ -680,8 +692,7 @@ class OpengnsysGitLibrary:
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)
shutil.copytree(boot_mount, efi_files_dir)
else:
uuid = self._get_system_uuid()
self.logger.debug("Copying EFI data for system %s", uuid)
@ -693,8 +704,7 @@ class OpengnsysGitLibrary:
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)
shutil.copytree(boot_mount, efi_files_dir)
@ -727,14 +737,21 @@ class OpengnsysGitLibrary:
line_num = line_num + 1
for disk in disks:
self.logger.debug("Loading partitions for disk {disk}")
disk_json_data = subprocess.run(["/usr/sbin/sfdisk", "-J", disk], check=True, capture_output=True)
disk_data = json.loads(disk_json_data)
self.logger.debug("Loading partitions for disk %s", disk)
#disk_json_data = subprocess.run(["/usr/sbin/sfdisk", "-J", f"/dev/{disk}"], check=False, capture_output=True)
sfdisk_out = subprocess.run(["/usr/sbin/sfdisk", "-J", f"/dev/{disk}"], check=False, capture_output=True)
for part in disk_data["partitiontable"]["partitions"]:
self.logger.debug("Checking partition {part}")
if part["type"] == "C12A7328-F81F-11D2-BA4B-00A0C93EC93B":
return part["node"]
if sfdisk_out.returncode == 0:
disk_json_data = sfdisk_out.stdout
disk_data = json.loads(disk_json_data)
for part in disk_data["partitiontable"]["partitions"]:
self.logger.debug("Checking partition %s", part)
if part["type"] == "C12A7328-F81F-11D2-BA4B-00A0C93EC93B":
self.logger.debug("EFI partition found at %s", part["node"])
return part["node"]
else:
self.logger.debug("sfdisk returned with code %i, error %s", sfdisk_out.returncode, sfdisk_out.stderr)
self.logger.warning("Failed to find EFI partition!")
@ -862,7 +879,7 @@ class OpengnsysGitLibrary:
return results
def _create_metadata(self, path):
def _create_metadata(self, path, initial_creation=False):
"""Calculate metadata for a filesystem
Here we traverse the entire filesystem to:
@ -890,6 +907,7 @@ class OpengnsysGitLibrary:
Args:
path (str): Base path of the filesystem
initial_creation (bool): This is being called from the initial repository creation
"""
self.logger.info(f"Creating metadata for {path}")
@ -916,16 +934,10 @@ class OpengnsysGitLibrary:
metadata["efi_boot"] = self._is_efi()
if self._is_efi():
self._efi_copy(path)
#self.logger.debug("Copying 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)
# If we're doing the initial repository creation, then we're creating the initial,
# non-system-specific EFI data.
self._efi_copy(root_directory=path, system_specific=not initial_creation)
empties_file = open(os.path.join(meta_dir, "empty_directories.jsonl.new"), "w", encoding='utf-8')
specials_file = open(os.path.join(meta_dir, "special_files.jsonl.new"), "w", encoding='utf-8')
@ -1494,7 +1506,7 @@ class OpengnsysGitLibrary:
repo = git.Repo.init(path)
self._configure_repo(repo)
self._write_ignore_list(path)
metadata_ret = self._create_metadata(path)
metadata_ret = self._create_metadata(path, initial_creation=True)
self.logger.debug(f"Building list of files to add from path {path}")
@ -1641,9 +1653,9 @@ class OpengnsysGitLibrary:
repo = git.Repo.clone_from(repo_url, destination_dir, multi_options = [f"--separate-git-dir={real_git_dir}"], progress=OgProgressPrinter(self.logger))
if repo_is_efi:
self._efi_install(boot_device, destination_dir)
self._efi_install(root_directory=destination_dir)
else:
self._grub_install(boot_device, destination_dir)
self._grub_install(root_directory=destination_dir, boot_device=boot_device)
self._mklostandfound(destination_dir)
self._restore_metadata(destination_dir)
@ -1660,7 +1672,7 @@ class OpengnsysGitLibrary:
self.logger.info("Committing changes to repository")
repo = git.Repo(path)
self._create_metadata(path)
self._create_metadata(path, initial_creation=False)
self.logger.info("Adding files")
repo.index.add("*")
@ -1786,10 +1798,11 @@ if __name__ == '__main__':
parser.add_argument("--fetch", type=str, metavar='DEV', help="Fetch changes from ogrepository")
parser.add_argument("--ntfs-type", type=str, metavar="FS", help="Tipo de NTFS, 'kernel' o 'fuse'")
parser.add_argument("--test-metadata", type=str, metavar="DIR", help="Test metadata generation")
parser.add_argument("--test-create-metadata", type=str, metavar="DIR", help="Test metadata generation")
parser.add_argument("--test-restore-metadata", type=str, metavar="DIR", help="Test metadata restoration")
parser.add_argument("--test-restore-metadata-destructive", type=str, metavar="DIR", help="Test metadata restoration, destructive parts only")
parser.add_argument("--test-clone-metadata", type=str, metavar="REPO", help="Test metadata cloning")
parser.add_argument("--test-efi-install", type=str, metavar="DIR", help = "Install EFI")
parser.add_argument("-m", "--message", type=str, metavar="MSG", help="Commit message")
parser.add_argument("--test-set-ntfsid", type=str, metavar="ID", help="Set NTFS ID")
parser.add_argument("--device", type=str, metavar="DEV", help="Device to set the UUID on")
@ -1847,8 +1860,8 @@ if __name__ == '__main__':
elif args.pull:
with OperationTimer(og_git, "git pull"):
og_git.pullRepo(args.pull)
elif args.test_metadata:
og_git._create_metadata(args.test_metadata) # pylint: disable=protected-access
elif args.test_create_metadata:
og_git._create_metadata(args.test_create_metadata, initial_creation=False) # pylint: disable=protected-access
elif args.test_restore_metadata:
og_git._restore_metadata(args.test_restore_metadata) # pylint: disable=protected-access
elif args.test_restore_metadata_destructive:
@ -1858,6 +1871,8 @@ if __name__ == '__main__':
elif args.test_set_ntfsid:
ntfs = NTFSLibrary(ntfs_impl)
ntfs.modify_uuid(args.device, args.test_set_ntfsid)
elif args.test_efi_install:
og_git._efi_install(root_directory=args.test_efi_install) # pylint: disable=protected-access
else:
print("Debe especificar una acción")
#