347 lines
11 KiB
Bash
347 lines
11 KiB
Bash
|
|
#!/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
|
|||
|
|
|