/
sapertlt
/
layout_switcher
Обзор
Документация
Войти
/
sapertlt
/
layout_switcher
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
develop
scripts/check-env.sh
317 строк
13 KB
Andrey
feat: make check-env — диагностика среды перед установкой
06 авг 2026, 11:33
06 авг 2026, 11:33
cbf2d9e
Код
Авторство
О чём код?
#!/usr/bin/env bash # ============================================================================ # check-env.sh — диагностика среды Layout Switcher # # Тестирует все провайдеры (ввод, вывод, раскладка) и выдаёт рекомендацию # по конфигурации. Запускать ПЕРЕД make install или при проблемах. # # Использование: # bash scripts/check-env.sh # make check-env # ============================================================================ set -eu # Используем python из .venv проекта, если он есть (там установлены evdev, pynput) SCRIPT_DIR_CE="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" REPO_ROOT_CE="$(cd "$SCRIPT_DIR_CE/.." && pwd)" if [[ -x "$REPO_ROOT_CE/.venv/bin/python3" ]]; then PYTHON3="$REPO_ROOT_CE/.venv/bin/python3" else PYTHON3="python3" fi RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' CYAN='\033[0;36m' BOLD='\033[1m' NC='\033[0m' ok() { echo -e " ${GREEN}✓${NC} $*"; } fail() { echo -e " ${RED}✗${NC} $*"; } warn() { echo -e " ${YELLOW}!${NC} $*"; } info() { echo -e " ${BLUE}→${NC} $*"; } hdr() { echo -e "\n${BOLD}${CYAN}══ $* ══${NC}"; } INPUT_MODE="" OUTPUT_MODE="" LAYOUT_MODE="" ERRORS=() # ============================================================================ hdr "1. Среда выполнения" # ============================================================================ echo "" DISPLAY_SERVER="unknown" if [[ -n "${WAYLAND_DISPLAY:-}" ]]; then DISPLAY_SERVER="wayland" ok "Wayland: WAYLAND_DISPLAY=${WAYLAND_DISPLAY}" fi if [[ -n "${DISPLAY:-}" ]]; then if [[ "$DISPLAY_SERVER" == "wayland" ]]; then ok "X11 (Xwayland): DISPLAY=${DISPLAY}" else DISPLAY_SERVER="x11" ok "X11: DISPLAY=${DISPLAY}" fi fi if [[ "$DISPLAY_SERVER" == "unknown" ]]; then warn "Ни WAYLAND_DISPLAY, ни DISPLAY не заданы — TTY-режим" DISPLAY_SERVER="tty" fi echo "" info "Desktop: ${XDG_CURRENT_DESKTOP:-${DESKTOP_SESSION:-unknown}}" info "Session type: ${XDG_SESSION_TYPE:-unknown}" if command -v loginctl &>/dev/null; then REMOTE_VAL=$(loginctl show-session auto -p Remote --value 2>/dev/null || echo "no") if [[ "$REMOTE_VAL" == "yes" ]]; then warn "Удалённая сессия (loginctl Remote=yes) — RDP/VNC" else ok "Локальная сессия (loginctl Remote=no)" fi fi # ============================================================================ hdr "2. Ввод (Input Provider)" # ============================================================================ echo "" EVDEV_OK=false PYNPUT_OK=false # Evdev if [[ -d /dev/input ]]; then EVDEV_DEVICES=$(find /dev/input -name "event*" -readable 2>/dev/null | wc -l) if [[ "$EVDEV_DEVICES" -gt 0 ]]; then if $PYTHON3 -c " import evdev, sys devs = [evdev.InputDevice(p) for p in evdev.list_devices()] kbs = [d for d in devs if evdev.ecodes.EV_KEY in d.capabilities()] if not kbs: sys.exit(1) print(f' Найдено клавиатур: {len(kbs)}') for d in kbs[:3]: print(f' {d.path}: {d.name}') " 2>/dev/null; then EVDEV_OK=true ok "evdev: клавиатурные устройства доступны" else fail "evdev: python evdev не видит клавиатур (нет прав?)" info "Проверьте группу: id -Gn | grep input" info "Добавьте: sudo usermod -a -G input \$USER (затем перелогиниться)" fi else fail "evdev: нет доступных /dev/input/event* (RDP/VNC — это нормально)" fi else fail "evdev: /dev/input не существует" fi if id -Gn 2>/dev/null | grep -qw input; then ok "Группа 'input': пользователь в группе" else warn "Группа 'input': пользователь НЕ в группе — evdev недоступен" info "Исправление: sudo usermod -a -G input \$USER (затем перелогиниться)" fi # pynput / X11 if [[ -n "${DISPLAY:-}" ]]; then if $PYTHON3 -c "from pynput import keyboard; print('ok')" 2>/dev/null | grep -q ok; then PYNPUT_OK=true ok "pynput/X11: работает (DISPLAY=${DISPLAY})" else fail "pynput: не установлен" info "Установка: pip install pynput" fi else warn "pynput/X11: DISPLAY не задан — X11-ввод недоступен" fi if $EVDEV_OK; then INPUT_MODE="evdev" info "Рекомендация: evdev (аппаратный, наиболее надёжный)" elif $PYNPUT_OK; then INPUT_MODE="x11" info "Рекомендация: pynput/XRecord (через X11)" else INPUT_MODE="none" ERRORS+=("Нет доступного провайдера ввода!") fi # ============================================================================ hdr "3. Вывод (Output Provider — замена текста)" # ============================================================================ echo "" XDOTOOL_OK=false WL_OK=false XCLIP_OK=false # xdotool if command -v xdotool &>/dev/null && [[ -n "${DISPLAY:-}" ]]; then if xdotool key ctrl+shift 2>/dev/null; then XDOTOOL_OK=true ok "xdotool: работает (отправка клавиш через X11)" else fail "xdotool: установлен, но не может отправлять клавиши" fi elif ! command -v xdotool &>/dev/null; then fail "xdotool: не установлен → sudo apt install xdotool" else fail "xdotool: DISPLAY не задан" fi # wl-clipboard if command -v wl-copy &>/dev/null && command -v wl-paste &>/dev/null; then if echo "layout-switcher-test" | wl-copy 2>/dev/null && \ wl-paste 2>/dev/null | grep -q "layout-switcher-test"; then WL_OK=true ok "wl-clipboard: работает (wl-copy + wl-paste)" else fail "wl-clipboard: установлен, но не работает (нет Wayland/X11 сессии?)" fi else fail "wl-clipboard: не установлен → sudo apt install wl-clipboard" fi # xclip if command -v xclip &>/dev/null && [[ -n "${DISPLAY:-}" ]]; then if echo "test" | xclip -selection clipboard 2>/dev/null && \ xclip -selection clipboard -o 2>/dev/null | grep -q "test"; then XCLIP_OK=true ok "xclip: работает (X11 clipboard)" else fail "xclip: установлен, но не работает" fi elif ! command -v xclip &>/dev/null; then fail "xclip: не установлен → sudo apt install xclip" fi if $XDOTOOL_OK && $WL_OK; then OUTPUT_MODE="wayland" info "Рекомендация: WaylandOutputProvider (xdotool + wl-clipboard)" elif $XDOTOOL_OK && $XCLIP_OK; then OUTPUT_MODE="x11" info "Рекомендация: X11OutputProvider (xdotool + xclip)" else OUTPUT_MODE="none" ERRORS+=("Нет доступного провайдера вывода!") fi # ============================================================================ hdr "4. Раскладка (Layout Provider — переключение)" # ============================================================================ echo "" GNOME_OK=false X11_LAYOUT_OK=false # GNOME if command -v gsettings &>/dev/null; then SOURCES=$(gsettings get org.gnome.desktop.input-sources sources 2>/dev/null || echo "") if [[ -n "$SOURCES" && "$SOURCES" != "@a(ss) []" ]]; then ok "gsettings: раскладки настроены: ${SOURCES}" MRU=$(gsettings get org.gnome.desktop.input-sources mru-sources 2>/dev/null || echo "") ok "gsettings: текущая (mru-sources): ${MRU}" # Тест Super+Space if $XDOTOOL_OK; then MRU_BEFORE=$(gsettings get org.gnome.desktop.input-sources mru-sources 2>/dev/null) xdotool key super+space 2>/dev/null; sleep 0.3 MRU_AFTER=$(gsettings get org.gnome.desktop.input-sources mru-sources 2>/dev/null) xdotool key super+space 2>/dev/null; sleep 0.2 # вернуть обратно if [[ "$MRU_BEFORE" != "$MRU_AFTER" ]]; then GNOME_OK=true ok "xdotool Super+Space: переключает раскладку GNOME ✓" else warn "xdotool Super+Space: раскладка НЕ переключилась" info "Проверьте хоткей: gsettings get org.gnome.desktop.wm.keybindings switch-input-source" GNOME_OK=true # gsettings доступен — провайдер частично работает fi else warn "xdotool недоступен — переключение Super+Space невозможно" fi else fail "gsettings: раскладки не настроены в GNOME" fi else fail "gsettings: не установлен (не GNOME?)" fi # xkb-switch (X11) if command -v xkb-switch &>/dev/null && [[ -n "${DISPLAY:-}" ]]; then CURRENT=$(xkb-switch 2>/dev/null || echo "") if [[ -n "$CURRENT" ]]; then X11_LAYOUT_OK=true ok "xkb-switch: текущая раскладка = ${CURRENT}" else fail "xkb-switch: не работает" fi else if ! command -v xkb-switch &>/dev/null; then warn "xkb-switch: не установлен (нужен для X11LayoutProvider)" fi fi if $GNOME_OK; then LAYOUT_MODE="gnome" info "Рекомендация: GnomeLayoutProvider (gsettings + xdotool Super+Space)" elif $X11_LAYOUT_OK; then LAYOUT_MODE="x11" info "Рекомендация: X11LayoutProvider (xkb-switch)" else LAYOUT_MODE="none" ERRORS+=("Нет доступного провайдера раскладки!") fi # ============================================================================ hdr "5. Итоговая рекомендация" # ============================================================================ echo "" if [[ ${#ERRORS[@]} -gt 0 ]]; then echo -e "${RED}${BOLD}ОШИБКИ — нужно исправить перед установкой:${NC}" for e in "${ERRORS[@]}"; do echo -e " ${RED}✗${NC} $e" done echo "" fi echo -e "${BOLD}Конфигурация вашей среды:${NC}" echo "" echo -e " Дисплей: ${CYAN}${DISPLAY_SERVER}${NC}" echo -e " Ввод (input): ${CYAN}${INPUT_MODE}${NC}" echo -e " Вывод (output): ${CYAN}${OUTPUT_MODE}${NC}" echo -e " Раскладка: ${CYAN}${LAYOUT_MODE}${NC}" echo "" # Итоговый режим if [[ "$OUTPUT_MODE" == "wayland" && "$LAYOUT_MODE" == "gnome" && "$INPUT_MODE" == "evdev" ]]; then echo -e "${GREEN}${BOLD}► Режим: GNOME Wayland (полный — evdev)${NC}" echo -e " Всё работает оптимально. Запустите: ${CYAN}make install${NC}" elif [[ "$OUTPUT_MODE" == "wayland" && "$LAYOUT_MODE" == "gnome" && "$INPUT_MODE" == "x11" ]]; then echo -e "${YELLOW}${BOLD}► Режим: GNOME + Xwayland (RDP/VNC — pynput)${NC}" echo -e " evdev недоступен (нормально для RDP), pynput будет использован автоматически." echo -e " Запустите: ${CYAN}make install${NC}" elif [[ "$OUTPUT_MODE" == "x11" && "$LAYOUT_MODE" == "x11" ]]; then echo -e "${GREEN}${BOLD}► Режим: X11 (xkb-switch + xclip)${NC}" echo -e " Запустите: ${CYAN}make install${NC}" elif [[ "$INPUT_MODE" == "none" ]]; then echo -e "${RED}${BOLD}► Нет провайдера ввода — нажатия клавиш не будут обнаружены!${NC}" echo -e " Установите системные зависимости: ${CYAN}make install-system${NC}" elif [[ "$OUTPUT_MODE" == "none" ]]; then echo -e "${RED}${BOLD}► Нет провайдера вывода — замена текста невозможна!${NC}" echo -e " Установите системные зависимости: ${CYAN}make install-system${NC}" else echo -e "${YELLOW}${BOLD}► Нестандартная конфигурация${NC}" echo -e " Запустите ${CYAN}make install${NC} и проверьте работу через ${CYAN}make run${NC}" fi echo "" echo -e " Установка зависимостей: ${CYAN}make install-system${NC}" echo -e " Установка приложения: ${CYAN}make install${NC}" echo -e " Повторная диагностика: ${CYAN}make check-env${NC}" echo ""