new commit

This commit is contained in:
Manuel 2025-04-27 18:55:44 +00:00
parent 87772236d8
commit 39c0d2093f
2 changed files with 87 additions and 58 deletions

View File

@ -1,38 +1,70 @@
# builder/core/bootstrap.py (Revised) # builder/core/bootstrap.py (Apenas Construção de Argumentos)
import os import os
import logging import logging
import platform import platform
import sys import sys
# shutil não é necessário neste ficheiro com esta estratégia
base_dir = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) # base_dir e sys.path.insert são geralmente feitos no script principal
sys.path.insert(0, base_dir) # from builder.core.bootstrap.paths import paths # Não é necessário importar paths aqui
try: try:
from builder.configs import logger_config from builder.configs import logger_config
from builder.core.command_runner import run_command # from builder.core.command_runner import run_command # Não precisamos de run_command neste ficheiro com esta estratégia
except ImportError as e: except ImportError as e:
logging.error(f"Error importing necessary modules: {e}. Ensure your environment is set up correctly.") # Usar print ou logger básico se logger_config falhar
try:
basic_logger = logging.getLogger(__name__)
logging.basicConfig(level=logging.ERROR) # Configurar um logger básico para erro
basic_logger.error(f"Error importing necessary modules for bootstrap helper: {e}. Ensure your environment is set up correctly.")
except Exception:
print(f"Error importing necessary modules for bootstrap helper: {e}. Ensure your environment is set up correctly.")
sys.exit(1) sys.exit(1)
logger = logger_config.setup_logger('bootstrap')
# Configurar logger para este módulo
try:
logger = logger_config.setup_logger('bootstrap')
except NameError:
# Fallback logger se logger_config não estiver disponível
logging.basicConfig(level=logging.INFO) # Nível INFO por padrão para este helper
logger = logging.getLogger('bootstrap')
def filter_repositories_by_architecture(repositories_data, target_architecture): def filter_repositories_by_architecture(repositories_data, target_architecture):
# ... (Keep this function as is) ... """
Filters the list of repositories to include only those supporting the target architecture.
Args:
repositories_data (list): A list of repository dictionaries,
each potentially having an 'architectures' key.
target_architecture (str): The target architecture (e.g., 'aarch64', 'i686', 'x86_64').
Returns:
list: A list of '-R <uri>' strings for the relevant repositories.
"""
filtered_repo_args = [] filtered_repo_args = []
if not isinstance(repositories_data, list):
logger.error("repositories_data must be a list.")
return []
for repo in repositories_data: for repo in repositories_data:
if not isinstance(repo, dict):
logger.warning(f"Repository entry is not a dictionary: {repo}. Skipping.")
continue
if 'uri' in repo and ('architectures' not in repo or target_architecture in repo['architectures']): if 'uri' in repo and ('architectures' not in repo or target_architecture in repo['architectures']):
filtered_repo_args.extend(["-R", repo['uri']]) filtered_repo_args.extend(["-R", repo['uri']])
logger.debug(f"Including repository {repo['uri']} for architecture {target_architecture}") logger.debug(f"Including repository {repo.get('uri')} for architecture {target_architecture}")
else: else:
if 'uri' not in repo: if 'uri' not in repo:
logger.warning(f"Repository entry missing 'uri' key: {repo}. Skipping.") logger.warning(f"Repository entry missing 'uri' key: {repo}. Skipping.")
else: else:
logger.debug(f"Excluding repository {repo['uri']} for architecture {target_architecture}") logger.debug(f"Excluding repository {repo.get('uri')} for architecture {target_architecture}")
return filtered_repo_args return filtered_repo_args
# MODIFIED: This function now only returns the arguments for xbps-install, does NOT execute
def construct_xbps_install_args(env_name, paths, target_architecture, repositories_data, all_bootstrap_packages): def construct_xbps_install_args(env_name, paths, target_architecture, repositories_data, all_bootstrap_packages):
""" """
Constructs the xbps-install command arguments for a specific environment. Constructs the xbps-install command arguments for a specific environment.
@ -42,8 +74,10 @@ def construct_xbps_install_args(env_name, paths, target_architecture, repositori
paths (dict): Dictionary of build paths. paths (dict): Dictionary of build paths.
target_architecture (str): The target architecture for the bootstrap. target_architecture (str): The target architecture for the bootstrap.
repositories_data (list): List of repository dictionaries from YAML config. repositories_data (list): List of repository dictionaries from YAML config.
Expected structure: [{'name': '...', 'uri': '...', 'architectures': [...]}, ...]
all_bootstrap_packages (dict): Dictionary containing package lists for all_bootstrap_packages (dict): Dictionary containing package lists for
different environments and architectures. different environments and architectures.
Expected structure: {'env_name': {'arch': ['pkg1', ...]}}
Returns: Returns:
list: A list of strings representing the xbps-install command arguments. list: A list of strings representing the xbps-install command arguments.
@ -53,7 +87,7 @@ def construct_xbps_install_args(env_name, paths, target_architecture, repositori
ValueError: If no repositories found for the target architecture. ValueError: If no repositories found for the target architecture.
KeyError: If target directory path is not found in paths. KeyError: If target directory path is not found in paths.
""" """
logger.debug(f"Constructing xbps-install arguments for {env_name.upper()} ({target_architecture})...") logger.info(f"=> Constructing xbps-install arguments for {env_name.upper()} ({target_architecture})...")
target_directory_path = None target_directory_path = None
if env_name == "rootfs": if env_name == "rootfs":
@ -89,6 +123,7 @@ def construct_xbps_install_args(env_name, paths, target_architecture, repositori
logger.debug(f"Using XBPS cache directory (on host): {host_cachedir}") logger.debug(f"Using XBPS cache directory (on host): {host_cachedir}")
# Construct the xbps-install command arguments # Construct the xbps-install command arguments
# This command will be run directly on the host, targeting the specified directory (-r)
xbps_command_args = [ xbps_command_args = [
"-S", "-y", "-S", "-y",
] + filtered_repo_args + [ ] + filtered_repo_args + [
@ -96,31 +131,5 @@ def construct_xbps_install_args(env_name, paths, target_architecture, repositori
"-c", host_cachedir, # XBPS cache directory (path on host) "-c", host_cachedir, # XBPS cache directory (path on host)
] + packages_to_install ] + packages_to_install
logger.debug(f"Constructed arguments for {env_name}: {xbps_command_args}") logger.info(f"Constructed arguments for {env_name}: {xbps_command_args}")
return xbps_command_args return xbps_command_args
# NEW FUNCTION: Helper to run a command inside a chroot
def run_command_in_chroot(chroot_path, command_list):
"""
Executes a command inside a specified chroot environment.
Args:
chroot_path (str): The path on the host to the root of the chroot environment.
command_list (list): The list of strings representing the command and its arguments
*as they would be run directly*, e.g., ['/usr/bin/xbps-install', ...].
The function adds the 'sudo chroot chroot_path' wrapper.
Raises:
subprocess.CalledProcessError: If the command fails inside the chroot.
"""
# Construct the chroot command wrapper
chroot_wrapper = ["sudo", "chroot", chroot_path]
# Combine the wrapper with the command to be run inside the chroot
full_command = chroot_wrapper + command_list
logger.info(f"Executing command in chroot {chroot_path}: {' '.join(full_command)}")
run_command(full_command) # Use the existing run_command helper
# Removed generate_bootstrap_commands and __main__ block

View File

@ -43,7 +43,6 @@ try:
from builder.configs import logger_config from builder.configs import logger_config
from builder.core.customize_system import customize_system from builder.core.customize_system import customize_system
from builder.core.copy_customizations import copy_custom_files from builder.core.copy_customizations import copy_custom_files
from builder.core.bootstrap.cache import get_or_download_package, sync_repositories
from builder.core.final_cleanup import remove_fusato_directory from builder.core.final_cleanup import remove_fusato_directory
from builder.core.move_iso import move_and_cleanup_iso from builder.core.move_iso import move_and_cleanup_iso
from builder.core.bootstrap import bootstrap from builder.core.bootstrap import bootstrap
@ -124,40 +123,61 @@ def iso_builder_main(
all_bootstrap_packages = repo_data.get('bootstrap_packages', {}) all_bootstrap_packages = repo_data.get('bootstrap_packages', {})
if build_rootfs: if build_rootfs:
bootstrap.run_bootstrap_for_environment( logger.info("=> Initiating the Void Linux system bootstrap for ROOTFS (host execution)...")
rootfs_bootstrap_args = bootstrap.construct_xbps_install_args(
"rootfs", "rootfs",
paths, paths,
architecture, architecture,
host_arch,
repositories, repositories,
all_bootstrap_packages all_bootstrap_packages
) )
logger.info("=> Void Linux ROOTFS bootstrap COMPLETE.")
if rootfs_bootstrap_args:
initial_bootstrap_command = ["/usr/bin/xbps-install"] + rootfs_bootstrap_args
logger.info(f"Executing initial ROOTFS bootstrap command (host): {' '.join(initial_bootstrap_command)}")
run_command(initial_bootstrap_command)
logger.info("=> Void Linux ROOTFS initial bootstrap COMPLETE.")
else:
logger.warning("Skipping ROOTFS bootstrap due to no packages defined or error.")
mount_essential_filesystems_in_chroot(paths, logger)
logger.info("=> Essential filesystems mounted in the ROOTFS.")
if build_pephost: if build_pephost:
bootstrap.run_bootstrap_for_environment( logger.info("=> Initiating the Void Linux system bootstrap for PEP-HOST (host execution)...")
"pep-host",
paths, pephost_bootstrap_args = bootstrap.construct_xbps_install_args(
architecture, "pep-host", paths, architecture, repositories, all_bootstrap_packages
host_arch,
repositories,
all_bootstrap_packages
) )
logger.info("=> Void Linux PEP-HOST bootstrap COMPLETE.")
if pephost_bootstrap_args:
pephost_bootstrap_command = ["/usr/bin/xbps-install"] + pephost_bootstrap_args
logger.info(f"Executing PEP-HOST bootstrap command (host): {' '.join(pephost_bootstrap_command)}")
run_command(pephost_bootstrap_command)
logger.info("=> Void Linux PEP-HOST bootstrap COMPLETE.")
else:
logger.warning("Skipping PEP-HOST bootstrap due to no packages defined or error.")
if build_peptarget: if build_peptarget:
bootstrap.run_bootstrap_for_environment( logger.info("=> Initiating the Void Linux system bootstrap for PEP-TARGET (host execution)...")
"pep-target",
paths, peptarget_bootstrap_args = bootstrap.construct_xbps_install_args(
architecture, "pep-target", paths, architecture, repositories, all_bootstrap_packages
host_arch,
repositories,
all_bootstrap_packages
) )
logger.info("=> Void Linux PEP-TARGET bootstrap COMPLETE.")
if peptarget_bootstrap_args:
peptarget_bootstrap_command = ["/usr/bin/xbps-install"] + peptarget_bootstrap_args
logger.info(f"Executing PEP-TARGET bootstrap command (host): {' '.join(peptarget_bootstrap_command)}")
run_command(peptarget_bootstrap_command)
logger.info("=> Void Linux PEP-TARGET bootstrap COMPLETE.")
else:
logger.warning("Skipping PEP-TARGET bootstrap due to no packages defined or error.")
logger.info("=> Void Linux system bootstrap (ROOTFS, PEP-HOST, PEP-TARGET) COMPLETE.") logger.info("=> Void Linux system bootstrap (ROOTFS, PEP-HOST, PEP-TARGET) COMPLETE.")
mount_essential_filesystems_in_chroot(paths, logger) mount_essential_filesystems_in_chroot(paths, logger)
logger.info("=> Essential filesystems mounted in the chroot.") logger.info("=> Essential filesystems mounted in the chroot.")