xref: /openbmc/qemu/tests/vm/freebsd (revision c88ee46cdb9888fbe9ea45c174743d6f7544b737)
1*c88ee46cSPhilippe Mathieu-Daudé#!/usr/bin/env python3
2111e30c0SFam Zheng#
3111e30c0SFam Zheng# FreeBSD VM image
4111e30c0SFam Zheng#
5918fb8faSGerd Hoffmann# Copyright 2017-2019 Red Hat Inc.
6111e30c0SFam Zheng#
7111e30c0SFam Zheng# Authors:
8111e30c0SFam Zheng#  Fam Zheng <famz@redhat.com>
9918fb8faSGerd Hoffmann#  Gerd Hoffmann <kraxel@redhat.com>
10111e30c0SFam Zheng#
11111e30c0SFam Zheng# This code is licensed under the GPL version 2 or later.  See
12111e30c0SFam Zheng# the COPYING file in the top-level directory.
13111e30c0SFam Zheng#
14111e30c0SFam Zheng
15111e30c0SFam Zhengimport os
16918fb8faSGerd Hoffmannimport re
17111e30c0SFam Zhengimport sys
18918fb8faSGerd Hoffmannimport time
19918fb8faSGerd Hoffmannimport socket
20111e30c0SFam Zhengimport subprocess
21111e30c0SFam Zhengimport basevm
22111e30c0SFam Zheng
23111e30c0SFam Zhengclass FreeBSDVM(basevm.BaseVM):
24111e30c0SFam Zheng    name = "freebsd"
2531719c37SPhilippe Mathieu-Daudé    arch = "x86_64"
26918fb8faSGerd Hoffmann
27918fb8faSGerd Hoffmann    link = "https://download.freebsd.org/ftp/releases/ISO-IMAGES/12.0/FreeBSD-12.0-RELEASE-amd64-disc1.iso.xz"
28918fb8faSGerd Hoffmann    csum = "1d40015bea89d05b8bd13e2ed80c40b522a9ec1abd8e7c8b80954fb485fb99db"
29918fb8faSGerd Hoffmann    size = "20G"
30918fb8faSGerd Hoffmann    pkgs = [
31918fb8faSGerd Hoffmann        # build tools
32918fb8faSGerd Hoffmann        "git",
33918fb8faSGerd Hoffmann        "pkgconf",
34918fb8faSGerd Hoffmann        "bzip2",
35bc2bf7f3SGerd Hoffmann        "python37",
36918fb8faSGerd Hoffmann
37918fb8faSGerd Hoffmann        # gnu tools
38918fb8faSGerd Hoffmann        "bash",
39918fb8faSGerd Hoffmann        "gmake",
40918fb8faSGerd Hoffmann        "gsed",
41918fb8faSGerd Hoffmann        "flex", "bison",
42918fb8faSGerd Hoffmann
43918fb8faSGerd Hoffmann        # libs: crypto
44918fb8faSGerd Hoffmann        "gnutls",
45918fb8faSGerd Hoffmann
46918fb8faSGerd Hoffmann        # libs: images
47918fb8faSGerd Hoffmann        "jpeg-turbo",
48918fb8faSGerd Hoffmann        "png",
49918fb8faSGerd Hoffmann
50918fb8faSGerd Hoffmann        # libs: ui
51918fb8faSGerd Hoffmann        "sdl2",
52918fb8faSGerd Hoffmann        "gtk3",
53918fb8faSGerd Hoffmann        "libxkbcommon",
54918fb8faSGerd Hoffmann
55918fb8faSGerd Hoffmann        # libs: opengl
56918fb8faSGerd Hoffmann        "libepoxy",
57918fb8faSGerd Hoffmann        "mesa-libs",
58918fb8faSGerd Hoffmann    ]
59918fb8faSGerd Hoffmann
60111e30c0SFam Zheng    BUILD_SCRIPT = """
61111e30c0SFam Zheng        set -e;
62918fb8faSGerd Hoffmann        rm -rf /home/qemu/qemu-test.*
63918fb8faSGerd Hoffmann        cd $(mktemp -d /home/qemu/qemu-test.XXXXXX);
64918fb8faSGerd Hoffmann        mkdir src build; cd src;
65111e30c0SFam Zheng        tar -xf /dev/vtbd1;
66918fb8faSGerd Hoffmann        cd ../build
67bc2bf7f3SGerd Hoffmann        ../src/configure --python=python3.7 {configure_opts};
685c2ec9b6SAlex Bennée        gmake --output-sync -j{jobs} {target} {verbose};
69111e30c0SFam Zheng    """
70111e30c0SFam Zheng
71918fb8faSGerd Hoffmann    def console_boot_serial(self):
72918fb8faSGerd Hoffmann        self.console_wait_send("Autoboot", "3")
73918fb8faSGerd Hoffmann        self.console_wait_send("OK", "set console=comconsole\n")
74918fb8faSGerd Hoffmann        self.console_wait_send("OK", "boot\n")
75918fb8faSGerd Hoffmann
76111e30c0SFam Zheng    def build_image(self, img):
77918fb8faSGerd Hoffmann        self.print_step("Downloading install iso")
78918fb8faSGerd Hoffmann        cimg = self._download_with_cache(self.link, sha256sum=self.csum)
79111e30c0SFam Zheng        img_tmp = img + ".tmp"
80918fb8faSGerd Hoffmann        iso = img + ".install.iso"
81918fb8faSGerd Hoffmann        iso_xz = iso + ".xz"
82918fb8faSGerd Hoffmann
83918fb8faSGerd Hoffmann        self.print_step("Preparing iso and disk image")
84918fb8faSGerd Hoffmann        subprocess.check_call(["cp", "-f", cimg, iso_xz])
85918fb8faSGerd Hoffmann        subprocess.check_call(["xz", "-dvf", iso_xz])
861e48931cSWainer dos Santos Moschetta        self.exec_qemu_img("create", "-f", "qcow2", img_tmp, self.size)
87918fb8faSGerd Hoffmann
88918fb8faSGerd Hoffmann        self.print_step("Booting installer")
89918fb8faSGerd Hoffmann        self.boot(img_tmp, extra_args = [
90918fb8faSGerd Hoffmann            "-bios", "pc-bios/bios-256k.bin",
91918fb8faSGerd Hoffmann            "-machine", "graphics=off",
92918fb8faSGerd Hoffmann            "-cdrom", iso
93918fb8faSGerd Hoffmann        ])
94918fb8faSGerd Hoffmann        self.console_init()
95918fb8faSGerd Hoffmann        self.console_boot_serial()
96918fb8faSGerd Hoffmann        self.console_wait_send("Console type",          "xterm\n")
97918fb8faSGerd Hoffmann
98918fb8faSGerd Hoffmann        # pre-install configuration
99918fb8faSGerd Hoffmann        self.console_wait_send("Welcome",               "\n")
100918fb8faSGerd Hoffmann        self.console_wait_send("Keymap Selection",      "\n")
101918fb8faSGerd Hoffmann        self.console_wait_send("Set Hostname",          "freebsd\n")
102918fb8faSGerd Hoffmann        self.console_wait_send("Distribution Select",   "\n")
103918fb8faSGerd Hoffmann        self.console_wait_send("Partitioning",          "\n")
104918fb8faSGerd Hoffmann        self.console_wait_send("Partition",             "\n")
105918fb8faSGerd Hoffmann        self.console_wait_send("Scheme",                "\n")
106918fb8faSGerd Hoffmann        self.console_wait_send("Editor",                "f")
107918fb8faSGerd Hoffmann        self.console_wait_send("Confirmation",          "c")
108918fb8faSGerd Hoffmann
109918fb8faSGerd Hoffmann        self.print_step("Installation started now, this will take a while")
110918fb8faSGerd Hoffmann
111918fb8faSGerd Hoffmann        # post-install configuration
112918fb8faSGerd Hoffmann        self.console_wait("New Password:")
113918fb8faSGerd Hoffmann        self.console_send("%s\n" % self.ROOT_PASS)
114918fb8faSGerd Hoffmann        self.console_wait("Retype New Password:")
115918fb8faSGerd Hoffmann        self.console_send("%s\n" % self.ROOT_PASS)
116918fb8faSGerd Hoffmann
117918fb8faSGerd Hoffmann        self.console_wait_send("Network Configuration", "\n")
118918fb8faSGerd Hoffmann        self.console_wait_send("IPv4",                  "y")
119918fb8faSGerd Hoffmann        self.console_wait_send("DHCP",                  "y")
120918fb8faSGerd Hoffmann        self.console_wait_send("IPv6",                  "n")
121918fb8faSGerd Hoffmann        self.console_wait_send("Resolver",              "\n")
122918fb8faSGerd Hoffmann
123918fb8faSGerd Hoffmann        self.console_wait_send("Time Zone Selector",    "a\n")
124918fb8faSGerd Hoffmann        self.console_wait_send("Confirmation",          "y")
125918fb8faSGerd Hoffmann        self.console_wait_send("Time & Date",           "\n")
126918fb8faSGerd Hoffmann        self.console_wait_send("Time & Date",           "\n")
127918fb8faSGerd Hoffmann
128918fb8faSGerd Hoffmann        self.console_wait_send("System Configuration",  "\n")
129918fb8faSGerd Hoffmann        self.console_wait_send("System Hardening",      "\n")
130918fb8faSGerd Hoffmann
131918fb8faSGerd Hoffmann        # qemu user
132918fb8faSGerd Hoffmann        self.console_wait_send("Add User Accounts", "y")
133918fb8faSGerd Hoffmann        self.console_wait("Username")
134918fb8faSGerd Hoffmann        self.console_send("%s\n" % self.GUEST_USER)
135918fb8faSGerd Hoffmann        self.console_wait("Full name")
136918fb8faSGerd Hoffmann        self.console_send("%s\n" % self.GUEST_USER)
137918fb8faSGerd Hoffmann        self.console_wait_send("Uid",                   "\n")
138918fb8faSGerd Hoffmann        self.console_wait_send("Login group",           "\n")
139918fb8faSGerd Hoffmann        self.console_wait_send("Login group",           "\n")
140918fb8faSGerd Hoffmann        self.console_wait_send("Login class",           "\n")
141918fb8faSGerd Hoffmann        self.console_wait_send("Shell",                 "\n")
142918fb8faSGerd Hoffmann        self.console_wait_send("Home directory",        "\n")
143918fb8faSGerd Hoffmann        self.console_wait_send("Home directory perm",   "\n")
144918fb8faSGerd Hoffmann        self.console_wait_send("Use password",          "\n")
145918fb8faSGerd Hoffmann        self.console_wait_send("Use an empty password", "\n")
146918fb8faSGerd Hoffmann        self.console_wait_send("Use a random password", "\n")
147918fb8faSGerd Hoffmann        self.console_wait("Enter password:")
148918fb8faSGerd Hoffmann        self.console_send("%s\n" % self.GUEST_PASS)
149918fb8faSGerd Hoffmann        self.console_wait("Enter password again:")
150918fb8faSGerd Hoffmann        self.console_send("%s\n" % self.GUEST_PASS)
151918fb8faSGerd Hoffmann        self.console_wait_send("Lock out",              "\n")
152918fb8faSGerd Hoffmann        self.console_wait_send("OK",                    "yes\n")
153918fb8faSGerd Hoffmann        self.console_wait_send("Add another user",      "no\n")
154918fb8faSGerd Hoffmann
155918fb8faSGerd Hoffmann        self.console_wait_send("Final Configuration",   "\n")
156918fb8faSGerd Hoffmann        self.console_wait_send("Manual Configuration",  "\n")
157918fb8faSGerd Hoffmann        self.console_wait_send("Complete",              "\n")
158918fb8faSGerd Hoffmann
159918fb8faSGerd Hoffmann        self.print_step("Installation finished, rebooting")
160918fb8faSGerd Hoffmann        self.console_boot_serial()
161918fb8faSGerd Hoffmann
162918fb8faSGerd Hoffmann        # setup qemu user
163918fb8faSGerd Hoffmann        prompt = "$"
164918fb8faSGerd Hoffmann        self.console_ssh_init(prompt, self.GUEST_USER, self.GUEST_PASS)
165918fb8faSGerd Hoffmann        self.console_wait_send(prompt, "exit\n")
166918fb8faSGerd Hoffmann
167918fb8faSGerd Hoffmann        # setup root user
168918fb8faSGerd Hoffmann        prompt = "root@freebsd:~ #"
169918fb8faSGerd Hoffmann        self.console_ssh_init(prompt, "root", self.ROOT_PASS)
170918fb8faSGerd Hoffmann        self.console_sshd_config(prompt)
171918fb8faSGerd Hoffmann
172918fb8faSGerd Hoffmann        # setup serial console
173918fb8faSGerd Hoffmann        self.console_wait(prompt)
174918fb8faSGerd Hoffmann        self.console_send("echo 'console=comconsole' >> /boot/loader.conf\n")
175918fb8faSGerd Hoffmann
176918fb8faSGerd Hoffmann        # setup boot delay
177918fb8faSGerd Hoffmann        self.console_wait(prompt)
178918fb8faSGerd Hoffmann        self.console_send("echo 'autoboot_delay=1' >> /boot/loader.conf\n")
179918fb8faSGerd Hoffmann
180918fb8faSGerd Hoffmann        # setup virtio-blk #1 (tarfile)
181918fb8faSGerd Hoffmann        self.console_wait(prompt)
182918fb8faSGerd Hoffmann        self.console_send("echo 'chmod 666 /dev/vtbd1' >> /etc/rc.local\n")
183918fb8faSGerd Hoffmann
184918fb8faSGerd Hoffmann        self.print_step("Configuration finished, rebooting")
185918fb8faSGerd Hoffmann        self.console_wait_send(prompt, "reboot\n")
186918fb8faSGerd Hoffmann        self.console_wait("login:")
187918fb8faSGerd Hoffmann        self.wait_ssh()
188918fb8faSGerd Hoffmann
189918fb8faSGerd Hoffmann        self.print_step("Installing packages")
190918fb8faSGerd Hoffmann        self.ssh_root_check("pkg install -y %s\n" % " ".join(self.pkgs))
191918fb8faSGerd Hoffmann
192918fb8faSGerd Hoffmann        # shutdown
193918fb8faSGerd Hoffmann        self.ssh_root(self.poweroff)
194918fb8faSGerd Hoffmann        self.console_wait("Uptime:")
195918fb8faSGerd Hoffmann        self.wait()
196918fb8faSGerd Hoffmann
197918fb8faSGerd Hoffmann        if os.path.exists(img):
198918fb8faSGerd Hoffmann            os.remove(img)
199111e30c0SFam Zheng        os.rename(img_tmp, img)
200918fb8faSGerd Hoffmann        os.remove(iso)
201918fb8faSGerd Hoffmann        self.print_step("All done")
202111e30c0SFam Zheng
203111e30c0SFam Zhengif __name__ == "__main__":
204111e30c0SFam Zheng    sys.exit(basevm.main(FreeBSDVM))
205