Charles Short 4f1bba5c62 Add support for "compose exec"
Add support to run shell commands inside a checked out
ostree branch.

The way that this works is the following:

1. Determine the branch to checkout.
2. Checkout the branch in the workspace.
3. Use systemd-nspawn to create a shell inside
   the branch.

Test Plan
PASSED Installed apt-ostree from git repo.
PASSED Run sudo apt-ostree compose create \
           --base config/debian/bookworm \
           --repo /repo debian/bookworm \
           bookworm-test
PASSED Run sudo apt-ostree compose exec --repo /repo --branch
       bookwork-test "cat /etc/debian_version"

Story: 2010867
Task: 48556

Change-Id: I6ff9658fc04ec83d50d2cb5f3b8dbb70e3065688
Signed-off-by: Charles Short <charles.short@windriver.com>
2023-10-26 08:03:46 -04:00

54 lines
1.4 KiB
Python

"""
Copyright (c) 2023 Wind River Systems, Inc.
SPDX-License-Identifier: Apache-2.0
"""
import os
import sys
import click
from rich.console import Console
import yaml
from apt_ostree import utils
class RunCommand:
def __init__(self, state):
self.state = state
self.console = Console()
def run_command(self, command, mount_points, pre_exec, rootfs):
"""Run a command in an ostree branch."""
if not os.path.exists(rootfs):
click.secho(f"Directory not found: {rootfs}", fg="red")
sys.exit(1)
mounts = None
if mount_points:
self.console.print("Loading configuration.")
with open(mount_points, "r") as f:
mounts = yaml.safe_load(f)
if pre_exec:
self.console.print(f"Executing pre-command: {pre_exec}",
highlight=False)
cmd = ["systemd-nspawn", "-q", "-D", rootfs]
cmd += pre_exec.split()
r = utils.run_command(cmd)
if r.returncode != 0:
self.console.print("Sucessfully executed pre-command")
# Run the systemd-nspawn command.
cmd = ["systemd-nspawn", "-q"]
if mounts:
for m in mounts:
cmd += (["--bind", f"{m}"])
cmd += ["-D", rootfs]
if len(command) != 0:
cmd += command.split()
utils.run_command(cmd, check=False)