#!/bin/sh set -eu instance_id=${1:?instance ID is required} nonce=${2:?registration nonce is required} case "$instance_id" in ????????-????-????-????-????????????) ;; *) echo "invalid instance ID" >&2; exit 64 ;; esac case "$nonce" in *[!A-Za-z0-9_-]*|'') echo "invalid nonce" >&2; exit 64 ;; esac state_root=${RUNNER_STATE_ROOT:-/var/lib/microvm-runner} base_image=${RUNNER_BASE_IMAGE:-$state_root/images/runner-base.qcow2} firmware=${RUNNER_FIRMWARE:-$state_root/firmware/CLOUDHV.fd} bridge=${RUNNER_BRIDGE:-mvrbr0} cloud_hypervisor=${CLOUD_HYPERVISOR:-/usr/local/bin/cloud-hypervisor} vm_timeout=${RUNNER_VM_TIMEOUT:-3h} cpus=${RUNNER_VM_CPUS:-4} memory=${RUNNER_VM_MEMORY:-3G} gitea_instance=${GITEA_INSTANCE:-https://git.ddupan.top} runner_labels=${RUNNER_LABELS:-self-hosted:host,vm:host} token_url=${RUNNER_TOKEN_URL:-http://172.30.0.1:8787} vm_dir="$state_root/instances/$instance_id" tap="mvr${instance_id%%-*}" overlay="$vm_dir/root.qcow2" seed="$vm_dir/seed.img" serial="$vm_dir/serial.log" cleanup() { ip link delete "$tap" 2>/dev/null || true rm -rf -- "$vm_dir" } trap cleanup EXIT INT TERM test -r "$base_image" test -r "$firmware" install -d -m 0700 "$state_root/instances" "$vm_dir" qemu-img create -q -f qcow2 -F qcow2 -b "$base_image" "$overlay" cat >"$vm_dir/meta-data" <"$vm_dir/user-data" <