118 lines
4.2 KiB
Bash
118 lines
4.2 KiB
Bash
|
|
#!/bin/bash
|
||
|
|
|
||
|
|
# Force cleanup script for orphaned VMs with lock files
|
||
|
|
# This script attempts to remove lock files and force delete VMs
|
||
|
|
|
||
|
|
set -e
|
||
|
|
|
||
|
|
PROXMOX_ENDPOINT="${PROXMOX_ENDPOINT:-https://192.168.11.10:8006}"
|
||
|
|
PROXMOX_NODE="${PROXMOX_NODE:-ml110-01}"
|
||
|
|
PROXMOX_USER="${PROXMOX_USER:-}"
|
||
|
|
PROXMOX_PASS="${PROXMOX_PASS:-}"
|
||
|
|
PROXMOX_SSH_HOST="${PROXMOX_SSH_HOST:-192.168.11.10}"
|
||
|
|
PROXMOX_SSH_USER="${PROXMOX_SSH_USER:-root}"
|
||
|
|
|
||
|
|
ORPHANED_VMS=(234 235 100 101 102)
|
||
|
|
|
||
|
|
if [ -z "$PROXMOX_USER" ] || [ -z "$PROXMOX_PASS" ]; then
|
||
|
|
echo "Error: PROXMOX_USER and PROXMOX_PASS must be set"
|
||
|
|
exit 1
|
||
|
|
fi
|
||
|
|
|
||
|
|
echo "Force cleanup of orphaned VMs with lock files"
|
||
|
|
echo "=============================================="
|
||
|
|
echo ""
|
||
|
|
|
||
|
|
# Get authentication ticket
|
||
|
|
TICKET=$(curl -s -k -d "username=${PROXMOX_USER}&password=${PROXMOX_PASS}" \
|
||
|
|
"${PROXMOX_ENDPOINT}/api2/json/access/ticket" | \
|
||
|
|
jq -r '.data.ticket // empty')
|
||
|
|
|
||
|
|
if [ -z "$TICKET" ]; then
|
||
|
|
echo "Error: Failed to authenticate with Proxmox"
|
||
|
|
exit 1
|
||
|
|
fi
|
||
|
|
|
||
|
|
CSRF_TOKEN=$(curl -s -k -d "username=${PROXMOX_USER}&password=${PROXMOX_PASS}" \
|
||
|
|
"${PROXMOX_ENDPOINT}/api2/json/access/ticket" | \
|
||
|
|
jq -r '.data.CSRFPreventionToken // empty')
|
||
|
|
|
||
|
|
echo "Attempting to remove lock files and delete VMs..."
|
||
|
|
echo ""
|
||
|
|
|
||
|
|
for VMID in "${ORPHANED_VMS[@]}"; do
|
||
|
|
echo "Processing VM $VMID..."
|
||
|
|
|
||
|
|
# Check if VM exists
|
||
|
|
VM_EXISTS=$(curl -s -k -b "PVEAuthCookie=${TICKET}" \
|
||
|
|
"${PROXMOX_ENDPOINT}/api2/json/nodes/${PROXMOX_NODE}/qemu/${VMID}/status/current" 2>/dev/null | \
|
||
|
|
jq -r '.data // empty')
|
||
|
|
|
||
|
|
if [ -n "$VM_EXISTS" ] && [ "$VM_EXISTS" != "null" ]; then
|
||
|
|
echo " VM $VMID exists"
|
||
|
|
|
||
|
|
# Try multiple unlock attempts
|
||
|
|
for i in {1..3}; do
|
||
|
|
echo " Unlock attempt $i..."
|
||
|
|
curl -s -k -b "PVEAuthCookie=${TICKET}" \
|
||
|
|
-H "CSRFPreventionToken: ${CSRF_TOKEN}" \
|
||
|
|
-X POST \
|
||
|
|
"${PROXMOX_ENDPOINT}/api2/json/nodes/${PROXMOX_NODE}/qemu/${VMID}/unlock" > /dev/null
|
||
|
|
sleep 2
|
||
|
|
done
|
||
|
|
|
||
|
|
# Try to remove lock file via API (if supported) or provide manual instructions
|
||
|
|
echo " Attempting to delete VM $VMID..."
|
||
|
|
|
||
|
|
# Try delete with different parameters
|
||
|
|
DELETE_RESULT=$(curl -s -k -b "PVEAuthCookie=${TICKET}" \
|
||
|
|
-H "CSRFPreventionToken: ${CSRF_TOKEN}" \
|
||
|
|
-X DELETE \
|
||
|
|
"${PROXMOX_ENDPOINT}/api2/json/nodes/${PROXMOX_NODE}/qemu/${VMID}?purge=1&skiplock=1" 2>&1)
|
||
|
|
|
||
|
|
TASK_UPID=$(echo "$DELETE_RESULT" | jq -r '.data // empty' 2>/dev/null)
|
||
|
|
|
||
|
|
if [ -n "$TASK_UPID" ] && [ "$TASK_UPID" != "null" ]; then
|
||
|
|
echo " Delete task started: $TASK_UPID"
|
||
|
|
sleep 5
|
||
|
|
|
||
|
|
# Check if VM still exists
|
||
|
|
VM_STILL_EXISTS=$(curl -s -k -b "PVEAuthCookie=${TICKET}" \
|
||
|
|
"${PROXMOX_ENDPOINT}/api2/json/nodes/${PROXMOX_NODE}/qemu/${VMID}/status/current" 2>/dev/null | \
|
||
|
|
jq -r '.data // empty')
|
||
|
|
|
||
|
|
if [ -z "$VM_STILL_EXISTS" ] || [ "$VM_STILL_EXISTS" = "null" ]; then
|
||
|
|
echo " ✅ VM $VMID deleted successfully"
|
||
|
|
else
|
||
|
|
echo " ⚠️ VM $VMID still exists - lock file may need manual removal"
|
||
|
|
echo " Manual cleanup required:"
|
||
|
|
echo " ssh ${PROXMOX_SSH_USER}@${PROXMOX_SSH_HOST}"
|
||
|
|
echo " rm -f /var/lock/qemu-server/lock-${VMID}.conf"
|
||
|
|
echo " qm destroy ${VMID} --purge"
|
||
|
|
fi
|
||
|
|
else
|
||
|
|
echo " ⚠️ Failed to start delete task"
|
||
|
|
echo " Manual cleanup required:"
|
||
|
|
echo " ssh ${PROXMOX_SSH_USER}@${PROXMOX_SSH_HOST}"
|
||
|
|
echo " rm -f /var/lock/qemu-server/lock-${VMID}.conf"
|
||
|
|
echo " qm destroy ${VMID} --purge"
|
||
|
|
fi
|
||
|
|
else
|
||
|
|
echo " VM $VMID not found (already deleted)"
|
||
|
|
fi
|
||
|
|
echo ""
|
||
|
|
done
|
||
|
|
|
||
|
|
echo "Cleanup attempt complete!"
|
||
|
|
echo ""
|
||
|
|
echo "If VMs still exist, manual cleanup is required:"
|
||
|
|
echo "1. SSH into the Proxmox node:"
|
||
|
|
echo " ssh ${PROXMOX_SSH_USER}@${PROXMOX_SSH_HOST}"
|
||
|
|
echo ""
|
||
|
|
echo "2. For each VM, run:"
|
||
|
|
for VMID in "${ORPHANED_VMS[@]}"; do
|
||
|
|
echo " rm -f /var/lock/qemu-server/lock-${VMID}.conf"
|
||
|
|
echo " qm destroy ${VMID} --purge"
|
||
|
|
done
|
||
|
|
|