diff options
Diffstat (limited to '')
-rwxr-xr-x | %HOME%/.local/bin/virsh-cleanup.sh | 98 |
1 files changed, 98 insertions, 0 deletions
diff --git a/%HOME%/.local/bin/virsh-cleanup.sh b/%HOME%/.local/bin/virsh-cleanup.sh new file mode 100755 index 0000000..1cf4c82 --- /dev/null +++ b/%HOME%/.local/bin/virsh-cleanup.sh @@ -0,0 +1,98 @@ +#!/usr/bin/env bash + +# Copyright (c) 2022 Egor Tensin <Egor.Tensin@gmail.com> +# This file is part of the "linux-home" project. +# For details, see https://github.com/egor-tensin/linux-home. +# Distributed under the MIT License. + +set -o errexit -o nounset -o pipefail +shopt -s inherit_errexit + +CONNECT="${CONNECT:=qemu:///system}" +POOL="${POOL:=default}" + +dump() { + local prefix="${FUNCNAME[0]}" + [ "${#FUNCNAME[@]}" -gt 1 ] && prefix="${FUNCNAME[1]}" + + local msg + for msg; do + echo "$prefix: $msg" + done +} + +run_virsh() { + virsh -c "$CONNECT" "$@" +} + +list_domains() { + run_virsh list --all --name +} + +list_networks() { + local output + output="$( run_virsh net-list --all --name )" + + local name + while IFS= read -r name; do + [ "$name" = default ] && continue + echo "$name" + done <<< "$output" +} + +list_volumes() { + local output + output="$( run_virsh vol-list "$POOL" | tail -n +3 | tr -s ' ' )" + + local name + while IFS=' ' read -r name _; do + echo "$name" + done <<< "$output" +} + +remove_domain() { + local domain + for domain; do + dump "$domain" + run_virsh destroy "$domain" + run_virsh undefine "$domain" + done +} + +remove_network() { + local network + for network; do + dump "$network" + run_virsh net-destroy "$network" + run_virsh net-undefine "$network" + done +} + +remove_volume() { + local volume + for volume; do + dump "$volume" + run_virsh vol-delete --pool "$POOL" "$volume" + done +} + +main() { + local output item + + output="$( list_domains )" + if [ -n "$output" ]; then + while IFS= read -r item; do remove_domain "$item"; done <<< "$output" + fi + + output="$( list_volumes )" + if [ -n "$output" ]; then + while IFS= read -r item; do remove_volume "$item"; done <<< "$output" + fi + + output="$( list_networks )" + if [ -n "$output" ]; then + while IFS= read -r item; do remove_network "$item"; done <<< "$output" + fi +} + +main |