#!/usr/bin/env bash set -euo pipefail ROOT=$(git rev-parse --show-toplevel) VM_NAME="talos-vm" VCPUS="2" RAM_MB="2048" DISK_GB="10" NETWORK=talos CONNECTION="qemu:///system" function define_network() { config_file=$(mktemp) cat > ${config_file} << EOF ${NETWORK} EOF function cleanup() { rm ${config_file} } trap cleanup EXIT if [[ $(virsh --connect="${CONNECTION}" net-list --all | grep -c "${NETWORK}") == "0" ]]; then virsh --connect="${CONNECTION}" net-define "${config_file}" virsh --connect="${CONNECTION}" net-start "${NETWORK}" virsh --connect="${CONNECTION}" net-autostart "${NETWORK}" fi trap - EXIT cleanup } function create() { define_network if [[ $(virsh --connect="${CONNECTION}" list --all | grep -c "${VM_NAME}") == "0" ]]; then virt-install --connect="${CONNECTION}" --name="${VM_NAME}" --vcpus="${VCPUS}" --memory="${RAM_MB}" \ --os-variant="linux2022" \ --disk="size=${DISK_GB}" \ --pxe \ --sysinfo system.serial=${VM_NAME} \ --network network="${NETWORK}" else echo -n "VM already exists, start it with: ${0} start " exit -1 fi } function start() { if [[ $(virsh --connect="${CONNECTION}" list --all | grep -c "${VM_NAME}") > "0" ]]; then virsh --connect="${CONNECTION}" start ${VM_NAME} virt-viewer --connect="${CONNECTION}" ${VM_NAME} else echo -n "VM doest not exists yet, create it with: ${0} create " exit -1 fi } function connect() { if [[ $(virsh --connect="${CONNECTION}" list | grep -c "${VM_NAME}") > "0" ]]; then virt-viewer --connect="${CONNECTION}" ${VM_NAME} else echo "VM is not running" exit -1 fi } function stop() { if [[ $(virsh --connect="${CONNECTION}" list | grep -c "${VM_NAME}") > "0" ]]; then virsh --connect="${CONNECTION}" shutdown ${VM_NAME} WAIT=240 for i in $(seq 0 1 ${WAIT}); do echo -en "\rWaiting for VM to shutdown... (${i}/${WAIT})" if [[ $(virsh --connect="${CONNECTION}" list | grep -c "${VM_NAME}") == "0" ]]; then echo -e "\nVM successfully shutdown" exit fi sleep 1 done echo -e "\nDestroying VM" virsh --connect="${CONNECTION}" destroy ${VM_NAME} else echo "VM is not running" exit -1 fi } function delete() { if [[ $(virsh --connect="${CONNECTION}" list --all | grep -c "${VM_NAME}") > "0" ]]; then if [[ $(virsh --connect="${CONNECTION}" list | grep -c "${VM_NAME}") > "0" ]]; then virsh --connect="${CONNECTION}" destroy "${VM_NAME}" fi virsh --connect="${CONNECTION}" undefine "${VM_NAME}" --remove-all-storage else echo "VM doest not exists" exit -1 fi if [[ $(virsh --connect="${CONNECTION}" net-list --all | grep -c "${NETWORK}") > "0" ]]; then virsh --connect="${CONNECTION}" net-destroy "${NETWORK}" virsh --connect="${CONNECTION}" net-undefine "${NETWORK}" fi } function help() { echo -n "Available commands: start stop remove connect " } COMMAND=${1:-} case ${COMMAND} in create) create Create the vm and perform first install ;; start) start Start the vm ;; stop) stop Stop the vm ;; delete) delete Delete the vm ;; connect) connect Connect to an already running vm ;; *) help ;; esac