#!/usr/bin/env python
#
# Fedora VM image
#
# Copyright 2019 Red Hat Inc.
#
# Authors:
#  Gerd Hoffmann <kraxel@redhat.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

class FedoraVM(basevm.BaseVM):
    name = "fedora"
    arch = "x86_64"

    base = "https://archives.fedoraproject.org/pub/archive/fedora/linux/releases/30/"
    link = base + "Server/x86_64/iso/Fedora-Server-netinst-x86_64-30-1.2.iso"
    repo = base + "Server/x86_64/os/"
    full = base + "Everything/x86_64/os/"
    csum = "5e4eac4566d8c572bfb3bcf54b7d6c82006ec3c6c882a2c9235c6d3494d7b100"
    size = "20G"
    pkgs = [
        # tools
        'git-core',
        'flex', 'bison',
        'gcc', 'binutils', 'make',

        # perl
        'perl-Test-Harness',

        # libs: usb
        '"pkgconfig(libusb-1.0)"',
        '"pkgconfig(libusbredirparser-0.5)"',

        # libs: crypto
        '"pkgconfig(gnutls)"',

        # libs: ui
        '"pkgconfig(sdl2)"',
        '"pkgconfig(gtk+-3.0)"',
        '"pkgconfig(ncursesw)"',

        # libs: audio
        '"pkgconfig(libpulse)"',
        '"pkgconfig(alsa)"',
    ]

    BUILD_SCRIPT = """
        set -e;
        rm -rf /home/qemu/qemu-test.*
        cd $(mktemp -d /home/qemu/qemu-test.XXXXXX);
        mkdir src build; cd src;
        tar -xf /dev/vdb;
        cd ../build
        ../src/configure --python=python3 {configure_opts};
        gmake --output-sync -j{jobs} {target} {verbose};
    """

    def build_image(self, img):
        self.print_step("Downloading install iso")
        cimg = self._download_with_cache(self.link, sha256sum=self.csum)
        img_tmp = img + ".tmp"
        iso = img + ".install.iso"

        self.print_step("Preparing iso and disk image")
        subprocess.check_call(["cp", "-f", cimg, iso])
        subprocess.check_call(["qemu-img", "create", "-f", "qcow2",
                               img_tmp, self.size])

        self.print_step("Booting installer")
        self.boot(img_tmp, extra_args = [
            "-bios", "pc-bios/bios-256k.bin",
            "-machine", "graphics=off",
            "-cdrom", iso
        ])
        self.console_init(300)
        self.console_wait("installation process.")
        time.sleep(0.3)
        self.console_send("\t")
        time.sleep(0.3)
        self.console_send(" console=ttyS0")
        proxy = os.environ.get("http_proxy")
        if not proxy is None:
            self.console_send(" proxy=%s" % proxy)
            self.console_send(" inst.proxy=%s" % proxy)
        self.console_send(" inst.repo=%s" % self.repo)
        self.console_send("\n")

        self.console_wait_send("2) Use text mode",         "2\n")

        self.console_wait_send("5) [!] Installation Dest", "5\n")
        self.console_wait_send("1) [x]",                   "c\n")
        self.console_wait_send("2) [ ] Use All Space",     "2\n")
        self.console_wait_send("2) [x] Use All Space",     "c\n")
        self.console_wait_send("1) [ ] Standard Part",     "1\n")
        self.console_wait_send("1) [x] Standard Part",     "c\n")

        self.console_wait_send("7) [!] Root password",     "7\n")
        self.console_wait("Password:")
        self.console_send("%s\n" % self.ROOT_PASS)
        self.console_wait("Password (confirm):")
        self.console_send("%s\n" % self.ROOT_PASS)

        self.console_wait_send("8) [ ] User creation",     "8\n")
        self.console_wait_send("1) [ ] Create user",       "1\n")
        self.console_wait_send("3) User name",             "3\n")
        self.console_wait_send("ENTER:", "%s\n" % self.GUEST_USER)
        self.console_wait_send("4) [ ] Use password",      "4\n")
        self.console_wait_send("5) Password",              "5\n")
        self.console_wait("Password:")
        self.console_send("%s\n" % self.GUEST_PASS)
        self.console_wait("Password (confirm):")
        self.console_send("%s\n" % self.GUEST_PASS)
        self.console_wait_send("7) Groups",                "c\n")

        while True:
            good = self.console_wait("3) [x] Installation",
                                     "3) [!] Installation")
            self.console_send("r\n")
            if good:
                break
            time.sleep(10)

        while True:
            good = self.console_wait("4) [x] Software",
                                     "4) [!] Software")
            self.console_send("r\n")
            if good:
                break
            time.sleep(10)
            self.console_send("r\n" % self.GUEST_PASS)

        self.console_wait_send("'b' to begin install",     "b\n")

        self.print_step("Installation started now, this will take a while")

        self.console_wait_send("Installation complete",    "\n")
        self.print_step("Installation finished, rebooting")

        # setup qemu user
        prompt = " ~]$"
        self.console_ssh_init(prompt, self.GUEST_USER, self.GUEST_PASS)
        self.console_wait_send(prompt, "exit\n")

        # setup root user
        prompt = " ~]#"
        self.console_ssh_init(prompt, "root", self.ROOT_PASS)
        self.console_sshd_config(prompt)

        # setup virtio-blk #1 (tarfile)
        self.console_wait(prompt)
        self.console_send("echo 'KERNEL==\"vdb\" MODE=\"666\"' >> %s\n" %
                          "/etc/udev/rules.d/99-qemu.rules")

        self.print_step("Configuration finished, rebooting")
        self.console_wait_send(prompt, "reboot\n")
        self.console_wait("login:")
        self.wait_ssh()

        self.print_step("Installing packages")
        self.ssh_root_check("rm -vf /etc/yum.repos.d/fedora*.repo\n")
        self.ssh_root_check("echo '[fedora]' >> /etc/yum.repos.d/qemu.repo\n")
        self.ssh_root_check("echo 'baseurl=%s' >> /etc/yum.repos.d/qemu.repo\n" % self.full)
        self.ssh_root_check("echo 'gpgcheck=0' >> /etc/yum.repos.d/qemu.repo\n")
        self.ssh_root_check("dnf install -y %s\n" % " ".join(self.pkgs))

        # shutdown
        self.ssh_root(self.poweroff)
        self.console_wait("sleep state S5")
        self.wait()

        if os.path.exists(img):
            os.remove(img)
        os.rename(img_tmp, img)
        os.remove(iso)
        self.print_step("All done")

if __name__ == "__main__":
    sys.exit(basevm.main(FedoraVM))
