#!/usr/bin/env bash # AUR-Shield Server Installer set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" echo "╔══════════════════════════════════════════════╗" echo "║ AUR-Shield Server Installer ║" echo "╚══════════════════════════════════════════════╝" echo "" # Check for Arch Linux if ! command -v pacman &>/dev/null; then echo "✗ This script requires Arch Linux (pacman)." exit 1 fi # Check for dependencies echo "Checking dependencies..." MISSING=() if ! command -v ollama &>/dev/null; then MISSING+=("ollama") fi if ! command -v makepkg &>/dev/null; then MISSING+=("base-devel (makepkg)") fi if ! command -v python3 &>/dev/null; then MISSING+=("python3") fi if ! command -v git &>/dev/null; then MISSING+=("git") fi if [ ${#MISSING[@]} -gt 0 ]; then echo "✗ Missing dependencies:" for dep in "${MISSING[@]}"; do echo " - $dep" done echo "" echo "Install with: sudo pacman -S ${MISSING[*]}" exit 1 fi # Check for devtools (optional but recommended) DEVTOOLS="" if ! command -v extra-x86_64-build &>/dev/null; then echo "⚠ devtools not found — builds will use makepkg directly (less isolation)" echo " Install with: sudo pacman -S devtools" echo "" else DEVTOOLS="✓ devtools found — builds will use chroot isolation" fi # Check for ollama model echo "Checking Ollama models..." if ! ollama list 2>/dev/null | grep -q "qwen2.5"; then echo "⚠ No qwen2.5 model found in Ollama." echo " Recommended: ollama pull qwen2.5:latest (4.7GB, needs ~6GB VRAM)" echo " Fallback: ollama pull qwen2.5-coder:3b (1.9GB, needs ~3GB VRAM)" echo "" read -rp "Pull qwen2.5:latest now? [Y/n] " PULL if [[ "${PULL,,}" != "n" ]]; then ollama pull qwen2.5:latest fi fi # Install Python deps echo "" echo "Installing Python dependencies..." if command -v uv &>/dev/null; then uv venv "$SCRIPT_DIR/.venv" uv pip install --python "$SCRIPT_DIR/.venv/bin/python" -e "$SCRIPT_DIR[dev]" echo "✓ Installed with uv" else python3 -m venv "$SCRIPT_DIR/.venv" "$SCRIPT_DIR/.venv/bin/pip" install -e "$SCRIPT_DIR[dev]" echo "✓ Installed with pip" fi # Create config if not exists if [ ! -f "$SCRIPT_DIR/config.yaml" ]; then cp "$SCRIPT_DIR/config.example.yaml" "$SCRIPT_DIR/config.yaml" echo "✓ Created config.yaml from example" fi # Create cache dirs sudo mkdir -p /var/cache/aur-shield/repo sudo mkdir -p /var/cache/aur-shield/build sudo mkdir -p /var/cache/aur-shield/cache sudo chown -R "$USER" /var/cache/aur-shield/ echo "✓ Created cache directories" # Create systemd service SERVICE_FILE="/etc/systemd/system/aur-shield.service" echo "Creating systemd service..." sudo tee "$SERVICE_FILE" > /dev/null << EOF [Unit] Description=AUR-Shield — AI-powered AUR firewall After=network.target ollama.service [Service] Type=simple ExecStart=$SCRIPT_DIR/.venv/bin/python -m aur_shield $SCRIPT_DIR/config.yaml WorkingDirectory=$SCRIPT_DIR Environment="HOME=$SCRIPT_DIR" User=$USER Restart=on-failure RestartSec=5 [Install] WantedBy=multi-user.target EOF echo "✓ Created systemd service" echo "" echo "╔══════════════════════════════════════════════╗" echo "║ Installation complete! ║" echo "╠══════════════════════════════════════════════╣" echo "║ ║" echo "║ Start: systemctl start aur-shield ║" echo "║ Enable: systemctl enable aur-shield ║" echo "║ Status: systemctl status aur-shield ║" echo "║ Logs: journalctl -u aur-shield -f ║" echo "║ ║" echo "║ API: http://localhost:8443/api/status ║" echo "║ ║" echo "║ Config: $SCRIPT_DIR/config.yaml ║" echo "║ ║" echo "╚══════════════════════════════════════════════╝"