#!/usr/bin/env python3
#
# Haiku VM image
#
# Copyright 2020-2022 Haiku, Inc.
#
# Authors:
#  Alexander von Gluck IV <kallisti5@unixzen.com>
#
# This code is licensed under the GPL version 2 or later.  See
# the COPYING file in the top-level directory.
#

import os
import re
import sys
import time
import socket
import subprocess
import basevm

VAGRANT_KEY_FILE = os.path.join(os.path.dirname(__file__),
    "..", "keys", "vagrant")

VAGRANT_PUB_KEY_FILE = os.path.join(os.path.dirname(__file__),
    "..", "keys", "vagrant.pub")

HAIKU_CONFIG = {
    'cpu'             : "max",
    'machine'         : 'pc',
    'guest_user'      : "vagrant",
    'guest_pass'      : "",
    'root_user'       : "vagrant",
    'root_pass'       : "",
    'ssh_key_file'    : VAGRANT_KEY_FILE,
    'ssh_pub_key_file': VAGRANT_PUB_KEY_FILE,
    'memory'          : "4G",
    'extra_args'      : [],
    'qemu_args'       : "-device VGA",
    'dns'             : "",
    'ssh_port'        : 0,
    'install_cmds'    : "",
    'boot_dev_type'   : "block",
    'ssh_timeout'     : 1,
}

class HaikuVM(basevm.BaseVM):
    name = "haiku"
    arch = "x86_64"

    link = "https://app.vagrantup.com/haiku-os/boxes/r1beta4-x86_64/versions/20230114/providers/libvirt.box"
    csum = "6e72a2a470e03dbc3c5e808664e057bb4022b390dca88e4c7da6188f26f6a3c9"

    poweroff = "shutdown"

    requirements = [
        "devel:libbz2",
        "devel:libcapstone",
        "devel:libcurl",
        "devel:libfdt",
        "devel:libgcrypt",
        "devel:libgl",
        "devel:libglib_2.0",
        "devel:libgnutls",
        "devel:libgpg_error",
        "devel:libintl",
        "devel:libjpeg",
        "devel:liblzo2",
        "devel:libncursesw",
        "devel:libnettle",
        "devel:libpixman_1",
        "devel:libpng16",
        "devel:libsdl2_2.0",
        "devel:libslirp",
        "devel:libsnappy",
        "devel:libssh2",
        "devel:libtasn1",
        "devel:libusb_1.0",
        "devel:libz",
        "ninja",
    ]

    BUILD_SCRIPT = """
        set -e;
        rm -rf /tmp/qemu-test.*
        cd $(mktemp -d /tmp/qemu-test.XXXXXX);
        mkdir src build; cd src;
        tar -xf /dev/disk/virtual/virtio_block/1/raw;
        mkdir -p /usr/bin
        ln -s /boot/system/bin/env /usr/bin/env
        cd ../build
        ../src/configure {configure_opts};
        make --output-sync -j{jobs} {target} {verbose};
    """

    def build_image(self, img):
        self.print_step("Downloading disk image")
        tarball = self._download_with_cache(self.link, sha256sum=self.csum)

        self.print_step("Extracting disk image")

        subprocess.check_call(["tar", "xzf", tarball, "box.img", "-O"],
                              stdout=open(img, 'wb'))

        self.print_step("Preparing disk image")
        self.boot(img)

        # Wait for ssh to be available.
        self.wait_ssh(wait_root=True, cmd="exit 0")

        # Install packages
        self.ssh_root("pkgman install -y %s" % " ".join(self.requirements))
        self.graceful_shutdown()

        self.print_step("All done")

if __name__ == "__main__":
    sys.exit(basevm.main(HaikuVM, config=HAIKU_CONFIG))
