debian-forge-composer/tools/deploy-qemu
Ondřej Budai 99d1d4e5d0 tools/deploy-qemu: use default temp dir location
Previously, the temporary directory was created in the script dir. It just
imo created unnecessary and confusing files in my git checkout. Let's just
use the default temporary directory because we don't really have special
needs for it.

Signed-off-by: Ondřej Budai <ondrej@budai.cz>
2021-06-22 14:45:54 +02:00

73 lines
2.6 KiB
Python
Executable file

#!/usr/bin/env python3
import os
import shutil
import subprocess
import sys
import tempfile
HELP_TEXT="""deploy-qemu IMAGE USERDATA
Starts an ephemeral virtual machine in qemu, injecting configuration via
cloud-init. Stopping this script stops the VM and discards all data.
IMAGE -- An os image that can be booted by qemu and has cloud-init
installed and enabled. No changes are made to this file.
USERDATA -- A cloud-init user-data config file, or a directory of
configuration as accepted by the `gen-user-data` tool.
In addition, if the QEMU_EXTRA_ARGS environment variable is defined, it adds
its content as additional arguments to qemu."""
if len(sys.argv) != 3:
print(HELP_TEXT)
exit(1)
script_dir = os.path.dirname(os.path.realpath(__file__))
image = sys.argv[1]
userdata = sys.argv[2]
qemu_extra_args = os.getenv("QEMU_EXTRA_ARGS")
qemu_extra_args = qemu_extra_args.split(' ') if qemu_extra_args is not None else []
with tempfile.TemporaryDirectory(prefix="qemu-tmp-") as workdir:
os.mkdir(os.path.join(workdir, "cidata"))
if os.path.isdir(userdata):
gen_user_data = subprocess.run([os.path.join(script_dir, "gen-user-data"), userdata], check=True, capture_output=True, encoding="utf-8")
with open(os.path.join(workdir, "cidata", "user-data"), "w") as f:
f.write(gen_user_data.stdout)
else:
shutil.copyfile(userdata, os.path.join(workdir, "cidata", "user-data"))
with open(os.path.join(workdir, "cidata", "meta-data"), "w") as f:
f.writelines(["instance-id: nocloud\n", "local-hostname: vm\n"])
if sys.platform == "linux":
subprocess.run(["mkisofs",
"-input-charset", "utf-8",
"-output", f"{workdir}/cloudinit.iso",
"-volid", "cidata",
"-joliet",
"-rock",
"-quiet",
"-graft-points",
f"{workdir}/cidata/user-data",
f"{workdir}/cidata/meta-data"], check=True)
elif sys.platform == "darwin":
# conviently uses the last component of source as volumeid, which has to be cidata
subprocess.run(["hdiutil", "makehybrid", "-iso", "-joliet", "-o", f"{workdir}/cloudinit.iso", f"{workdir}/cidata"], check=True)
subprocess.run(["qemu-system-x86_64",
"-M", "accel=kvm:hvf",
"-m", "1024",
"-snapshot",
"-cpu", "host",
"-net", "nic,model=virtio",
"-net", "user,hostfwd=tcp::2222-:22,hostfwd=tcp::4430-:443",
"-cdrom", f"{workdir}/cloudinit.iso",
*qemu_extra_args,
image])