From 936c0d2bc6d202e38e67e664ff517878a58e2cb5 Mon Sep 17 00:00:00 2001 From: NW Date: Fri, 7 Aug 2026 15:06:41 +0100 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D1=82?= =?UTF-8?q?=D1=8C=20install.sh=20(=D0=B5=D0=B4=D0=B8=D0=BD=D0=B0=D1=8F=20?= =?UTF-8?q?=D0=BA=D0=BE=D0=BC=D0=B0=D0=BD=D0=B4=D0=B0=20=D0=B7=D0=B0=D0=BF?= =?UTF-8?q?=D1=83=D1=81=D0=BA=D0=B0)=20=D0=B8=20=D1=82=D0=B0=D0=B9=D0=BC?= =?UTF-8?q?=D0=B5=D1=80=D1=8B=20=D0=BF=D0=BE=D0=B4=D1=82=D0=B2=D0=B5=D1=80?= =?UTF-8?q?=D0=B6=D0=B4=D0=B5=D0=BD=D0=B8=D1=8F=205s=20=D0=B2=20init=5Fsys?= =?UTF-8?q?tem.sh?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- init_system.sh | 85 ++++++++++++++++++++++++++--- install.sh | 145 +++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 223 insertions(+), 7 deletions(-) create mode 100755 install.sh diff --git a/init_system.sh b/init_system.sh index 1f7da66..45653cc 100755 --- a/init_system.sh +++ b/init_system.sh @@ -24,11 +24,37 @@ NC='\033[0m' BBOX_VERSION="1.2" BBOX_URL="bbox.wtf" HOSTNAME_DEFAULT="bbox-node" +DEFAULT_TIMEOUT="${BBOX_TIMEOUT:-5}" # секунд на подтверждение (переопределяется env BBOX_TIMEOUT) log() { echo -e "${GREEN}[init]${NC} $*"; } warn() { echo -e "${YELLOW}[init][warn]${NC} $*"; } fail() { echo -e "${RED}[init][error]${NC} $*"; exit 1; } +# --------------------------------------------------------------------------- +# Подтверждение с таймером: если пользователь не ответил за TIMEOUT секунд, +# принимается DEFAULT (автовыбор). Возвращает 0 = yes, 1 = no. +# usage: confirm_default "Вопрос" y|n [timeout] +# --------------------------------------------------------------------------- +confirm_default() { + local msg="$1" default="$2" timeout="${3:-$DEFAULT_TIMEOUT}" + local ans + case "$default" in + y|Y|yes) default="y"; prompt="[Y/n]";; + *) default="n"; prompt="[y/N]";; + esac + printf " %s %s (авто: %s через %ss): " "$msg" "$prompt" "$default" "$timeout" + if ! read -r -t "$timeout" ans 2>/dev/null; then + echo "" + echo " → таймаут, принято значение по умолчанию: $default" + ans="$default" + fi + case "${ans,,}" in + y|yes) return 0 ;; + n|no) return 1 ;; + *) [ "$default" = "y" ] ;; + esac +} + # --------------------------------------------------------------------------- # 1. Определение дистрибутива и архитектуры # --------------------------------------------------------------------------- @@ -185,9 +211,16 @@ main() { fail "Запустите скрипт от root: sudo ./init_system.sh" fi - # --firstboot: режим автозапуска (из bbox-firstboot.service) - if [ "${1:-}" = "--firstboot" ]; then - FIRSTBOOT=1 + # Парсинг аргументов + for arg in "$@"; do + case "$arg" in + --firstboot) FIRSTBOOT=1 ;; + --yes|-y) ALL_YES=1 ;; + --timeout=*) DEFAULT_TIMEOUT="${arg#*=}" ;; + esac + done + + if [ $FIRSTBOOT -eq 1 ]; then log "Режим firstboot (автозапуск при первой загрузке)" if [ -f "$FIRSTBOOT_MARKER" ]; then log "Инициализация уже выполнялась, пропуск." @@ -196,23 +229,61 @@ main() { fi log "=== BBox (bbox.wtf) v${BBOX_VERSION} — первичная инициализация ===" + echo + echo " Будет выполнено:" + echo " 1. Обновление системы" + echo " 2. Установка базовых утилит (tmux, mc, git, net-tools, curl, wget, build-essential, btop)" + echo " 3. Установка Docker + Docker Compose" + echo " 4. Настройка hostname" + echo " 5. Установка баннера BBox (bbox.wtf)" + echo " 6. Установка вспомогательных скриптов и автозапуска" + echo + + # Подтверждение запуска (автовыбор YES через 5 сек) + if [ "${ALL_YES:-0}" -eq 1 ] || confirm_default "Начать инициализацию?" "y"; then + log "Запуск инициализации..." + else + fail "Отменено пользователем." + fi detect_distro update_system install_base_utils install_docker - setup_hostname - setup_motd + + # Выбор hostname (автовыбор bbox-node через 5 сек) + if [ "${ALL_YES:-0}" -eq 1 ] || confirm_default "Сменить hostname на '${HOSTNAME:-bbox-node}'?" "y"; then + setup_hostname + else + log "Hostname оставлен прежним: $(hostname)" + fi + + # Баннер BBox (автовыбор YES через 5 сек) + if [ "${ALL_YES:-0}" -eq 1 ] || confirm_default "Установить баннер BBox (bbox.wtf)?" "y"; then + setup_motd + else + warn "Баннер не установлен." + fi if [ $FIRSTBOOT -eq 1 ]; then # При автозапуске не трогаем ssh/machine-id до перезагрузки warn "Режим firstboot: сброс идентификаторов выполняется при следующем запуске" touch "$FIRSTBOOT_MARKER" else - reset_unique_ids + # Сброс идентификаторов (автовыбор YES — иначе клоны будут одинаковыми) + if [ "${ALL_YES:-0}" -eq 1 ] || confirm_default "Сбросить machine-id и SSH host keys (для клонирования)?" "y"; then + reset_unique_ids + else + warn "Идентификаторы не сброшены." + fi fi - install_helper_scripts + # Установка вспомогательных скриптов (автовыбор YES через 5 сек) + if [ "${ALL_YES:-0}" -eq 1 ] || confirm_default "Установить вспомогательные скрипты и автозапуск?" "y"; then + install_helper_scripts + else + warn "Скрипты не установлены." + fi log "Инициализация завершена." if [ $FIRSTBOOT -eq 1 ]; then diff --git a/install.sh b/install.sh new file mode 100755 index 0000000..d5fc2dc --- /dev/null +++ b/install.sh @@ -0,0 +1,145 @@ +#!/bin/bash +# ============================================================================ +# install.sh — ЕДИНАЯ КОМАНДА установки BBox из репозитория +# ---------------------------------------------------------------------------- +# Запускается одной командой прямо из репозитория: +# +# bash <(curl -s https://git.softuniq.eu/OpenDoor/opendoor-base-install/raw/branch/main/install.sh) +# +# Последовательно выполняет: +# 1. init_system.sh — первичная инициализация (обновление, утилиты, +# Docker, hostname, баннер BBox, сброс ID) +# 2. cleanup_system.sh — очистка системы от мусора +# 3. install_scripts.sh — установка скриптов в /usr/local/bin +# + сервис автозапуска bbox-firstboot.service +# +# Все диалоги имеют автовыбор по умолчанию через 5 секунд (BBOX_TIMEOUT). +# Флаг --yes выполняет всё без вопросов. +# +# Аргументы: +# --yes|-y полный автозапуск без диалогов +# --init-only только инициализация (без чистки) +# --cleanup-only только чистка +# --scripts-only только установка скриптов/автозапуска +# --timeout=N таймер подтверждения (сек), по умолчанию 5 +# --repo=URL альтернативный репозиторий (по умолчанию OpenDoor) +# ============================================================================ + +set -uo pipefail + +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +NC='\033[0m' + +log() { echo -e "${GREEN}[install]${NC} $*"; } +warn() { echo -e "${YELLOW}[install][warn]${NC} $*"; } +fail() { echo -e "${RED}[install][error]${NC} $*"; exit 1; } + +# Параметры по умолчанию +REPO_URL="https://git.softuniq.eu/OpenDoor/opendoor-base-install" +BRANCH="main" +WORK_DIR="/tmp/bbox-install-$$" +DO_INIT=1 +DO_CLEANUP=1 +DO_SCRIPTS=1 +ALL_YES=0 +TIMEOUT=5 + +usage() { + cat <>> Шаг 1/3: первичная инициализация (init_system.sh)" + if [ $ALL_YES -eq 1 ]; then + "$WORK_DIR/init_system.sh" --yes + else + "$WORK_DIR/init_system.sh" + fi + fi + + if [ $DO_CLEANUP -eq 1 ]; then + echo + log ">>> Шаг 2/3: очистка системы (cleanup_system.sh)" + "$WORK_DIR/cleanup_system.sh" + fi + + if [ $DO_SCRIPTS -eq 1 ]; then + echo + log ">>> Шаг 3/3: установка скриптов и автозапуска (install_scripts.sh)" + "$WORK_DIR/install_scripts.sh" + fi + + rm -rf "$WORK_DIR" + echo + log "=== Установка завершена. Добро пожаловать в BBox (bbox.wtf) ===" + log "Свободные люди для свободного мира, во имя приватности и безопасности." +} + +main "$@"