#!/usr/bin/env bash set -e # Цвета для вывода GREEN='\033[1;32m' BLUE='\033[1;34m' YELLOW='\033[1;33m' RED='\033[1;31m' NC='\033[0m' info() { echo -e "\n${BLUE}===> $1${NC}"; } ok() { echo -e "${GREEN}[OK] $1${NC}"; } warn() { echo -e "${YELLOW}[!] $1${NC}"; } err() { echo -e "${RED}[ОШИБКА] $1${NC}"; exit 1; } # 0. Проверка прав if [ "$EUID" -ne 0 ]; then echo -e "${YELLOW}Запрос прав администратора (sudo)...${NC}" exec sudo -E bash "$0" "$@" fi # Определяем реального пользователя REAL_USER="${SUDO_USER:-$(logname 2>/dev/null || echo user)}" REAL_UID=$(id -u "$REAL_USER" 2>/dev/null || echo 1000) REAL_HOME=$(getent passwd "$REAL_USER" | cut -d: -f6) [ -z "$REAL_HOME" ] && REAL_HOME="/home/$REAL_USER" USB_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" # Параметры прокси ЕСПД (уточните IP для вашего региона) PROXY_HOST="10.0.57.52" PROXY_PORT="3128" PROXY_URL="http://${PROXY_HOST}:${PROXY_PORT}" echo -e "${GREEN}======================================================${NC}" echo -e "${GREEN} Установка и настройка ЕСПД для МЭШ ОС (МОС12) ${NC}" echo -e "${GREEN}======================================================${NC}" echo "Пользователь: $REAL_USER ($REAL_HOME)" echo "Папка с файлами: $USB_DIR" # ---------------------------------------------------------------------- # ЭТАП 1. Настройка системного прокси KDE (с исключением localhost) # ---------------------------------------------------------------------- info "Этап 1/3: Настройка прокси KDE (исключение localhost для АРМ ГИА)..." KIOSLAVERC="$REAL_HOME/.config/kioslaverc" mkdir -p "$REAL_HOME/.config" # Функция записи ключей KDE write_kde_proxy() { local key="$1" local value="$2" if command -v kwriteconfig5 >/dev/null 2>&1; then sudo -u "$REAL_USER" kwriteconfig5 --file "$KIOSLAVERC" --group "Proxy Settings" --key "$key" "$value" elif command -v kwriteconfig6 >/dev/null 2>&1; then sudo -u "$REAL_USER" kwriteconfig6 --file "$KIOSLAVERC" --group "Proxy Settings" --key "$key" "$value" else return 1 fi } if ! write_kde_proxy "ProxyType" "1" 2>/dev/null; then warn "Утилиты kwriteconfig не найдены, используется прямая запись." cat < "$KIOSLAVERC" [Proxy Settings] ProxyType=1 httpProxy=http://${PROXY_HOST}:${PROXY_PORT} httpsProxy=http://${PROXY_HOST}:${PROXY_PORT} ftpProxy= socksProxy= NoProxyFor=localhost,127.0.0.1,::1 ReversedException=false EOF chown "$REAL_USER:$REAL_USER" "$KIOSLAVERC" else # Важно: формат host:port (двоеточие), а не пробел write_kde_proxy "httpProxy" "http://${PROXY_HOST}:${PROXY_PORT}" write_kde_proxy "httpsProxy" "http://${PROXY_HOST}:${PROXY_PORT}" write_kde_proxy "ftpProxy" "" write_kde_proxy "socksProxy" "" # Критически важно: исключаем localhost, чтобы не сломать CPD АРМ ГИА-11 write_kde_proxy "NoProxyFor" "localhost,127.0.0.1,::1" write_kde_proxy "ReversedException" "false" fi # Применяем настройки KDE sudo -u "$REAL_USER" \ DBUS_SESSION_BUS_ADDRESS="unix:path=/run/user/$REAL_UID/bus" \ dbus-send --type=signal /KIO/Scheduler org.kde.KIO.Scheduler.reparseSlaveConfiguration string:'' >/dev/null 2>&1 || true # Перезапуск kded для гарантированного применения (если доступен) if command -v kded5 >/dev/null 2>&1; then sudo -u "$REAL_USER" DISPLAY="${DISPLAY:-:0}" kded5 --replace >/dev/null 2>&1 & elif command -v kded6 >/dev/null 2>&1; then sudo -u "$REAL_USER" DISPLAY="${DISPLAY:-:0}" kded6 --replace >/dev/null 2>&1 & fi ok "Прокси KDE настроен. localhost/127.0.0.1 исключены из проксирования." # ---------------------------------------------------------------------- # ЭТАП 2. Установка сертификата Ростелеком # ---------------------------------------------------------------------- info "Этап 2/3: Установка корневого сертификата Ростелеком..." CERT_FILE=$(find "$USB_DIR" -maxdepth 2 -type f \( -iname "ca-root.crt" -o -iname "ca-root.cer" -o -iname "ca-root.pem" \) -print -quit) [ -z "$CERT_FILE" ] && err "Файл сертификата ca-root.crt не найден в $USB_DIR" # 2.1 Системное хранилище (стандартный путь для RPM-систем) mkdir -p /etc/pki/ca-trust/source/anchors/ cp -f "$CERT_FILE" /etc/pki/ca-trust/source/anchors/ca-root.crt chmod 644 /etc/pki/ca-trust/source/anchors/ca-root.crt if command -v update-ca-trust >/dev/null 2>&1; then update-ca-trust extract ok "Сертификат добавлен в системное хранилище." else warn "Команда update-ca-trust не найдена. Проверьте путь к сертификатам вручную." fi # 2.2 Копия в Загрузки пользователя USER_DOWNLOADS="$REAL_HOME/Загрузки" [ ! -d "$USER_DOWNLOADS" ] && USER_DOWNLOADS="$REAL_HOME/Downloads" if [ -d "$USER_DOWNLOADS" ]; then cp -f "$CERT_FILE" "$USER_DOWNLOADS/ca-root.crt" chown "$REAL_USER:$REAL_USER" "$USER_DOWNLOADS/ca-root.crt" fi # 2.3 Импорт в NSS (Chromium) — критически важно для браузера NSSDB_DIR="$REAL_HOME/.pki/nssdb" sudo -u "$REAL_USER" mkdir -p "$NSSDB_DIR" if command -v certutil >/dev/null 2>&1; then if [ ! -f "$NSSDB_DIR/cert9.db" ]; then sudo -u "$REAL_USER" certutil -d sql:"$NSSDB_DIR" -N --empty-password >/dev/null 2>&1 || true fi sudo -u "$REAL_USER" certutil -d sql:"$NSSDB_DIR" -D -n "CA Root Social Objects" >/dev/null 2>&1 || true sudo -u "$REAL_USER" certutil -d sql:"$NSSDB_DIR" -A -t "C,," -n "CA Root Social Objects" -i "$CERT_FILE" ok "Сертификат импортирован в Chromium (NSS)." else warn "Утилита certutil не найдена. Попытка установки nss-utils через dnf..." dnf install -y nss-utils 2>/dev/null || true if command -v certutil >/dev/null 2>&1; then sudo -u "$REAL_USER" certutil -d sql:"$NSSDB_DIR" -A -t "C,," -n "CA Root Social Objects" -i "$CERT_FILE" ok "Сертификат импортирован в Chromium (NSS)." else warn "Не удалось установить certutil. Браузер может не доверять сертификату." fi fi # ---------------------------------------------------------------------- # ЭТАП 3. Установка пакетов и настройка прокси для DNF # ---------------------------------------------------------------------- info "Этап 3/3: Установка пакетов и настройка DNF..." SWITCH_RPM=$(find "$USB_DIR" -maxdepth 2 -type f -iname "python3-pyqt6-switch-control*.rpm" -print -quit) ESPD_RPM=$(find "$USB_DIR" -maxdepth 2 -type f -iname "espd-proxy*.rpm" -print -quit) [ -z "$SWITCH_RPM" ] && err "Не найден пакет python3-pyqt6-switch-control*.rpm" [ -z "$ESPD_RPM" ] && err "Не найден пакет espd-proxy*.rpm" # Установка через dnf (основной менеджер МОС12) info "Установка python3-pyqt6-switch-control..." if ! dnf install -y "$SWITCH_RPM" 2>/dev/null; then warn "dnf install не удался, пробуем rpm -Uvh..." rpm -Uvh --replacepkgs --oldpackage "$SWITCH_RPM" || err "Не удалось установить switch-control" fi info "Установка espd-proxy..." if ! dnf install -y "$ESPD_RPM" 2>/dev/null; then warn "dnf install не удался, пробуем rpm -Uvh..." rpm -Uvh --replacepkgs --oldpackage "$ESPD_RPM" || err "Не удалось установить espd-proxy" fi ok "Пакеты установлены." # Настройка прокси для DNF info "Настройка прокси для DNF (/etc/dnf/dnf.conf)..." if grep -q "^proxy=" /etc/dnf/dnf.conf 2>/dev/null; then sed -i "s|^proxy=.*|proxy=${PROXY_URL}|" /etc/dnf/dnf.conf else echo "proxy=${PROXY_URL}" >> /etc/dnf/dnf.conf fi # Настройка Wget if [ -f /etc/wgetrc ]; then sed -i '/^#*http_proxy/d; /^#*https_proxy/d; /^#*use_proxy/d' /etc/wgetrc cat <> /etc/wgetrc http_proxy = ${PROXY_URL}/ https_proxy = ${PROXY_URL}/ use_proxy = on EOF fi # Запуск espd-proxy if command -v espd-proxy >/dev/null 2>&1; then info "Запуск Конфигуратора прокси (espd-proxy)..." warn "В открывшемся окне выберите регион, отметьте настройки dnf/wget и включите тумблер." sudo -u "$REAL_USER" \ DISPLAY="${DISPLAY:-:0}" \ XAUTHORITY="${XAUTHORITY:-$REAL_HOME/.Xauthority}" \ DBUS_SESSION_BUS_ADDRESS="unix:path=/run/user/$REAL_UID/bus" \ espd-proxy >/dev/null 2>&1 & fi echo -e "\n${GREEN}======================================================${NC}" echo -e "${GREEN} НАСТРОЙКА ЕСПД ДЛЯ МЭШ ОС ЗАВЕРШЕНА! ${NC}" echo -e "${GREEN}======================================================${NC}" echo -e "${YELLOW}ВАЖНО: Если используется АРМ ГИА-11, проверьте:${NC}" echo " curl http://localhost:7080/api/status" echo " Если ошибка — убедитесь, что прокси не перехватывает localhost."