190 lines
5.4 KiB
Bash
190 lines
5.4 KiB
Bash
|
|
#!/bin/bash
|
||
|
|
# start-vms-via-api.sh
|
||
|
|
# Start VMs via Proxmox API
|
||
|
|
|
||
|
|
set -euo pipefail
|
||
|
|
|
||
|
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||
|
|
PROJECT_ROOT="$(cd "${SCRIPT_DIR}/.." && pwd)"
|
||
|
|
|
||
|
|
# Load environment
|
||
|
|
if [ -f "${PROJECT_ROOT}/.env" ]; then
|
||
|
|
source "${PROJECT_ROOT}/.env"
|
||
|
|
fi
|
||
|
|
|
||
|
|
PROXMOX_ROOT_PASS="${PROXMOX_ROOT_PASS:-L@kers2010}"
|
||
|
|
PROXMOX_1_API_URL="${PROXMOX_1_API_URL:-https://192.168.11.10:8006}"
|
||
|
|
PROXMOX_2_API_URL="${PROXMOX_2_API_URL:-https://192.168.11.11:8006}"
|
||
|
|
|
||
|
|
# Colors
|
||
|
|
GREEN='\033[0;32m'
|
||
|
|
YELLOW='\033[1;33m'
|
||
|
|
RED='\033[0;31m'
|
||
|
|
BLUE='\033[0;34m'
|
||
|
|
NC='\033[0m'
|
||
|
|
|
||
|
|
log() {
|
||
|
|
echo -e "${BLUE}[$(date +'%Y-%m-%d %H:%M:%S')]${NC} $*"
|
||
|
|
}
|
||
|
|
|
||
|
|
log_success() {
|
||
|
|
echo -e "${GREEN}[$(date +'%Y-%m-%d %H:%M:%S')] ✅${NC} $*"
|
||
|
|
}
|
||
|
|
|
||
|
|
log_error() {
|
||
|
|
echo -e "${RED}[$(date +'%Y-%m-%d %H:%M:%S')] ❌${NC} $*"
|
||
|
|
}
|
||
|
|
|
||
|
|
# Get authentication ticket
|
||
|
|
get_ticket() {
|
||
|
|
local api_url=$1
|
||
|
|
local username=$2
|
||
|
|
local password=$3
|
||
|
|
|
||
|
|
local response
|
||
|
|
response=$(curl -k -s -X POST \
|
||
|
|
-d "username=${username}&password=${password}" \
|
||
|
|
"${api_url}/api2/json/access/ticket" 2>/dev/null || echo "")
|
||
|
|
|
||
|
|
if [ -z "${response}" ] || echo "${response}" | grep -q "authentication failure"; then
|
||
|
|
echo ""
|
||
|
|
return 1
|
||
|
|
fi
|
||
|
|
|
||
|
|
if command -v jq &> /dev/null; then
|
||
|
|
local ticket
|
||
|
|
ticket=$(echo "${response}" | jq -r '.data.ticket // empty' 2>/dev/null)
|
||
|
|
if [ -n "${ticket}" ] && [ "${ticket}" != "null" ]; then
|
||
|
|
echo "${ticket}"
|
||
|
|
return 0
|
||
|
|
fi
|
||
|
|
fi
|
||
|
|
|
||
|
|
# Fallback: extract from JSON manually
|
||
|
|
echo "${response}" | grep -o '"ticket":"[^"]*' | head -1 | cut -d'"' -f4
|
||
|
|
}
|
||
|
|
|
||
|
|
# Get CSRF token
|
||
|
|
get_csrf() {
|
||
|
|
local api_url=$1
|
||
|
|
local username=$2
|
||
|
|
local password=$3
|
||
|
|
|
||
|
|
local response
|
||
|
|
response=$(curl -k -s -X POST \
|
||
|
|
-d "username=${username}&password=${password}" \
|
||
|
|
"${api_url}/api2/json/access/ticket" 2>/dev/null || echo "")
|
||
|
|
|
||
|
|
if [ -z "${response}" ] || echo "${response}" | grep -q "authentication failure"; then
|
||
|
|
echo ""
|
||
|
|
return 1
|
||
|
|
fi
|
||
|
|
|
||
|
|
if command -v jq &> /dev/null; then
|
||
|
|
local csrf
|
||
|
|
csrf=$(echo "${response}" | jq -r '.data.CSRFPreventionToken // empty' 2>/dev/null)
|
||
|
|
if [ -n "${csrf}" ] && [ "${csrf}" != "null" ]; then
|
||
|
|
echo "${csrf}"
|
||
|
|
return 0
|
||
|
|
fi
|
||
|
|
fi
|
||
|
|
|
||
|
|
# Fallback: extract from JSON manually
|
||
|
|
echo "${response}" | grep -o '"CSRFPreventionToken":"[^"]*' | head -1 | cut -d'"' -f4
|
||
|
|
}
|
||
|
|
|
||
|
|
# Start VM
|
||
|
|
start_vm() {
|
||
|
|
local api_url=$1
|
||
|
|
local ticket=$2
|
||
|
|
local csrf=$3
|
||
|
|
local node=$4
|
||
|
|
local vmid=$5
|
||
|
|
|
||
|
|
local response
|
||
|
|
response=$(curl -k -s -X POST \
|
||
|
|
-H "CSRFPreventionToken: ${csrf}" \
|
||
|
|
-b "PVEAuthCookie=${ticket}" \
|
||
|
|
"${api_url}/api2/json/nodes/${node}/qemu/${vmid}/status/start" 2>/dev/null || echo "")
|
||
|
|
|
||
|
|
if echo "${response}" | grep -q '"data":null'; then
|
||
|
|
return 0
|
||
|
|
fi
|
||
|
|
|
||
|
|
return 1
|
||
|
|
}
|
||
|
|
|
||
|
|
main() {
|
||
|
|
log "=========================================="
|
||
|
|
log "Starting SMOM-DBIS-138 VMs via Proxmox API"
|
||
|
|
log "=========================================="
|
||
|
|
log ""
|
||
|
|
|
||
|
|
# Site 1 (ml110-01)
|
||
|
|
log "Authenticating to Site 1 (ml110-01)..."
|
||
|
|
local ticket1 csrf1
|
||
|
|
ticket1=$(get_ticket "${PROXMOX_1_API_URL}" "root@pam" "${PROXMOX_ROOT_PASS}")
|
||
|
|
csrf1=$(get_csrf "${PROXMOX_1_API_URL}" "root@pam" "${PROXMOX_ROOT_PASS}")
|
||
|
|
|
||
|
|
if [ -z "${ticket1}" ]; then
|
||
|
|
log_error "Failed to authenticate to Site 1"
|
||
|
|
return 1
|
||
|
|
fi
|
||
|
|
|
||
|
|
log_success "Authenticated to Site 1"
|
||
|
|
|
||
|
|
# Site 1 VMs
|
||
|
|
local site1_vms=("118:nginx-proxy-vm" "132:smom-validator-01" "133:smom-validator-02" "127:smom-sentry-01" "128:smom-sentry-02" "123:smom-rpc-node-01" "124:smom-rpc-node-02" "121:smom-management")
|
||
|
|
|
||
|
|
log "Starting Site 1 VMs..."
|
||
|
|
for vm_entry in "${site1_vms[@]}"; do
|
||
|
|
IFS=':' read -r vmid vmname <<< "${vm_entry}"
|
||
|
|
log " Starting ${vmname} (VMID: ${vmid})..."
|
||
|
|
if start_vm "${PROXMOX_1_API_URL}" "${ticket1}" "${csrf1}" "ml110-01" "${vmid}"; then
|
||
|
|
log_success " ${vmname} started"
|
||
|
|
else
|
||
|
|
log_error " Failed to start ${vmname}"
|
||
|
|
fi
|
||
|
|
done
|
||
|
|
|
||
|
|
log ""
|
||
|
|
|
||
|
|
# Site 2 (r630-01)
|
||
|
|
log "Authenticating to Site 2 (r630-01)..."
|
||
|
|
local ticket2 csrf2
|
||
|
|
ticket2=$(get_ticket "${PROXMOX_2_API_URL}" "root@pam" "${PROXMOX_ROOT_PASS}")
|
||
|
|
csrf2=$(get_csrf "${PROXMOX_2_API_URL}" "root@pam" "${PROXMOX_ROOT_PASS}")
|
||
|
|
|
||
|
|
if [ -z "${ticket2}" ]; then
|
||
|
|
log_error "Failed to authenticate to Site 2"
|
||
|
|
return 1
|
||
|
|
fi
|
||
|
|
|
||
|
|
log_success "Authenticated to Site 2"
|
||
|
|
|
||
|
|
# Site 2 VMs
|
||
|
|
local site2_vms=("119:cloudflare-tunnel-vm" "134:smom-validator-03" "122:smom-validator-04" "129:smom-sentry-03" "130:smom-sentry-04" "125:smom-rpc-node-03" "126:smom-rpc-node-04" "131:smom-services" "120:smom-blockscout" "122:smom-monitoring")
|
||
|
|
|
||
|
|
log "Starting Site 2 VMs..."
|
||
|
|
for vm_entry in "${site2_vms[@]}"; do
|
||
|
|
IFS=':' read -r vmid vmname <<< "${vm_entry}"
|
||
|
|
log " Starting ${vmname} (VMID: ${vmid})..."
|
||
|
|
if start_vm "${PROXMOX_2_API_URL}" "${ticket2}" "${csrf2}" "r630-01" "${vmid}"; then
|
||
|
|
log_success " ${vmname} started"
|
||
|
|
else
|
||
|
|
log_error " Failed to start ${vmname}"
|
||
|
|
fi
|
||
|
|
done
|
||
|
|
|
||
|
|
log ""
|
||
|
|
log "=========================================="
|
||
|
|
log_success "VM startup initiated!"
|
||
|
|
log ""
|
||
|
|
log "Waiting for VMs to boot (this may take 2-5 minutes)..."
|
||
|
|
log "Monitor with: kubectl get proxmoxvm -A -w"
|
||
|
|
log ""
|
||
|
|
}
|
||
|
|
|
||
|
|
main "$@"
|
||
|
|
|