diff options
author | Alejandro Sirgo Rica <asirgo@soleta.eu> | 2024-03-07 10:25:55 +0100 |
---|---|---|
committer | lupoDharkael <izhe@hotmail.es> | 2024-03-08 13:03:33 +0100 |
commit | f5501aac91704da4e9b6d7a67633b9e52b48bef7 (patch) | |
tree | 37971800428cdb4360fca06e12dd9c89dd5798cc | |
parent | 4d4171e45958a50f4317a5add8fdba297e0f3a83 (diff) |
utils: implement linux distro id detection
The OS probe logic must be able to check a distro programmatically,
add get_linux_distro_id to return an id whitout versioning.
Ensure the availability of 'ubuntu' when we need to ensure certain
features are only used with a supported system.
-rw-r--r-- | src/utils/boot.py | 6 | ||||
-rw-r--r-- | src/utils/probe.py | 22 |
2 files changed, 27 insertions, 1 deletions
diff --git a/src/utils/boot.py b/src/utils/boot.py index 15dac7d..07a29ba 100644 --- a/src/utils/boot.py +++ b/src/utils/boot.py @@ -12,7 +12,7 @@ import os import shlex import subprocess -from src.utils.probe import OSFamily, get_os_family +from src.utils.probe import OSFamily, get_os_family, get_linux_distro_id, os_probe from src.utils.disk import get_partition_device, get_efi_partition from src.utils.uefi import * from src.utils.fs import * @@ -23,6 +23,10 @@ def _boot_bios_legacy(disk, part, mountpoint): def _boot_bios_linux(disk, part, mountpoint): logging.info(f'Booting Linux system') + + if not get_linux_distro_id(mountpoint) == 'ubuntu': + raise NotImplementedError(f'{os_probe(mountpoint)} detected, only Ubuntu is supported for legacy BIOS boot') + _boot_bios_legacy(disk, part, mountpoint) def _boot_bios_windows(disk, part, mountpoint): diff --git a/src/utils/probe.py b/src/utils/probe.py index c6e3680..8c0e39a 100644 --- a/src/utils/probe.py +++ b/src/utils/probe.py @@ -112,6 +112,28 @@ def linux_is64bit(mountpoint): return True if bits == '64bit' else False return os.path.exists(lib64_path) +def get_linux_distro_id(mountpoint): + """ + Parses a os-release file and fetches the 'ID' key. + Check repository documentation at ./ogclient/os-release-ids.txt + for a list of the potential strings it might return. + If file or key are not found, then returns generic 'linux' string. + """ + osrelease = f'{mountpoint}/etc/os-release' + + try: + with open(osrelease, 'r') as f: + for line in f: + if line.find('=') == -1: + continue + key, value = line.split('=') + if key == 'ID': + value = value.replace('\n', '') + value = value.strip('"') + return value + except FileNotFoundError as e: + logging.error(f'os-release file not found at "{osrelease}"') + return 'linux' def cache_probe(): """ |