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