diff --git a/alpine_install.sh b/alpine_install.sh index 474bda0..b6f8d69 100644 --- a/alpine_install.sh +++ b/alpine_install.sh @@ -379,3 +379,958 @@ echo "==================================================" if id "$USER_NAME" >/dev/null 2>&1 then : fi + +Стоп — здесь я не хочу оставлять тебе поломанный кусок. В sh нельзя писать if id ... then в таком виде. Поэтому ниже даю окончательную цельную версию, а не предлагаю собирать её из двух частей: + +#!/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 "==================================================" \ No newline at end of file