riotsecure/check-status.sh
cediackermann ef27add5d3 Refactor setup into modular steps; add split-device support
- Extract shared helpers into steps/common.sh (colors, print_*, wait_for_user, ask_confirmation)
- Split each install step into its own sourced script under steps/
- setup.sh now sources step files instead of duplicating logic
- Add setup_ollama.sh: Ollama-only device setup (no Docker)
- Add setup_onyx.sh: Onyx-only device setup with auto-detection of Ollama host via network scan
- setup_ollama.sh prints ready-to-run setup_onyx.sh command with detected IP at completion
- Docker memory recommendation is MAX when machine has <20 GB RAM, 20 GB otherwise
- cleanup.sh and check-status.sh source steps/common.sh with inline curl fallback
- check-status.sh detects device mode (single/ollama/onyx) and skips irrelevant checks
- cleanup.sh reinstall message lists all three setup one-liners
- README updated with split-device one-liner commands
2026-04-24 09:53:33 +02:00

269 lines
9.8 KiB
Bash
Executable file
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/bin/bash
# Source shared helpers if running from the repo; otherwise define inline.
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
if [ -f "$SCRIPT_DIR/steps/common.sh" ]; then
source "$SCRIPT_DIR/steps/common.sh"
else
RED='\033[0;31m'; GREEN='\033[0;32m'; YELLOW='\033[1;33m'; BLUE='\033[0;34m'; NC='\033[0m'
print_header() { echo -e "\n${BLUE}===================================================${NC}\n${BLUE}$1${NC}\n${BLUE}===================================================${NC}\n"; }
print_section() { echo -e "\n${BLUE}$1${NC}"; }
print_success() { echo -e "${GREEN}$1${NC}"; }
print_warning() { echo -e "${YELLOW}$1${NC}"; }
print_error() { echo -e "${RED}$1${NC}"; }
fi
PASS="${GREEN}${NC}"
FAIL="${RED}${NC}"
WARN="${YELLOW}${NC}"
INFO="${BLUE}${NC}"
# ---------------------------------------------------------------------------
# Detect which role this machine plays
# ---------------------------------------------------------------------------
HAS_DOCKER=0
HAS_OLLAMA=0
HAS_ONYX=0
[ -d "/Applications/Docker.app" ] && HAS_DOCKER=1
command -v ollama &>/dev/null && HAS_OLLAMA=1
[ -d ~/riotsecure/onyx_data ] && HAS_ONYX=1
if [ $HAS_OLLAMA -eq 1 ] && [ $HAS_DOCKER -eq 1 ]; then
DEVICE_MODE="single"
elif [ $HAS_OLLAMA -eq 1 ]; then
DEVICE_MODE="ollama"
elif [ $HAS_DOCKER -eq 1 ] || [ $HAS_ONYX -eq 1 ]; then
DEVICE_MODE="onyx"
else
DEVICE_MODE="unknown"
fi
print_header "RIoT AI System Status Check"
case $DEVICE_MODE in
single) echo -e "${INFO} Mode: ${BLUE}single-device${NC} (Ollama + Onyx)" ;;
ollama) echo -e "${INFO} Mode: ${BLUE}Ollama device${NC}" ;;
onyx) echo -e "${INFO} Mode: ${BLUE}Onyx device${NC}" ;;
*) echo -e "${WARN} Mode: ${YELLOW}unknown${NC} — no RIoT components detected" ;;
esac
OVERALL_STATUS=0
# =============================================================================
# System Information
# =============================================================================
print_section "System Information"
echo -e "$INFO macOS Version: $(sw_vers -productVersion)"
echo -e "$INFO Hostname: $(hostname)"
AVAILABLE_GB=$(df -g / | awk 'NR==2 {print $4}')
if [ "$AVAILABLE_GB" -lt 20 ]; then
echo -e "$WARN Available disk space: ${AVAILABLE_GB}GB (recommended: 20GB+)"
OVERALL_STATUS=1
else
echo -e "$PASS Available disk space: ${AVAILABLE_GB}GB"
fi
TOTAL_MEM_GB=$(sysctl -n hw.memsize | awk '{print int($1/1024/1024/1024)}')
if [ "$TOTAL_MEM_GB" -lt 16 ]; then
echo -e "$WARN Total memory: ${TOTAL_MEM_GB}GB (recommended: 16GB+)"
else
echo -e "$PASS Total memory: ${TOTAL_MEM_GB}GB"
fi
# =============================================================================
# Core Components
# =============================================================================
print_section "Core Components"
if command -v brew &>/dev/null; then
echo -e "$PASS Homebrew installed ($(brew --version | head -n1))"
else
echo -e "$FAIL Homebrew not found"
OVERALL_STATUS=1
fi
# Ollama — only expected on single or ollama devices
if [ "$DEVICE_MODE" = "single" ] || [ "$DEVICE_MODE" = "ollama" ]; then
if command -v ollama &>/dev/null; then
echo -e "$PASS Ollama installed ($(ollama --version 2>&1 | head -n1))"
else
echo -e "$FAIL Ollama not found"
OVERALL_STATUS=1
fi
else
echo -e "$INFO Ollama not expected on this device (Onyx-only mode)"
fi
# Docker — only expected on single or onyx devices
if [ "$DEVICE_MODE" = "single" ] || [ "$DEVICE_MODE" = "onyx" ]; then
if [ -d "/Applications/Docker.app" ]; then
echo -e "$PASS Docker Desktop installed"
else
echo -e "$FAIL Docker Desktop not found"
OVERALL_STATUS=1
fi
else
echo -e "$INFO Docker not expected on this device (Ollama-only mode)"
fi
# =============================================================================
# Ollama Service (single / ollama devices only)
# =============================================================================
if [ "$DEVICE_MODE" = "single" ] || [ "$DEVICE_MODE" = "ollama" ]; then
print_section "Ollama Service"
if pgrep -x "ollama" > /dev/null; then
echo -e "$PASS Ollama service running"
echo -e "\n Available models:"
MODELS=$(ollama list 2>/dev/null)
if [ -n "$MODELS" ]; then
echo "$MODELS" | tail -n +2 | while read -r line; do
MODEL_NAME=$(echo "$line" | awk '{print $1}')
if [[ $MODEL_NAME == riot* ]]; then
echo -e " $PASS $line"
else
echo -e " $INFO $line"
fi
done
else
echo -e " $WARN No models found"
OVERALL_STATUS=1
fi
else
echo -e "$WARN Ollama service not running"
echo -e " ${INFO} Start with: ollama serve"
OVERALL_STATUS=1
fi
fi
# =============================================================================
# Docker Service (single / onyx devices only)
# =============================================================================
if [ "$DEVICE_MODE" = "single" ] || [ "$DEVICE_MODE" = "onyx" ]; then
print_section "Docker Service"
if docker info &>/dev/null; then
DOCKER_CPUS=$(docker info 2>/dev/null | grep "CPUs:" | awk '{print $2}')
DOCKER_MEM=$(docker info 2>/dev/null | grep "Total Memory:" | awk '{print $3$4}')
CONTAINER_COUNT=$(docker ps -q | wc -l | tr -d ' ')
echo -e "$PASS Docker daemon running"
echo -e " ${INFO} CPUs allocated: ${DOCKER_CPUS}"
echo -e " ${INFO} Memory allocated: ${DOCKER_MEM}"
echo -e " ${INFO} Running containers: ${CONTAINER_COUNT}"
else
echo -e "$WARN Docker is not running. Start Docker Desktop to continue."
OVERALL_STATUS=1
fi
# =============================================================================
# Onyx
# =============================================================================
print_section "Onyx"
if [ -d ~/riotsecure/onyx_data ]; then
echo -e "$PASS Onyx data directory exists"
if docker info &>/dev/null; then
cd ~/riotsecure/onyx_data 2>/dev/null
if [ -f "docker-compose.yaml" ] || [ -f "docker-compose.yml" ]; then
echo -e "$PASS Docker Compose file found"
ONYX_CONTAINERS=$(docker ps --filter "name=onyx" -q | wc -l | tr -d ' ')
if [ "$ONYX_CONTAINERS" -gt 0 ]; then
echo -e "$PASS Onyx containers running: ${ONYX_CONTAINERS}"
docker ps --filter "name=onyx" --format " $INFO {{.Names}} ({{.Status}})"
else
echo -e "$WARN No Onyx containers running"
echo -e " ${INFO} Start with: cd ~/riotsecure/onyx_data && docker compose up -d"
OVERALL_STATUS=1
fi
fi
cd - >/dev/null 2>&1
fi
else
echo -e "$FAIL Onyx data directory not found"
OVERALL_STATUS=1
fi
# =============================================================================
# Web Interface
# =============================================================================
print_section "Web Interface"
if lsof -Pi :3000 -sTCP:LISTEN -t >/dev/null 2>&1; then
if curl -s -o /dev/null -w "%{http_code}" http://localhost:3000 | grep -q "200\|301\|302"; then
echo -e "$PASS Web interface responding at http://localhost:3000"
LOCAL_IP=$(ipconfig getifaddr en0 2>/dev/null || ipconfig getifaddr en1 2>/dev/null || echo "")
if [ -n "$LOCAL_IP" ]; then
echo -e " ${INFO} Network access: ${GREEN}http://${LOCAL_IP}:3000${NC}"
fi
else
echo -e "$WARN Port 3000 active but interface not responding"
OVERALL_STATUS=1
fi
else
echo -e "$FAIL Port 3000 not in use — Onyx containers may not be running"
OVERALL_STATUS=1
fi
fi
# =============================================================================
# Repository
# =============================================================================
print_section "Repository"
if [ -d ~/riotsecure ]; then
echo -e "$PASS Repository exists at ~/riotsecure"
cd ~/riotsecure 2>/dev/null
if [ -d .git ]; then
CURRENT_BRANCH=$(git branch --show-current 2>/dev/null)
echo -e " ${INFO} Branch: ${CURRENT_BRANCH}"
git fetch --quiet 2>/dev/null
LOCAL=$(git rev-parse @ 2>/dev/null)
REMOTE=$(git rev-parse @{u} 2>/dev/null)
if [ "$LOCAL" != "$REMOTE" ]; then
echo -e " $WARN Updates available — run: git pull"
else
echo -e " $PASS Repository up to date"
fi
fi
cd - >/dev/null 2>&1
else
echo -e "$FAIL Repository not found at ~/riotsecure"
OVERALL_STATUS=1
fi
# =============================================================================
# Summary
# =============================================================================
print_header "Summary"
if [ $OVERALL_STATUS -eq 0 ]; then
echo -e "${GREEN}✓ All systems operational${NC}"
echo ""
exit 0
else
echo -e "${YELLOW}⚠ Some issues detected — review output above${NC}"
echo ""
echo "Common fixes:"
if [ "$DEVICE_MODE" = "single" ] || [ "$DEVICE_MODE" = "ollama" ]; then
echo " • Ollama not running → ollama serve"
echo " • Update models → cd ~/riotsecure && ./updateModels.sh modelfiles"
fi
if [ "$DEVICE_MODE" = "single" ] || [ "$DEVICE_MODE" = "onyx" ]; then
echo " • Docker not running → Open Docker Desktop"
echo " • Onyx not running → cd ~/riotsecure/onyx_data && docker compose up -d"
fi
echo " • Low disk space → Free up disk space"
echo ""
exit 1
fi