cachepc-qemu

Fork of AMDESE/qemu with changes for cachepc side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-qemu
Log | Files | Refs | Submodules | LICENSE | sfeed.txt

netbsd (7744B)


      1#!/usr/bin/env python3
      2#
      3# NetBSD VM image
      4#
      5# Copyright 2017-2019 Red Hat Inc.
      6#
      7# Authors:
      8#  Fam Zheng <famz@redhat.com>
      9#  Gerd Hoffmann <kraxel@redhat.com>
     10#
     11# This code is licensed under the GPL version 2 or later.  See
     12# the COPYING file in the top-level directory.
     13#
     14
     15import os
     16import sys
     17import time
     18import subprocess
     19import basevm
     20
     21class NetBSDVM(basevm.BaseVM):
     22    name = "netbsd"
     23    arch = "x86_64"
     24
     25    link = "https://cdn.netbsd.org/pub/NetBSD/NetBSD-9.2/images/NetBSD-9.2-amd64.iso"
     26    csum = "5ee0ea101f73386b9b424f5d1041e371db3c42fdd6f4e4518dc79c4a08f31d43091ebe93425c9f0dcaaed2b51131836fe6774f33f89030b58d64709b35fda72f"
     27    size = "20G"
     28    pkgs = [
     29        # tools
     30        "git-base",
     31        "pkgconf",
     32        "xz",
     33        "python37",
     34        "ninja-build",
     35
     36        # gnu tools
     37        "bash",
     38        "gmake",
     39        "gsed",
     40        "gettext-tools",
     41
     42        # libs: crypto
     43        "gnutls",
     44
     45        # libs: images
     46        "jpeg",
     47        "png",
     48
     49	# libs: ui
     50        "SDL2",
     51        "gtk3+",
     52        "libxkbcommon",
     53
     54        # libs: migration
     55        "zstd",
     56    ]
     57
     58    BUILD_SCRIPT = """
     59        set -e;
     60        rm -rf /home/qemu/qemu-test.*
     61        cd $(mktemp -d /home/qemu/qemu-test.XXXXXX);
     62        mkdir src build; cd src;
     63        tar -xf /dev/rld1a;
     64        cd ../build
     65        ../src/configure --python=python3.7 --disable-opengl {configure_opts};
     66        gmake --output-sync -j{jobs} {target} {verbose};
     67    """
     68    poweroff = "/sbin/poweroff"
     69
     70    # Workaround for NetBSD + IPv6 + slirp issues.
     71    # NetBSD seems to ignore the ICMPv6 Destination Unreachable
     72    # messages generated by slirp.  When the host has no IPv6
     73    # connectivity, this causes every connection to ftp.NetBSD.org
     74    # take more than a minute to be established.
     75    ipv6 = False
     76
     77    def build_image(self, img):
     78        cimg = self._download_with_cache(self.link, sha512sum=self.csum)
     79        img_tmp = img + ".tmp"
     80        iso = img + ".install.iso"
     81
     82        self.print_step("Preparing iso and disk image")
     83        subprocess.check_call(["ln", "-f", cimg, iso])
     84        self.exec_qemu_img("create", "-f", "qcow2", img_tmp, self.size)
     85
     86        self.print_step("Booting installer")
     87        self.boot(img_tmp, extra_args = [
     88            "-bios", "pc-bios/bios-256k.bin",
     89            "-machine", "graphics=off",
     90            "-cdrom", iso
     91        ])
     92        self.console_init()
     93        self.console_wait_send("3. Drop to boot prompt", "3")
     94        self.console_wait_send("> ", "consdev com0\n")
     95        self.console_wait_send("> ", "boot\n")
     96
     97        self.console_wait_send("Terminal type",            "xterm\n")
     98        self.console_wait_send("a: Installation messages", "a\n")
     99        self.console_wait_send("a: Install NetBSD",        "a\n")
    100        self.console_wait("Shall we continue?")
    101        self.console_wait_send("b: Yes",                   "b\n")
    102
    103        self.console_wait_send("a: ld0",                   "a\n")
    104        self.console_wait_send("a: Guid Partition Table",  "a\n")
    105        self.console_wait_send("a: This is the correct",   "a\n")
    106        self.console_wait_send("b: Use default part",      "b\n")
    107        self.console_wait_send("x: Partition sizes ok",    "x\n")
    108        self.console_wait("Shall we continue?")
    109        self.console_wait_send("b: Yes",                   "b\n")
    110
    111        self.console_wait_send("b: Use serial port com0",  "b\n")
    112        self.console_wait_send("f: Set serial baud rate",  "f\n")
    113        self.console_wait_send("a: 9600",                  "a\n")
    114        self.console_wait_send("x: Continue",              "x\n")
    115
    116        self.console_wait_send("a: Full installation",     "a\n")
    117        self.console_wait_send("a: CD-ROM",                "a\n")
    118
    119        self.print_step("Installation started now, this will take a while")
    120        self.console_wait_send("Hit enter to continue",    "\n")
    121
    122        self.console_wait_send("d: Change root password",  "d\n")
    123        self.console_wait_send("a: Yes",                   "a\n")
    124        self.console_wait("New password:")
    125        self.console_send("%s\n" % self._config["root_pass"])
    126        self.console_wait("New password:")
    127        self.console_send("%s\n" % self._config["root_pass"])
    128        self.console_wait("Retype new password:")
    129        self.console_send("%s\n" % self._config["root_pass"])
    130
    131        self.console_wait_send("o: Add a user",            "o\n")
    132        self.console_wait("username")
    133        self.console_send("%s\n" % self._config["guest_user"])
    134        self.console_wait("to group wheel")
    135        self.console_wait_send("a: Yes",                   "a\n")
    136        self.console_wait_send("a: /bin/sh",               "a\n")
    137        self.console_wait("New password:")
    138        self.console_send("%s\n" % self._config["guest_pass"])
    139        self.console_wait("New password:")
    140        self.console_send("%s\n" % self._config["guest_pass"])
    141        self.console_wait("Retype new password:")
    142        self.console_send("%s\n" % self._config["guest_pass"])
    143
    144        self.console_wait_send("a: Configure network",     "a\n")
    145        self.console_wait_send("a: vioif0",                "a\n")
    146        self.console_wait_send("Network media type",       "\n")
    147        self.console_wait("autoconfiguration")
    148        self.console_wait_send("a: Yes",                   "a\n")
    149        self.console_wait_send("DNS domain",               "localnet\n")
    150        self.console_wait("Are they OK?")
    151        self.console_wait_send("a: Yes",                   "a\n")
    152        self.console_wait("installed in /etc")
    153        self.console_wait_send("a: Yes",                   "a\n")
    154
    155        self.console_wait_send("e: Enable install",        "e\n")
    156        proxy = os.environ.get("http_proxy")
    157        if not proxy is None:
    158            self.console_wait_send("f: Proxy",             "f\n")
    159            self.console_wait("Proxy")
    160            self.console_send("%s\n" % proxy)
    161        self.console_wait_send("x: Install pkgin",         "x\n")
    162        self.console_init(1200)
    163        self.console_wait_send("Hit enter to continue", "\n")
    164        self.console_init()
    165
    166        self.console_wait_send("g: Enable sshd",           "g\n")
    167        self.console_wait_send("x: Finished conf",         "x\n")
    168        self.console_wait_send("Hit enter to continue",    "\n")
    169
    170        self.print_step("Installation finished, rebooting")
    171        self.console_wait_send("d: Reboot the computer",   "d\n")
    172
    173        # setup qemu user
    174        prompt = "localhost$"
    175        self.console_ssh_init(prompt, self._config["guest_user"],
    176                                      self._config["guest_pass"])
    177        self.console_wait_send(prompt, "exit\n")
    178
    179        # setup root user
    180        prompt = "localhost#"
    181        self.console_ssh_init(prompt, "root", self._config["root_pass"])
    182        self.console_sshd_config(prompt)
    183
    184        # setup virtio-blk #1 (tarfile)
    185        self.console_wait(prompt)
    186        self.console_send("echo 'chmod 666 /dev/rld1a' >> /etc/rc.local\n")
    187
    188        # turn off mprotect (conflicts with tcg)
    189        self.console_wait(prompt)
    190        self.console_send("echo security.pax.mprotect.enabled=0 >> /etc/sysctl.conf\n")
    191
    192        self.print_step("Configuration finished, rebooting")
    193        self.console_wait_send(prompt, "reboot\n")
    194        self.console_wait("login:")
    195        self.wait_ssh()
    196
    197        self.print_step("Installing packages")
    198        self.ssh_root_check("pkgin update\n")
    199        self.ssh_root_check("pkgin -y install %s\n" % " ".join(self.pkgs))
    200
    201        # shutdown
    202        self.ssh_root(self.poweroff)
    203        self.console_wait("entering state S5")
    204        self.wait()
    205
    206        os.rename(img_tmp, img)
    207        os.remove(iso)
    208        self.print_step("All done")
    209
    210if __name__ == "__main__":
    211    sys.exit(basevm.main(NetBSDVM))