Some checks failed
Test / test (push) Has been cancelled
Co-authored-by: Cursor <cursoragent@cursor.com>
245 lines
8.4 KiB
Bash
Executable File
245 lines
8.4 KiB
Bash
Executable File
#!/bin/bash
|
|
source ~/.bashrc
|
|
# Test Proxmox VE Connection Script
|
|
# Tests connectivity and authentication to Proxmox hosts using .env credentials
|
|
|
|
set -e
|
|
|
|
# Colors for output
|
|
RED='\033[0;31m'
|
|
GREEN='\033[0;32m'
|
|
YELLOW='\033[1;33m'
|
|
BLUE='\033[0;34m'
|
|
NC='\033[0m'
|
|
|
|
# Load environment variables from .env if it exists
|
|
if [ -f .env ]; then
|
|
# Source .env file, handling comments and inline comments
|
|
set -a
|
|
source <(grep -v '^#' .env | grep -v '^$' | sed 's/#.*$//' | sed 's/^[[:space:]]*//;s/[[:space:]]*$//' | grep '=')
|
|
set +a
|
|
fi
|
|
|
|
# Proxmox configuration
|
|
PVE_USERNAME="${PVE_USERNAME:-root@pam}"
|
|
PVE_PASSWORD="${PVE_ROOT_PASS:-}"
|
|
PROXMOX_ML110_URL="${PROXMOX_ML110_URL:-}"
|
|
PROXMOX_R630_URL="${PROXMOX_R630_URL:-}"
|
|
|
|
log_info() {
|
|
echo -e "${GREEN}[INFO]${NC} $1"
|
|
}
|
|
|
|
log_warn() {
|
|
echo -e "${YELLOW}[WARN]${NC} $1"
|
|
}
|
|
|
|
log_error() {
|
|
echo -e "${RED}[ERROR]${NC} $1"
|
|
}
|
|
|
|
log_test() {
|
|
echo -e "${BLUE}[TEST]${NC} $1"
|
|
}
|
|
|
|
test_connection() {
|
|
local host_name=$1
|
|
local host_url=$2
|
|
|
|
if [ -z "$host_url" ]; then
|
|
log_error "$host_name: URL not set (check .env file)"
|
|
return 1
|
|
fi
|
|
|
|
if [ -z "$PVE_PASSWORD" ]; then
|
|
log_error "$host_name: PVE_ROOT_PASS not set (check .env file)"
|
|
return 1
|
|
fi
|
|
|
|
log_test "Testing connection to $host_name..."
|
|
echo " URL: $host_url"
|
|
|
|
# Extract hostname/IP from URL
|
|
local host_ip=$(echo "$host_url" | sed -E 's|https?://([^:]+).*|\1|')
|
|
|
|
# Test basic connectivity (ping) - optional, as ping may be blocked
|
|
log_test " Testing network connectivity..."
|
|
if ping -c 1 -W 2 "$host_ip" &> /dev/null; then
|
|
echo -e " ${GREEN}✓${NC} Network reachable (ping)"
|
|
else
|
|
echo -e " ${YELLOW}⚠${NC} Ping failed (may be blocked by firewall, continuing with API test...)"
|
|
fi
|
|
|
|
# Test HTTPS port connectivity
|
|
log_test " Testing HTTPS port (8006)..."
|
|
if timeout 3 bash -c "cat < /dev/null > /dev/tcp/$host_ip/8006" 2>/dev/null; then
|
|
echo -e " ${GREEN}✓${NC} Port 8006 is open"
|
|
else
|
|
echo -e " ${YELLOW}⚠${NC} Port test inconclusive (may require root), continuing with API test..."
|
|
fi
|
|
|
|
# Test Proxmox API authentication
|
|
log_test " Testing Proxmox API authentication..."
|
|
|
|
# Get CSRF token and ticket with timeout
|
|
local api_response=$(curl -s -k --connect-timeout 10 --max-time 15 \
|
|
-d "username=$PVE_USERNAME&password=$PVE_PASSWORD" \
|
|
"$host_url/api2/json/access/ticket" 2>&1)
|
|
|
|
if echo "$api_response" | grep -q '"data"'; then
|
|
local ticket=$(echo "$api_response" | grep -o '"ticket":"[^"]*' | cut -d'"' -f4)
|
|
local csrf_token=$(echo "$api_response" | grep -o '"CSRFPreventionToken":"[^"]*' | cut -d'"' -f4)
|
|
|
|
if [ -n "$ticket" ] && [ -n "$csrf_token" ]; then
|
|
echo -e " ${GREEN}✓${NC} Authentication successful"
|
|
|
|
# Test API access with ticket
|
|
log_test " Testing API access..."
|
|
local version_response=$(curl -s -k -H "Cookie: PVEAuthCookie=$ticket" \
|
|
-H "CSRFPreventionToken: $csrf_token" \
|
|
"$host_url/api2/json/version" 2>&1)
|
|
|
|
if echo "$version_response" | grep -q '"data"'; then
|
|
local pve_version=$(echo "$version_response" | grep -o '"version":"[^"]*' | cut -d'"' -f4)
|
|
local release=$(echo "$version_response" | grep -o '"release":"[^"]*' | cut -d'"' -f4)
|
|
echo -e " ${GREEN}✓${NC} API access successful"
|
|
echo " Proxmox Version: $pve_version"
|
|
echo " Release: $release"
|
|
|
|
# Get cluster status if available
|
|
log_test " Testing cluster status..."
|
|
local cluster_response=$(curl -s -k -H "Cookie: PVEAuthCookie=$ticket" \
|
|
-H "CSRFPreventionToken: $csrf_token" \
|
|
"$host_url/api2/json/cluster/status" 2>&1)
|
|
|
|
if echo "$cluster_response" | grep -q '"data"'; then
|
|
echo -e " ${GREEN}✓${NC} Cluster API accessible"
|
|
local node_count=$(echo "$cluster_response" | grep -o '"name":"[^"]*' | wc -l)
|
|
echo " Cluster nodes found: $node_count"
|
|
else
|
|
echo -e " ${YELLOW}⚠${NC} Not in a cluster (standalone node)"
|
|
fi
|
|
|
|
return 0
|
|
else
|
|
echo -e " ${RED}✗${NC} API access failed"
|
|
echo " Response: $version_response"
|
|
return 1
|
|
fi
|
|
else
|
|
echo -e " ${RED}✗${NC} Failed to extract authentication tokens"
|
|
return 1
|
|
fi
|
|
else
|
|
echo -e " ${RED}✗${NC} Authentication failed"
|
|
if echo "$api_response" | grep -q "401"; then
|
|
echo " Error: Invalid credentials (check PVE_ROOT_PASS in .env)"
|
|
elif echo "$api_response" | grep -q "Connection refused"; then
|
|
echo " Error: Connection refused (check if Proxmox is running)"
|
|
elif echo "$api_response" | grep -q "Connection timed out\|timed out\|Operation timed out"; then
|
|
echo " Error: Connection timed out"
|
|
echo " Possible causes:"
|
|
echo " - Host is behind a firewall or VPN"
|
|
echo " - Host is not accessible from this network"
|
|
echo " - Host may be down or unreachable"
|
|
echo " Try accessing the web UI directly: $host_url"
|
|
elif [ -z "$api_response" ]; then
|
|
echo " Error: No response from server (connection timeout or network issue)"
|
|
echo " Try accessing the web UI directly: $host_url"
|
|
else
|
|
echo " Response: $api_response"
|
|
fi
|
|
return 1
|
|
fi
|
|
}
|
|
|
|
main() {
|
|
echo "========================================="
|
|
echo "Proxmox VE Connection Test"
|
|
echo "========================================="
|
|
echo ""
|
|
|
|
log_info "Note: Proxmox uses self-signed SSL certificates by default."
|
|
log_info "Browser warnings are normal. The script uses -k flag to bypass certificate validation."
|
|
echo ""
|
|
|
|
# Check if .env file exists
|
|
if [ ! -f .env ]; then
|
|
log_warn ".env file not found. Using environment variables or defaults."
|
|
log_warn "Create .env from .env.example and configure credentials."
|
|
echo ""
|
|
fi
|
|
|
|
# Validate required variables
|
|
if [ -z "$PVE_PASSWORD" ]; then
|
|
log_error "PVE_ROOT_PASS not set"
|
|
log_info "Set it in .env file or as environment variable:"
|
|
log_info " export PVE_ROOT_PASS=your-password"
|
|
exit 1
|
|
fi
|
|
|
|
echo "Configuration:"
|
|
echo " Username: $PVE_USERNAME (implied, not stored)"
|
|
echo " Password: ${PVE_PASSWORD:0:3}*** (hidden)"
|
|
echo ""
|
|
|
|
local ml110_result=0
|
|
local r630_result=0
|
|
|
|
# Test ML110
|
|
if [ -n "$PROXMOX_ML110_URL" ]; then
|
|
echo "----------------------------------------"
|
|
test_connection "HPE ML110 Gen9" "$PROXMOX_ML110_URL"
|
|
ml110_result=$?
|
|
echo ""
|
|
else
|
|
log_warn "PROXMOX_ML110_URL not set, skipping ML110 test"
|
|
ml110_result=1
|
|
fi
|
|
|
|
# Test R630 (continue even if ML110 failed)
|
|
if [ -n "$PROXMOX_R630_URL" ]; then
|
|
echo "----------------------------------------"
|
|
test_connection "Dell R630" "$PROXMOX_R630_URL"
|
|
r630_result=$?
|
|
echo ""
|
|
else
|
|
log_warn "PROXMOX_R630_URL not set, skipping R630 test"
|
|
r630_result=1
|
|
fi
|
|
|
|
# Summary
|
|
echo "========================================="
|
|
echo "Test Summary"
|
|
echo "========================================="
|
|
|
|
if [ -n "$PROXMOX_ML110_URL" ]; then
|
|
if [ $ml110_result -eq 0 ]; then
|
|
echo -e "${GREEN}✓${NC} HPE ML110 Gen9: Connection successful"
|
|
else
|
|
echo -e "${RED}✗${NC} HPE ML110 Gen9: Connection failed"
|
|
fi
|
|
fi
|
|
|
|
if [ -n "$PROXMOX_R630_URL" ]; then
|
|
if [ $r630_result -eq 0 ]; then
|
|
echo -e "${GREEN}✓${NC} Dell R630: Connection successful"
|
|
else
|
|
echo -e "${RED}✗${NC} Dell R630: Connection failed"
|
|
fi
|
|
fi
|
|
|
|
echo ""
|
|
|
|
if [ $ml110_result -eq 0 ] && [ $r630_result -eq 0 ]; then
|
|
log_info "All connections successful!"
|
|
exit 0
|
|
else
|
|
log_error "Some connections failed. Check your .env configuration."
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
main "$@"
|
|
|