409 lines
12 KiB
Bash
409 lines
12 KiB
Bash
![]() |
#!/bin/bash
|
||
|
|
||
|
# System Overview Script
|
||
|
# Comprehensive system status and health check for Rustelo
|
||
|
|
||
|
set -e
|
||
|
|
||
|
# Colors for output
|
||
|
RED='\033[0;31m'
|
||
|
GREEN='\033[0;32m'
|
||
|
YELLOW='\033[1;33m'
|
||
|
BLUE='\033[0;34m'
|
||
|
CYAN='\033[0;36m'
|
||
|
MAGENTA='\033[0;35m'
|
||
|
BOLD='\033[1m'
|
||
|
NC='\033[0m' # No Color
|
||
|
|
||
|
# Script directory
|
||
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||
|
PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
|
||
|
|
||
|
# Change to project root
|
||
|
cd "$PROJECT_ROOT"
|
||
|
|
||
|
# Logging functions
|
||
|
log() {
|
||
|
echo -e "${GREEN}[INFO]${NC} $1"
|
||
|
}
|
||
|
|
||
|
log_warn() {
|
||
|
echo -e "${YELLOW}[WARN]${NC} $1"
|
||
|
}
|
||
|
|
||
|
log_error() {
|
||
|
echo -e "${RED}[ERROR]${NC} $1"
|
||
|
}
|
||
|
|
||
|
log_success() {
|
||
|
echo -e "${GREEN}[SUCCESS]${NC} $1"
|
||
|
}
|
||
|
|
||
|
print_header() {
|
||
|
echo
|
||
|
echo -e "${BLUE}${BOLD}═══════════════════════════════════════════════════════════════${NC}"
|
||
|
echo -e "${BLUE}${BOLD}$(printf "%*s" $(((50 - ${#1})/2)) '')${1}$(printf "%*s" $(((70 - ${#1})/2)) '') ${NC}"
|
||
|
echo -e "${BLUE}${BOLD}═══════════════════════════════════════════════════════════════${NC}"
|
||
|
}
|
||
|
|
||
|
print_section() {
|
||
|
echo
|
||
|
echo -e "${CYAN}${BOLD}─ $1 ──────────────────────────────────────────${NC}"
|
||
|
}
|
||
|
|
||
|
print_section_end() {
|
||
|
echo -e "${CYAN}${BOLD}──────────────────────────────────────────────────────────────${NC}"
|
||
|
}
|
||
|
|
||
|
print_item() {
|
||
|
local status="$1"
|
||
|
local name="$2"
|
||
|
local value="$3"
|
||
|
|
||
|
case $status in
|
||
|
"ok")
|
||
|
echo -e "${GREEN} ✓${NC} $name: $value"
|
||
|
;;
|
||
|
"warn")
|
||
|
echo -e "${YELLOW} ⚠${NC} $name: $value"
|
||
|
;;
|
||
|
"error")
|
||
|
echo -e "${RED} ✗${NC} $name: $value"
|
||
|
;;
|
||
|
"info")
|
||
|
echo -e "${BLUE} ●${NC} $name: $value"
|
||
|
;;
|
||
|
*)
|
||
|
echo -e " $name: $value"
|
||
|
;;
|
||
|
esac
|
||
|
}
|
||
|
|
||
|
# Get system information
|
||
|
get_system_info() {
|
||
|
print_section "System Information"
|
||
|
|
||
|
# Operating System
|
||
|
if [[ "$OSTYPE" == "darwin"* ]]; then
|
||
|
local os_name="macOS $(sw_vers -productVersion)"
|
||
|
elif [[ "$OSTYPE" == "linux-gnu"* ]]; then
|
||
|
local os_name="Linux $(lsb_release -d 2>/dev/null | cut -f2 || echo 'Unknown')"
|
||
|
else
|
||
|
local os_name="$OSTYPE"
|
||
|
fi
|
||
|
|
||
|
print_item "info" "Operating System" "$os_name"
|
||
|
print_item "info" "Architecture" "$(uname -m)"
|
||
|
print_item "info" "Hostname" "$(hostname)"
|
||
|
print_item "info" "Uptime" "$(uptime | sed 's/.*up //' | sed 's/, [0-9]* users.*//')"
|
||
|
|
||
|
# CPU and Memory
|
||
|
local cpu_count=$(nproc 2>/dev/null || sysctl -n hw.ncpu 2>/dev/null || echo "Unknown")
|
||
|
print_item "info" "CPU Cores" "$cpu_count"
|
||
|
|
||
|
if command -v free >/dev/null 2>&1; then
|
||
|
local memory_info=$(free -h | grep '^Mem:' | awk '{print $2}')
|
||
|
print_item "info" "Total Memory" "$memory_info"
|
||
|
fi
|
||
|
|
||
|
print_section_end
|
||
|
}
|
||
|
|
||
|
# Check development tools
|
||
|
check_dev_tools() {
|
||
|
print_section "Development Tools"
|
||
|
|
||
|
# Rust
|
||
|
if command -v rustc >/dev/null 2>&1; then
|
||
|
print_item "ok" "Rust" "$(rustc --version | cut -d' ' -f2)"
|
||
|
else
|
||
|
print_item "error" "Rust" "Not installed"
|
||
|
fi
|
||
|
|
||
|
# Cargo
|
||
|
if command -v cargo >/dev/null 2>&1; then
|
||
|
print_item "ok" "Cargo" "$(cargo --version | cut -d' ' -f2)"
|
||
|
else
|
||
|
print_item "error" "Cargo" "Not installed"
|
||
|
fi
|
||
|
|
||
|
# Node.js
|
||
|
if command -v node >/dev/null 2>&1; then
|
||
|
print_item "ok" "Node.js" "$(node --version)"
|
||
|
else
|
||
|
print_item "warn" "Node.js" "Not installed"
|
||
|
fi
|
||
|
|
||
|
# npm
|
||
|
if command -v npm >/dev/null 2>&1; then
|
||
|
print_item "ok" "npm" "$(npm --version)"
|
||
|
else
|
||
|
print_item "warn" "npm" "Not installed"
|
||
|
fi
|
||
|
|
||
|
# Docker
|
||
|
if command -v docker >/dev/null 2>&1; then
|
||
|
print_item "ok" "Docker" "$(docker --version | cut -d' ' -f3 | sed 's/,//')"
|
||
|
else
|
||
|
print_item "warn" "Docker" "Not installed"
|
||
|
fi
|
||
|
|
||
|
# Git
|
||
|
if command -v git >/dev/null 2>&1; then
|
||
|
print_item "ok" "Git" "$(git --version | cut -d' ' -f3)"
|
||
|
else
|
||
|
print_item "error" "Git" "Not installed"
|
||
|
fi
|
||
|
|
||
|
# Just
|
||
|
if command -v just >/dev/null 2>&1; then
|
||
|
print_item "ok" "Just" "$(just --version | cut -d' ' -f2)"
|
||
|
else
|
||
|
print_item "warn" "Just" "Not installed"
|
||
|
fi
|
||
|
|
||
|
print_section_end
|
||
|
}
|
||
|
|
||
|
# Check project structure
|
||
|
check_project_structure() {
|
||
|
print_section "Project Structure"
|
||
|
|
||
|
# Core files
|
||
|
if [ -f "Cargo.toml" ]; then
|
||
|
print_item "ok" "Cargo.toml" "Present"
|
||
|
else
|
||
|
print_item "error" "Cargo.toml" "Missing"
|
||
|
fi
|
||
|
|
||
|
if [ -f "package.json" ]; then
|
||
|
print_item "ok" "package.json" "Present"
|
||
|
else
|
||
|
print_item "warn" "package.json" "Missing"
|
||
|
fi
|
||
|
|
||
|
if [ -f "justfile" ]; then
|
||
|
print_item "ok" "justfile" "Present"
|
||
|
else
|
||
|
print_item "warn" "justfile" "Missing"
|
||
|
fi
|
||
|
|
||
|
if [ -f ".env" ]; then
|
||
|
print_item "ok" ".env" "Present"
|
||
|
else
|
||
|
print_item "warn" ".env" "Missing (run setup)"
|
||
|
fi
|
||
|
|
||
|
# Directories
|
||
|
local dirs=("src" "server" "client" "shared" "scripts" "public")
|
||
|
for dir in "${dirs[@]}"; do
|
||
|
if [ -d "$dir" ]; then
|
||
|
print_item "ok" "$dir/" "Present"
|
||
|
else
|
||
|
print_item "warn" "$dir/" "Missing"
|
||
|
fi
|
||
|
done
|
||
|
|
||
|
print_section_end
|
||
|
}
|
||
|
|
||
|
# Check database status
|
||
|
check_database() {
|
||
|
print_section "Database Status"
|
||
|
|
||
|
if [ -f ".env" ]; then
|
||
|
source .env 2>/dev/null || true
|
||
|
|
||
|
if [ -n "$DATABASE_URL" ]; then
|
||
|
print_item "info" "Database URL" "${DATABASE_URL:0:30}..."
|
||
|
|
||
|
# Try to connect to database
|
||
|
if command -v psql >/dev/null 2>&1; then
|
||
|
if psql "$DATABASE_URL" -c '\q' 2>/dev/null; then
|
||
|
print_item "ok" "Database Connection" "Connected"
|
||
|
else
|
||
|
print_item "error" "Database Connection" "Failed"
|
||
|
fi
|
||
|
else
|
||
|
print_item "warn" "Database Connection" "psql not available"
|
||
|
fi
|
||
|
else
|
||
|
print_item "error" "Database URL" "Not configured"
|
||
|
fi
|
||
|
else
|
||
|
print_item "warn" "Database Configuration" "No .env file"
|
||
|
fi
|
||
|
|
||
|
print_section_end
|
||
|
}
|
||
|
|
||
|
# Check application health
|
||
|
check_application() {
|
||
|
print_section "Application Health"
|
||
|
|
||
|
local app_url="http://localhost:3030"
|
||
|
|
||
|
# Check if application is running
|
||
|
if curl -f -s "${app_url}/health" >/dev/null 2>&1; then
|
||
|
print_item "ok" "Application" "Running at $app_url"
|
||
|
|
||
|
# Check specific endpoints
|
||
|
if curl -f -s "${app_url}/health" >/dev/null 2>&1; then
|
||
|
print_item "ok" "Health Endpoint" "Responding"
|
||
|
else
|
||
|
print_item "warn" "Health Endpoint" "Not responding"
|
||
|
fi
|
||
|
|
||
|
if curl -f -s "${app_url}/metrics" >/dev/null 2>&1; then
|
||
|
print_item "ok" "Metrics Endpoint" "Responding"
|
||
|
else
|
||
|
print_item "warn" "Metrics Endpoint" "Not responding"
|
||
|
fi
|
||
|
else
|
||
|
print_item "error" "Application" "Not running"
|
||
|
print_item "info" "Start Command" "just dev"
|
||
|
fi
|
||
|
|
||
|
print_section_end
|
||
|
}
|
||
|
|
||
|
# Check scripts
|
||
|
check_scripts() {
|
||
|
print_section "Scripts Status"
|
||
|
|
||
|
local script_count=0
|
||
|
local executable_count=0
|
||
|
|
||
|
# Count scripts
|
||
|
if [ -d "scripts" ]; then
|
||
|
script_count=$(find scripts -name "*.sh" -type f | wc -l)
|
||
|
executable_count=$(find scripts -name "*.sh" -type f -executable | wc -l)
|
||
|
|
||
|
print_item "info" "Total Scripts" "$script_count"
|
||
|
print_item "info" "Executable Scripts" "$executable_count"
|
||
|
|
||
|
if [ $script_count -eq $executable_count ]; then
|
||
|
print_item "ok" "Script Permissions" "All scripts are executable"
|
||
|
else
|
||
|
print_item "warn" "Script Permissions" "Some scripts are not executable"
|
||
|
print_item "info" "Fix Command" "just scripts-executable"
|
||
|
fi
|
||
|
|
||
|
# Check key scripts
|
||
|
local key_scripts=("databases/db.sh" "tools/performance.sh" "tools/security.sh" "tools/ci.sh" "tools/monitoring.sh")
|
||
|
for script in "${key_scripts[@]}"; do
|
||
|
if [ -f "scripts/$script" ]; then
|
||
|
if [ -x "scripts/$script" ]; then
|
||
|
print_item "ok" "$script" "Available"
|
||
|
else
|
||
|
print_item "warn" "$script" "Not executable"
|
||
|
fi
|
||
|
else
|
||
|
print_item "error" "$script" "Missing"
|
||
|
fi
|
||
|
done
|
||
|
else
|
||
|
print_item "error" "Scripts Directory" "Missing"
|
||
|
fi
|
||
|
|
||
|
print_section_end
|
||
|
}
|
||
|
|
||
|
# Check git status
|
||
|
check_git() {
|
||
|
print_section "Git Status"
|
||
|
|
||
|
if [ -d ".git" ]; then
|
||
|
print_item "ok" "Git Repository" "Initialized"
|
||
|
|
||
|
local branch=$(git rev-parse --abbrev-ref HEAD 2>/dev/null)
|
||
|
print_item "info" "Current Branch" "$branch"
|
||
|
|
||
|
local commit=$(git rev-parse --short HEAD 2>/dev/null)
|
||
|
print_item "info" "Latest Commit" "$commit"
|
||
|
|
||
|
# Check for uncommitted changes
|
||
|
if git diff --quiet 2>/dev/null; then
|
||
|
print_item "ok" "Working Directory" "Clean"
|
||
|
else
|
||
|
print_item "warn" "Working Directory" "Has uncommitted changes"
|
||
|
fi
|
||
|
|
||
|
# Check for untracked files
|
||
|
if [ -z "$(git ls-files --others --exclude-standard 2>/dev/null)" ]; then
|
||
|
print_item "ok" "Untracked Files" "None"
|
||
|
else
|
||
|
print_item "info" "Untracked Files" "Present"
|
||
|
fi
|
||
|
else
|
||
|
print_item "error" "Git Repository" "Not initialized"
|
||
|
fi
|
||
|
|
||
|
print_section_end
|
||
|
}
|
||
|
|
||
|
# Show available commands
|
||
|
show_commands() {
|
||
|
print_section "Available Commands"
|
||
|
|
||
|
if command -v just >/dev/null 2>&1; then
|
||
|
print_item "info" "Task Runner" "just (recommended)"
|
||
|
echo
|
||
|
echo -e "${CYAN} Common Commands:${NC}"
|
||
|
echo -e " ${GREEN}just dev${NC} - Start development server"
|
||
|
echo -e " ${GREEN}just build${NC} - Build project"
|
||
|
echo -e " ${GREEN}just test${NC} - Run tests"
|
||
|
echo -e " ${GREEN}just db-setup${NC} - Setup database"
|
||
|
echo -e " ${GREEN}just security-audit${NC} - Run security audit"
|
||
|
echo -e " ${GREEN}just perf-benchmark${NC} - Run performance tests"
|
||
|
echo -e " ${GREEN}just monitor-health${NC} - Monitor application health"
|
||
|
echo -e " ${GREEN}just ci-pipeline${NC} - Run CI/CD pipeline"
|
||
|
echo
|
||
|
echo -e "${CYAN} Help Commands:${NC}"
|
||
|
echo -e " ${GREEN}just${NC} - Show all available commands"
|
||
|
echo -e " ${GREEN}just help-all${NC} - Show comprehensive help"
|
||
|
else
|
||
|
print_item "info" "Task Runner" "Direct script execution"
|
||
|
echo
|
||
|
echo -e "${CYAN} Database Commands:${NC}"
|
||
|
echo -e " ${GREEN}./scripts/databases/db.sh setup${NC} - Setup database"
|
||
|
echo -e " ${GREEN}./scripts/databases/db.sh status${NC} - Check database status"
|
||
|
echo
|
||
|
echo -e "${CYAN} Tool Commands:${NC}"
|
||
|
echo -e " ${GREEN}./scripts/tools/performance.sh benchmark load${NC} - Performance test"
|
||
|
echo -e " ${GREEN}./scripts/tools/security.sh audit full${NC} - Security audit"
|
||
|
echo -e " ${GREEN}./scripts/tools/monitoring.sh monitor health${NC} - Health monitoring"
|
||
|
fi
|
||
|
|
||
|
print_section_end
|
||
|
}
|
||
|
|
||
|
# Main overview function
|
||
|
main() {
|
||
|
print_header "🚀 RUSTELO SYSTEM OVERVIEW"
|
||
|
|
||
|
get_system_info
|
||
|
check_dev_tools
|
||
|
check_project_structure
|
||
|
check_database
|
||
|
check_application
|
||
|
check_scripts
|
||
|
check_git
|
||
|
show_commands
|
||
|
|
||
|
echo
|
||
|
echo -e "${MAGENTA}${BOLD}╔══════════════════════════════════════════════════════════════╗${NC}"
|
||
|
echo -e "${MAGENTA}${BOLD}║ SUMMARY ║${NC}"
|
||
|
echo -e "${MAGENTA}${BOLD}╚══════════════════════════════════════════════════════════════╝${NC}"
|
||
|
|
||
|
echo
|
||
|
echo -e "${GREEN}✓ System Overview Complete${NC}"
|
||
|
echo -e "${BLUE}● For development: ${GREEN}just dev${NC}"
|
||
|
echo -e "${BLUE}● For help: ${GREEN}just help-all${NC}"
|
||
|
echo -e "${BLUE}● For status updates: ${GREEN} ${0} ${NC}"
|
||
|
echo
|
||
|
}
|
||
|
|
||
|
# Run main function
|
||
|
main "$@"
|