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

837 lines
18 KiB
Bash

#!/bin/sh
# ============================================================
# LabWC Alpine Setup Script
# Version 8
#
# Запуск:
#
# ./setup.sh
# ./setup.sh ivan
#
# Можно запускать:
# - от root
# - от обычного пользователя
#
# Если запущено не от root, скрипт автоматически использует sudo.
# ============================================================
set -eu
# ============================================================
# 0. Параметры
# ============================================================
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"
SCRIPT_PATH="$0"
# ============================================================
# 1. Проверка имени пользователя
# ============================================================
case "$USER_NAME" in
""|*[!a-zA-Z0-9_-]*)
echo "[!] Некорректное имя пользователя: $USER_NAME"
exit 1
;;
esac
# ============================================================
# 2. Автоматический переход в root
#
# Если скрипт запущен от ivan:
#
# ./setup.sh
#
# он сам выполнит:
#
# sudo ./setup.sh
#
# ============================================================
if [ "$(id -u)" -ne 0 ]; then
echo "=================================================="
echo "[*] Скрипт запущен от пользователя: $(id -un)"
echo "[*] Требуются root-права."
echo "=================================================="
if ! command -v sudo >/dev/null 2>&1; then
echo
echo "[!] sudo не установлен."
echo
echo "[!] Один раз выполните от root:"
echo
echo " apk add sudo"
echo
exit 1
fi
echo "[*] Перезапуск через sudo..."
exec sudo "$SCRIPT_PATH" "$@"
fi
# ============================================================
# 3. Root
# ============================================================
echo
echo "=================================================="
echo "[*] LabWC Alpine Setup"
echo "=================================================="
echo "[*] Root: OK"
echo "[*] User: $USER_NAME"
echo "[*] Home: $HOME_DIR"
echo "=================================================="
echo
# ============================================================
# 4. Проверка repositories
# ============================================================
if [ ! -f /etc/apk/repositories ]; then
echo "[!] /etc/apk/repositories не найден."
exit 1
fi
# ============================================================
# 5. Функции
# ============================================================
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 "[*] Настройка службы $SERVICE..."
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
}
package_exists() {
PACKAGE="$1"
apk search -x "$PACKAGE" 2>/dev/null |
grep -qx "$PACKAGE"
}
install_optional() {
PACKAGE="$1"
if package_exists "$PACKAGE"; then
echo "[*] Установка дополнительного пакета: $PACKAGE"
apk add "$PACKAGE"
else
echo "[!] Дополнительный пакет $PACKAGE отсутствует."
echo "[!] Пропуск."
fi
}
# ============================================================
# 6. Community
# ============================================================
echo "[*] Проверка community..."
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
echo "Проверьте:"
echo
echo " cat /etc/apk/repositories"
echo
exit 1
fi
# ============================================================
# 7. APK update
# ============================================================
echo
echo "[*] Обновление индексов APK..."
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. Финальная проверка
# ============================================================
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
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
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 "=================================================="