#!/bin/sh # LabWC Alpine Setup Script # Version 5 # # Запускать от имени root! # # Использование: # ./setup.sh # ./setup.sh username # # Скрипт устанавливает: # - LabWC + Wayland # - Waybar / Mako / Wofi # - PipeWire + WirePlumber # - NetworkManager # - Firefox # - zenith-cli # - автоматический вход на 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. Проверка существования /etc/apk/repositories # -------------------------------------------------- if [ ! -f /etc/apk/repositories ]; then echo "[!] Файл /etc/apk/repositories не найден." exit 1 fi # -------------------------------------------------- # 4. Вспомогательные функции # -------------------------------------------------- add_user_group() { GROUP_NAME="$1" if groups "$USER_NAME" 2>/dev/null | grep -qw "$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..." rc-update add "$SERVICE" default 2>/dev/null || true if rc-service "$SERVICE" status >/dev/null 2>&1; then echo "[+] $SERVICE уже запущен." else echo "[*] Запуск $SERVICE..." rc-service "$SERVICE" start 2>/dev/null || true fi } # -------------------------------------------------- # 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. Группы # -------------------------------------------------- echo "[*] Настройка групп пользователя..." add_user_group wheel add_user_group seat # При использовании seatd отдельные группы video/input # обычно не требуются. # # При необходимости их можно добавить: # # add_user_group video # add_user_group input # -------------------------------------------------- # 9. 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 # -------------------------------------------------- # 10. Wayland / LabWC # -------------------------------------------------- echo "[*] Установка Wayland и системных компонентов..." apk add \ mesa \ mesa-dri \ libinput \ seatd \ dbus \ polkit # -------------------------------------------------- # 11. Зависимости zenith-cli # -------------------------------------------------- echo "[*] Установка зависимостей zenith-cli..." # zenith-cli: # # Bash -> build.sh # C/C++ -> build-base # CMake -> cmake # libcurl -> curl-dev # OpenCV -> opencv-dev # # CMakeLists.txt использует: # # find_package(CURL REQUIRED) # find_package(OpenCV REQUIRED) 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" cat > "$HOME_DIR/.config/labwc/environment" << 'EOF' XDG_CURRENT_DESKTOP=labwc XDG_SESSION_DESKTOP=labwc XDG_SESSION_TYPE=wayland MOZ_ENABLE_WAYLAND=1 QT_QPA_PLATFORM=wayland SDL_VIDEODRIVER=wayland EOF cat > "$HOME_DIR/.config/labwc/autostart" << 'EOF' #!/bin/sh # -------------------------------------------------- # NetworkManager applet # -------------------------------------------------- nm-applet & # -------------------------------------------------- # Waybar # -------------------------------------------------- waybar & # -------------------------------------------------- # Notification daemon # -------------------------------------------------- mako & # -------------------------------------------------- # 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. Проверка бинарника zenith-cli # -------------------------------------------------- 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. Автологин 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 # -------------------------------------------------- # 22. Автозапуск LabWC # -------------------------------------------------- echo "[*] Настройка запуска LabWC..." if ! grep -qF '# LABWC-AUTOSTART' "$PROFILE"; then cat >> "$PROFILE" << 'EOF' # LABWC-AUTOSTART # # Запуск LabWC только на tty1. # # dbus-run-session создаёт отдельную D-Bus session bus # для графической сессии. # if [ "$(tty 2>/dev/null)" = "/dev/tty1" ] && [ -z "${WAYLAND_DISPLAY:-}" ]; then exec dbus-run-session -- labwc fi EOF fi # -------------------------------------------------- # 23. Права # -------------------------------------------------- echo "[*] Настройка владельцев файлов..." chown -R "$USER_NAME:$USER_NAME" "$HOME_DIR/.config" chown "$USER_NAME:$USER_NAME" "$PROFILE" 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 # -------------------------------------------------- # 24. Финальная проверка # -------------------------------------------------- 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 session:" if command -v dbus-run-session >/dev/null 2>&1; then echo "OK" else echo "ERROR" 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. LabWC запустится через dbus-run-session." echo " 3. Waybar, Mako и NetworkManager applet запустятся автоматически." echo " 4. PipeWire и WirePlumber будут запущены в пользовательской сессии." echo " 5. zenith-cli будет доступен как:" echo echo " zenith-cli" echo echo "=================================================="