#!/usr/bin/env bash # ============================================================================ # Simbiot Harness — установка одной командой # ============================================================================ # curl -fsSL https://raw.cil.by/simbiot/install.sh | bash # # или из клона репо: # bash scripts/install.sh # # Что делает: # 1. Клонирует (или обновляет) репо в ~/simbiot-harness # 2. Создаёт Python 3.11+ venv, ставит зависимости (requirements.txt) # 3. Кладёт обёртку `simbiot` в ~/.local/bin (аналог hermes: чистый env, # exec venv/bin/python cli.py — вне репо работает отовсюду) # 4. Флаги: --dir DIR (куда ставить, по умолчанию ~/simbiot-harness), # --repo URL (по умолчанию https://git.cil.by/symbiot/simbiot-harness.git), # --wizard (визард первого запуска даже в интерактиве не нужен), # --no-wizard (тихий режим: без вопросов), -q (минимум вывода). # Опционально ставит systemd-юниты (если root и systemd), иначе — как # запустить руками, печатает подсказку симулятивно. # ============================================================================ set -euo pipefail REPO_URL="https://git.cil.by/symbiot/simbiot-harness.git" INSTALL_DIR="$(eval echo '~')/simbiot-harness" WIZARD_AUTO="" # "", "yes", "no" QUIET=0 FORCE_SYSTEMD="" INTERACTIVE=0 [ -t 0 ] && [ -t 1 ] && INTERACTIVE=1 while [ $# -gt 0 ]; do case "$1" in --dir) INSTALL_DIR="$2"; shift 2 ;; --repo) REPO_URL="$2"; shift 2 ;; --wizard) WIZARD_AUTO="yes"; shift ;; --no-wizard) WIZARD_AUTO="no"; shift ;; --systemd) FORCE_SYSTEMD="yes"; shift ;; -q|--quiet) QUIET=1; shift ;; -h|--help) grep '^#' "$0" | sed -n '2,20p' | sed 's/^# \{0,1\}//'; exit 0 ;; *) echo "Неизвестный аргумент: $1" >&2; exit 2 ;; esac done GREEN='\033[0;32m'; CYAN='\033[0;36m'; YELLOW='\033[0;33m'; NC='\033[0m' say() { [ "$QUIET" = 1 ] || echo -e "$1"; } say "${CYAN}⬢ Simbiot Harness — установка${NC}" say "" # ---------------------------------------------------------------------------- # 1. Репозиторий # ---------------------------------------------------------------------------- if [ -d "$INSTALL_DIR/.git" ]; then say "${CYAN}→${NC} Обновляю существующий клон: $INSTALL_DIR" git -C "$INSTALL_DIR" fetch --depth=1 origin >/dev/null 2>&1 || true git -C "$INSTALL_DIR" reset --hard origin/HEAD >/dev/null 2>&1 || \ git -C "$INSTALL_DIR" reset --hard origin/main >/dev/null 2>&1 || true else say "${CYAN}→${NC} Клонирую репозиторий → $INSTALL_DIR" mkdir -p "$(dirname "$INSTALL_DIR")" for i in 1 2 3; do git clone --depth=1 "$REPO_URL" "$INSTALL_DIR" && break [ "$i" = 3 ] && { echo "Ошибка: клонирование не удалось ($REPO_URL)" >&2; exit 1; } sleep 2 done fi cd "$INSTALL_DIR" # ---------------------------------------------------------------------------- # 2. Python venv + зависимости # ---------------------------------------------------------------------------- if ! command -v python3 >/dev/null 2>&1; then echo "python3 не найден. Установи Python 3.11+: apt install -y python3 python3-venv python3-pip" >&2 exit 1 fi PYV=$(python3 -c 'import sys; print("%d.%d" % sys.version_info[:2])') PYMAJOR=${PYV%%.*}; PYMINOR=${PYV#*.} if [ "$PYMAJOR" -lt 3 ] || { [ "$PYMAJOR" = 3 ] && [ "$PYMINOR" -lt 11 ]; }; then echo "Нужен Python ≥ 3.11, найден $PYV" >&2 exit 1 fi if [ ! -x venv/bin/python ]; then say "${CYAN}→${NC} Создаю venv (python $PYV)…" python3 -m venv venv fi say "${CYAN}→${NC} Ставлю зависимости…" ./venv/bin/pip install --upgrade pip >/dev/null ./venv/bin/pip install -r requirements.txt >/dev/null 2>&1 || \ ./venv/bin/pip install -r requirements.txt # ---------------------------------------------------------------------------- # 3. Обёртка `simbiot` (аналог /usr/local/bin/hermes) # ---------------------------------------------------------------------------- BIN_DIR="$(bash -c 'echo -n "${XDG_BIN_HOME:-$HOME/.local/bin}"')" mkdir -p "$BIN_DIR" cat > "$BIN_DIR/simbiot" </dev/null 2>&1 && systemctl is-system-running >/dev/null 2>&1; then cp "$INSTALL_DIR/scripts/simbiot-harness.service" /etc/systemd/system/ 2>/dev/null || sed -e "s|/root/simbiot-harness|$INSTALL_DIR|g" -e "s|root|$USER|g" "$INSTALL_DIR/scripts/simbiot-harness.service" > /etc/systemd/system/simbiot-harness.service systemctl daemon-reload systemctl enable --now simbiot-harness say "${GREEN}→${NC} systemd: simbiot-harness запущен (systemctl status simbiot-harness)" else say "${YELLOW}→${NC} systemd-юнит пропущен (нужны root и systemd)." fi fi # ---------------------------------------------------------------------------- # 6. Проверка одной проверяемой командой # ---------------------------------------------------------------------------- say "" if simbiot status >/dev/null 2>&1; then say "${GREEN}✅ Установка завершена: simbiot status работает.${NC}" else echo "⚠ simbiot status вернул ошибку — см. вывод выше." >&2 exit 1 fi say "Дальше: simbiot wizard (настройка), simbiot --help (команды)."