#!/bin/sh # ============================================================ # LabWC Alpine Setup Script # Version 11 # # Запуск: # # ./setup.sh # ./setup.sh ivan # # Можно запускать от root ИЛИ обычного пользователя. # # Скрипт автоматически использует sudo. # # ============================================================ set -eu 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" # ============================================================ # Абсолютный путь к скрипту # ============================================================ case "$0" in /*) SCRIPT_PATH="$0" ;; *) SCRIPT_PATH="$(pwd)/$0" ;; esac # ============================================================ # Проверка имени # ============================================================ case "$USER_NAME" in ""|*[!a-zA-Z0-9_-]*) echo "[!] Некорректное имя пользователя: $USER_NAME" exit 1 ;; esac # ============================================================ # Автоматический sudo # ============================================================ if [ "$(id -u)" -ne 0 ]; then echo echo "==================================================" echo "[*] Запущено от пользователя: $(id -un)" echo "[*] Нужны root-права." echo "==================================================" echo if ! command -v sudo >/dev/null 2>&1; then echo "[!] sudo не установлен." echo echo "[!] Выполните один раз от root:" echo echo " apk add sudo" echo exit 1 fi exec sudo sh "$SCRIPT_PATH" "$@" fi # ============================================================ # Информация # ============================================================ echo echo "==================================================" echo " LabWC Alpine Setup Script v11" echo "==================================================" echo echo "[*] User: $USER_NAME" echo "[*] Home: $HOME_DIR" echo "[*] Alpine: $(cat /etc/alpine-release 2>/dev/null || echo unknown)" echo # ============================================================ # Проверка Alpine # ============================================================ if [ ! -f /etc/alpine-release ]; then echo "[!] Это не Alpine Linux." exit 1 fi # ============================================================ # Проверка repositories # ============================================================ if [ ! -f /etc/apk/repositories ]; then echo "[!] /etc/apk/repositories отсутствует." exit 1 fi # ============================================================ # Функции # ============================================================ package_exists() { PACKAGE="$1" apk search -x "$PACKAGE" 2>/dev/null | grep -Eq "^${PACKAGE}(-[0-9].*)?$" } install_required() { PACKAGE="$1" echo echo "[*] Проверка обязательного пакета: $PACKAGE" if apk info -e "$PACKAGE" >/dev/null 2>&1; then echo "[+] $PACKAGE уже установлен." return 0 fi if ! package_exists "$PACKAGE"; then echo echo "==================================================" echo "[!!!] ОШИБКА" echo "==================================================" echo echo "[!] Обязательный пакет отсутствует:" echo echo " $PACKAGE" echo echo "[!] Alpine:" cat /etc/alpine-release echo echo "[!] Репозитории:" cat /etc/apk/repositories echo exit 1 fi apk add "$PACKAGE" } install_optional() { PACKAGE="$1" echo echo "[*] Необязательный пакет: $PACKAGE" if apk info -e "$PACKAGE" >/dev/null 2>&1; then echo "[+] Уже установлен." return 0 fi if package_exists "$PACKAGE"; then apk add "$PACKAGE" echo "[+] Установлен." else echo "[!] Пакет отсутствует." echo "[!] Пропускаем." fi } add_user_group() { GROUP_NAME="$1" # Создаём группу, если её нет if ! getent group "$GROUP_NAME" >/dev/null 2>&1; then echo "[*] Создание группы $GROUP_NAME..." addgroup "$GROUP_NAME" 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 echo "[*] Служба: $SERVICE" if ! command -v rc-service >/dev/null 2>&1; then echo "[!] OpenRC недоступен." return 0 fi 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 } check_command() { NAME="$1" COMMAND="$2" printf '%-25s' "$NAME:" if command -v "$COMMAND" >/dev/null 2>&1; then echo "OK" else echo "ERROR" fi } # ============================================================ # Community # ============================================================ echo echo "==================================================" echo "[*] Репозиторий community" echo "==================================================" 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 cat /etc/apk/repositories echo exit 1 fi # ============================================================ # APK update # ============================================================ echo echo "[*] apk update..." apk update # ============================================================ # Пользователь # ============================================================ echo echo "==================================================" echo "[*] Пользователь" echo "==================================================" if id "$USER_NAME" >/dev/null 2>&1; then echo "[+] $USER_NAME уже существует." else echo "[*] Создание $USER_NAME..." adduser -D "$USER_NAME" echo echo "[!] Задайте пароль для $USER_NAME вручную:" echo " passwd $USER_NAME" echo fi # ============================================================ # Базовые пакеты # ============================================================ echo echo "==================================================" echo "[*] Базовые пакеты" echo "==================================================" install_required sudo install_required nano install_required git install_required bash install_required build-base # ============================================================ # Sudo # ============================================================ echo echo "==================================================" echo "[*] Настройка sudo" echo "==================================================" 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 # ============================================================ # Группы # ============================================================ echo echo "==================================================" echo "[*] Группы" echo "==================================================" add_user_group wheel # ------------------------------------------------------------ # seat # # ВАЖНО: # seatd — имя программы/демона. # seat — группа. # # НЕ добавляем пользователя в группу "seatd". # ------------------------------------------------------------ if ! getent group seat >/dev/null 2>&1; then echo "[*] Группа seat отсутствует." echo "[*] Создание группы seat..." addgroup seat fi add_user_group seat # ============================================================ # Wayland / graphics # ============================================================ echo echo "==================================================" echo "[*] Wayland / graphics" echo "==================================================" # НЕ используем mesa-dri. install_required mesa install_required libinput install_required seatd install_required dbus install_required polkit # ============================================================ # zenith-cli dependencies # ============================================================ echo echo "==================================================" echo "[*] zenith-cli dependencies" echo "==================================================" install_required cmake install_required curl-dev install_required opencv-dev # ============================================================ # Desktop # ============================================================ echo echo "==================================================" echo "[*] Desktop" echo "==================================================" install_required labwc install_required alacritty install_required waybar install_required mako install_required swaybg install_required wofi install_required font-noto install_required font-dejavu install_required wl-clipboard install_required xdg-desktop-portal install_required pipewire install_required wireplumber install_required alsa-utils install_required networkmanager install_required pcmanfm install_required firefox install_required swaylock # ============================================================ # SDDM (Display Manager) # ============================================================ echo echo "==================================================" echo "[*] SDDM" echo "==================================================" install_required sddm # ============================================================ # Необязательные пакеты # ============================================================ echo echo "==================================================" echo "[*] Необязательные пакеты" echo "==================================================" # GTK portal может отсутствовать в некоторых конфигурациях. install_optional xdg-desktop-portal-gtk # network-manager-applet может отсутствовать в текущей ветке. # # Он НЕ нужен для работы NetworkManager. # Поэтому не ломаем установку из-за него. install_optional network-manager-applet # ============================================================ # OpenRC # ============================================================ echo echo "==================================================" echo "[*] OpenRC" echo "==================================================" enable_service seatd enable_service dbus enable_service networkmanager enable_service sddm # ============================================================ # LabWC configuration # ============================================================ echo echo "==================================================" echo "[*] Конфигурация LabWC" echo "==================================================" 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 # ============================================================ # Runtime directory # ============================================================ 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 # ============================================================ WALLPAPER="" if [ -f /usr/share/backgrounds/alpine/alpine-wallpaper.png ]; then WALLPAPER="/usr/share/backgrounds/alpine/alpine-wallpaper.png" elif [ -f /usr/share/pixmaps/alpine-wallpaper.png ]; then WALLPAPER="/usr/share/pixmaps/alpine-wallpaper.png" elif [ -f /usr/share/wallpapers/alpine.png ]; then WALLPAPER="/usr/share/wallpapers/alpine.png" fi if command -v swaybg >/dev/null 2>&1 && [ -n "$WALLPAPER" ]; then swaybg \ -i "$WALLPAPER" \ -m fill & fi EOF chmod +x "$HOME_DIR/.config/labwc/autostart" # ============================================================ # zenith-cli # ============================================================ echo echo "==================================================" echo "[*] zenith-cli" echo "==================================================" if [ -d "$ZENITH_DIR/.git" ]; then echo "[+] Репозиторий уже существует." su - "$USER_NAME" -c " set -eu cd '$ZENITH_DIR' git pull " else echo "[*] Клонирование..." su - "$USER_NAME" -c " set -eu git clone '$ZENITH_REPO' '$ZENITH_DIR' " fi # ============================================================ # Проверка исходников # ============================================================ if [ ! -f "$ZENITH_DIR/build.sh" ]; then echo echo "[!] build.sh не найден:" echo " $ZENITH_DIR/build.sh" exit 1 fi if [ ! -f "$ZENITH_DIR/CMakeLists.txt" ]; then echo echo "[!] CMakeLists.txt не найден:" echo " $ZENITH_DIR/CMakeLists.txt" exit 1 fi # ============================================================ # Сборка # ============================================================ echo echo "==================================================" echo "[*] Сборка zenith-cli" echo "==================================================" su - "$USER_NAME" -c " set -eu cd '$ZENITH_DIR' chmod +x 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 установлен.' " # ============================================================ # PATH # ============================================================ echo echo "==================================================" echo "[*] PATH" echo "==================================================" 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 # ============================================================ # 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 # ============================================================ # SDDM configuration # ============================================================ echo echo "==================================================" echo "[*] Настройка SDDM" echo "==================================================" mkdir -p /etc/sddm.conf.d cat > /etc/sddm.conf.d/wayland.conf << 'EOF' [Wayland] Compositor=labwc [General] GreeterEnvironment=MOZ_ENABLE_WAYLAND=1,QT_QPA_PLATFORM=wayland,SDL_VIDEODRIVER=wayland EOF echo "[+] SDDM настроен для использования LabWC." # ============================================================ # Права # ============================================================ echo echo "==================================================" 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 # ============================================================ # Финальная проверка # ============================================================ 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 echo check_command "seatd" "seatd" check_command "LabWC" "labwc" check_command "Waybar" "waybar" check_command "PipeWire" "pipewire" check_command "WirePlumber" "wireplumber" check_command "NetworkManager" "nmcli" check_command "D-Bus" "dbus-run-session" check_command "Bash" "bash" check_command "CMake" "cmake" check_command "SDDM" "sddm" echo printf '%-25s' "OpenCV:" if apk info -e opencv-dev >/dev/null 2>&1; then echo "OK" else echo "ERROR" fi printf '%-25s' "nm-applet:" if command -v nm-applet >/dev/null 2>&1; then echo "OK" else echo "OPTIONAL / SKIPPED" fi printf '%-25s' "zenith-cli:" if [ -x "$LOCAL_BIN/zenith-cli" ]; then echo "OK" else echo "ERROR" fi echo echo "==================================================" echo " УСТАНОВКА ЗАВЕРШЕНА" echo "==================================================" echo echo "[+] Пользователь: $USER_NAME" echo "[+] LabWC установлен." echo "[+] NetworkManager установлен." echo "[+] seatd установлен." echo "[+] PipeWire установлен." echo "[+] SDDM установлен." echo "[+] zenith-cli установлен." echo echo "[!] network-manager-applet не является обязательным." echo "[!] Если его нет — NetworkManager всё равно работает." echo echo "[!] Перезагрузка:" echo echo " reboot" echo echo "После перезагрузки:" echo echo " 1. SDDM запустится автоматически" echo " 2. Выберите пользователя: $USER_NAME" echo " 3. Введите пароль" echo " 4. Сессия LabWC (Wayland) запустится" echo " 5. Waybar" echo " 6. Mako" echo " 7. PipeWire / WirePlumber" echo " 8. NetworkManager" echo echo "zenith-cli:" echo echo " zenith-cli" echo echo "=================================================="