Initial commit: loc_az_hci (smom-dbis-138 excluded via .gitignore)
Some checks failed
Test / test (push) Has been cancelled
Some checks failed
Test / test (push) Has been cancelled
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
244
scripts/utils/test-proxmox-connection.sh
Executable file
244
scripts/utils/test-proxmox-connection.sh
Executable file
@@ -0,0 +1,244 @@
|
||||
#!/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 "$@"
|
||||
|
||||
Reference in New Issue
Block a user