Compare commits
3 commits
dev
...
kupfer-con
Author | SHA1 | Date | |
---|---|---|---|
|
15049285e3 | ||
|
d277d926fd | ||
|
064f265247 |
2 changed files with 19 additions and 11 deletions
|
@ -214,6 +214,7 @@ class Chroot(AbstractChroot):
|
||||||
def run_cmd(
|
def run_cmd(
|
||||||
self,
|
self,
|
||||||
script: Union[str, list[str]],
|
script: Union[str, list[str]],
|
||||||
|
user: str = 'root',
|
||||||
inner_env: dict[str, str] = {},
|
inner_env: dict[str, str] = {},
|
||||||
outer_env: dict[str, str] = os.environ.copy() | {'QEMU_LD_PREFIX': '/usr/aarch64-linux-gnu'},
|
outer_env: dict[str, str] = os.environ.copy() | {'QEMU_LD_PREFIX': '/usr/aarch64-linux-gnu'},
|
||||||
attach_tty: bool = False,
|
attach_tty: bool = False,
|
||||||
|
@ -227,6 +228,7 @@ class Chroot(AbstractChroot):
|
||||||
if outer_env is None:
|
if outer_env is None:
|
||||||
outer_env = os.environ.copy()
|
outer_env = os.environ.copy()
|
||||||
env_cmd = ['/usr/bin/env'] + [f'{shell_quote(key)}={shell_quote(value)}' for key, value in inner_env.items()]
|
env_cmd = ['/usr/bin/env'] + [f'{shell_quote(key)}={shell_quote(value)}' for key, value in inner_env.items()]
|
||||||
|
su_cmd = []
|
||||||
kwargs: dict = {
|
kwargs: dict = {
|
||||||
'env': outer_env,
|
'env': outer_env,
|
||||||
}
|
}
|
||||||
|
@ -237,7 +239,9 @@ class Chroot(AbstractChroot):
|
||||||
script = ' '.join(script)
|
script = ' '.join(script)
|
||||||
if cwd:
|
if cwd:
|
||||||
script = f"cd {shell_quote(cwd)} && ( {script} )"
|
script = f"cd {shell_quote(cwd)} && ( {script} )"
|
||||||
cmd = ['chroot', self.path] + env_cmd + [
|
if user != 'root':
|
||||||
|
su_cmd = ['su', user, '--']
|
||||||
|
cmd = ['chroot', self.path] + su_cmd + env_cmd + [
|
||||||
'/bin/bash',
|
'/bin/bash',
|
||||||
'-c',
|
'-c',
|
||||||
script,
|
script,
|
||||||
|
|
24
image.py
24
image.py
|
@ -11,7 +11,7 @@ from typing import Optional
|
||||||
|
|
||||||
from chroot.device import DeviceChroot, get_device_chroot
|
from chroot.device import DeviceChroot, get_device_chroot
|
||||||
from constants import Arch, BASE_PACKAGES, DEVICES, FLAVOURS
|
from constants import Arch, BASE_PACKAGES, DEVICES, FLAVOURS
|
||||||
from config import config, Profile
|
from config import config, Profile, PROFILE_DEFAULTS
|
||||||
from distro.distro import get_base_distro, get_kupfer_https
|
from distro.distro import get_base_distro, get_kupfer_https
|
||||||
from packages import build_enable_qemu_binfmt, discover_packages, build_packages
|
from packages import build_enable_qemu_binfmt, discover_packages, build_packages
|
||||||
from ssh import copy_ssh_keys
|
from ssh import copy_ssh_keys
|
||||||
|
@ -307,9 +307,11 @@ def install_rootfs(
|
||||||
packages: list[str],
|
packages: list[str],
|
||||||
use_local_repos: bool,
|
use_local_repos: bool,
|
||||||
profile: Profile,
|
profile: Profile,
|
||||||
|
kupfer_config_apply: bool = True,
|
||||||
):
|
):
|
||||||
user = profile['username'] or 'kupfer'
|
packages += ['kupfer-config'] if kupfer_config_apply else []
|
||||||
post_cmds = FLAVOURS[flavour].get('post_cmds', [])
|
profile = PROFILE_DEFAULTS | profile
|
||||||
|
user = profile['username']
|
||||||
chroot = get_device_chroot(device=device, flavour=flavour, arch=arch, packages=packages, use_local_repos=use_local_repos)
|
chroot = get_device_chroot(device=device, flavour=flavour, arch=arch, packages=packages, use_local_repos=use_local_repos)
|
||||||
|
|
||||||
mount_chroot(rootfs_device, bootfs_device, chroot)
|
mount_chroot(rootfs_device, bootfs_device, chroot)
|
||||||
|
@ -332,11 +334,12 @@ def install_rootfs(
|
||||||
for target, content in files.items():
|
for target, content in files.items():
|
||||||
with open(os.path.join(chroot.path, target.lstrip('/')), 'w') as file:
|
with open(os.path.join(chroot.path, target.lstrip('/')), 'w') as file:
|
||||||
file.write(content)
|
file.write(content)
|
||||||
if post_cmds:
|
|
||||||
result = chroot.run_cmd(' && '.join(post_cmds))
|
if kupfer_config_apply:
|
||||||
|
result = chroot.run_cmd(['kupfer-config', 'apply'])
|
||||||
assert isinstance(result, subprocess.CompletedProcess)
|
assert isinstance(result, subprocess.CompletedProcess)
|
||||||
if result.returncode != 0:
|
if result.returncode != 0:
|
||||||
raise Exception('Error running post_cmds')
|
raise Exception('Error running kupfer-config apply')
|
||||||
|
|
||||||
logging.info('Preparing to unmount chroot')
|
logging.info('Preparing to unmount chroot')
|
||||||
res = chroot.run_cmd('sync && umount /boot', attach_tty=True)
|
res = chroot.run_cmd('sync && umount /boot', attach_tty=True)
|
||||||
|
@ -355,11 +358,12 @@ def cmd_image():
|
||||||
|
|
||||||
@cmd_image.command(name='build')
|
@cmd_image.command(name='build')
|
||||||
@click.argument('profile_name', required=False)
|
@click.argument('profile_name', required=False)
|
||||||
@click.option('--local-repos/--no-local-repos', '-l/-L', default=True, help='Whether to use local packages. Defaults to true.')
|
@click.option('--local-repos/--no-local-repos', '-l/-L', is_flag=True, default=True, help='Whether to use local packages. Defaults to true.')
|
||||||
@click.option('--build-pkgs/--no-build-pkgs', '-p/-P', default=True, help='Whether to build missing/outdated local packages. Defaults to true.')
|
@click.option('--build-pkgs/--no-build-pkgs', '-p/-P', is_flag=True, default=True, help='Whether to build missing/outdated local packages. Defaults to true.')
|
||||||
@click.option('--block-target', default=None, help='Override the block device file to target')
|
@click.option('--block-target', default=None, help='Override the block device file to target')
|
||||||
@click.option('--skip-part-images', default=False, help='Skip creating image files for the partitions and directly work on the target block device.')
|
@click.option('--skip-part-images', default=False, help='Skip creating image files for the partitions and directly work on the target block device.')
|
||||||
def cmd_build(profile_name: str = None, local_repos: bool = True, build_pkgs: bool = True, block_target: str = None, skip_part_images: bool = False):
|
@click.option('--no-kupfer-config-apply', is_flag=True, help='skip applying kupfer-config, which mainly enables services according to the image flavor')
|
||||||
|
def cmd_build(profile_name: str = None, local_repos: bool = True, build_pkgs: bool = True, block_target: str = None, skip_part_images: bool = False, no_kupfer_config_apply: bool = False):
|
||||||
"""Build a device image"""
|
"""Build a device image"""
|
||||||
enforce_wrap()
|
enforce_wrap()
|
||||||
profile: Profile = config.get_profile(profile_name)
|
profile: Profile = config.get_profile(profile_name)
|
||||||
|
@ -371,7 +375,7 @@ def cmd_build(profile_name: str = None, local_repos: bool = True, build_pkgs: bo
|
||||||
sector_size = 4096
|
sector_size = 4096
|
||||||
rootfs_size_mb = FLAVOURS[flavour].get('size', 2) * 1000
|
rootfs_size_mb = FLAVOURS[flavour].get('size', 2) * 1000
|
||||||
|
|
||||||
packages = BASE_PACKAGES + DEVICES[device] + FLAVOURS[flavour]['packages'] + profile['pkgs_include']
|
packages = BASE_PACKAGES + DEVICES[device] + FLAVOURS[flavour]['packages'] + profile['pkgs_include'] + ([] if no_kupfer_config_apply else ['kupfer-config'])
|
||||||
|
|
||||||
if arch != config.runtime['arch']:
|
if arch != config.runtime['arch']:
|
||||||
build_enable_qemu_binfmt(arch)
|
build_enable_qemu_binfmt(arch)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue