summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorAlejandro Sirgo Rica <asirgo@soleta.eu>2024-03-07 10:25:55 +0100
committerlupoDharkael <izhe@hotmail.es>2024-03-08 13:03:33 +0100
commitf5501aac91704da4e9b6d7a67633b9e52b48bef7 (patch)
tree37971800428cdb4360fca06e12dd9c89dd5798cc /src
parent4d4171e45958a50f4317a5add8fdba297e0f3a83 (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.
Diffstat (limited to 'src')
-rw-r--r--src/utils/boot.py6
-rw-r--r--src/utils/probe.py22
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():
"""