master
x86_64 124 lines 3.42 KB
Raw
1 #!/usr/bin/env python3
2 #
3 # Haiku VM image
4 #
5 # Copyright 2020-2022 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/r1beta4-x86_64/versions/20230114/providers/libvirt.box"
52 csum = "6e72a2a470e03dbc3c5e808664e057bb4022b390dca88e4c7da6188f26f6a3c9"
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:libslirp",
75 "devel:libsnappy",
76 "devel:libssh2",
77 "devel:libtasn1",
78 "devel:libusb_1.0",
79 "devel:libz",
80 "ninja",
81 "pip",
82 "tomli_python310",
83 "wheel_python310",
84 "setuptools_python310",
85 ]
86
87 BUILD_SCRIPT = """
88 set -e;
89 rm -rf /tmp/qemu-test.*
90 cd $(mktemp -d /tmp/qemu-test.XXXXXX);
91 mkdir src build; cd src;
92 tar -xf /dev/disk/virtual/virtio_block/1/raw;
93 mkdir -p /usr/bin
94 ln -s /boot/system/bin/env /usr/bin/env
95 cd ../build
96 ../src/configure {configure_opts};
97 make --output-sync -j{jobs} {target} {verbose};
98 """
99
100 def build_image(self, img):
101 self.print_step("Downloading disk image")
102 tarball = self._download_with_cache(self.link, sha256sum=self.csum)
103
104 self.print_step("Extracting disk image")
105
106 subprocess.check_call(["tar", "xzf", tarball, "box.img", "-O"],
107 stdout=open(img, 'wb'))
108
109 self.print_step("Preparing disk image")
110 self.boot(img)
111
112 # Wait for ssh to be available.
113 self.wait_ssh(wait_root=True, cmd="exit 0")
114
115 # Install packages
116 self.ssh_root("echo yes | pkgman add-repo https://eu.hpkg.haiku-os.org/haiku/r1beta5/$(getarch)/current")
117 self.ssh_root("echo yes | pkgman add-repo https://eu.hpkg.haiku-os.org/haikuports/r1beta5/$(getarch)/current")
118 self.ssh_root("pkgman install -y %s" % " ".join(self.requirements))
119 self.graceful_shutdown()
120
121 self.print_step("All done")
122
123 if __name__ == "__main__":
124 sys.exit(basevm.main(HaikuVM, config=HAIKU_CONFIG))