Загрузка данных


1. russification.sh

Это главный файл.

#!/bin/bash
# Цвета
# ==========================================


YW='\033[1;33m'
GN='\033[1;32m'
RD='\033[1;31m'
CL='\033[0m'




# ==========================================
# Сообщения
# ==========================================


msg_error() {
    echo -e "${RD}[✗]${CL} $1"
}


msg_info() {
    echo -e "${YW}[!]${CL} $1"
}


msg_ok() {
    echo -e "${GN}[✓]${CL} $1"
}




# ==========================================
# Подключение библиотек
# ==========================================


source "$SCRIPT_DIR/lib/check-root.sh"
source "$SCRIPT_DIR/lib/ensure-executable.sh"
source "$SCRIPT_DIR/lib/set-locale.sh"




# ==========================================
# Проверка root
# ==========================================


check_root




# ==========================================
# Проверка прав запуска
# ==========================================


ensure_executable "$SCRIPT_DIR/russification.sh"
ensure_executable "$SCRIPT_DIR/lib/check-root.sh"
ensure_executable "$SCRIPT_DIR/lib/ensure-executable.sh"
ensure_executable "$SCRIPT_DIR/lib/set-locale.sh"




# ==========================================
# Запуск русификации
# ==========================================


echo
echo "=========================================="
echo "       Русификация Kali Linux"
echo "=========================================="
echo


set_locale




# ==========================================
# Завершение
# ==========================================


echo
echo "=========================================="
echo "       Русификация завершена!"
echo "=========================================="
echo


msg_info "Для применения изменений рекомендуется перезагрузить систему."


echo
read -rp "Перезагрузить сейчас? [y/N]: " answer


if [[ "$answer" =~ ^[YyДд]$ ]]; then
    msg_info "Перезагрузка..."
    reboot
else
    msg_ok "Перезагрузка отменена."
    echo
    echo "Выполните позже:"
    echo "  reboot"
fi
2. lib/check-root.sh

Это первый модуль, который вызывается главным скриптом.

Он только проверяет, что скрипт запущен от root.

# ==========================================
# Проверка прав root
# ==========================================
#
# Функция проверяет, запущен ли скрипт
# с правами суперпользователя root.
#
# UID 0 = root.
# ==========================================


check_root() {


    # Проверяем эффективный UID пользователя.
    #
    # Если UID не равен 0,
    # значит скрипт запущен не от root.
    if [[ $EUID -ne 0 ]]; then


        # Выводим сообщение об ошибке.
        msg_error "Скрипт требует прав root!"


        # Показываем пользователю,
        # как перейти в root.
        echo -e " ${YW}Запустите от root:${CL} su -"


        # Завершаем выполнение.
        exit 1
    fi
}
3. lib/ensure-executable.sh

Этот модуль проверяет права +x.

Если файл не исполняемый — добавляет +x.

# ==========================================
    local target="${1:-}"




    # ==========================================
    # Проверка аргумента
    # ==========================================


    # Если путь не указан —
    # возвращаем ошибку.
    if [ -z "$target" ]; then


        echo "ensure_executable: не указан файл" >&2


        return 1
    fi




    # ==========================================
    # Проверка существования файла
    # ==========================================


    if [ ! -e "$target" ]; then


        echo "ensure_executable: файл не найден: $target" >&2


        return 1
    fi




    # ==========================================
    # Проверка права +x
    # ==========================================


    # Если файл уже исполняемый,
    # ничего делать не нужно.
    if [ -x "$target" ]; then


        return 0
    fi




    # ==========================================
    # Проверка root
    # ==========================================


    # Для chmod нужны соответствующие права.
    if [ "$(id -u)" -ne 0 ]; then


        echo "ensure_executable: нужны права root (chmod +x)" >&2


        echo "  Запустите: su -   или   sudo $0 $target" >&2


        return 1
    fi




    # ==========================================
    # Добавление права +x
    # ==========================================


    if declare -F msg_info >/dev/null 2>&1; then


        msg_info "Файл не исполняемый, добавляем права (+x)"


    else


        echo " - Файл не исполняемый, добавляем права (+x)..."


    fi




    # Добавляем право на выполнение.
    chmod +x "$target"




    # ==========================================
    # Сообщение об успехе
    # ==========================================


    if declare -F msg_ok >/dev/null 2>&1; then


        msg_ok "Права добавлены"


    else


        echo " ✓ Права добавлены: $target"


    fi
}
4. lib/set-locale.sh

Это сам модуль русификации.

Обрати внимание: здесь используется функция set_locale(). Она не выполняется сама, пока главный скрипт не вызовет:

set_locale
# ==========================================
    msg_info "Проверяем пакет locales..."


    # Проверяем, установлен ли пакет locales.
    if ! dpkg -s locales >/dev/null 2>&1; then


        msg_info "Пакет locales не установлен."


        msg_info "Устанавливаем locales..."


        apt update


        apt install -y locales


        msg_ok "Пакет locales установлен."


    else


        msg_ok "Пакет locales уже установлен."


    fi




    # ==========================================
    # Настройка ru_RU.UTF-8
    # ==========================================


    msg_info "Настраиваем ru_RU.UTF-8..."




    # Если русская локаль закомментирована —
    # раскомментируем её.
    if grep -q '^# *ru_RU.UTF-8 UTF-8' /etc/locale.gen; then


        sed -i \
            's/^# *ru_RU.UTF-8 UTF-8/ru_RU.UTF-8 UTF-8/' \
            /etc/locale.gen




    # Если строки нет вообще —
    # добавляем её в конец файла.
    elif ! grep -q '^ru_RU.UTF-8 UTF-8' /etc/locale.gen; then


        echo 'ru_RU.UTF-8 UTF-8' >> /etc/locale.gen


    fi




    # ==========================================
    # Генерация локали
    # ==========================================


    msg_info "Генерируем ru_RU.UTF-8..."


    locale-gen ru_RU.UTF-8


    msg_ok "ru_RU.UTF-8 сгенерирована."




    # ==========================================
    # Установка локали по умолчанию
    # ==========================================


    msg_info "Устанавливаем русскую локаль по умолчанию..."


    update-locale \
        LANG=ru_RU.UTF-8 \
        LANGUAGE=ru_RU:ru


    msg_ok "Русская локаль установлена."




    # ==========================================
    # Информация
    # ==========================================


    echo
    echo "Текущие настройки:"
    echo


    grep -E '^(LANG|LANGUAGE)=' /etc/default/locale || true
}