#!/bin/sh GREEN="$(printf '\033[0;32m')" RED="$(printf '\033[0;31m')" WHITE="$(printf '\033[0m')" BOOTSTRAP_LOG="/root/rish-bootstrap.log" RISH_OS_RELEASE="${RISH_OS_RELEASE:-/etc/os-release}" RISH_REDHAT_RELEASE="${RISH_REDHAT_RELEASE:-/etc/redhat-release}" RISH_SYSTEM_RELEASE="${RISH_SYSTEM_RELEASE:-/etc/system-release}" RISH_ISSUE="${RISH_ISSUE:-/etc/issue}" print_color() { printf '%b\n' "$1" } read_os_release_value() { key="$1" if [ ! -f "$RISH_OS_RELEASE" ]; then return 1 fi value="$(awk -F= -v key="$key" ' $1 == key { value = substr($0, index($0, "=") + 1) gsub(/^"/, "", value) gsub(/"$/, "", value) print value exit } ' "$RISH_OS_RELEASE")" [ -n "$value" ] || return 1 printf '%s\n' "$value" } detect_current_os() { if [ "$RISH_OS_RELEASE" = "/etc/os-release" ] && command -v lsb_release >/dev/null 2>&1; then CURRENT_OS="$(lsb_release -d -s)" elif [ -f "$RISH_SYSTEM_RELEASE" ]; then CURRENT_OS="$(head -n 1 "$RISH_SYSTEM_RELEASE")" elif [ -f "$RISH_OS_RELEASE" ]; then CURRENT_OS="$(read_os_release_value PRETTY_NAME 2>/dev/null || true)" if [ -z "$CURRENT_OS" ]; then CURRENT_OS="$(read_os_release_value NAME 2>/dev/null || true)" fi elif [ -f "$RISH_ISSUE" ]; then CURRENT_OS="$(head -n 2 "$RISH_ISSUE")" else print_color "${RED}Невозможно определить вашу версию Linux${WHITE}" exit 1 fi } is_rhel_family() { if [ -f "$RISH_REDHAT_RELEASE" ]; then return 0 fi id_like="$(read_os_release_value ID_LIKE 2>/dev/null || true)" case " $id_like " in *" rhel "*) return 0 ;; esac return 1 } print_unsupported_os_message() { print_color "Система ${RED}НЕ относится${WHITE} к поддерживаемому семейству RHEL." echo "RISH устанавливается на AlmaLinux, Rocky Linux, RHEL и совместимые RHEL-системы." echo echo "Ubuntu/Debian и другие не-RHEL дистрибутивы не поддерживаются:" echo "RISH глубоко меняет настройки сервера," echo "поэтому мы работаем только с предсказуемым RHEL-family окружением." } print_current_os() { os_color="$1" print_color "Ваша версия Linux: ${os_color}${CURRENT_OS}${WHITE}" echo } print_step() { step_number="$1" step_text="$2" echo print_color "${GREEN}Шаг ${step_number}:${WHITE} ${step_text}" } Install() { missing_packages="" for package in "$@"; do if ! rpm -q "$package" >/dev/null 2>&1; then missing_packages="${missing_packages} ${package}" fi done if [ -z "$missing_packages" ]; then print_color "Пакеты ${GREEN}$*${WHITE} уже установлены" return 0 fi print_color "Устанавливаем пакеты ${GREEN}${missing_packages# }${WHITE}..." print_color "Это может занять несколько минут. Подробности: ${GREEN}${BOOTSTRAP_LOG}${WHITE}" if dnf -q -y install $missing_packages >>"$BOOTSTRAP_LOG" 2>&1; then print_color "Пакеты ${GREEN}${missing_packages# }${WHITE} установлены" else echo print_color "${RED}Ошибка${WHITE} при установке ${missing_packages# }!" print_color "Подробности записаны в ${GREEN}${BOOTSTRAP_LOG}${WHITE}" exit 1 fi } if grep -Eq '^[[:space:]]*export[[:space:]]+MYSQLPASS=' /root/.bashrc 2>/dev/null; then echo print_color "RISH уже установлен и первичная настройка сервера уже выполнена." echo print_color "Повторный запуск команды установки не требуется." print_color "Для обновления или проверки RISH запустите ${GREEN}mc${WHITE}, нажмите ${GREEN}F2${WHITE}" print_color "и выберите пункт ${GREEN}Обновление/проверка RISH${WHITE}." echo exit 1 fi print_step "1/4" "проверяем систему" detect_current_os if is_rhel_family; then print_current_os "$GREEN" print_color "Система ${GREEN}относится${WHITE} к семейству RHEL." else print_current_os "$RED" print_unsupported_os_message exit 1 fi if [ "${RISH_BOOTSTRAP_PREFLIGHT_ONLY:-0}" = "1" ]; then exit 0 fi ver="$(hostnamectl 2>/dev/null | grep -Eo 'Operating.*' | sed 's@^[^0-9]*\([0-9]\+\).*@\1@')" if [ -z "$ver" ] && [ -f "$RISH_REDHAT_RELEASE" ]; then ver="$(sed 's@^[^0-9]*\([0-9]\+\).*@\1@' "$RISH_REDHAT_RELEASE")" fi if [ "$ver" = "7" ]; then print_color "Версия для CentOS 7 больше ${RED}не поддерживается${WHITE}." echo "Советуем перейти на более свежую версию" print_color "${GREEN}AlmaLinux, Rocky Linux или RHEL-compatible систему${WHITE}" exit 1 fi print_step "2/4" "устанавливаем tar для распаковки архива" Install tar print_step "3/4" "скачиваем и распаковываем RISH" cd ~ || exit 1 echo "Скачиваем архив RISH..." if ! curl -L --connect-timeout 15 --max-time 60 --fail --progress-bar -o rish2.tar.gz https://rish.su/rish2.tar.gz then echo "rish.su недоступен, пробуем скачать релиз с GitHub..." release_url="$(curl -fsSL --connect-timeout 15 --max-time 30 https://api.github.com/repos/Delo-Design/rish/releases/latest | awk -F \" -v RS="," '/browser_download_url/ {print $(NF-1)}' | head -n 1)" if [ -z "$release_url" ] || ! curl -L --connect-timeout 15 --max-time 60 --fail --progress-bar -o rish2.tar.gz "$release_url" then print_color "${RED}Не удалось скачать архив${WHITE}" exit 1 fi fi echo "Распаковываем RISH..." if ! tar --no-same-owner -xzf rish2.tar.gz; then print_color "${RED}Не удалось распаковать архив RISH${WHITE}" exit 1 fi cd rish || exit 1 chmod u+x ri.sh print_step "4/4" "устанавливаем языковые пакеты UTF-8" Install langpacks-en glibc-all-langpacks print_color "Ваша версия Linux: ${GREEN}${CURRENT_OS}${WHITE}" echo echo print_color "Теперь запустите установку с помощью команды ${GREEN}/root/rish/ri.sh${WHITE}" rm -f "$BOOTSTRAP_LOG" rm ../rish2.tar.gz