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