diff --git a/alpine_install.sh b/alpine_install.sh index 5a3431a..474bda0 100644 --- a/alpine_install.sh +++ b/alpine_install.sh @@ -1,7 +1,7 @@ #!/bin/sh # ============================================================ # LabWC Alpine Setup Script -# Version 8 +# Version 9 # # Запуск: # @@ -13,6 +13,12 @@ # - от обычного пользователя # # Если запущено не от root, скрипт автоматически использует sudo. +# +# ВАЖНО: +# - mesa-dri НЕ используется +# - networkmanager-applet НЕ является обязательным +# - xdg-desktop-portal-gtk НЕ является обязательным +# - seatd != группа seat # ============================================================ set -eu @@ -30,10 +36,21 @@ 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 "$0" in + /*) + SCRIPT_PATH="$0" + ;; + *) + SCRIPT_PATH="$(pwd)/$0" + ;; +esac # ============================================================ -# 1. Проверка имени пользователя +# 2. Проверка имени пользователя # ============================================================ case "$USER_NAME" in @@ -44,85 +61,189 @@ case "$USER_NAME" in esac # ============================================================ -# 2. Автоматический переход в root -# -# Если скрипт запущен от ivan: -# -# ./setup.sh -# -# он сам выполнит: -# -# sudo ./setup.sh -# +# 3. Автоматический переход в root # ============================================================ if [ "$(id -u)" -ne 0 ]; then + echo echo "==================================================" - echo "[*] Скрипт запущен от пользователя: $(id -un)" + echo "[*] Скрипт запущен от: $(id -un)" echo "[*] Требуются root-права." echo "==================================================" + echo if ! command -v sudo >/dev/null 2>&1; then - echo + echo "[!] sudo не установлен." echo echo "[!] Один раз выполните от root:" echo echo " apk add sudo" echo + echo "[!] После этого снова:" + echo + echo " ./setup.sh" + echo + exit 1 fi echo "[*] Перезапуск через sudo..." + echo exec sudo "$SCRIPT_PATH" "$@" fi # ============================================================ -# 3. Root +# 4. Root # ============================================================ echo echo "==================================================" -echo "[*] LabWC Alpine Setup" +echo " LabWC Alpine Setup - Version 9" echo "==================================================" +echo echo "[*] Root: OK" echo "[*] User: $USER_NAME" echo "[*] Home: $HOME_DIR" -echo "==================================================" echo # ============================================================ -# 4. Проверка repositories +# 5. Проверка Alpine +# ============================================================ + +if [ ! -f /etc/alpine-release ]; then + + echo "[!] Это не похоже на Alpine Linux." + echo "[!] /etc/alpine-release не найден." + + exit 1 + +fi + +ALPINE_VERSION="$(cat /etc/alpine-release)" + +echo "[*] Alpine: $ALPINE_VERSION" + +# ============================================================ +# 6. Проверка repositories # ============================================================ if [ ! -f /etc/apk/repositories ]; then + echo "[!] /etc/apk/repositories не найден." + exit 1 + fi +echo +echo "[*] Проверка repositories..." + # ============================================================ -# 5. Функции +# 7. Функции # ============================================================ +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 "[!!!] Пакет '$PACKAGE' отсутствует." + echo + echo "[!] Alpine: $ALPINE_VERSION" + 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 "[+] $PACKAGE уже установлен." + + return 0 + + fi + + if package_exists "$PACKAGE"; then + + apk add "$PACKAGE" + + echo "[+] $PACKAGE установлен." + + else + + echo "[!] $PACKAGE отсутствует в текущих репозиториях." + echo "[!] Пропуск." + + fi +} + + add_user_group() { GROUP_NAME="$1" if ! getent group "$GROUP_NAME" >/dev/null 2>&1; then + echo "[!] Группа '$GROUP_NAME' отсутствует." + echo "[!] Пропуск." + return 0 + fi if id -nG "$USER_NAME" 2>/dev/null | tr ' ' '\n' | grep -qx "$GROUP_NAME" then - echo "[+] $USER_NAME уже в группе $GROUP_NAME." + + echo "[+] $USER_NAME уже состоит в группе $GROUP_NAME." + else + echo "[*] Добавление $USER_NAME в группу $GROUP_NAME..." + addgroup "$USER_NAME" "$GROUP_NAME" + + echo "[+] $USER_NAME добавлен в $GROUP_NAME." + fi } @@ -130,44 +251,64 @@ add_user_group() { enable_service() { SERVICE="$1" - echo "[*] Настройка службы $SERVICE..." + echo + echo "[*] Настройка службы: $SERVICE" + + if ! command -v rc-service >/dev/null 2>&1; then + + echo "[!] rc-service отсутствует." + echo "[!] Пропуск." + + 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 + + rc-service "$SERVICE" start 2>/dev/null || { + echo "[!] Не удалось запустить $SERVICE сейчас." + echo "[!] Продолжаем." + } + fi - rc-update add "$SERVICE" default 2>/dev/null || true + rc-update add "$SERVICE" default 2>/dev/null || { + + echo "[!] Не удалось добавить $SERVICE в default." + echo "[!] Продолжаем." + + } + } -package_exists() { - PACKAGE="$1" +check_command() { + NAME="$1" + COMMAND="$2" - apk search -x "$PACKAGE" 2>/dev/null | - grep -qx "$PACKAGE" -} + printf '%-25s' "$NAME:" - -install_optional() { - PACKAGE="$1" - - if package_exists "$PACKAGE"; then - echo "[*] Установка дополнительного пакета: $PACKAGE" - apk add "$PACKAGE" + if command -v "$COMMAND" >/dev/null 2>&1; then + echo "OK" else - echo "[!] Дополнительный пакет $PACKAGE отсутствует." - echo "[!] Пропуск." + echo "ERROR" fi } # ============================================================ -# 6. Community +# 8. Community # ============================================================ -echo "[*] Проверка community..." +echo +echo "==================================================" +echo "[*] Проверка community" +echo "==================================================" if grep -qE '^[[:space:]]*[^#[:space:]].*/community/?[[:space:]]*$' \ /etc/apk/repositories @@ -185,652 +326,56 @@ then 's|^[[:space:]]*#\(.*\/community/?[[:space:]]*\)$|\1|' \ /etc/apk/repositories + echo "[+] community включён." + else echo "[!] Репозиторий community не найден." echo - echo "Проверьте:" + echo "[!] Текущий /etc/apk/repositories:" echo - echo " cat /etc/apk/repositories" + cat /etc/apk/repositories echo + exit 1 fi # ============================================================ -# 7. APK update +# 9. APK update # ============================================================ echo -echo "[*] Обновление индексов APK..." +echo "==================================================" +echo "[*] Обновление APK" +echo "==================================================" 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. Финальная проверка +# 10. Базовые инструменты # ============================================================ echo echo "==================================================" -echo "[*] ФИНАЛЬНАЯ ПРОВЕРКА" +echo "[*] Базовые инструменты" echo "==================================================" -echo -echo "[*] Пользователь:" -id "$USER_NAME" +install_required sudo +install_required nano +install_required git +install_required bash +install_required build-base -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 +# ============================================================ +# 11. Пользователь +# ============================================================ 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 "[*] Пользователь $USER_NAME" echo "==================================================" + +if id "$USER_NAME" >/dev/null 2>&1 then + : +fi