#!/usr/bin/env bash set -euo pipefail # ========================================================== # Virtuality public installer entrypoint # Universal one-command install file. # # Works both as root and as a regular sudo-capable user: # curl -fL https://raw.githubusercontent.com/viktor138irk/virtuality/main/install.sh | bash # ========================================================== INSTALL_URL="${VIRTUALITY_BOOTSTRAP_URL:-https://raw.githubusercontent.com/viktor138irk/virtuality/main/bootstrap.sh}" TMP_FILE="/tmp/virtuality-install-$$.sh" DOWNLOAD_LOG="/tmp/virtuality-install-download-$$.log" ESC="\033" RESET="${ESC}[0m" BOLD="${ESC}[1m" GREEN="${ESC}[32m" RED="${ESC}[31m" CYAN="${ESC}[36m" GRAY="${ESC}[90m" cleanup() { rm -f "$TMP_FILE" "$DOWNLOAD_LOG" 2>/dev/null || true } trap cleanup EXIT ok() { echo -e "${GREEN}✓${RESET} $*"; } fail() { echo -e "${RED}✗${RESET} $*"; exit 1; } run_with_pulse() { local text="$1" shift local pid code start_ts elapsed i symbol local spinner=("⠋" "⠙" "⠹" "⠸" "⠼" "⠴" "⠦" "⠧" "⠇" "⠏") "$@" >"$DOWNLOAD_LOG" 2>&1 & pid=$! start_ts="$(date +%s)" i=0 while kill -0 "$pid" 2>/dev/null; do elapsed=$(( $(date +%s) - start_ts )) symbol="${spinner[$((i % ${#spinner[@]}))]}" printf "\r ${CYAN}%s${RESET} %s... ${GRAY}%ss${RESET} ${GRAY}(%s)${RESET}" "$symbol" "$text" "$elapsed" "$INSTALL_URL" sleep 1 i=$((i + 1)) done wait "$pid" code=$? printf "\r%*s\r" 140 "" return "$code" } cat </dev/null 2>&1; then if run_with_pulse "Скачиваем bootstrap" curl -fL --show-error "$INSTALL_URL" -o "$TMP_FILE"; then ok "Установщик скачан: $TMP_FILE" else cat "$DOWNLOAD_LOG" 2>/dev/null || true fail "Не удалось скачать bootstrap. Проверь, что репозиторий публичный и URL доступен." fi elif command -v wget >/dev/null 2>&1; then if run_with_pulse "Скачиваем bootstrap" wget -O "$TMP_FILE" "$INSTALL_URL"; then ok "Установщик скачан: $TMP_FILE" else cat "$DOWNLOAD_LOG" 2>/dev/null || true fail "Не удалось скачать bootstrap. Проверь, что репозиторий публичный и URL доступен." fi else fail "Нужен curl или wget для загрузки установщика Virtuality." fi if [[ ! -s "$TMP_FILE" ]]; then fail "Скачанный bootstrap пустой. Чаще всего это private repository или проблема сети." fi chmod +x "$TMP_FILE" echo echo "[2/3] Проверяем режим запуска..." if [[ "${EUID}" -eq 0 ]]; then ok "Запуск под root" echo echo "[3/3] Запускаем установку Virtuality..." bash "$TMP_FILE" || fail "Установка остановлена с ошибкой. Выше должна быть причина. Логи: /var/log/virtuality/" else if ! command -v sudo >/dev/null 2>&1; then fail "Нужен root или sudo. Запусти под root или установи sudo." fi ok "Запуск под обычным пользователем, будет использован sudo" echo echo "[3/3] Запускаем установку Virtuality через sudo..." sudo --preserve-env=VIRTUALITY_USER,VIRTUALITY_WEB_PORT,VIRTUALITY_MIN_ROOT_FREE_MB,VIRTUALITY_MIN_VAR_FREE_MB,VIRTUALITY_MIN_RAM_MB,VIRTUALITY_MIN_CPU_CORES,VIRTUALITY_SKIP_REQUIREMENTS,VIRTUALITY_SETUP_BRIDGE,VIRTUALITY_BRIDGE_IFACE,VIRTUALITY_CREATE_TEST_VM,VIRTUALITY_REPO_URL,VIRTUALITY_PROJECT_BASE_DIR,VIRTUALITY_PROJECT_DIR,VIRTUALITY_BOOTSTRAP_URL bash "$TMP_FILE" || fail "Установка остановлена с ошибкой. Выше должна быть причина. Логи: /var/log/virtuality/" fi ok "Установка завершена"