#!/bin/bash source ~/.bashrc # Fix VM Disk Sizes # Expands disk sizes for VMs cloned from template set -e SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)" # Load environment variables if [ -f "$PROJECT_ROOT/.env" ]; then set -a source <(grep -v '^#' "$PROJECT_ROOT/.env" | grep -v '^$' | sed 's/#.*$//' | grep '=') set +a fi # Colors RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' NC='\033[0m' PVE_USERNAME="${PVE_USERNAME:-root@pam}" PVE_PASSWORD="${PVE_ROOT_PASS:-}" PROXMOX_URL="${PROXMOX_ML110_URL:-https://192.168.1.206:8006}" PROXMOX_NODE="${PROXMOX_NODE:-pve}" log_info() { echo -e "${GREEN}[INFO]${NC} $1" } log_warn() { echo -e "${YELLOW}[WARN]${NC} $1" } log_error() { echo -e "${RED}[ERROR]${NC} $1" } get_api_token() { local response=$(curl -s -k --connect-timeout 10 --max-time 15 \ -d "username=$PVE_USERNAME&password=$PVE_PASSWORD" \ "$PROXMOX_URL/api2/json/access/ticket" 2>&1) if echo "$response" | grep -q '"data"'; then local ticket=$(echo "$response" | grep -o '"ticket":"[^"]*' | cut -d'"' -f4) local csrf_token=$(echo "$response" | grep -o '"CSRFPreventionToken":"[^"]*' | cut -d'"' -f4) echo "$ticket|$csrf_token" else echo "" fi } resize_disk() { local vmid=$1 local size=$2 local name=$3 log_info "Resizing disk for VM $vmid ($name) to $size..." local tokens=$(get_api_token) if [ -z "$tokens" ]; then log_error "Failed to authenticate with Proxmox" return 1 fi local ticket=$(echo "$tokens" | cut -d'|' -f1) local csrf_token=$(echo "$tokens" | cut -d'|' -f2) # Get current disk configuration local current_config=$(curl -s -k -H "Cookie: PVEAuthCookie=$ticket" \ -H "CSRFPreventionToken: $csrf_token" \ "$PROXMOX_URL/api2/json/nodes/$PROXMOX_NODE/qemu/$vmid/config") local current_disk=$(echo "$current_config" | python3 -c "import sys, json; d=json.load(sys.stdin).get('data', {}); print(d.get('scsi0', ''))" 2>/dev/null) if [ -z "$current_disk" ]; then log_error "Could not get current disk configuration" return 1 fi # Extract storage and disk name local storage=$(echo "$current_disk" | grep -o 'local-lvm:[^,]*' | cut -d':' -f2 | cut -d'-' -f1-2) local disk_name=$(echo "$current_disk" | grep -o 'vm-[0-9]*-disk-[0-9]*') # Stop VM if running local status=$(curl -s -k -H "Cookie: PVEAuthCookie=$ticket" \ -H "CSRFPreventionToken: $csrf_token" \ "$PROXMOX_URL/api2/json/nodes/$PROXMOX_NODE/qemu/$vmid/status/current" | \ python3 -c "import sys, json; print(json.load(sys.stdin).get('data', {}).get('status', 'unknown'))" 2>/dev/null) if [ "$status" = "running" ]; then log_info "Stopping VM $vmid..." curl -s -k -X POST -H "Cookie: PVEAuthCookie=$ticket" \ -H "CSRFPreventionToken: $csrf_token" \ "$PROXMOX_URL/api2/json/nodes/$PROXMOX_NODE/qemu/$vmid/status/stop" > /dev/null sleep 5 fi # Resize disk using resize endpoint log_info "Resizing disk to $size..." local resize_response=$(curl -s -k -X PUT \ -H "Cookie: PVEAuthCookie=$ticket" \ -H "CSRFPreventionToken: $csrf_token" \ -d "disk=scsi0" \ -d "size=$size" \ "$PROXMOX_URL/api2/json/nodes/$PROXMOX_NODE/qemu/$vmid/resize" 2>&1) if echo "$resize_response" | grep -q '"data"'; then log_info "Disk resized successfully" else log_warn "Disk resize response: $resize_response" # Try alternative method - update config directly log_info "Trying alternative method..." curl -s -k -X PUT \ -H "Cookie: PVEAuthCookie=$ticket" \ -H "CSRFPreventionToken: $csrf_token" \ -d "scsi0=local-lvm:$disk_name,iothread=1,size=$size" \ "$PROXMOX_URL/api2/json/nodes/$PROXMOX_NODE/qemu/$vmid/config" > /dev/null 2>&1 fi # Start VM if it was running if [ "$status" = "running" ]; then log_info "Starting VM $vmid..." curl -s -k -X POST -H "Cookie: PVEAuthCookie=$ticket" \ -H "CSRFPreventionToken: $csrf_token" \ "$PROXMOX_URL/api2/json/nodes/$PROXMOX_NODE/qemu/$vmid/status/start" > /dev/null fi return 0 } main() { log_info "Fixing VM disk sizes" if [ -z "$PVE_PASSWORD" ]; then log_error "PVE_ROOT_PASS not set in .env" exit 1 fi # VM definitions: vmid name size local vms=( "100 cloudflare-tunnel 40G" "101 k3s-master 80G" "102 git-server 100G" "103 observability 200G" ) for vm_spec in "${vms[@]}"; do read -r vmid name size <<< "$vm_spec" resize_disk "$vmid" "$size" "$name" sleep 2 done log_info "Disk size fixes completed!" } main "$@"