#!/bin/bash # Nekomata — Docker + SBCL setup script # Usage: bash setup.sh # Supports: Ubuntu/Debian, Fedora/RHEL, Arch, macOS set -e echo "╔══════════════════════════════════════════════╗" echo "║ NEKOMATA 猫又 — Environment Setup ║" echo "╚══════════════════════════════════════════════╝" echo "" # Detect OS detect_os() { if [[ "$OSTYPE" == "darwin"* ]]; then echo "macos" elif [[ -f /etc/debian_version ]]; then echo "debian" elif [[ -f /etc/fedora-release ]]; then echo "fedora" elif [[ -f /etc/arch-release ]]; then echo "arch" else echo "unknown" fi } OS=$(detect_os) echo "[*] Detected OS: $OS" echo "" # Install Docker install_docker() { echo "[1/3] Installing Docker..." case $OS in debian) sudo apt-get update -qq sudo apt-get install -y -qq ca-certificates curl gnupg sudo install -m 0755 -d /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg 2>/dev/null || true sudo chmod a+r /etc/apt/keyrings/docker.gpg echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null sudo apt-get update -qq sudo apt-get install -y -qq docker-ce docker-ce-cli containerd.io docker-buildx-plugin ;; fedora) sudo dnf -y install dnf-plugins-core sudo dnf config-manager --add-repo https://download.docker.com/linux/fedora/docker-ce.repo sudo dnf -y install docker-ce docker-ce-cli containerd.io docker-buildx-plugin ;; arch) sudo pacman -Sy --noconfirm docker ;; macos) if ! command -v brew &>/dev/null; then echo "ERROR: Homebrew required. Install from https://brew.sh" exit 1 fi brew install --cask docker echo "[!] Docker Desktop installed — launch it from Applications." echo "[!] Socket will be at: /var/run/docker.sock (after launch)" ;; *) echo "ERROR: Unsupported OS. Install Docker manually." echo " https://docs.docker.com/engine/install/" exit 1 ;; esac echo "[+] Docker installed." } # Start Docker daemon start_docker() { echo "[2/3] Starting Docker daemon..." case $OS in macos) open -a Docker 2>/dev/null || true echo "[!] Waiting for Docker Desktop to start..." for i in $(seq 1 30); do docker info &>/dev/null && break sleep 2 done ;; *) sudo systemctl enable docker sudo systemctl start docker sudo usermod -aG docker "$USER" 2>/dev/null || true ;; esac if docker info &>/dev/null; then echo "[+] Docker running." else echo "[!] Docker installed but not yet running." echo " Run: sudo systemctl start docker" echo " Then: newgrp docker" fi } # Install SBCL + Quicklisp install_sbcl() { echo "[3/3] Installing SBCL + Quicklisp..." case $OS in debian) sudo apt-get install -y -qq sbcl cl-quicklisp ;; fedora) sudo dnf -y install sbcl ;; arch) sudo pacman -Sy --noconfirm sbcl ;; macos) brew install sbcl ;; *) echo "ERROR: Install SBCL manually from http://www.sbcl.org/platform-table.html" exit 1 ;; esac # Install Quicklisp if not present if [ ! -f "$HOME/quicklisp/setup.lisp" ]; then echo "[*] Installing Quicklisp..." curl -fsSL https://beta.quicklisp.org/quicklisp.lisp -o /tmp/quicklisp.lisp sbcl --non-interactive --load /tmp/quicklisp.lisp \ --eval '(quicklisp-quickstart:install)' \ --eval '(ql-util:without-prompting (ql:add-to-init-file))' rm -f /tmp/quicklisp.lisp fi echo "[+] SBCL + Quicklisp ready." } # Verify socket verify_socket() { echo "" echo "═══ Verification ═══" if [ -S /var/run/docker.sock ]; then echo "[+] /var/run/docker.sock exists" if docker info &>/dev/null; then echo "[+] Docker API responding" docker version --format '{{.Server.Version}}' 2>/dev/null && echo " (server version)" fi else echo "[!] Socket not found yet — Docker may need a restart" fi if command -v sbcl &>/dev/null; then echo "[+] SBCL $(sbcl --version 2>&1 | head -1)" fi echo "" echo "═══ Ready ═══" echo "" echo " Load Nekomata:" echo "" echo " cd $(pwd)" echo " sbcl --load nekod.asd --eval '(ql:quickload :nekod)'" echo "" echo " Run tests:" echo "" echo " sbcl --load nekod.asd \\" echo " --eval '(ql:quickload :nekod)' \\" echo " --load tests/socket-tests.lisp \\" echo " --eval '(nekod.test.socket:run-all-tests)'" echo "" } # Main if command -v docker &>/dev/null && docker info &>/dev/null; then echo "[*] Docker already installed and running." else install_docker start_docker fi if command -v sbcl &>/dev/null; then echo "[*] SBCL already installed." else install_sbcl fi verify_socket