Добавить install.sh (единая команда запуска) и таймеры подтверждения 5s в init_system.sh
This commit is contained in:
@@ -24,11 +24,37 @@ NC='\033[0m'
|
|||||||
BBOX_VERSION="1.2"
|
BBOX_VERSION="1.2"
|
||||||
BBOX_URL="bbox.wtf"
|
BBOX_URL="bbox.wtf"
|
||||||
HOSTNAME_DEFAULT="bbox-node"
|
HOSTNAME_DEFAULT="bbox-node"
|
||||||
|
DEFAULT_TIMEOUT="${BBOX_TIMEOUT:-5}" # секунд на подтверждение (переопределяется env BBOX_TIMEOUT)
|
||||||
|
|
||||||
log() { echo -e "${GREEN}[init]${NC} $*"; }
|
log() { echo -e "${GREEN}[init]${NC} $*"; }
|
||||||
warn() { echo -e "${YELLOW}[init][warn]${NC} $*"; }
|
warn() { echo -e "${YELLOW}[init][warn]${NC} $*"; }
|
||||||
fail() { echo -e "${RED}[init][error]${NC} $*"; exit 1; }
|
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. Определение дистрибутива и архитектуры
|
# 1. Определение дистрибутива и архитектуры
|
||||||
# ---------------------------------------------------------------------------
|
# ---------------------------------------------------------------------------
|
||||||
@@ -185,9 +211,16 @@ main() {
|
|||||||
fail "Запустите скрипт от root: sudo ./init_system.sh"
|
fail "Запустите скрипт от root: sudo ./init_system.sh"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# --firstboot: режим автозапуска (из bbox-firstboot.service)
|
# Парсинг аргументов
|
||||||
if [ "${1:-}" = "--firstboot" ]; then
|
for arg in "$@"; do
|
||||||
FIRSTBOOT=1
|
case "$arg" in
|
||||||
|
--firstboot) FIRSTBOOT=1 ;;
|
||||||
|
--yes|-y) ALL_YES=1 ;;
|
||||||
|
--timeout=*) DEFAULT_TIMEOUT="${arg#*=}" ;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
if [ $FIRSTBOOT -eq 1 ]; then
|
||||||
log "Режим firstboot (автозапуск при первой загрузке)"
|
log "Режим firstboot (автозапуск при первой загрузке)"
|
||||||
if [ -f "$FIRSTBOOT_MARKER" ]; then
|
if [ -f "$FIRSTBOOT_MARKER" ]; then
|
||||||
log "Инициализация уже выполнялась, пропуск."
|
log "Инициализация уже выполнялась, пропуск."
|
||||||
@@ -196,23 +229,61 @@ main() {
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
log "=== BBox (bbox.wtf) v${BBOX_VERSION} — первичная инициализация ==="
|
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
|
detect_distro
|
||||||
update_system
|
update_system
|
||||||
install_base_utils
|
install_base_utils
|
||||||
install_docker
|
install_docker
|
||||||
|
|
||||||
|
# Выбор hostname (автовыбор bbox-node через 5 сек)
|
||||||
|
if [ "${ALL_YES:-0}" -eq 1 ] || confirm_default "Сменить hostname на '${HOSTNAME:-bbox-node}'?" "y"; then
|
||||||
setup_hostname
|
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
|
setup_motd
|
||||||
|
else
|
||||||
|
warn "Баннер не установлен."
|
||||||
|
fi
|
||||||
|
|
||||||
if [ $FIRSTBOOT -eq 1 ]; then
|
if [ $FIRSTBOOT -eq 1 ]; then
|
||||||
# При автозапуске не трогаем ssh/machine-id до перезагрузки
|
# При автозапуске не трогаем ssh/machine-id до перезагрузки
|
||||||
warn "Режим firstboot: сброс идентификаторов выполняется при следующем запуске"
|
warn "Режим firstboot: сброс идентификаторов выполняется при следующем запуске"
|
||||||
touch "$FIRSTBOOT_MARKER"
|
touch "$FIRSTBOOT_MARKER"
|
||||||
else
|
else
|
||||||
|
# Сброс идентификаторов (автовыбор YES — иначе клоны будут одинаковыми)
|
||||||
|
if [ "${ALL_YES:-0}" -eq 1 ] || confirm_default "Сбросить machine-id и SSH host keys (для клонирования)?" "y"; then
|
||||||
reset_unique_ids
|
reset_unique_ids
|
||||||
|
else
|
||||||
|
warn "Идентификаторы не сброшены."
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# Установка вспомогательных скриптов (автовыбор YES через 5 сек)
|
||||||
|
if [ "${ALL_YES:-0}" -eq 1 ] || confirm_default "Установить вспомогательные скрипты и автозапуск?" "y"; then
|
||||||
install_helper_scripts
|
install_helper_scripts
|
||||||
|
else
|
||||||
|
warn "Скрипты не установлены."
|
||||||
|
fi
|
||||||
|
|
||||||
log "Инициализация завершена."
|
log "Инициализация завершена."
|
||||||
if [ $FIRSTBOOT -eq 1 ]; then
|
if [ $FIRSTBOOT -eq 1 ]; then
|
||||||
|
|||||||
145
install.sh
Executable file
145
install.sh
Executable file
@@ -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 <<EOF
|
||||||
|
BBox (bbox.wtf) — единая установка из репозитория
|
||||||
|
|
||||||
|
--yes|-y полный автозапуск без диалогов (дефолты через $TIMEOUT сек)
|
||||||
|
--init-only только первичная инициализация
|
||||||
|
--cleanup-only только очистка системы
|
||||||
|
--scripts-only только установка скриптов/автозапуска
|
||||||
|
--timeout=N таймер подтверждения, сек (по умолчанию 5)
|
||||||
|
--repo=URL альтернативный репозиторий
|
||||||
|
-h, --help справка
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
|
||||||
|
# Парсинг аргументов
|
||||||
|
for arg in "$@"; do
|
||||||
|
case "$arg" in
|
||||||
|
--yes|-y) ALL_YES=1 ;;
|
||||||
|
--init-only) DO_CLEANUP=0; DO_SCRIPTS=0 ;;
|
||||||
|
--cleanup-only) DO_INIT=0; DO_SCRIPTS=0 ;;
|
||||||
|
--scripts-only) DO_INIT=0; DO_CLEANUP=0 ;;
|
||||||
|
--timeout=*) TIMEOUT="${arg#*=}" ;;
|
||||||
|
--repo=*) REPO_URL="${arg#*=}" ;;
|
||||||
|
-h|--help) usage; exit 0 ;;
|
||||||
|
*) warn "Неизвестный аргумент: $arg (игнорируется)" ;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
export BBOX_TIMEOUT="$TIMEOUT"
|
||||||
|
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
# Загрузка скриптов из репозитория
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
fetch_scripts() {
|
||||||
|
log "Загрузка скриптов из: $REPO_URL ($BRANCH)"
|
||||||
|
mkdir -p "$WORK_DIR"
|
||||||
|
|
||||||
|
local base="$REPO_URL/raw/branch/$BRANCH"
|
||||||
|
local files=("init_system.sh" "cleanup_system.sh" "install_scripts.sh")
|
||||||
|
local ok=1
|
||||||
|
|
||||||
|
for f in "${files[@]}"; do
|
||||||
|
if curl -fsSL "$base/$f" -o "$WORK_DIR/$f"; then
|
||||||
|
chmod +x "$WORK_DIR/$f"
|
||||||
|
log " ✓ $f загружен"
|
||||||
|
else
|
||||||
|
warn " ✗ не удалось загрузить $f"
|
||||||
|
ok=0
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
[ $ok -eq 1 ] || fail "Не удалось загрузить скрипты из репозитория."
|
||||||
|
}
|
||||||
|
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
# MAIN
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
main() {
|
||||||
|
if [ "$(id -u)" -ne 0 ]; then
|
||||||
|
fail "Запустите от root: sudo bash install.sh"
|
||||||
|
fi
|
||||||
|
|
||||||
|
log "=== BBox (bbox.wtf) — установка из репозитория ==="
|
||||||
|
log "Таймер подтверждения: ${TIMEOUT} сек, автовыбор по умолчанию"
|
||||||
|
[ $ALL_YES -eq 1 ] && log "Режим: полный автозапуск (--yes)"
|
||||||
|
|
||||||
|
fetch_scripts
|
||||||
|
|
||||||
|
if [ $DO_INIT -eq 1 ]; then
|
||||||
|
echo
|
||||||
|
log ">>> Шаг 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 "$@"
|
||||||
Reference in New Issue
Block a user