2021-04-06 00:12:02 +01:00
|
|
|
#!/usr/bin/env python3
|
|
|
|
"""System A"""
|
|
|
|
# SPDX-License-Identifier: GPL-3.0-or-later
|
2023-01-13 13:55:39 +00:00
|
|
|
# SPDX-FileCopyrightText: 2022-2023 Dor Askayo <dor.askayo@gmail.com>
|
2021-04-06 00:12:02 +01:00
|
|
|
# SPDX-FileCopyrightText: 2021 Andrius Štikonas <andrius@stikonas.eu>
|
2021-05-18 12:37:21 +01:00
|
|
|
# SPDX-FileCopyrightText: 2021 Melg Eight <public.melg8@gmail.com>
|
2023-01-28 00:11:32 +00:00
|
|
|
# SPDX-FileCopyrightText: 2021-23 fosslinux <fosslinux@aussies.space>
|
2021-04-06 00:12:02 +01:00
|
|
|
|
|
|
|
import os
|
2023-03-15 06:20:49 +00:00
|
|
|
# pylint: disable=deprecated-module
|
2021-04-06 00:12:02 +01:00
|
|
|
from distutils.dir_util import copy_tree
|
|
|
|
import shutil
|
2022-12-21 03:17:37 +00:00
|
|
|
import tarfile
|
2021-04-06 00:12:02 +01:00
|
|
|
|
2021-10-20 21:11:48 +01:00
|
|
|
from lib.sysgeneral import SysGeneral, stage0_arch_map
|
2021-04-06 00:12:02 +01:00
|
|
|
|
2021-08-05 13:16:19 +01:00
|
|
|
# pylint: disable=consider-using-with
|
2023-01-13 11:15:27 +00:00
|
|
|
# pylint: disable=too-many-instance-attributes
|
2021-07-06 01:52:10 +01:00
|
|
|
class SysA(SysGeneral):
|
2021-04-06 00:12:02 +01:00
|
|
|
"""
|
|
|
|
Class responsible for preparing sources for System A.
|
|
|
|
"""
|
2023-01-13 11:15:27 +00:00
|
|
|
|
|
|
|
git_dir = os.path.dirname(os.path.join(__file__))
|
|
|
|
sys_dir = os.path.join(git_dir, 'sysa')
|
2023-01-28 00:11:32 +00:00
|
|
|
sysb_dir = os.path.join(git_dir, 'sysb')
|
|
|
|
sysc_dir = os.path.join(git_dir, 'sysc')
|
2023-01-13 11:15:27 +00:00
|
|
|
cache_dir = os.path.join(sys_dir, 'distfiles')
|
|
|
|
|
|
|
|
# pylint: disable=too-many-arguments
|
2023-01-28 00:11:32 +00:00
|
|
|
def __init__(self, tmpdir, arch, external_sources,
|
|
|
|
early_preseed, repo_path):
|
2021-04-06 00:12:02 +01:00
|
|
|
self.arch = arch
|
2022-12-21 03:17:37 +00:00
|
|
|
self.early_preseed = early_preseed
|
2022-05-23 06:56:18 +01:00
|
|
|
self.external_sources = external_sources
|
2023-01-28 00:11:32 +00:00
|
|
|
self.repo_path = repo_path
|
2021-04-06 00:12:02 +01:00
|
|
|
|
2023-01-28 00:11:32 +00:00
|
|
|
self.tmp_dir = tmpdir.add_sys("sysa")
|
|
|
|
|
|
|
|
def prepare(self, create_initramfs):
|
2021-04-06 00:12:02 +01:00
|
|
|
"""
|
2021-05-06 02:14:11 +01:00
|
|
|
Prepare directory structure for System A.
|
2022-05-23 15:02:33 +01:00
|
|
|
We create an empty tmp directory, unpack stage0-posix.
|
2022-04-07 00:09:45 +01:00
|
|
|
Rest of the files are unpacked into more structured directory /sysa
|
2021-04-06 00:12:02 +01:00
|
|
|
"""
|
2022-12-21 03:17:37 +00:00
|
|
|
if self.early_preseed:
|
|
|
|
# Extract tar containing preseed
|
|
|
|
with tarfile.open(self.early_preseed, "r") as seed:
|
|
|
|
seed.extractall(self.tmp_dir)
|
|
|
|
shutil.copy2(os.path.join(self.sys_dir, 'base-preseeded.kaem'),
|
|
|
|
os.path.join(self.tmp_dir, 'kaem.x86'))
|
|
|
|
else:
|
|
|
|
self.stage0_posix()
|
|
|
|
|
2022-04-07 00:09:45 +01:00
|
|
|
self.sysa()
|
2021-04-06 00:12:02 +01:00
|
|
|
|
2021-07-06 01:52:10 +01:00
|
|
|
# sysb must be added to sysa as it is another initramfs stage
|
|
|
|
self.sysb()
|
|
|
|
|
2022-05-23 06:56:18 +01:00
|
|
|
self.sysc(create_initramfs)
|
2022-05-23 14:09:45 +01:00
|
|
|
|
2023-01-28 00:11:32 +00:00
|
|
|
if self.repo_path:
|
2022-05-28 22:59:42 +01:00
|
|
|
repo_dir = os.path.join(self.tmp_dir, 'usr', 'src', 'repo-preseeded')
|
2023-01-28 00:11:32 +00:00
|
|
|
shutil.copytree(self.repo_path, repo_dir)
|
2022-05-28 22:59:42 +01:00
|
|
|
|
2022-05-23 14:09:45 +01:00
|
|
|
if create_initramfs:
|
2022-05-23 14:04:13 +01:00
|
|
|
self.make_initramfs()
|
2021-10-10 16:01:50 +01:00
|
|
|
|
2022-04-13 00:08:29 +01:00
|
|
|
def sysa(self):
|
2022-04-24 04:59:17 +01:00
|
|
|
"""Copy in sysa files for sysa."""
|
2023-01-13 13:55:39 +00:00
|
|
|
source_manifest = self.get_source_manifest()
|
|
|
|
self.get_packages(source_manifest)
|
2022-04-24 04:59:17 +01:00
|
|
|
|
2022-04-13 00:08:29 +01:00
|
|
|
shutil.copytree(self.sys_dir, os.path.join(self.tmp_dir, 'sysa'),
|
2022-05-22 01:03:21 +01:00
|
|
|
ignore=shutil.ignore_patterns('tmp'))
|
2022-04-13 00:08:29 +01:00
|
|
|
|
2021-07-06 01:52:10 +01:00
|
|
|
def sysb(self):
|
|
|
|
"""Copy in sysb files for sysb."""
|
2022-04-24 04:59:17 +01:00
|
|
|
shutil.copytree(self.sysb_dir, os.path.join(self.tmp_dir, 'sysb'),
|
2022-05-22 01:03:21 +01:00
|
|
|
ignore=shutil.ignore_patterns('tmp'))
|
2021-07-06 01:52:10 +01:00
|
|
|
|
2022-05-23 06:56:18 +01:00
|
|
|
def sysc(self, create_initramfs):
|
2021-10-10 16:01:50 +01:00
|
|
|
"""Copy in sysc files for sysc."""
|
2023-03-06 06:30:09 +00:00
|
|
|
if create_initramfs or not self.external_sources:
|
2022-05-23 06:56:18 +01:00
|
|
|
ignore = shutil.ignore_patterns('tmp', 'distfiles')
|
|
|
|
else:
|
|
|
|
ignore = shutil.ignore_patterns('tmp')
|
2022-05-22 01:03:21 +01:00
|
|
|
shutil.copytree(self.sysc_dir, os.path.join(self.tmp_dir, 'sysc'),
|
2022-05-23 06:56:18 +01:00
|
|
|
ignore=ignore)
|
2021-10-10 16:01:50 +01:00
|
|
|
|
2021-04-06 00:12:02 +01:00
|
|
|
def stage0_posix(self):
|
2021-06-10 18:01:47 +01:00
|
|
|
"""Copy in all of the stage0-posix"""
|
2021-07-06 01:52:10 +01:00
|
|
|
stage0_posix_base_dir = os.path.join(self.sys_dir, 'stage0-posix', 'src')
|
2021-10-08 19:29:16 +01:00
|
|
|
copy_tree(stage0_posix_base_dir, self.tmp_dir)
|
|
|
|
|
2021-10-20 21:11:48 +01:00
|
|
|
arch = stage0_arch_map.get(self.arch, self.arch)
|
2021-10-08 19:29:16 +01:00
|
|
|
kaem_optional_seed = os.path.join(self.sys_dir, 'stage0-posix', 'src', 'bootstrap-seeds',
|
2021-10-20 21:11:48 +01:00
|
|
|
'POSIX', arch, 'kaem-optional-seed')
|
2021-04-06 00:12:02 +01:00
|
|
|
shutil.copy2(kaem_optional_seed, os.path.join(self.tmp_dir, 'init'))
|
|
|
|
|
2021-06-10 18:01:47 +01:00
|
|
|
# stage0-posix hook to continue running live-bootstrap
|
2021-12-28 11:51:15 +00:00
|
|
|
shutil.copy2(os.path.join(self.sys_dir, 'after.kaem'),
|
2021-06-10 18:01:47 +01:00
|
|
|
os.path.join(self.tmp_dir, 'after.kaem'))
|