#!/bin/sh # ============================================================ # LabWC Alpine Setup Script # Version 8 # # Запуск: # # ./setup.sh # ./setup.sh ivan # # Можно запускать: # - от root # - от обычного пользователя # # Если запущено не от root, скрипт автоматически использует sudo. # ============================================================ 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" SCRIPT_PATH="$0" # ============================================================ # 1. Проверка имени пользователя # ============================================================ case "$USER_NAME" in ""|*[!a-zA-Z0-9_-]*) echo "[!] Некорректное имя пользователя: $USER_NAME" exit 1 ;; esac # ============================================================ # 2. Автоматический переход в root # # Если скрипт запущен от ivan: # # ./setup.sh # # он сам выполнит: # # sudo ./setup.sh # # ============================================================ if [ "$(id -u)" -ne 0 ]; then echo "==================================================" echo "[*] Скрипт запущен от пользователя: $(id -un)" echo "[*] Требуются root-права." echo "==================================================" if ! command -v sudo >/dev/null 2>&1; then echo echo "[!] sudo не установлен." echo echo "[!] Один раз выполните от root:" echo echo " apk add sudo" echo exit 1 fi echo "[*] Перезапуск через sudo..." exec sudo "$SCRIPT_PATH" "$@" fi # ============================================================ # 3. Root # ============================================================ echo echo "==================================================" echo "[*] LabWC Alpine Setup" echo "==================================================" echo "[*] Root: OK" echo "[*] User: $USER_NAME" echo "[*] Home: $HOME_DIR" echo "==================================================" echo # ============================================================ # 4. Проверка repositories # ============================================================ if [ ! -f /etc/apk/repositories ]; then echo "[!] /etc/apk/repositories не найден." exit 1 fi # ============================================================ # 5. Функции # ============================================================ 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 уже запущен." else echo "[*] Запуск $SERVICE..." rc-service "$SERVICE" start 2>/dev/null || true fi rc-update add "$SERVICE" default 2>/dev/null || true } package_exists() { PACKAGE="$1" apk search -x "$PACKAGE" 2>/dev/null | grep -qx "$PACKAGE" } install_optional() { PACKAGE="$1" if package_exists "$PACKAGE"; then echo "[*] Установка дополнительного пакета: $PACKAGE" apk add "$PACKAGE" else echo "[!] Дополнительный пакет $PACKAGE отсутствует." echo "[!] Пропуск." fi } # ============================================================ # 6. Community # ============================================================ echo "[*] Проверка community..." if grep -qE '^[[:space:]]*[^#[:space:]].*/community/?[[:space:]]*$' \ /etc/apk/repositories then echo "[+] community уже включён." elif 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 echo "Проверьте:" echo echo " cat /etc/apk/repositories" echo exit 1 fi # ============================================================ # 7. APK update # ============================================================ echo echo "[*] Обновление индексов APK..." apk update # ============================================================ # 8. Базовые инструменты # ============================================================ echo echo "[*] Установка базовых инструментов..." apk add \ sudo \ nano \ git \ bash \ build-base # ============================================================ # 9. Пользователь # ============================================================ echo echo "[*] Проверка пользователя $USER_NAME..." if id "$USER_NAME" >/dev/null 2>&1; then echo "[+] Пользователь существует." else echo "[*] Создание пользователя..." adduser -D "$USER_NAME" echo echo "[!] Установите пароль для $USER_NAME." passwd "$USER_NAME" fi # ============================================================ # 10. Wayland / seatd # # ВАЖНО: # # НЕ используем mesa-dri. # # mesa-dri отсутствует в некоторых версиях Alpine. # Пакет mesa сам подтягивает необходимые компоненты. # ============================================================ echo echo "[*] Установка Wayland / seatd..." apk add \ mesa \ libinput \ seatd \ dbus \ polkit # ============================================================ # 11. Группы # ============================================================ echo echo "[*] Настройка групп..." add_user_group wheel # seat — группа для seatd/libseat. # # seatd — это демон. # seat — Unix-группа. if getent group seat >/dev/null 2>&1; then echo "[+] Группа seat существует." else echo "[*] Группа seat отсутствует." echo "[*] Создание группы seat..." addgroup seat fi add_user_group seat # ============================================================ # 12. Sudo # ============================================================ echo echo "[*] Настройка sudo..." if [ -d /etc/sudoers.d ]; then cat > /etc/sudoers.d/wheel << 'EOF' %wheel ALL=(ALL) ALL EOF chmod 440 /etc/sudoers.d/wheel else if ! grep -qE '^%wheel[[:space:]]+ALL=\(ALL\)[[:space:]]+ALL' \ /etc/sudoers then echo '%wheel ALL=(ALL) ALL' >> /etc/sudoers fi fi # ============================================================ # 13. zenith-cli dependencies # ============================================================ echo echo "[*] Установка зависимостей zenith-cli..." apk add \ cmake \ curl-dev \ opencv-dev # ============================================================ # 14. Desktop # ============================================================ echo echo "[*] Установка рабочего окружения..." apk add \ labwc \ alacritty \ waybar \ mako \ swaybg \ wofi \ font-noto \ font-dejavu \ wl-clipboard \ xdg-desktop-portal \ pipewire \ wireplumber \ alsa-utils \ networkmanager \ networkmanager-applet \ pcmanfm \ firefox \ swaylock # ============================================================ # 15. GTK portal — необязательный # ============================================================ echo echo "[*] Проверка xdg-desktop-portal-gtk..." if package_exists xdg-desktop-portal-gtk; then apk add xdg-desktop-portal-gtk else echo "[!] xdg-desktop-portal-gtk отсутствует." echo "[!] Продолжаем без него." fi # ============================================================ # 16. OpenRC # ============================================================ echo echo "[*] Настройка OpenRC..." enable_service seatd enable_service dbus enable_service networkmanager # ============================================================ # 17. LabWC config # ============================================================ echo echo "[*] Создание конфигурации LabWC..." mkdir -p "$HOME_DIR/.config/labwc" # ------------------------------------------------------------ # environment # ------------------------------------------------------------ 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 LIBSEAT_BACKEND=seatd EOF # ------------------------------------------------------------ # autostart # ------------------------------------------------------------ cat > "$HOME_DIR/.config/labwc/autostart" << 'EOF' #!/bin/sh # ============================================================ # 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 # ============================================================ # 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 # ============================================================ # Mako # ============================================================ if command -v mako >/dev/null 2>&1; then mako & fi # ============================================================ # PipeWire # ============================================================ if command -v pipewire >/dev/null 2>&1; then if ! pgrep -x pipewire >/dev/null 2>&1; then pipewire & fi fi # ============================================================ # WirePlumber # ============================================================ if command -v wireplumber >/dev/null 2>&1; then if ! pgrep -x wireplumber >/dev/null 2>&1; then wireplumber & fi 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" # ============================================================ # 18. zenith-cli # ============================================================ echo echo "[*] Установка zenith-cli..." if [ -d "$ZENITH_DIR/.git" ]; then echo "[+] Репозиторий уже существует." 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 # ============================================================ # 19. Проверка файлов zenith-cli # ============================================================ if [ ! -f "$ZENITH_DIR/build.sh" ]; then echo "[!] Не найден:" echo " $ZENITH_DIR/build.sh" exit 1 fi if [ ! -f "$ZENITH_DIR/CMakeLists.txt" ]; then echo "[!] Не найден:" echo " $ZENITH_DIR/CMakeLists.txt" exit 1 fi # ============================================================ # 20. Сборка zenith-cli # ============================================================ echo echo "[*] Сборка zenith-cli..." su - "$USER_NAME" -c " set -eu cd '$ZENITH_DIR' chmod +x build.sh echo '[*] Запуск build.sh...' ./build.sh if [ ! -f './zenith-cli' ]; then echo '[!] zenith-cli не найден после сборки.' exit 1 fi chmod +x './zenith-cli' mkdir -p '$LOCAL_BIN' cp './zenith-cli' '$LOCAL_BIN/zenith-cli' chmod +x '$LOCAL_BIN/zenith-cli' echo '[+] zenith-cli установлен.' " # ============================================================ # 21. PATH # ============================================================ echo 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 # ============================================================ # 22. XDG_RUNTIME_DIR # ============================================================ if ! grep -qF '# XDG-RUNTIME-DIR' "$PROFILE"; then cat >> "$PROFILE" << 'EOF' # 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 # ============================================================ # 23. Автологин tty1 # ============================================================ echo echo "[*] Настройка автологина tty1..." if [ -f /etc/inittab ]; then if [ ! -f /etc/inittab.bak ]; then 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::respawn:/sbin/getty -a $USER_NAME 38400 tty1" \ >> /etc/inittab fi else echo "[!] /etc/inittab отсутствует." echo "[!] Автологин не настроен." fi # ============================================================ # 24. Автозапуск LabWC # ============================================================ echo echo "[*] Настройка автозапуска LabWC..." if ! grep -qF '# LABWC-AUTOSTART' "$PROFILE"; then cat >> "$PROFILE" << 'EOF' # LABWC-AUTOSTART 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 # ============================================================ # 25. Права # ============================================================ echo 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 # ============================================================ # 26. Финальная проверка # ============================================================ echo echo "==================================================" echo "[*] ФИНАЛЬНАЯ ПРОВЕРКА" echo "==================================================" echo echo "[*] Пользователь:" id "$USER_NAME" echo printf '%-25s' "wheel:" if id -nG "$USER_NAME" | tr ' ' '\n' | grep -qx wheel then echo "OK" else echo "ERROR" fi printf '%-25s' "seat:" if id -nG "$USER_NAME" | tr ' ' '\n' | grep -qx seat then echo "OK" else echo "ERROR" fi printf '%-25s' "seatd:" if command -v seatd >/dev/null 2>&1; then echo "OK" else echo "ERROR" fi printf '%-25s' "LabWC:" if command -v labwc >/dev/null 2>&1; then echo "OK" else echo "ERROR" fi printf '%-25s' "Waybar:" if command -v waybar >/dev/null 2>&1; then echo "OK" else echo "ERROR" fi printf '%-25s' "PipeWire:" if command -v pipewire >/dev/null 2>&1; then echo "OK" else echo "ERROR" fi printf '%-25s' "WirePlumber:" if command -v wireplumber >/dev/null 2>&1; then echo "OK" else echo "ERROR" fi printf '%-25s' "NetworkManager:" if command -v nmcli >/dev/null 2>&1; then echo "OK" else echo "ERROR" fi printf '%-25s' "D-Bus:" if command -v dbus-run-session >/dev/null 2>&1; then echo "OK" else echo "ERROR" fi printf '%-25s' "Bash:" if command -v bash >/dev/null 2>&1; then echo "OK" else echo "ERROR" fi printf '%-25s' "CMake:" if command -v cmake >/dev/null 2>&1; then echo "OK" else echo "ERROR" fi printf '%-25s' "OpenCV:" if apk info -e opencv-dev >/dev/null 2>&1; then echo "OK" else echo "ERROR" fi printf '%-25s' "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 "После reboot:" echo echo " $USER_NAME -> автоматический вход tty1" echo " tty1 -> LabWC" echo " LabWC -> Waybar / Mako / PipeWire" echo " Network -> NetworkManager" echo " seat -> seatd" echo echo "zenith-cli:" echo echo " zenith-cli" echo echo "=================================================="