Alexander von Gluck IV | 9fc33bf | 2020-10-27 11:21:21 +0100 | [diff] [blame] | 1 | #!/usr/bin/env python3 |
| 2 | # |
| 3 | # Haiku VM image |
| 4 | # |
| 5 | # Copyright 2020 Haiku, Inc. |
| 6 | # |
| 7 | # Authors: |
| 8 | # Alexander von Gluck IV <kallisti5@unixzen.com> |
| 9 | # |
| 10 | # This code is licensed under the GPL version 2 or later. See |
| 11 | # the COPYING file in the top-level directory. |
| 12 | # |
| 13 | |
| 14 | import os |
| 15 | import re |
| 16 | import sys |
| 17 | import time |
| 18 | import socket |
| 19 | import subprocess |
| 20 | import basevm |
| 21 | |
| 22 | VAGRANT_KEY_FILE = os.path.join(os.path.dirname(__file__), |
| 23 | "..", "keys", "vagrant") |
| 24 | |
| 25 | VAGRANT_PUB_KEY_FILE = os.path.join(os.path.dirname(__file__), |
| 26 | "..", "keys", "vagrant.pub") |
| 27 | |
| 28 | HAIKU_CONFIG = { |
| 29 | 'cpu' : "max", |
| 30 | 'machine' : 'pc', |
| 31 | 'guest_user' : "vagrant", |
| 32 | 'guest_pass' : "", |
| 33 | 'root_user' : "vagrant", |
| 34 | 'root_pass' : "", |
| 35 | 'ssh_key_file' : VAGRANT_KEY_FILE, |
| 36 | 'ssh_pub_key_file': VAGRANT_PUB_KEY_FILE, |
| 37 | 'memory' : "4G", |
| 38 | 'extra_args' : [], |
| 39 | 'qemu_args' : "-device VGA", |
| 40 | 'dns' : "", |
| 41 | 'ssh_port' : 0, |
| 42 | 'install_cmds' : "", |
| 43 | 'boot_dev_type' : "block", |
| 44 | 'ssh_timeout' : 1, |
| 45 | } |
| 46 | |
| 47 | class HaikuVM(basevm.BaseVM): |
| 48 | name = "haiku" |
| 49 | arch = "x86_64" |
| 50 | |
| 51 | link = "https://app.vagrantup.com/haiku-os/boxes/r1beta2-x86_64/versions/20200702/providers/libvirt.box" |
| 52 | csum = "41c38b316e0cbdbc66b5dbaf3612b866700a4f35807cb1eb266a5bf83e9e68d5" |
| 53 | |
| 54 | poweroff = "shutdown" |
| 55 | |
| 56 | requirements = [ |
| 57 | "devel:libbz2", |
| 58 | "devel:libcapstone", |
| 59 | "devel:libcurl", |
| 60 | "devel:libfdt", |
| 61 | "devel:libgcrypt", |
| 62 | "devel:libgl", |
| 63 | "devel:libglib_2.0", |
| 64 | "devel:libgnutls", |
| 65 | "devel:libgpg_error", |
| 66 | "devel:libintl", |
| 67 | "devel:libjpeg", |
| 68 | "devel:liblzo2", |
| 69 | "devel:libncursesw", |
| 70 | "devel:libnettle", |
| 71 | "devel:libpixman_1", |
| 72 | "devel:libpng16", |
| 73 | "devel:libsdl2_2.0", |
| 74 | "devel:libsnappy", |
| 75 | "devel:libssh2", |
| 76 | "devel:libtasn1", |
| 77 | "devel:libusb_1.0", |
| 78 | "devel:libz", |
| 79 | "ninja", |
Alexander von Gluck IV | 9fc33bf | 2020-10-27 11:21:21 +0100 | [diff] [blame] | 80 | ] |
| 81 | |
| 82 | # https://dev.haiku-os.org/ticket/16512 virtio disk1 shows up as 0 (reversed order) |
| 83 | BUILD_SCRIPT = """ |
| 84 | set -e; |
| 85 | rm -rf /tmp/qemu-test.* |
| 86 | cd $(mktemp -d /tmp/qemu-test.XXXXXX); |
| 87 | mkdir src build; cd src; |
| 88 | tar -xf /dev/disk/virtual/virtio_block/0/raw; |
| 89 | mkdir -p /usr/bin |
| 90 | ln -s /boot/system/bin/env /usr/bin/env |
| 91 | cd ../build |
| 92 | ../src/configure --disable-slirp {configure_opts}; |
| 93 | make --output-sync -j{jobs} {target} {verbose}; |
| 94 | """ |
| 95 | |
| 96 | def build_image(self, img): |
| 97 | self.print_step("Downloading disk image") |
| 98 | tarball = self._download_with_cache(self.link, sha256sum=self.csum) |
| 99 | |
| 100 | self.print_step("Extracting disk image") |
| 101 | |
| 102 | subprocess.check_call(["tar", "xzf", tarball, "./box.img", "-O"], |
| 103 | stdout=open(img, 'wb')) |
| 104 | |
| 105 | self.print_step("Preparing disk image") |
| 106 | self.boot(img) |
| 107 | |
| 108 | # Wait for ssh to be available. |
| 109 | self.wait_ssh(wait_root=True, cmd="exit 0") |
| 110 | |
| 111 | # Install packages |
| 112 | self.ssh_root("pkgman install -y %s" % " ".join(self.requirements)) |
| 113 | self.graceful_shutdown() |
| 114 | |
| 115 | self.print_step("All done") |
| 116 | |
| 117 | if __name__ == "__main__": |
| 118 | sys.exit(basevm.main(HaikuVM, config=HAIKU_CONFIG)) |