Files
euri-mklive/euri_mklive/rootfs.py
T
c-ludenberg 131e84bb3f feat: interactive TUI with rich/questionary, fakeroot mode, failsafes
- Interactive TUI: distro/init/libc/arch/package selection, ISO config
- Root vs fakeroot mode detection with warnings
- Disk space check before build
- Confirmation prompts with build summary
- Fakeroot support via set_mode() in base.py
2026-08-27 20:18:30 +02:00

58 lines
1.8 KiB
Python

"""Rootfs builder — creates the root filesystem."""
from __future__ import annotations
import shutil
import tempfile
from pathlib import Path
from .distros import get as get_distro
from .distros.base import set_mode
def build(config: dict, output: Path) -> Path:
"""Build a rootfs and return its path."""
set_mode(config.get("_mode", "root"))
distro_name = config["distro"]
distro_cls = get_distro(distro_name)
# artix vs arch
if distro_name in ("artix",):
distro = distro_cls(family="artix")
elif distro_name in ("debian", "ubuntu"):
distro = distro_cls(family=distro_name)
elif distro_name in ("fedora", "rocky", "almalinux"):
distro = distro_cls(family=distro_name)
else:
distro = distro_cls()
rootfs = Path(tempfile.mkdtemp(prefix="mklive-"))
print(f"\n\033[1;36m==>\033[0m \033[1mBuilding rootfs in {rootfs}\033[0m")
# 1. bootstrap
print(f"\033[1;36m==>\033[0m \033[1m[1/4] Bootstrapping {distro_name}...\033[0m")
distro.bootstrap(rootfs, config)
# 2. install packages
pkgs = config.get("packages", [])
if pkgs:
print(f"\033[1;36m==>\033[0m \033[1m[2/4] Installing {len(pkgs)} packages...\033[0m")
distro.install_packages(rootfs, pkgs)
else:
print(f"\033[1;36m==>\033[0m \033[1m[2/4] No extra packages to install\033[0m")
# 3. configure
print(f"\033[1;36m==>\033[0m \033[1m[3/4] Configuring base system...\033[0m")
distro.configure_base(rootfs, config)
# 4. bootloader
print(f"\033[1;36m==>\033[0m \033[1m[4/4] Installing bootloader...\033[0m")
distro.install_bootloader(rootfs, config)
return rootfs
def cleanup(rootfs: Path) -> None:
"""Remove the temporary rootfs."""
shutil.rmtree(rootfs, ignore_errors=True)