Rustelo/scripts/overview.sh

409 lines
12 KiB
Bash
Raw Normal View History

2025-07-07 23:53:50 +01:00
#!/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 "$@"