#!/bin/sh # ============================================================ # LabWC Alpine Setup Script # Version 10 # # Запуск: # # ./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 "$SCRIPT_PATH" "$@" fi # ============================================================ # Информация # ============================================================ echo echo "==================================================" echo " LabWC Alpine Setup Script v10" 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 отсутствует." 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 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." passwd "$USER_NAME" 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 # ============================================================ # Необязательные пакеты # ============================================================ 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 # ============================================================ # 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 # ============================================================ if command -v swaybg >/dev/null 2>&1 && [ -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" # ============================================================ # 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 --ff-only " 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 # ============================================================ # Автологин tty1 # ============================================================ echo echo "==================================================" echo "[*] Автологин tty1" echo "==================================================" 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 # ============================================================ # Автозапуск LabWC # ============================================================ echo echo "==================================================" echo "[*] Автозапуск LabWC" echo "==================================================" 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 # ============================================================ # Права # ============================================================ 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" 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 "[+] zenith-cli установлен." echo echo "[!] network-manager-applet не является обязательным." echo "[!] Если его нет — NetworkManager всё равно работает." echo echo "[!] Перезагрузка:" echo echo " reboot" echo echo "После перезагрузки:" echo echo " 1. Автоматический вход $USER_NAME" echo " 2. Запуск LabWC" echo " 3. Waybar" echo " 4. Mako" echo " 5. PipeWire / WirePlumber" echo " 6. NetworkManager" echo echo "zenith-cli:" echo echo " zenith-cli" echo echo "=================================================="