19fc33bf4SAlexander von Gluck IV#!/usr/bin/env python3 29fc33bf4SAlexander von Gluck IV# 39fc33bf4SAlexander von Gluck IV# Haiku VM image 49fc33bf4SAlexander von Gluck IV# 563021223SThomas Huth# Copyright 2020-2022 Haiku, Inc. 69fc33bf4SAlexander von Gluck IV# 79fc33bf4SAlexander von Gluck IV# Authors: 89fc33bf4SAlexander von Gluck IV# Alexander von Gluck IV <kallisti5@unixzen.com> 99fc33bf4SAlexander von Gluck IV# 109fc33bf4SAlexander von Gluck IV# This code is licensed under the GPL version 2 or later. See 119fc33bf4SAlexander von Gluck IV# the COPYING file in the top-level directory. 129fc33bf4SAlexander von Gluck IV# 139fc33bf4SAlexander von Gluck IV 149fc33bf4SAlexander von Gluck IVimport os 159fc33bf4SAlexander von Gluck IVimport re 169fc33bf4SAlexander von Gluck IVimport sys 179fc33bf4SAlexander von Gluck IVimport time 189fc33bf4SAlexander von Gluck IVimport socket 199fc33bf4SAlexander von Gluck IVimport subprocess 209fc33bf4SAlexander von Gluck IVimport basevm 219fc33bf4SAlexander von Gluck IV 229fc33bf4SAlexander von Gluck IVVAGRANT_KEY_FILE = os.path.join(os.path.dirname(__file__), 239fc33bf4SAlexander von Gluck IV "..", "keys", "vagrant") 249fc33bf4SAlexander von Gluck IV 259fc33bf4SAlexander von Gluck IVVAGRANT_PUB_KEY_FILE = os.path.join(os.path.dirname(__file__), 269fc33bf4SAlexander von Gluck IV "..", "keys", "vagrant.pub") 279fc33bf4SAlexander von Gluck IV 289fc33bf4SAlexander von Gluck IVHAIKU_CONFIG = { 299fc33bf4SAlexander von Gluck IV 'cpu' : "max", 309fc33bf4SAlexander von Gluck IV 'machine' : 'pc', 319fc33bf4SAlexander von Gluck IV 'guest_user' : "vagrant", 329fc33bf4SAlexander von Gluck IV 'guest_pass' : "", 339fc33bf4SAlexander von Gluck IV 'root_user' : "vagrant", 349fc33bf4SAlexander von Gluck IV 'root_pass' : "", 359fc33bf4SAlexander von Gluck IV 'ssh_key_file' : VAGRANT_KEY_FILE, 369fc33bf4SAlexander von Gluck IV 'ssh_pub_key_file': VAGRANT_PUB_KEY_FILE, 379fc33bf4SAlexander von Gluck IV 'memory' : "4G", 389fc33bf4SAlexander von Gluck IV 'extra_args' : [], 399fc33bf4SAlexander von Gluck IV 'qemu_args' : "-device VGA", 409fc33bf4SAlexander von Gluck IV 'dns' : "", 419fc33bf4SAlexander von Gluck IV 'ssh_port' : 0, 429fc33bf4SAlexander von Gluck IV 'install_cmds' : "", 439fc33bf4SAlexander von Gluck IV 'boot_dev_type' : "block", 449fc33bf4SAlexander von Gluck IV 'ssh_timeout' : 1, 459fc33bf4SAlexander von Gluck IV} 469fc33bf4SAlexander von Gluck IV 479fc33bf4SAlexander von Gluck IVclass HaikuVM(basevm.BaseVM): 489fc33bf4SAlexander von Gluck IV name = "haiku" 499fc33bf4SAlexander von Gluck IV arch = "x86_64" 509fc33bf4SAlexander von Gluck IV 51*66ef41d2SThomas Huth link = "https://app.vagrantup.com/haiku-os/boxes/r1beta4-x86_64/versions/20230114/providers/libvirt.box" 52*66ef41d2SThomas Huth csum = "6e72a2a470e03dbc3c5e808664e057bb4022b390dca88e4c7da6188f26f6a3c9" 539fc33bf4SAlexander von Gluck IV 549fc33bf4SAlexander von Gluck IV poweroff = "shutdown" 559fc33bf4SAlexander von Gluck IV 569fc33bf4SAlexander von Gluck IV requirements = [ 579fc33bf4SAlexander von Gluck IV "devel:libbz2", 589fc33bf4SAlexander von Gluck IV "devel:libcapstone", 599fc33bf4SAlexander von Gluck IV "devel:libcurl", 609fc33bf4SAlexander von Gluck IV "devel:libfdt", 619fc33bf4SAlexander von Gluck IV "devel:libgcrypt", 629fc33bf4SAlexander von Gluck IV "devel:libgl", 639fc33bf4SAlexander von Gluck IV "devel:libglib_2.0", 649fc33bf4SAlexander von Gluck IV "devel:libgnutls", 659fc33bf4SAlexander von Gluck IV "devel:libgpg_error", 669fc33bf4SAlexander von Gluck IV "devel:libintl", 679fc33bf4SAlexander von Gluck IV "devel:libjpeg", 689fc33bf4SAlexander von Gluck IV "devel:liblzo2", 699fc33bf4SAlexander von Gluck IV "devel:libncursesw", 709fc33bf4SAlexander von Gluck IV "devel:libnettle", 719fc33bf4SAlexander von Gluck IV "devel:libpixman_1", 729fc33bf4SAlexander von Gluck IV "devel:libpng16", 739fc33bf4SAlexander von Gluck IV "devel:libsdl2_2.0", 740026be1dSThomas Huth "devel:libslirp", 759fc33bf4SAlexander von Gluck IV "devel:libsnappy", 769fc33bf4SAlexander von Gluck IV "devel:libssh2", 779fc33bf4SAlexander von Gluck IV "devel:libtasn1", 789fc33bf4SAlexander von Gluck IV "devel:libusb_1.0", 799fc33bf4SAlexander von Gluck IV "devel:libz", 809fc33bf4SAlexander von Gluck IV "ninja", 819fc33bf4SAlexander von Gluck IV ] 829fc33bf4SAlexander von Gluck IV 839fc33bf4SAlexander von Gluck IV BUILD_SCRIPT = """ 849fc33bf4SAlexander von Gluck IV set -e; 859fc33bf4SAlexander von Gluck IV rm -rf /tmp/qemu-test.* 869fc33bf4SAlexander von Gluck IV cd $(mktemp -d /tmp/qemu-test.XXXXXX); 879fc33bf4SAlexander von Gluck IV mkdir src build; cd src; 88*66ef41d2SThomas Huth tar -xf /dev/disk/virtual/virtio_block/1/raw; 899fc33bf4SAlexander von Gluck IV mkdir -p /usr/bin 909fc33bf4SAlexander von Gluck IV ln -s /boot/system/bin/env /usr/bin/env 919fc33bf4SAlexander von Gluck IV cd ../build 920026be1dSThomas Huth ../src/configure {configure_opts}; 939fc33bf4SAlexander von Gluck IV make --output-sync -j{jobs} {target} {verbose}; 949fc33bf4SAlexander von Gluck IV """ 959fc33bf4SAlexander von Gluck IV 969fc33bf4SAlexander von Gluck IV def build_image(self, img): 979fc33bf4SAlexander von Gluck IV self.print_step("Downloading disk image") 989fc33bf4SAlexander von Gluck IV tarball = self._download_with_cache(self.link, sha256sum=self.csum) 999fc33bf4SAlexander von Gluck IV 1009fc33bf4SAlexander von Gluck IV self.print_step("Extracting disk image") 1019fc33bf4SAlexander von Gluck IV 10263021223SThomas Huth subprocess.check_call(["tar", "xzf", tarball, "box.img", "-O"], 1039fc33bf4SAlexander von Gluck IV stdout=open(img, 'wb')) 1049fc33bf4SAlexander von Gluck IV 1059fc33bf4SAlexander von Gluck IV self.print_step("Preparing disk image") 1069fc33bf4SAlexander von Gluck IV self.boot(img) 1079fc33bf4SAlexander von Gluck IV 1089fc33bf4SAlexander von Gluck IV # Wait for ssh to be available. 1099fc33bf4SAlexander von Gluck IV self.wait_ssh(wait_root=True, cmd="exit 0") 1109fc33bf4SAlexander von Gluck IV 1119fc33bf4SAlexander von Gluck IV # Install packages 1129fc33bf4SAlexander von Gluck IV self.ssh_root("pkgman install -y %s" % " ".join(self.requirements)) 1139fc33bf4SAlexander von Gluck IV self.graceful_shutdown() 1149fc33bf4SAlexander von Gluck IV 1159fc33bf4SAlexander von Gluck IV self.print_step("All done") 1169fc33bf4SAlexander von Gluck IV 1179fc33bf4SAlexander von Gluck IVif __name__ == "__main__": 1189fc33bf4SAlexander von Gluck IV sys.exit(basevm.main(HaikuVM, config=HAIKU_CONFIG)) 119