xref: /openbmc/qemu/tests/vm/openbsd (revision 12745eaa02f4e4bd730126388a83e14ebe576f34)
1fdfaa332SFam Zheng#!/usr/bin/env python
2fdfaa332SFam Zheng#
3fdfaa332SFam Zheng# OpenBSD VM image
4fdfaa332SFam Zheng#
5*12745eaaSGerd Hoffmann# Copyright 2017-2019 Red Hat Inc.
6fdfaa332SFam Zheng#
7fdfaa332SFam Zheng# Authors:
8fdfaa332SFam Zheng#  Fam Zheng <famz@redhat.com>
9*12745eaaSGerd Hoffmann#  Gerd Hoffmann <kraxel@redhat.com>
10fdfaa332SFam Zheng#
11fdfaa332SFam Zheng# This code is licensed under the GPL version 2 or later.  See
12fdfaa332SFam Zheng# the COPYING file in the top-level directory.
13fdfaa332SFam Zheng#
14fdfaa332SFam Zheng
15fdfaa332SFam Zhengimport os
16fdfaa332SFam Zhengimport sys
17*12745eaaSGerd Hoffmannimport socket
18fdfaa332SFam Zhengimport subprocess
19fdfaa332SFam Zhengimport basevm
20fdfaa332SFam Zheng
21fdfaa332SFam Zhengclass OpenBSDVM(basevm.BaseVM):
22fdfaa332SFam Zheng    name = "openbsd"
2331719c37SPhilippe Mathieu-Daudé    arch = "x86_64"
24*12745eaaSGerd Hoffmann
25*12745eaaSGerd Hoffmann    link = "https://cdn.openbsd.org/pub/OpenBSD/6.5/amd64/install65.iso"
26*12745eaaSGerd Hoffmann    csum = "38d1f8cadd502f1c27bf05c5abde6cc505dd28f3f34f8a941048ff9a54f9f608"
27*12745eaaSGerd Hoffmann    size = "20G"
28*12745eaaSGerd Hoffmann    pkgs = [
29*12745eaaSGerd Hoffmann        # tools
30*12745eaaSGerd Hoffmann        "git",
31*12745eaaSGerd Hoffmann        "pkgconf",
32*12745eaaSGerd Hoffmann        "bzip2", "xz",
33*12745eaaSGerd Hoffmann
34*12745eaaSGerd Hoffmann        # gnu tools
35*12745eaaSGerd Hoffmann        "bash",
36*12745eaaSGerd Hoffmann        "gmake",
37*12745eaaSGerd Hoffmann        "gsed",
38*12745eaaSGerd Hoffmann        "bison",
39*12745eaaSGerd Hoffmann
40*12745eaaSGerd Hoffmann        # libs: usb
41*12745eaaSGerd Hoffmann        "libusb1",
42*12745eaaSGerd Hoffmann
43*12745eaaSGerd Hoffmann        # libs: crypto
44*12745eaaSGerd Hoffmann        "gnutls",
45*12745eaaSGerd Hoffmann
46*12745eaaSGerd Hoffmann        # libs: images
47*12745eaaSGerd Hoffmann        "jpeg",
48*12745eaaSGerd Hoffmann        "png",
49*12745eaaSGerd Hoffmann
50*12745eaaSGerd Hoffmann	# libs: ui
51*12745eaaSGerd Hoffmann        "sdl2",
52*12745eaaSGerd Hoffmann        "gtk+3",
53*12745eaaSGerd Hoffmann        "libxkbcommon",
54*12745eaaSGerd Hoffmann    ]
55*12745eaaSGerd Hoffmann
56fdfaa332SFam Zheng    BUILD_SCRIPT = """
57fdfaa332SFam Zheng        set -e;
58*12745eaaSGerd Hoffmann        rm -rf /home/qemu/qemu-test.*
59*12745eaaSGerd Hoffmann        cd $(mktemp -d /home/qemu/qemu-test.XXXXXX);
60*12745eaaSGerd Hoffmann        mkdir src build; cd src;
61fdfaa332SFam Zheng        tar -xf /dev/rsd1c;
62*12745eaaSGerd Hoffmann        cd ../build
63*12745eaaSGerd Hoffmann        ../src/configure --cc=cc --python=python3 {configure_opts};
64*12745eaaSGerd Hoffmann        gmake --output-sync -j{jobs} {target} {verbose};
65fdfaa332SFam Zheng    """
66*12745eaaSGerd Hoffmann    poweroff = "halt -p"
67fdfaa332SFam Zheng
68fdfaa332SFam Zheng    def build_image(self, img):
69*12745eaaSGerd Hoffmann        self.print_step("Downloading install iso")
70*12745eaaSGerd Hoffmann        cimg = self._download_with_cache(self.link, sha256sum=self.csum)
71fdfaa332SFam Zheng        img_tmp = img + ".tmp"
72*12745eaaSGerd Hoffmann        iso = img + ".install.iso"
73*12745eaaSGerd Hoffmann
74*12745eaaSGerd Hoffmann        self.print_step("Preparing iso and disk image")
75*12745eaaSGerd Hoffmann        subprocess.check_call(["cp", "-f", cimg, iso])
76*12745eaaSGerd Hoffmann        subprocess.check_call(["qemu-img", "create", "-f", "qcow2",
77*12745eaaSGerd Hoffmann                               img_tmp, self.size])
78*12745eaaSGerd Hoffmann
79*12745eaaSGerd Hoffmann        self.print_step("Booting installer")
80*12745eaaSGerd Hoffmann        self.boot(img_tmp, extra_args = [
81*12745eaaSGerd Hoffmann            "-bios", "pc-bios/bios-256k.bin",
82*12745eaaSGerd Hoffmann            "-machine", "graphics=off",
83*12745eaaSGerd Hoffmann            "-cdrom", iso
84*12745eaaSGerd Hoffmann        ])
85*12745eaaSGerd Hoffmann        self.console_init()
86*12745eaaSGerd Hoffmann        self.console_wait_send("boot>", "set tty com0\n")
87*12745eaaSGerd Hoffmann        self.console_wait_send("boot>", "\n")
88*12745eaaSGerd Hoffmann
89*12745eaaSGerd Hoffmann        # pre-install configuration
90*12745eaaSGerd Hoffmann        self.console_wait_send("(I)nstall",               "i\n")
91*12745eaaSGerd Hoffmann        self.console_wait_send("Terminal type",           "xterm\n")
92*12745eaaSGerd Hoffmann        self.console_wait_send("System hostname",         "openbsd\n")
93*12745eaaSGerd Hoffmann        self.console_wait_send("Which network interface", "vio0\n")
94*12745eaaSGerd Hoffmann        self.console_wait_send("IPv4 address",            "dhcp\n")
95*12745eaaSGerd Hoffmann        self.console_wait_send("IPv6 address",            "none\n")
96*12745eaaSGerd Hoffmann        self.console_wait_send("Which network interface", "done\n")
97*12745eaaSGerd Hoffmann        self.console_wait_send("DNS domain name",         "localnet\n")
98*12745eaaSGerd Hoffmann        self.console_wait("Password for root account")
99*12745eaaSGerd Hoffmann        self.console_send("%s\n" % self.ROOT_PASS)
100*12745eaaSGerd Hoffmann        self.console_wait("Password for root account")
101*12745eaaSGerd Hoffmann        self.console_send("%s\n" % self.ROOT_PASS)
102*12745eaaSGerd Hoffmann        self.console_wait_send("Start sshd(8)",           "yes\n")
103*12745eaaSGerd Hoffmann        self.console_wait_send("X Window System",         "\n")
104*12745eaaSGerd Hoffmann        self.console_wait_send("xenodm",                  "\n")
105*12745eaaSGerd Hoffmann        self.console_wait_send("console to com0",         "\n")
106*12745eaaSGerd Hoffmann        self.console_wait_send("Which speed",             "\n")
107*12745eaaSGerd Hoffmann
108*12745eaaSGerd Hoffmann        self.console_wait("Setup a user")
109*12745eaaSGerd Hoffmann        self.console_send("%s\n" % self.GUEST_USER)
110*12745eaaSGerd Hoffmann        self.console_wait("Full name")
111*12745eaaSGerd Hoffmann        self.console_send("%s\n" % self.GUEST_USER)
112*12745eaaSGerd Hoffmann        self.console_wait("Password")
113*12745eaaSGerd Hoffmann        self.console_send("%s\n" % self.GUEST_PASS)
114*12745eaaSGerd Hoffmann        self.console_wait("Password")
115*12745eaaSGerd Hoffmann        self.console_send("%s\n" % self.GUEST_PASS)
116*12745eaaSGerd Hoffmann
117*12745eaaSGerd Hoffmann        self.console_wait_send("Allow root ssh login",    "yes\n")
118*12745eaaSGerd Hoffmann        self.console_wait_send("timezone",                "UTC\n")
119*12745eaaSGerd Hoffmann        self.console_wait_send("root disk",               "\n")
120*12745eaaSGerd Hoffmann        self.console_wait_send("(W)hole disk",            "\n")
121*12745eaaSGerd Hoffmann        self.console_wait_send("(A)uto layout",           "\n")
122*12745eaaSGerd Hoffmann        self.console_wait_send("Location of sets",        "cd0\n")
123*12745eaaSGerd Hoffmann        self.console_wait_send("Pathname to the sets",    "\n")
124*12745eaaSGerd Hoffmann        self.console_wait_send("Set name(s)",             "\n")
125*12745eaaSGerd Hoffmann        self.console_wait_send("without verification",    "yes\n")
126*12745eaaSGerd Hoffmann
127*12745eaaSGerd Hoffmann        self.print_step("Installation started now, this will take a while")
128*12745eaaSGerd Hoffmann        self.console_wait_send("Location of sets",        "done\n")
129*12745eaaSGerd Hoffmann
130*12745eaaSGerd Hoffmann        self.console_wait("successfully completed")
131*12745eaaSGerd Hoffmann        self.print_step("Installation finished, rebooting")
132*12745eaaSGerd Hoffmann        self.console_wait_send("(R)eboot",                "reboot\n")
133*12745eaaSGerd Hoffmann
134*12745eaaSGerd Hoffmann        # setup qemu user
135*12745eaaSGerd Hoffmann        prompt = "$"
136*12745eaaSGerd Hoffmann        self.console_ssh_init(prompt, self.GUEST_USER, self.GUEST_PASS)
137*12745eaaSGerd Hoffmann        self.console_wait_send(prompt, "exit\n")
138*12745eaaSGerd Hoffmann
139*12745eaaSGerd Hoffmann        # setup root user
140*12745eaaSGerd Hoffmann        prompt = "openbsd#"
141*12745eaaSGerd Hoffmann        self.console_ssh_init(prompt, "root", self.ROOT_PASS)
142*12745eaaSGerd Hoffmann        self.console_sshd_config(prompt)
143*12745eaaSGerd Hoffmann
144*12745eaaSGerd Hoffmann        # setup virtio-blk #1 (tarfile)
145*12745eaaSGerd Hoffmann        self.console_wait(prompt)
146*12745eaaSGerd Hoffmann        self.console_send("echo 'chmod 666 /dev/rsd1c' >> /etc/rc.local\n")
147*12745eaaSGerd Hoffmann
148*12745eaaSGerd Hoffmann        # enable w+x for /home
149*12745eaaSGerd Hoffmann        self.console_wait(prompt)
150*12745eaaSGerd Hoffmann        self.console_send("sed -i -e '/home/s/rw,/rw,wxallowed,/' /etc/fstab\n")
151*12745eaaSGerd Hoffmann
152*12745eaaSGerd Hoffmann        # tweak datasize limit
153*12745eaaSGerd Hoffmann        self.console_wait(prompt)
154*12745eaaSGerd Hoffmann        self.console_send("sed -i -e 's/\\(datasize[^=]*\\)=[^:]*/\\1=infinity/' /etc/login.conf\n")
155*12745eaaSGerd Hoffmann
156*12745eaaSGerd Hoffmann        # use http (be proxy cache friendly)
157*12745eaaSGerd Hoffmann        self.console_wait(prompt)
158*12745eaaSGerd Hoffmann        self.console_send("sed -i -e 's/https/http/' /etc/installurl\n")
159*12745eaaSGerd Hoffmann
160*12745eaaSGerd Hoffmann        self.print_step("Configuration finished, rebooting")
161*12745eaaSGerd Hoffmann        self.console_wait_send(prompt, "reboot\n")
162*12745eaaSGerd Hoffmann        self.console_wait("login:")
163*12745eaaSGerd Hoffmann        self.wait_ssh()
164*12745eaaSGerd Hoffmann
165*12745eaaSGerd Hoffmann        self.print_step("Installing packages")
166*12745eaaSGerd Hoffmann        self.ssh_root_check("pkg_add %s\n" % " ".join(self.pkgs))
167*12745eaaSGerd Hoffmann
168*12745eaaSGerd Hoffmann        # shutdown
169*12745eaaSGerd Hoffmann        self.ssh_root(self.poweroff)
170*12745eaaSGerd Hoffmann        self.wait()
171*12745eaaSGerd Hoffmann
172*12745eaaSGerd Hoffmann        if os.path.exists(img):
173*12745eaaSGerd Hoffmann            os.remove(img)
174fdfaa332SFam Zheng        os.rename(img_tmp, img)
175*12745eaaSGerd Hoffmann        os.remove(iso)
176*12745eaaSGerd Hoffmann        self.print_step("All done")
177fdfaa332SFam Zheng
178fdfaa332SFam Zhengif __name__ == "__main__":
179fdfaa332SFam Zheng    sys.exit(basevm.main(OpenBSDVM))
180