- Add comprehensive database migrations (001-024) for schema evolution - Enhance API schema with expanded type definitions and resolvers - Add new middleware: audit logging, rate limiting, MFA enforcement, security, tenant auth - Implement new services: AI optimization, billing, blockchain, compliance, marketplace - Add adapter layer for cloud integrations (Cloudflare, Kubernetes, Proxmox, storage) - Update Crossplane provider with enhanced VM management capabilities - Add comprehensive test suite for API endpoints and services - Update frontend components with improved GraphQL subscriptions and real-time updates - Enhance security configurations and headers (CSP, CORS, etc.) - Update documentation and configuration files - Add new CI/CD workflows and validation scripts - Implement design system improvements and UI enhancements
236 lines
6.2 KiB
Bash
Executable File
236 lines
6.2 KiB
Bash
Executable File
#!/bin/bash
|
|
set -euo pipefail
|
|
|
|
# Verify Proxmox Resources Script
|
|
# This script connects to Proxmox and verifies actual resource names
|
|
|
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
PROJECT_ROOT="$(cd "${SCRIPT_DIR}/.." && pwd)"
|
|
OUTPUT_DIR="${PROJECT_ROOT}/docs/proxmox-review"
|
|
|
|
# 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_warning() {
|
|
echo -e "${YELLOW}[$(date +'%Y-%m-%d %H:%M:%S')] ⚠️${NC} $*"
|
|
}
|
|
|
|
log_error() {
|
|
echo -e "${RED}[$(date +'%Y-%m-%d %H:%M:%S')] ❌${NC} $*"
|
|
}
|
|
|
|
# Load environment
|
|
load_env() {
|
|
if [ -f "${PROJECT_ROOT}/.env" ]; then
|
|
source "${PROJECT_ROOT}/.env"
|
|
fi
|
|
|
|
PROXMOX_1_API_URL="${PROXMOX_1_API_URL:-https://192.168.11.10:8006}"
|
|
PROXMOX_1_USER="${PROXMOX_1_USER:-root}"
|
|
PROXMOX_1_PASS="${PROXMOX_1_PASS:-}"
|
|
PROXMOX_1_API_TOKEN="${PROXMOX_1_API_TOKEN:-}"
|
|
PROXMOX_1_INSECURE="${PROXMOX_1_INSECURE_SKIP_TLS_VERIFY:-false}"
|
|
|
|
PROXMOX_2_API_URL="${PROXMOX_2_API_URL:-https://192.168.11.11:8006}"
|
|
PROXMOX_2_USER="${PROXMOX_2_USER:-root}"
|
|
PROXMOX_2_PASS="${PROXMOX_2_PASS:-}"
|
|
PROXMOX_2_API_TOKEN="${PROXMOX_2_API_TOKEN:-}"
|
|
PROXMOX_2_INSECURE="${PROXMOX_2_INSECURE_SKIP_TLS_VERIFY:-false}"
|
|
}
|
|
|
|
# Authenticate and get ticket
|
|
get_ticket() {
|
|
local api_url=$1
|
|
local username=$2
|
|
local password=$3
|
|
local insecure=$4
|
|
|
|
local curl_opts=()
|
|
if [ "${insecure}" = "true" ]; then
|
|
curl_opts+=("-k")
|
|
fi
|
|
|
|
local response
|
|
response=$(curl -s "${curl_opts[@]}" -X POST \
|
|
-d "username=${username}&password=${password}" \
|
|
"${api_url}/api2/json/access/ticket" 2>/dev/null || echo "")
|
|
|
|
if [ -z "${response}" ]; then
|
|
echo ""
|
|
return 1
|
|
fi
|
|
|
|
if command -v jq &> /dev/null; then
|
|
echo "${response}" | jq -r '.data.ticket // empty'
|
|
else
|
|
echo "${response}" | grep -o '"ticket":"[^"]*' | cut -d'"' -f4
|
|
fi
|
|
}
|
|
|
|
# Get CSRF token
|
|
get_csrf() {
|
|
local api_url=$1
|
|
local username=$2
|
|
local password=$3
|
|
local insecure=$4
|
|
|
|
local curl_opts=()
|
|
if [ "${insecure}" = "true" ]; then
|
|
curl_opts+=("-k")
|
|
fi
|
|
|
|
local response
|
|
response=$(curl -s "${curl_opts[@]}" -X POST \
|
|
-d "username=${username}&password=${password}" \
|
|
"${api_url}/api2/json/access/ticket" 2>/dev/null || echo "")
|
|
|
|
if [ -z "${response}" ]; then
|
|
echo ""
|
|
return 1
|
|
fi
|
|
|
|
if command -v jq &> /dev/null; then
|
|
echo "${response}" | jq -r '.data.CSRFPreventionToken // empty'
|
|
else
|
|
echo "${response}" | grep -o '"CSRFPreventionToken":"[^"]*' | cut -d'"' -f4
|
|
fi
|
|
}
|
|
|
|
# API call
|
|
api_call() {
|
|
local api_url=$1
|
|
local endpoint=$2
|
|
local ticket=$3
|
|
local csrf=$4
|
|
local insecure=$5
|
|
|
|
local curl_opts=(-s -f)
|
|
if [ "${insecure}" = "true" ]; then
|
|
curl_opts+=("-k")
|
|
fi
|
|
|
|
local headers=()
|
|
if [ -n "${csrf}" ]; then
|
|
headers+=(-H "CSRFPreventionToken: ${csrf}")
|
|
fi
|
|
|
|
curl "${curl_opts[@]}" "${headers[@]}" \
|
|
-b "PVEAuthCookie=${ticket}" \
|
|
"${api_url}/api2/json${endpoint}" 2>/dev/null || echo ""
|
|
}
|
|
|
|
# Verify resources for an instance
|
|
verify_instance() {
|
|
local instance_num=$1
|
|
local api_url=$2
|
|
local username=$3
|
|
local password=$4
|
|
local insecure=$5
|
|
|
|
log "Verifying Instance ${instance_num} (${api_url})..."
|
|
|
|
if [ -z "${password}" ]; then
|
|
log_warning "Password not set, skipping verification"
|
|
return 1
|
|
fi
|
|
|
|
local ticket
|
|
ticket=$(get_ticket "${api_url}" "${username}" "${password}" "${insecure}")
|
|
|
|
if [ -z "${ticket}" ]; then
|
|
log_error "Failed to authenticate to Instance ${instance_num}"
|
|
return 1
|
|
fi
|
|
|
|
local csrf
|
|
csrf=$(get_csrf "${api_url}" "${username}" "${password}" "${insecure}")
|
|
|
|
log_success "Authenticated to Instance ${instance_num}"
|
|
|
|
# Get nodes
|
|
log " Fetching nodes..."
|
|
local nodes
|
|
nodes=$(api_call "${api_url}" "/nodes" "${ticket}" "${csrf}" "${insecure}")
|
|
|
|
# Get storage
|
|
log " Fetching storage pools..."
|
|
local storage
|
|
storage=$(api_call "${api_url}" "/storage" "${ticket}" "${csrf}" "${insecure}")
|
|
|
|
# Get version
|
|
log " Fetching version..."
|
|
local version
|
|
version=$(api_call "${api_url}" "/version" "${ticket}" "${csrf}" "${insecure}")
|
|
|
|
# Save results
|
|
local output_file="${OUTPUT_DIR}/proxmox-${instance_num}-resources-$(date +%Y%m%d_%H%M%S).json"
|
|
{
|
|
echo "{"
|
|
echo " \"instance\": ${instance_num},"
|
|
echo " \"api_url\": \"${api_url}\","
|
|
echo " \"timestamp\": \"$(date -Iseconds)\","
|
|
echo " \"nodes\": ${nodes:-null},"
|
|
echo " \"storage\": ${storage:-null},"
|
|
echo " \"version\": ${version:-null}"
|
|
echo "}"
|
|
} > "${output_file}"
|
|
|
|
log_success "Resources saved to ${output_file}"
|
|
|
|
# Display summary
|
|
if command -v jq &> /dev/null && [ -n "${nodes}" ]; then
|
|
log " Nodes:"
|
|
echo "${nodes}" | jq -r '.data[]? | " - \(.node) (status: \(.status // "unknown"))"' || true
|
|
|
|
log " Storage Pools:"
|
|
echo "${storage}" | jq -r '.data[]? | " - \(.storage) (type: \(.type), enabled: \(.enabled))"' || true
|
|
fi
|
|
|
|
return 0
|
|
}
|
|
|
|
main() {
|
|
log "Starting Proxmox Resource Verification..."
|
|
log "=========================================="
|
|
|
|
load_env
|
|
mkdir -p "${OUTPUT_DIR}"
|
|
|
|
# Verify Instance 1
|
|
verify_instance 1 \
|
|
"${PROXMOX_1_API_URL}" \
|
|
"${PROXMOX_1_USER}" \
|
|
"${PROXMOX_1_PASS}" \
|
|
"${PROXMOX_1_INSECURE}" || log_warning "Instance 1 verification failed"
|
|
|
|
log ""
|
|
|
|
# Verify Instance 2
|
|
verify_instance 2 \
|
|
"${PROXMOX_2_API_URL}" \
|
|
"${PROXMOX_2_USER}" \
|
|
"${PROXMOX_2_PASS}" \
|
|
"${PROXMOX_2_INSECURE}" || log_warning "Instance 2 verification failed"
|
|
|
|
log ""
|
|
log "=========================================="
|
|
log_success "Verification completed!"
|
|
log ""
|
|
log "Review resource files in: ${OUTPUT_DIR}"
|
|
}
|
|
|
|
main "$@"
|
|
|