Files
proxmox/scripts/check-prerequisites.sh

347 lines
11 KiB
Bash
Raw Normal View History

#!/bin/bash
# Comprehensive Prerequisites Check Script
# Validates all prerequisites for the Proxmox workspace
set +e # Don't exit on errors - collect all results
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
# Colors
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
CYAN='\033[0;36m'
NC='\033[0m'
# Status tracking
PASSED=0
FAILED=0
WARNINGS=0
pass() {
echo -e "${GREEN}${NC} $1"
((PASSED++))
}
fail() {
echo -e "${RED}${NC} $1"
((FAILED++))
}
warn() {
echo -e "${YELLOW}⚠️${NC} $1"
((WARNINGS++))
}
info() {
echo -e "${BLUE}${NC} $1"
}
section() {
echo ""
echo -e "${CYAN}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
echo -e "${CYAN}$1${NC}"
echo -e "${CYAN}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
echo ""
}
echo ""
echo -e "${BLUE}╔════════════════════════════════════════════════════════════════════════╗${NC}"
echo -e "${BLUE}${NC} Prerequisites Check for Proxmox Workspace ${BLUE}${NC}"
echo -e "${BLUE}╚════════════════════════════════════════════════════════════════════════╝${NC}"
echo ""
# ============================================================================
# SECTION 1: SYSTEM PREREQUISITES
# ============================================================================
section "1. SYSTEM PREREQUISITES"
# Check Node.js
if command -v node &> /dev/null; then
NODE_VERSION=$(node --version | sed 's/v//')
NODE_MAJOR=$(echo "$NODE_VERSION" | cut -d. -f1)
if [ "$NODE_MAJOR" -ge 16 ]; then
pass "Node.js installed: v$NODE_VERSION (requires 16+)"
else
fail "Node.js version too old: v$NODE_VERSION (requires 16+)"
fi
else
fail "Node.js not installed (requires 16+)"
fi
# Check pnpm
if command -v pnpm &> /dev/null; then
PNPM_VERSION=$(pnpm --version)
PNPM_MAJOR=$(echo "$PNPM_VERSION" | cut -d. -f1)
if [ "$PNPM_MAJOR" -ge 8 ]; then
pass "pnpm installed: $PNPM_VERSION (requires 8+)"
else
fail "pnpm version too old: $PNPM_VERSION (requires 8+)"
fi
else
fail "pnpm not installed (requires 8+)"
fi
# Check Git
if command -v git &> /dev/null; then
GIT_VERSION=$(git --version | awk '{print $3}')
pass "Git installed: $GIT_VERSION"
else
fail "Git not installed"
fi
# Check required tools
REQUIRED_TOOLS=("curl" "jq" "bash")
for tool in "${REQUIRED_TOOLS[@]}"; do
if command -v "$tool" &> /dev/null; then
pass "$tool installed"
else
fail "$tool not found (required)"
fi
done
# ============================================================================
# SECTION 2: WORKSPACE STRUCTURE
# ============================================================================
section "2. WORKSPACE STRUCTURE"
# Check project root
if [ -d "$PROJECT_ROOT" ]; then
pass "Project root exists: $PROJECT_ROOT"
else
fail "Project root not found: $PROJECT_ROOT"
exit 1
fi
# Check package.json
if [ -f "$PROJECT_ROOT/package.json" ]; then
pass "package.json exists"
else
fail "package.json not found"
fi
# Check pnpm-workspace.yaml
if [ -f "$PROJECT_ROOT/pnpm-workspace.yaml" ]; then
pass "pnpm-workspace.yaml exists"
else
fail "pnpm-workspace.yaml not found"
fi
# Check submodules
if [ -d "$PROJECT_ROOT/mcp-proxmox" ]; then
if [ -f "$PROJECT_ROOT/mcp-proxmox/index.js" ]; then
pass "mcp-proxmox submodule exists and has index.js"
else
warn "mcp-proxmox submodule exists but index.js not found"
fi
else
fail "mcp-proxmox submodule not found"
fi
if [ -d "$PROJECT_ROOT/ProxmoxVE" ]; then
pass "ProxmoxVE submodule exists"
else
warn "ProxmoxVE submodule not found"
fi
if [ -d "$PROJECT_ROOT/smom-dbis-138-proxmox" ]; then
pass "smom-dbis-138-proxmox submodule exists"
else
warn "smom-dbis-138-proxmox submodule not found"
fi
# Check directory structure
[ -d "$PROJECT_ROOT/scripts" ] && pass "scripts/ directory exists" || fail "scripts/ directory not found"
[ -d "$PROJECT_ROOT/docs" ] && pass "docs/ directory exists" || fail "docs/ directory not found"
# ============================================================================
# SECTION 3: DEPENDENCIES
# ============================================================================
section "3. DEPENDENCIES"
# Check if node_modules exists
if [ -d "$PROJECT_ROOT/node_modules" ]; then
pass "node_modules exists (dependencies installed)"
# Check MCP server dependencies
if [ -d "$PROJECT_ROOT/mcp-proxmox/node_modules" ]; then
pass "MCP server dependencies installed"
else
warn "MCP server dependencies not installed (run: pnpm install)"
fi
# Check frontend dependencies
if [ -d "$PROJECT_ROOT/ProxmoxVE/frontend/node_modules" ]; then
pass "Frontend dependencies installed"
else
warn "Frontend dependencies not installed (run: pnpm install)"
fi
else
fail "node_modules not found (run: pnpm install)"
fi
# ============================================================================
# SECTION 4: CONFIGURATION FILES
# ============================================================================
section "4. CONFIGURATION FILES"
# Check .env file
ENV_FILE="$HOME/.env"
if [ -f "$ENV_FILE" ]; then
pass ".env file exists: $ENV_FILE"
# Check for required variables
source scripts/load-env.sh 2>/dev/null || true
load_env_file 2>/dev/null || true
[ -n "${PROXMOX_HOST:-}" ] && [ "${PROXMOX_HOST}" != "your-proxmox-ip-or-hostname" ] && \
pass "PROXMOX_HOST configured: $PROXMOX_HOST" || \
warn "PROXMOX_HOST not configured or using placeholder"
[ -n "${PROXMOX_USER:-}" ] && [ "${PROXMOX_USER}" != "your-username" ] && \
pass "PROXMOX_USER configured: $PROXMOX_USER" || \
warn "PROXMOX_USER not configured or using placeholder"
[ -n "${PROXMOX_TOKEN_NAME:-}" ] && [ "${PROXMOX_TOKEN_NAME}" != "your-token-name" ] && \
pass "PROXMOX_TOKEN_NAME configured: $PROXMOX_TOKEN_NAME" || \
warn "PROXMOX_TOKEN_NAME not configured or using placeholder"
if [ -n "${PROXMOX_TOKEN_VALUE:-}" ] && [ "${PROXMOX_TOKEN_VALUE}" != "your-token-secret-here" ] && [ "${PROXMOX_TOKEN_VALUE}" != "your-token-secret" ]; then
pass "PROXMOX_TOKEN_VALUE configured (secret present)"
else
fail "PROXMOX_TOKEN_VALUE not configured or using placeholder"
fi
else
fail ".env file not found: $ENV_FILE"
info "Create it with: ./scripts/setup.sh"
fi
# Check Claude Desktop config
CLAUDE_CONFIG="$HOME/.config/Claude/claude_desktop_config.json"
if [ -f "$CLAUDE_CONFIG" ]; then
pass "Claude Desktop config exists: $CLAUDE_CONFIG"
# Check if MCP server is configured
if grep -q "proxmox" "$CLAUDE_CONFIG" 2>/dev/null; then
pass "MCP server configured in Claude Desktop"
else
warn "MCP server not found in Claude Desktop config"
fi
else
warn "Claude Desktop config not found: $CLAUDE_CONFIG"
info "Create it with: ./scripts/setup.sh"
fi
# Check deployment configs
if [ -d "$PROJECT_ROOT/smom-dbis-138-proxmox/config" ]; then
if [ -f "$PROJECT_ROOT/smom-dbis-138-proxmox/config/proxmox.conf" ]; then
pass "Deployment proxmox.conf exists"
else
warn "Deployment proxmox.conf not found (example exists)"
fi
if [ -f "$PROJECT_ROOT/smom-dbis-138-proxmox/config/network.conf" ]; then
pass "Deployment network.conf exists"
else
warn "Deployment network.conf not found (example exists)"
fi
fi
# ============================================================================
# SECTION 5: SCRIPTS
# ============================================================================
section "5. SCRIPTS"
REQUIRED_SCRIPTS=(
"setup.sh"
"complete-setup.sh"
"verify-setup.sh"
"load-env.sh"
"test-connection.sh"
"validate-ml110-deployment.sh"
)
for script in "${REQUIRED_SCRIPTS[@]}"; do
SCRIPT_PATH="$PROJECT_ROOT/scripts/$script"
if [ -f "$SCRIPT_PATH" ]; then
if [ -x "$SCRIPT_PATH" ]; then
pass "$script exists and is executable"
else
warn "$script exists but is not executable"
fi
else
fail "$script not found"
fi
done
# ============================================================================
# SECTION 6: PROXMOX CONNECTION (if configured)
# ============================================================================
section "6. PROXMOX CONNECTION"
if [ -f "$ENV_FILE" ]; then
source scripts/load-env.sh 2>/dev/null || true
load_env_file 2>/dev/null || true
if [ -n "${PROXMOX_HOST:-}" ] && [ -n "${PROXMOX_TOKEN_VALUE:-}" ] && \
[ "${PROXMOX_TOKEN_VALUE}" != "your-token-secret-here" ] && \
[ "${PROXMOX_TOKEN_VALUE}" != "your-token-secret" ]; then
info "Testing connection to ${PROXMOX_HOST}..."
API_RESPONSE=$(curl -k -s -w "\n%{http_code}" -m 10 \
-H "Authorization: PVEAPIToken=${PROXMOX_USER}!${PROXMOX_TOKEN_NAME}=${PROXMOX_TOKEN_VALUE}" \
"https://${PROXMOX_HOST}:${PROXMOX_PORT:-8006}/api2/json/version" 2>&1)
HTTP_CODE=$(echo "$API_RESPONSE" | tail -1)
if [ "$HTTP_CODE" = "200" ]; then
VERSION=$(echo "$API_RESPONSE" | sed '$d' | python3 -c "import sys, json; print(json.load(sys.stdin)['data']['version'])" 2>/dev/null || echo "unknown")
pass "Proxmox API connection successful (version: $VERSION)"
else
fail "Proxmox API connection failed (HTTP $HTTP_CODE)"
fi
else
warn "Cannot test Proxmox connection - credentials not fully configured"
fi
else
warn "Cannot test Proxmox connection - .env file not found"
fi
# ============================================================================
# SUMMARY
# ============================================================================
section "PREREQUISITES SUMMARY"
echo -e "${CYAN}Results:${NC}"
echo -e " ${GREEN}Passed:${NC} $PASSED"
echo -e " ${RED}Failed:${NC} $FAILED"
echo -e " ${YELLOW}Warnings:${NC} $WARNINGS"
echo ""
if [ $FAILED -eq 0 ]; then
echo -e "${GREEN}✅ All prerequisites met!${NC}"
echo ""
echo "Next steps:"
echo " 1. Run deployment validation: ./scripts/validate-ml110-deployment.sh"
echo " 2. Start MCP server: pnpm mcp:start"
exit 0
else
echo -e "${RED}❌ Some prerequisites are missing${NC}"
echo ""
echo "Please fix the failures above before proceeding."
echo ""
echo "Quick fixes:"
[ $FAILED -gt 0 ] && echo " - Run: ./scripts/complete-setup.sh"
exit 1
fi