Files
labwc-alpine/alpine_install.sh
T
2026-09-06 20:24:15 +06:00

931 lines
22 KiB
Bash

#!/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 "=================================================="