#!/bin/sh # LabWC Alpine Setup Script # Version 6 # # Запускать от имени root! # # Использование: # ./setup.sh # ./setup.sh username # # Устанавливает: # - LabWC + Wayland # - Waybar / Mako / Wofi # - PipeWire + WirePlumber # - NetworkManager # - Firefox # - zenith-cli # - seatd # - автоматический вход на tty1 # - автоматический запуск LabWC # # ВАЖНО: # zenith-cli использует build.sh на Bash, # поэтому bash устанавливается явно. set -eu # ================================================== # 0. Основные параметры # ================================================== USER_NAME="${1:-ivan}" HOME_DIR="/home/$USER_NAME" PROFILE="$HOME_DIR/.profile" ZENITH_REPO="https://zenithcode.duckdns.org/s13bby/zenith-cli.git" ZENITH_DIR="$HOME_DIR/zenith-cli" LOCAL_BIN="$HOME_DIR/.local/bin" echo "==================================================" echo "[*] LabWC Alpine Setup" echo "==================================================" echo "[*] Пользователь: $USER_NAME" echo "[*] Домашний каталог: $HOME_DIR" echo "==================================================" # ================================================== # 1. Проверка root # ================================================== if [ "$(id -u)" -ne 0 ]; then echo "[!] Этот скрипт необходимо запускать от root." exit 1 fi # ================================================== # 2. Проверка имени пользователя # ================================================== case "$USER_NAME" in ""|*[!a-zA-Z0-9_-]*) echo "[!] Некорректное имя пользователя: $USER_NAME" exit 1 ;; esac # ================================================== # 3. Проверка repositories # ================================================== if [ ! -f /etc/apk/repositories ]; then echo "[!] Файл /etc/apk/repositories не найден." exit 1 fi # ================================================== # 4. Вспомогательные функции # ================================================== add_user_group() { GROUP_NAME="$1" if ! getent group "$GROUP_NAME" >/dev/null 2>&1; then echo "[!] Группа $GROUP_NAME не существует — пропуск." return 0 fi if id -nG "$USER_NAME" 2>/dev/null | tr ' ' '\n' | grep -qx "$GROUP_NAME" then echo "[+] $USER_NAME уже состоит в группе $GROUP_NAME." else echo "[*] Добавление $USER_NAME в группу $GROUP_NAME..." addgroup "$USER_NAME" "$GROUP_NAME" fi } enable_service() { SERVICE="$1" echo "[*] Настройка службы $SERVICE..." if ! rc-service "$SERVICE" status >/dev/null 2>&1; then echo "[*] Запуск $SERVICE..." rc-service "$SERVICE" start 2>/dev/null || true else echo "[+] $SERVICE уже запущен." fi rc-update add "$SERVICE" default 2>/dev/null || true } # ================================================== # 5. Репозитории # ================================================== echo "[*] Проверка репозитория community..." if ! grep -qE '^[[:space:]]*[^#[:space:]].*/community/?[[:space:]]*$' \ /etc/apk/repositories then if grep -qE '^[[:space:]]*#.*\/community/?[[:space:]]*$' \ /etc/apk/repositories then echo "[*] Раскомментирование community..." sed -i \ 's|^[[:space:]]*#\(.*\/community/?[[:space:]]*\)$|\1|' \ /etc/apk/repositories else echo "[!] Репозиторий community не найден." echo "[!] Добавьте community в /etc/apk/repositories." exit 1 fi fi echo "[*] Обновление индекса пакетов..." apk update # ================================================== # 6. Базовые инструменты # ================================================== echo "[*] Установка базовых инструментов..." apk add \ sudo \ nano \ git \ bash \ build-base # ================================================== # 7. Пользователь # ================================================== echo "[*] Настройка пользователя $USER_NAME..." if id "$USER_NAME" >/dev/null 2>&1; then echo "[+] Пользователь $USER_NAME уже существует." else echo "[*] Создание пользователя $USER_NAME..." adduser -D "$USER_NAME" echo echo "[!] Сейчас необходимо задать пароль пользователя $USER_NAME." passwd "$USER_NAME" echo fi # ================================================== # 8. Wayland / seatd / системные компоненты # # ВАЖНО: # seatd устанавливается ДО добавления пользователя # в группу seat. # ================================================== echo "[*] Установка Wayland и системных компонентов..." apk add \ mesa \ mesa-dri \ libinput \ seatd \ seatd-openrc \ dbus \ dbus-openrc \ polkit # ================================================== # 9. Группы # ================================================== echo "[*] Настройка групп пользователя..." # Sudo add_user_group wheel # seatd # # Alpine использует группу "seat". # "seatd" — это имя демона/пакета, НЕ имя группы. # # Документация Alpine: # adduser $USER seat # if getent group seat >/dev/null 2>&1; then add_user_group seat else echo "[!] Группа seat отсутствует." echo "[!] Создаю группу seat..." addgroup seat add_user_group seat fi # Для seatd обычно НЕ нужны input/video. # # video можно добавить отдельно, если PipeWire # должен напрямую работать с веб-камерой: # # add_user_group video # ================================================== # 10. Sudo # ================================================== echo "[*] Настройка sudo..." if [ -d /etc/sudoers.d ] && grep -qE '^[[:space:]]*#?[[:space:]]*includedir[[:space:]]+/etc/sudoers\.d' \ /etc/sudoers then echo "[+] Используется /etc/sudoers.d." cat > /etc/sudoers.d/wheel << 'EOF' %wheel ALL=(ALL) ALL EOF chmod 440 /etc/sudoers.d/wheel else echo "[*] sudoers.d не подключен." if grep -qE '^%wheel[[:space:]]+ALL=\(ALL\)[[:space:]]+ALL' \ /etc/sudoers then echo "[+] Правило wheel уже существует." elif grep -qE '^#[[:space:]]*%wheel[[:space:]]+ALL=\(ALL\)[[:space:]]+ALL' \ /etc/sudoers then sed -i \ 's/^#[[:space:]]*\(%wheel[[:space:]]*ALL=(ALL)[[:space:]]*ALL\)/\1/' \ /etc/sudoers else echo '%wheel ALL=(ALL) ALL' >> /etc/sudoers fi fi # ================================================== # 11. Зависимости zenith-cli # ================================================== echo "[*] Установка зависимостей zenith-cli..." apk add \ cmake \ curl-dev \ opencv-dev # ================================================== # 12. Desktop environment # ================================================== echo "[*] Установка рабочего окружения..." apk add \ labwc \ alacritty \ waybar \ mako \ swaybg \ wofi \ font-noto \ font-dejavu \ wl-clipboard \ xdg-desktop-portal \ xdg-desktop-portal-gtk \ pipewire \ wireplumber \ alsa-utils \ networkmanager \ networkmanager-applet \ pcmanfm \ firefox \ swaylock # ================================================== # 13. OpenRC # ================================================== echo "[*] Настройка системных служб..." enable_service seatd enable_service dbus enable_service networkmanager # ================================================== # 14. Конфигурация LabWC # ================================================== echo "[*] Создание конфигурации LabWC..." mkdir -p "$HOME_DIR/.config/labwc" # -------------------------------------------------- # LabWC environment # -------------------------------------------------- cat > "$HOME_DIR/.config/labwc/environment" << 'EOF' XDG_CURRENT_DESKTOP=labwc XDG_SESSION_DESKTOP=labwc XDG_SESSION_TYPE=wayland # Runtime directory для Wayland/seatd XDG_RUNTIME_DIR=/tmp/user-1000 MOZ_ENABLE_WAYLAND=1 QT_QPA_PLATFORM=wayland SDL_VIDEODRIVER=wayland # Явно использовать seatd LIBSEAT_BACKEND=seatd EOF # -------------------------------------------------- # LabWC autostart # -------------------------------------------------- cat > "$HOME_DIR/.config/labwc/autostart" << 'EOF' #!/bin/sh # ================================================== # XDG_RUNTIME_DIR # ================================================== if [ -z "${XDG_RUNTIME_DIR:-}" ]; then XDG_RUNTIME_DIR="/tmp/user-$(id -u)" export XDG_RUNTIME_DIR fi if [ ! -d "$XDG_RUNTIME_DIR" ]; then mkdir -p "$XDG_RUNTIME_DIR" chmod 700 "$XDG_RUNTIME_DIR" fi # ================================================== # NetworkManager applet # ================================================== if command -v nm-applet >/dev/null 2>&1; then nm-applet & fi # ================================================== # Waybar # ================================================== if command -v waybar >/dev/null 2>&1; then waybar & fi # ================================================== # Notification daemon # ================================================== if command -v mako >/dev/null 2>&1; then mako & fi # ================================================== # PipeWire # ================================================== if ! pgrep -x pipewire >/dev/null 2>&1; then pipewire & fi # ================================================== # WirePlumber # ================================================== if ! pgrep -x wireplumber >/dev/null 2>&1; then wireplumber & fi # ================================================== # Wallpaper # ================================================== if [ -f /usr/share/backgrounds/alpine/alpine-wallpaper.png ]; then swaybg \ -i /usr/share/backgrounds/alpine/alpine-wallpaper.png \ -m fill & fi EOF chmod +x "$HOME_DIR/.config/labwc/autostart" # ================================================== # 15. zenith-cli # ================================================== echo "[*] Установка zenith-cli..." if [ -d "$ZENITH_DIR/.git" ]; then echo "[*] Репозиторий zenith-cli уже существует." su - "$USER_NAME" -c " set -eu cd '$ZENITH_DIR' git pull --ff-only " else echo "[*] Клонирование zenith-cli..." su - "$USER_NAME" -c " set -eu git clone '$ZENITH_REPO' '$ZENITH_DIR' " fi # ================================================== # 16. Проверка build.sh # ================================================== echo "[*] Проверка build.sh..." if [ ! -f "$ZENITH_DIR/build.sh" ]; then echo "[!] build.sh не найден:" echo " $ZENITH_DIR/build.sh" exit 1 fi # ================================================== # 17. Проверка CMakeLists.txt # ================================================== echo "[*] Проверка CMakeLists.txt..." if [ ! -f "$ZENITH_DIR/CMakeLists.txt" ]; then echo "[!] CMakeLists.txt не найден:" echo " $ZENITH_DIR/CMakeLists.txt" exit 1 fi # ================================================== # 18. Сборка zenith-cli # ================================================== echo "[*] Сборка zenith-cli..." su - "$USER_NAME" -c " set -eu cd '$ZENITH_DIR' chmod +x build.sh echo '[*] Запуск build.sh...' ./build.sh echo '[*] Проверка результата сборки...' if [ ! -f './zenith-cli' ]; then echo '[!] ./zenith-cli не найден после сборки.' exit 1 fi if [ ! -x './zenith-cli' ]; then chmod +x './zenith-cli' fi mkdir -p '$LOCAL_BIN' cp './zenith-cli' '$LOCAL_BIN/zenith-cli' chmod +x '$LOCAL_BIN/zenith-cli' echo '[+] zenith-cli успешно собран.' echo '[+] Установлен в: $LOCAL_BIN/zenith-cli' " # ================================================== # 19. Проверка бинарника # ================================================== echo "[*] Проверка zenith-cli..." if [ ! -x "$LOCAL_BIN/zenith-cli" ]; then echo "[!] Бинарник zenith-cli не установлен." exit 1 fi # ================================================== # 20. PATH # ================================================== echo "[*] Настройка PATH..." touch "$PROFILE" if ! grep -qF 'export PATH="$HOME/.local/bin:$PATH"' "$PROFILE"; then cat >> "$PROFILE" << 'EOF' # User local binaries export PATH="$HOME/.local/bin:$PATH" EOF fi # ================================================== # 21. XDG_RUNTIME_DIR # ================================================== echo "[*] Настройка XDG_RUNTIME_DIR..." if ! grep -qF '# XDG-RUNTIME-DIR' "$PROFILE"; then cat >> "$PROFILE" << 'EOF' # XDG-RUNTIME-DIR # # seatd/Wayland требует XDG_RUNTIME_DIR. # if [ -z "${XDG_RUNTIME_DIR:-}" ]; then export XDG_RUNTIME_DIR="/tmp/user-$(id -u)" fi if [ ! -d "$XDG_RUNTIME_DIR" ]; then mkdir -p "$XDG_RUNTIME_DIR" chmod 700 "$XDG_RUNTIME_DIR" fi EOF fi # ================================================== # 22. Автологин tty1 # ================================================== echo "[*] Настройка автоматического входа..." if [ -f /etc/inittab ]; then if [ ! -f /etc/inittab.bak ]; then echo "[*] Создание резервной копии /etc/inittab..." cp /etc/inittab /etc/inittab.bak fi if grep -q '^tty1::respawn:/sbin/getty' /etc/inittab; then sed -i \ "s|^tty1::respawn:/sbin/getty.*|tty1::respawn:/sbin/getty -a $USER_NAME 38400 tty1|" \ /etc/inittab elif ! grep -q '^tty1::respawn:' /etc/inittab; then echo "[*] Добавление tty1..." echo \ "tty1::respawn:/sbin/getty -a $USER_NAME 38400 tty1" \ >> /etc/inittab fi else echo "[!] /etc/inittab не найден." echo "[!] Автологин не настроен." fi # ================================================== # 23. Автозапуск LabWC # ================================================== echo "[*] Настройка запуска LabWC..." if ! grep -qF '# LABWC-AUTOSTART' "$PROFILE"; then cat >> "$PROFILE" << 'EOF' # LABWC-AUTOSTART # # Запуск LabWC только на tty1. # if [ "$(tty 2>/dev/null)" = "/dev/tty1" ] && [ -z "${WAYLAND_DISPLAY:-}" ]; then export XDG_SESSION_TYPE=wayland export XDG_CURRENT_DESKTOP=labwc export XDG_SESSION_DESKTOP=labwc export LIBSEAT_BACKEND=seatd exec dbus-run-session -- labwc fi EOF fi # ================================================== # 24. Права # ================================================== echo "[*] Настройка владельцев файлов..." if [ -d "$HOME_DIR/.config" ]; then chown -R "$USER_NAME:$USER_NAME" "$HOME_DIR/.config" fi if [ -f "$PROFILE" ]; then chown "$USER_NAME:$USER_NAME" "$PROFILE" fi if [ -d "$HOME_DIR/.local" ]; then chown -R "$USER_NAME:$USER_NAME" "$HOME_DIR/.local" fi if [ -d "$ZENITH_DIR" ]; then chown -R "$USER_NAME:$USER_NAME" "$ZENITH_DIR" fi # ================================================== # 25. Проверка групп # ================================================== echo echo "==================================================" echo "[*] Группы пользователя" echo "==================================================" id "$USER_NAME" echo if id -nG "$USER_NAME" | tr ' ' '\n' | grep -qx seat; then echo "[+] seat: OK" else echo "[!] seat: НЕ НАЙДЕНА" fi # ================================================== # 26. Финальная проверка # ================================================== echo echo "==================================================" echo "[*] Финальная проверка" echo "==================================================" printf '%-20s' "LabWC:" if command -v labwc >/dev/null 2>&1; then echo "OK" else echo "ERROR" fi printf '%-20s' "Waybar:" if command -v waybar >/dev/null 2>&1; then echo "OK" else echo "ERROR" fi printf '%-20s' "PipeWire:" if command -v pipewire >/dev/null 2>&1; then echo "OK" else echo "ERROR" fi printf '%-20s' "WirePlumber:" if command -v wireplumber >/dev/null 2>&1; then echo "OK" else echo "ERROR" fi printf '%-20s' "NetworkManager:" if command -v nmcli >/dev/null 2>&1; then echo "OK" else echo "ERROR" fi printf '%-20s' "D-Bus:" if command -v dbus-run-session >/dev/null 2>&1; then echo "OK" else echo "ERROR" fi printf '%-20s' "seatd:" if command -v seatd >/dev/null 2>&1; then echo "OK" else echo "ERROR" fi printf '%-20s' "seatd service:" if rc-service seatd status >/dev/null 2>&1; then echo "RUNNING" else echo "NOT RUNNING" fi printf '%-20s' "Bash:" if command -v bash >/dev/null 2>&1; then echo "OK" else echo "ERROR" fi printf '%-20s' "CMake:" if command -v cmake >/dev/null 2>&1; then echo "OK" else echo "ERROR" fi printf '%-20s' "OpenCV:" if apk info -e opencv-dev >/dev/null 2>&1; then echo "OK" else echo "ERROR" fi printf '%-20s' "zenith-cli:" if [ -x "$LOCAL_BIN/zenith-cli" ]; then echo "OK" else echo "ERROR" fi echo echo "==================================================" echo "[+] Установка завершена." echo "==================================================" echo echo "[!] Следующий шаг:" echo echo " reboot" echo echo "После перезагрузки:" echo echo " 1. $USER_NAME будет автоматически авторизован на tty1." echo " 2. seatd будет запущен OpenRC." echo " 3. LabWC запустится через dbus-run-session." echo " 4. Waybar, Mako и NetworkManager applet запустятся автоматически." echo " 5. PipeWire и WirePlumber будут запущены в пользовательской сессии." echo " 6. zenith-cli будет доступен как:" echo echo " zenith-cli" echo echo "=================================================="