1
0
Fork 0

Make removal script support ids or names

This commit is contained in:
Nicolas Jeannerod 2025-02-24 18:33:44 +01:00
parent fb5bed9042
commit bc8ad08228
Signed by untrusted user: Niols
GPG key ID: 35DB9EC8886E1CB8

View file

@ -18,11 +18,11 @@ mkdir $tmpdir
api_url=
username=
password=
vm_ids=
vm_ids_or_names=
help () {
cat <<EOF
Usage: $0 [OPTION...] ID [ID...]
Usage: $0 [OPTION...] ID_OR_NAME [ID_OR_NAME...]
Options:
--api-url STR Base URL of the Proxmox API (required)
@ -35,7 +35,6 @@ Options can also be provided by adding assignments to a '.proxmox' file in the
current working directory. For instance, it could contain:
api_url=https://192.168.51.81:8006/api2/json
cores=7
username=mireille@pve
debug=true
@ -64,12 +63,12 @@ while [ $# -gt 0 ]; do
-*) die_with_help "Unknown argument: '%s'." "$argument" ;;
*) vm_ids="$vm_ids $argument" ;;
*) vm_ids_or_names="$vm_ids_or_names $argument" ;;
esac
done
if [ -z "$vm_ids" ]; then
die_with_help "Required: at least one VM id.\n"
if [ -z "$vm_ids_or_names" ]; then
die_with_help "Required: at least one VM id or name.\n"
fi
if [ -z "$api_url" ] || [ -z "$username" ] || [ -z "$password" ]; then
@ -129,48 +128,89 @@ proxmox_sync () (
done
)
################################################################################
## Grab VM options
##
## Takes the name of the VM, grabs `.#vmOptions.<name>` and gets the id from it.
is_integer () {
[ "$1" -eq "$1" ] 2>/dev/null
}
grab_vm_options () {
local options
if is_integer "$1"; then
vm_id=$1
vm_name="#$1"
else
vm_name=$1
printf 'Grabing VM options for VM %s...\n' "$vm_name"
options=$(
nix eval \
--impure --raw --expr "
builtins.toJSON (builtins.getFlake (builtins.toString ./.)).vmOptions.$vm_name
" \
--log-format raw --quiet
)
proxmox=$(echo "$options" | jq -r .proxmox)
vm_id=$(echo "$options" | jq -r .vmId)
if [ "$proxmox" != fediversity ]; then
die "I do not know how to remove things that are not Fediversity VMs,
but I got proxmox = '%s' for VM %s." "$proxmox" "$vm_name"
fi
printf 'done grabing VM options for VM %s. Got %d.\n' "$vm_name" "$vm_id"
fi
}
################################################################################
## Stop VM
stop_vm () {
printf 'Stopping VM %d...\n' "$1"
printf 'Stopping VM %s...\n' "$vm_name"
proxmox_sync POST "$api_url/nodes/$node/qemu/$1/status/stop" \
proxmox_sync POST "$api_url/nodes/$node/qemu/$vm_id/status/stop" \
'overrule-shutdown'==1
printf 'done stopping VM %d.\n' "$1"
printf 'done stopping VM %s.\n' "$vm_name"
}
################################################################################
## Delete VM
delete_vm () {
printf 'Deleting VM %d...\n' "$1"
printf 'Deleting VM %s...\n' "$vm_name"
proxmox_sync DELETE "$api_url/nodes/$node/qemu/$1" \
proxmox_sync DELETE "$api_url/nodes/$node/qemu/$vm_id" \
'destroy-unreferenced-disks'==1 \
'purge'==1
printf 'done deleting VM %d.\n' "$1"
printf 'done deleting VM %s.\n' "$vm_name"
}
################################################################################
## Main loop
printf 'Removing VMs%s...\n' "$vm_ids"
printf 'Removing VMs%s...\n' "$vm_ids_or_names"
remove_vm () {
stop_vm "$1"
delete_vm "$1"
}
remove_vm () (
grab_vm_options "$1"
stop_vm
delete_vm
)
for vm_id in $vm_ids; do
vm_id=${vm_id%:*}
remove_vm "$vm_id" &
for vm_id_or_name in $vm_ids_or_names; do
remove_vm "$vm_id_or_name" &
done
wait
printf 'done removing VMs%s.\n' "$vm_ids"
printf 'done removing VMs%s.\n' "$vm_ids_or_names"
################################################################################
## Cleanup