#!/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 "$@"