/
sapertlt
/
layout_switcher
Обзор
Документация
Войти
/
sapertlt
/
layout_switcher
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
develop
scripts/install.sh
281 строка
10 KB
Andrey Nikolaev
Отключение автокоррекции по умолчанию и добавление linux-headers в зависимости
17 июн 2026, 10:31
17 июн 2026, 10:31
40bc8ed
Код
Авторство
О чём код?
#!/usr/bin/env bash # ============================================================================ # Скрипт установки Layout Switcher для Ubuntu/Debian # # Устанавливает системные зависимости, настраивает права доступа, # устанавливает Python-пакет и systemd-сервис. # ============================================================================ set -euo pipefail # --- Цвета для вывода --- RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # Без цвета # --- Вспомогательные функции вывода --- info() { echo -e "${BLUE}[INFO]${NC} $*"; } success() { echo -e "${GREEN}[OK]${NC} $*"; } warn() { echo -e "${YELLOW}[ВНИМАНИЕ]${NC} $*"; } error() { echo -e "${RED}[ОШИБКА]${NC} $*"; } # --- Определяем директорию скрипта (корень проекта) --- SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PROJECT_DIR="$(dirname "$SCRIPT_DIR")" # ============================================================================ # Функции # ============================================================================ check_os() { # Проверка: работаем ли на Ubuntu/Debian info "Проверка операционной системы..." if [[ ! -f /etc/os-release ]]; then error "Файл /etc/os-release не найден. Скрипт предназначен для Ubuntu/Debian." exit 1 fi source /etc/os-release if [[ "$ID" != "ubuntu" && "$ID" != "debian" && "$ID_LIKE" != *"ubuntu"* && "$ID_LIKE" != *"debian"* ]]; then warn "Обнаружена ОС: $PRETTY_NAME" warn "Скрипт оптимизирован для Ubuntu/Debian. Некоторые пакеты могут отсутствовать." read -p "Продолжить? (y/N) " -n 1 -r echo if [[ ! $REPLY =~ ^[Yy]$ ]]; then info "Установка отменена." exit 0 fi else success "ОС: $PRETTY_NAME" fi } install_system_deps() { # Установка системных зависимостей через apt info "Установка системных зависимостей..." local packages=( # Заголовки ядра для сборки evdev "linux-headers-$(uname -r)" # Python python3-dev python3-pip python3-venv # GTK и GObject Introspection python3-gi python3-gi-cairo gir1.2-gtk-3.0 # AppIndicator (для трея) gir1.2-ayatanaappindicator3-0.1 # Утилиты для X11 xdotool xclip # Утилиты для Wayland wl-clipboard ) # xkb-switch может отсутствовать в стандартных репозиториях local optional_packages=( xkb-switch ydotool ) echo "" info "Будут установлены следующие пакеты:" for pkg in "${packages[@]}"; do echo " • $pkg" done echo "" info "Опциональные пакеты (если доступны):" for pkg in "${optional_packages[@]}"; do echo " • $pkg" done echo "" read -p "Установить пакеты? Потребуется sudo. (Y/n) " -n 1 -r echo if [[ $REPLY =~ ^[Nn]$ ]]; then warn "Установка системных зависимостей пропущена." return fi sudo apt update sudo apt install -y "${packages[@]}" # Опциональные пакеты — устанавливаем без прерывания при ошибке for pkg in "${optional_packages[@]}"; do if apt-cache show "$pkg" &>/dev/null; then sudo apt install -y "$pkg" || warn "Не удалось установить $pkg (опциональный)" else warn "Пакет $pkg не найден в репозиториях (опциональный)" fi done success "Системные зависимости установлены." } setup_input_group() { # Добавление пользователя в группу 'input' для доступа к evdev info "Настройка доступа к устройствам ввода..." local current_user current_user="$(whoami)" if groups "$current_user" | grep -q '\binput\b'; then success "Пользователь $current_user уже в группе 'input'" return fi echo "" warn "Для работы с клавиатурой через evdev нужно добавить" warn "пользователя '$current_user' в группу 'input'." echo "" read -p "Добавить в группу? Потребуется sudo. (Y/n) " -n 1 -r echo if [[ $REPLY =~ ^[Nn]$ ]]; then warn "Добавление в группу пропущено. evdev может не работать." return fi sudo usermod -a -G input "$current_user" success "Пользователь $current_user добавлен в группу 'input'" warn "ВАЖНО: Перелогиньтесь для применения изменений группы!" } install_python_package() { # Установка Python-пакета в виртуальное окружение (PEP 668) info "Установка Python-пакета..." cd "$PROJECT_DIR" local venv_dir="$PROJECT_DIR/.venv" if [[ ! -d "$venv_dir" ]]; then info "Создание виртуального окружения: $venv_dir" python3 -m venv "$venv_dir" --system-site-packages else info "Виртуальное окружение уже существует: $venv_dir" fi source "$venv_dir/bin/activate" pip install -e . # Создаём симлинк в ~/.local/bin для удобного запуска local bin_link="$HOME/.local/bin/layout-switcher" mkdir -p "$HOME/.local/bin" ln -sf "$venv_dir/bin/layout-switcher" "$bin_link" success "Python-пакет установлен." info "Исполняемый файл: $bin_link" info "Виртуальное окружение: $venv_dir" } create_config_dir() { # Создание директории конфигурации info "Создание директории конфигурации..." local config_dir="$HOME/.config/layout-switcher" mkdir -p "$config_dir" success "Директория конфигурации: $config_dir" } install_systemd_service() { # Установка systemd user-сервиса info "Установка systemd-сервиса..." local service_src="$PROJECT_DIR/systemd/layout-switcher.service" local service_dst="$HOME/.config/systemd/user/layout-switcher.service" if [[ ! -f "$service_src" ]]; then error "Файл сервиса не найден: $service_src" return fi echo "" read -p "Установить systemd-сервис? (Y/n) " -n 1 -r echo if [[ $REPLY =~ ^[Nn]$ ]]; then warn "Установка сервиса пропущена." return fi mkdir -p "$(dirname "$service_dst")" cp "$service_src" "$service_dst" systemctl --user daemon-reload systemctl --user enable layout-switcher success "Systemd-сервис установлен и активирован." info "Для запуска: systemctl --user start layout-switcher" } show_summary() { # Итоговая информация echo "" echo -e "${GREEN}============================================${NC}" echo -e "${GREEN} Установка Layout Switcher завершена!${NC}" echo -e "${GREEN}============================================${NC}" echo "" echo "Следующие шаги:" echo "" echo " 1. Перелогиньтесь (для применения группы 'input')" echo "" echo " 2. Запустите приложение (из ~/.local/bin):" echo " layout-switcher # Foreground с GUI" echo " layout-switcher --daemon # Фоновый режим" echo " layout-switcher --no-gui # Без трея" echo "" echo " Если команда не найдена, добавьте в ~/.bashrc:" echo ' export PATH="$HOME/.local/bin:$PATH"' echo "" echo " 3. Или через systemd:" echo " systemctl --user start layout-switcher" echo " systemctl --user status layout-switcher" echo "" echo " 4. Управление исключениями:" echo " layout-switcher exclude add python" echo " layout-switcher exclude list" echo "" echo " 5. Настройки:" echo " layout-switcher settings" echo " vim ~/.config/layout-switcher/config.yaml" echo "" echo " 6. Перезагрузка конфигурации (без перезапуска):" echo " systemctl --user reload layout-switcher" echo "" echo " 7. Обновление до последней версии:" echo " bash ~/layout_switcher/scripts/update.sh" echo "" } # ============================================================================ # Основной поток # ============================================================================ main() { echo "" echo -e "${BLUE}╔════════════════════════════════════════════╗${NC}" echo -e "${BLUE}║ Установка Layout Switcher для Ubuntu ║${NC}" echo -e "${BLUE}╚════════════════════════════════════════════╝${NC}" echo "" check_os install_system_deps setup_input_group create_config_dir install_python_package install_systemd_service show_summary } main "$@"