forked from Fediversity/Fediversity
Make removal script support ids or names
This commit is contained in:
parent
fb5bed9042
commit
bc8ad08228
1 changed files with 61 additions and 21 deletions
|
@ -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
|
||||
|
|
Loading…
Add table
Reference in a new issue