# Copyright 2021 The ChromiumOS Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

"""A set of utilities to build the Chrome OS kernel."""

import logging
import os
import pathlib
from typing import List, Optional

from chromite.lib import build_target_lib
from chromite.lib import constants
from chromite.lib import cros_build_lib
from chromite.lib import kernel_cmdline


class Error(Exception):
    """Base error class for the module."""


class KernelBuildError(Error):
    """Error class thrown when failing to build kernel (image)."""


class Builder:
    """A class for building kernel images."""

    def __init__(self, board: str, work_dir: str, install_root: str, jobs: int):
        """Initialize this class.

        Args:
            board: The board to build the kernel for.
            work_dir: The directory for keeping intermediary files.
            install_root: A directory to put the built kernel files (e.g.
                vmlinuz).
            jobs: The number of packages to build in parallel.
        """
        self._board = board
        self._work_dir = pathlib.Path(work_dir)
        self._install_root = pathlib.Path(install_root)
        # Convert to string since all cmds require bytes/strings/Path.
        self.jobs = f"--jobs={jobs}"

        self._board_root = build_target_lib.get_default_sysroot_path(board)

    def CreateCustomKernel(
        self,
        kernel_flags: List[str],
        use_flags_override: Optional[List[str]] = None,
    ):
        """Builds a custom kernel and initramfs.

        Args:
            kernel_flags: A list of USE flags for building the kernel.
            use_flags_override: A list of USE flags to override the default env
                USE variable.
        """
        pkgdir = self._work_dir / "packages"
        logging.info("Using PKGDIR: %s", pkgdir)
        try:
            self._CreateCustomKernel(
                str(pkgdir), kernel_flags, use_flags_override
            )
        finally:
            # The reason we need to specifically remove the pkgdir is that some
            # content of this directory will be read-only by non-root and tools
            # like shutil.rmtree won't be able to remove them. So we just do a
            # force delete.
            try:
                cros_build_lib.sudo_run(["rm", "-rf", str(pkgdir)])
            except cros_build_lib.RunCommandError as e:
                logging.error(
                    "Failed to delete directory %s with error: %s", pkgdir, e
                )
                # For whatever reason it failed but, for now we just ignore it.
                # It is probably going to fail at the end anyway.

    def _CreateCustomKernel(
        self,
        pkgdir: str,
        kernel_flags: List[str],
        use_flags_override: Optional[List[str]] = None,
    ):
        """Internal function for CreateCustomKernel()

        This code is mainly borrowed from
        src/scripts/build_library/build_common.sh.

        Args:
            pkgdir: The path to a working dir for installing packages.
            kernel_flags: See CreateCustomKernel().
            use_flags_override: See CreateCustomKernel().
        """
        logging.info("Building custom kernel.")
        # Clean up any leftover state in custom directories.
        use_flags = use_flags_override or os.environ.get("USE", "").split()
        use_flags += kernel_flags
        logging.debug("Using USE flags: %s", use_flags)
        extra_env = {"PKGDIR": pkgdir, "USE": " ".join(use_flags)}
        build_target = build_target_lib.BuildTarget(self._board)
        emerge = build_target.get_command("emerge")

        # Update chromeos-initramfs to contain the latest binaries from the
        # build tree. This is basically just packaging up already-built binaries
        # from root. We are careful not to muck with the existing prebuilts so
        # that prebuilts can be uploaded in parallel.
        #
        # TODO(davidjames): Implement ABI deps so that chromeos-initramfs will
        #   be rebuilt automatically when its dependencies change.
        logging.info("Building initramfs package.")
        try:
            cros_build_lib.run(
                [emerge, self.jobs, "chromeos-base/chromeos-initramfs"],
                enter_chroot=True,
                extra_env=extra_env,
            )
        except cros_build_lib.RunCommandError as e:
            raise KernelBuildError(
                "kernel_builder: Failed to build initramfs package: %s" % e
            )

        # Verify all dependencies of the kernel are installed. This should be a
        # no-op, but it's good to check in case a developer didn't run
        # build_packages.  We need the `expand_virtual` call to work around a
        # bug in portage where it only installs the virtual pkg.
        logging.info("Verifying dependencies of the kernel.")
        try:
            kernel = cros_build_lib.run(
                [
                    build_target.get_command("portageq"),
                    "expand_virtual",
                    self._board_root,
                    "virtual/linux-sources",
                ],
                encoding="utf-8",
                enter_chroot=True,
                capture_output=True,
            ).stdout.strip()
            logging.debug("Building kernel package %s", kernel)
            cros_build_lib.run(
                [emerge, self.jobs, "--onlydeps", kernel],
                enter_chroot=True,
                extra_env=extra_env,
            )
        except cros_build_lib.RunCommandError as e:
            raise KernelBuildError(
                "kernel_builder: Failed verify all kernel "
                "dependencies are built: %s" % e
            )

        # Build the kernel. This uses the standard root so that we can pick up
        # the initramfs from there. But we don't actually install the kernel to
        # the standard root, because that'll muck up the kernel debug symbols
        # there, which we want to upload in parallel.
        logging.info("Building the custom kernel.")
        try:
            cros_build_lib.run(
                [emerge, self.jobs, "--buildpkgonly", kernel],
                enter_chroot=True,
                extra_env=extra_env,
            )
        except cros_build_lib.RunCommandError as e:
            raise KernelBuildError(
                "kernel_builder: Failed to build the custom kernel: %s" % e
            )

        logging.info(
            "Installing the custom kernel image into install root %s.",
            self._install_root,
        )
        # Install the custom kernel to the provided install root.
        try:
            cros_build_lib.run(
                [
                    emerge,
                    self.jobs,
                    "--usepkgonly",
                    f"--root={self._install_root}",
                    kernel,
                ],
                enter_chroot=True,
                extra_env=extra_env,
            )
        except cros_build_lib.RunCommandError as e:
            raise KernelBuildError(
                "kernel_builder: Failed to install the custom kernel: %s" % e
            )

    def CreateKernelImage(
        self,
        output: str,
        boot_args: Optional[str] = None,
        serial: Optional[str] = None,
        keys_dir: str = constants.VBOOT_DEVKEYS_DIR,
        public_key: str = constants.KERNEL_PUBLIC_SUBKEY,
        private_key: str = constants.KERNEL_DATA_PRIVATE_KEY,
        keyblock: str = constants.KERNEL_KEYBLOCK,
        disable_rootfs_verification: bool = False,
    ):
        """Builds the final initramfs kernel image.

        Args:
            output: The output file to put the final kernel image.
            boot_args: A string of kernel boot arguments.
            serial: Serial ports for printks.
            keys_dir: The path to kernel keys directories. Default is dev keys.
            public_key: Filename to the public key whose private part signed the
                keyblock.
            private_key: Filename to the private key whose public part is baked
                into the keyblock.
            keyblock: Filename to the kernel keyblock.
            disable_rootfs_verification: If True, the rootfs verification is
                disabled.
        """
        logging.info("Building kernel image into %s.", output)

        portageq = build_target_lib.BuildTarget(self._board).get_command(
            "portageq"
        )
        try:
            arch = cros_build_lib.run(
                [portageq, "envvar", "ARCH"],
                encoding="utf-8",
                enter_chroot=True,
                capture_output=True,
            ).stdout.strip()
            logging.debug("Using architecture %s", arch)
        except cros_build_lib.RunCommandError as e:
            raise KernelBuildError(
                "kernel_builder: Failed to query kernel architecture: %s" % e
            )

        vmlinuz = self._install_root / "boot" / "vmlinuz"
        cmd = [
            constants.CROSUTILS_DIR / "build_kernel_image.sh",
            f"--board={self._board}",
            f"--arch={arch}",
            f"--to={output}",
            f"--vmlinuz={vmlinuz}",
            f"--working_dir={self._work_dir}",
            # Clean up is left to the caller of this class.
            "--keep_work",
            f"--keys_dir={keys_dir}",
            f"--public={public_key}",
            f"--private={private_key}",
            f"--keyblock={keyblock}",
        ]
        if disable_rootfs_verification:
            cmd += ["--noenable_rootfs_verification"]
        if boot_args:
            arg_list = kernel_cmdline.KernelArgList(boot_args)
            cmd += [f"--boot_args={arg_list.Format()}"]
        if serial:
            if not serial.startswith("tty"):
                raise KernelBuildError(
                    "Possibly invalid argument for serial port: %s" % serial
                )
            cmd += [f"--enable_serial={serial}"]

        try:
            cros_build_lib.run(cmd, enter_chroot=True)
        except cros_build_lib.RunCommandError as e:
            raise KernelBuildError(
                "kernel_builder: Failed to create kernel image: %s" % e
            )
