Files
labwc-alpine/alpine_install.sh
T
2026-09-06 02:04:47 +06:00

675 lines
16 KiB
Bash

#!/bin/sh
# LabWC Alpine Setup Script
# Version 5
#
# Запускать от имени root!
#
# Использование:
# ./setup.sh
# ./setup.sh username
#
# Скрипт устанавливает:
# - LabWC + Wayland
# - Waybar / Mako / Wofi
# - PipeWire + WirePlumber
# - NetworkManager
# - Firefox
# - zenith-cli
# - автоматический вход на tty1
# - автоматический запуск LabWC
#
# ВАЖНО:
# zenith-cli использует build.sh на Bash,
# поэтому bash устанавливается явно.
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"
echo "=================================================="
echo "[*] LabWC Alpine Setup"
echo "=================================================="
echo "[*] Пользователь: $USER_NAME"
echo "[*] Домашний каталог: $HOME_DIR"
echo "=================================================="
# --------------------------------------------------
# 1. Проверка root
# --------------------------------------------------
if [ "$(id -u)" -ne 0 ]; then
echo "[!] Этот скрипт необходимо запускать от root."
exit 1
fi
# --------------------------------------------------
# 2. Проверка имени пользователя
# --------------------------------------------------
case "$USER_NAME" in
""|*[!a-zA-Z0-9_-]*)
echo "[!] Некорректное имя пользователя: $USER_NAME"
exit 1
;;
esac
# --------------------------------------------------
# 3. Проверка существования /etc/apk/repositories
# --------------------------------------------------
if [ ! -f /etc/apk/repositories ]; then
echo "[!] Файл /etc/apk/repositories не найден."
exit 1
fi
# --------------------------------------------------
# 4. Вспомогательные функции
# --------------------------------------------------
add_user_group() {
GROUP_NAME="$1"
if groups "$USER_NAME" 2>/dev/null | grep -qw "$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..."
rc-update add "$SERVICE" default 2>/dev/null || true
if rc-service "$SERVICE" status >/dev/null 2>&1; then
echo "[+] $SERVICE уже запущен."
else
echo "[*] Запуск $SERVICE..."
rc-service "$SERVICE" start 2>/dev/null || true
fi
}
# --------------------------------------------------
# 5. Репозитории
# --------------------------------------------------
echo "[*] Проверка репозитория community..."
if ! grep -qE '^[[:space:]]*[^#[:space:]].*/community/?[[:space:]]*$' \
/etc/apk/repositories
then
if 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 "[!] Добавьте community в /etc/apk/repositories."
exit 1
fi
fi
echo "[*] Обновление индекса пакетов..."
apk update
# --------------------------------------------------
# 6. Базовые инструменты
# --------------------------------------------------
echo "[*] Установка базовых инструментов..."
apk add \
sudo \
nano \
git \
bash \
build-base
# --------------------------------------------------
# 7. Пользователь
# --------------------------------------------------
echo "[*] Настройка пользователя $USER_NAME..."
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"
echo
fi
# --------------------------------------------------
# 8. Группы
# --------------------------------------------------
echo "[*] Настройка групп пользователя..."
add_user_group wheel
add_user_group seat
# При использовании seatd отдельные группы video/input
# обычно не требуются.
#
# При необходимости их можно добавить:
#
# add_user_group video
# add_user_group input
# --------------------------------------------------
# 9. Sudo
# --------------------------------------------------
echo "[*] Настройка sudo..."
if [ -d /etc/sudoers.d ] &&
grep -qE '^[[:space:]]*#?[[:space:]]*includedir[[:space:]]+/etc/sudoers\.d' \
/etc/sudoers
then
echo "[+] Используется /etc/sudoers.d."
cat > /etc/sudoers.d/wheel << 'EOF'
%wheel ALL=(ALL) ALL
EOF
chmod 440 /etc/sudoers.d/wheel
else
echo "[*] sudoers.d не подключен."
if grep -qE '^%wheel[[:space:]]+ALL=\(ALL\)[[:space:]]+ALL' \
/etc/sudoers
then
echo "[+] Правило wheel уже существует."
elif grep -qE '^#[[:space:]]*%wheel[[:space:]]+ALL=\(ALL\)[[:space:]]+ALL' \
/etc/sudoers
then
sed -i \
's/^#[[:space:]]*\(%wheel[[:space:]]*ALL=(ALL)[[:space:]]*ALL\)/\1/' \
/etc/sudoers
else
echo '%wheel ALL=(ALL) ALL' >> /etc/sudoers
fi
fi
# --------------------------------------------------
# 10. Wayland / LabWC
# --------------------------------------------------
echo "[*] Установка Wayland и системных компонентов..."
apk add \
mesa \
mesa-dri \
libinput \
seatd \
dbus \
polkit
# --------------------------------------------------
# 11. Зависимости zenith-cli
# --------------------------------------------------
echo "[*] Установка зависимостей zenith-cli..."
# zenith-cli:
#
# Bash -> build.sh
# C/C++ -> build-base
# CMake -> cmake
# libcurl -> curl-dev
# OpenCV -> opencv-dev
#
# CMakeLists.txt использует:
#
# find_package(CURL REQUIRED)
# find_package(OpenCV REQUIRED)
apk add \
cmake \
curl-dev \
opencv-dev
# --------------------------------------------------
# 12. Desktop environment
# --------------------------------------------------
echo "[*] Установка рабочего окружения..."
apk add \
labwc \
alacritty \
waybar \
mako \
swaybg \
wofi \
font-noto \
font-dejavu \
wl-clipboard \
xdg-desktop-portal \
xdg-desktop-portal-gtk \
pipewire \
wireplumber \
alsa-utils \
networkmanager \
networkmanager-applet \
pcmanfm \
firefox \
swaylock
# --------------------------------------------------
# 13. OpenRC
# --------------------------------------------------
echo "[*] Настройка системных служб..."
enable_service seatd
enable_service dbus
enable_service networkmanager
# --------------------------------------------------
# 14. Конфигурация LabWC
# --------------------------------------------------
echo "[*] Создание конфигурации LabWC..."
mkdir -p "$HOME_DIR/.config/labwc"
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
EOF
cat > "$HOME_DIR/.config/labwc/autostart" << 'EOF'
#!/bin/sh
# --------------------------------------------------
# NetworkManager applet
# --------------------------------------------------
nm-applet &
# --------------------------------------------------
# Waybar
# --------------------------------------------------
waybar &
# --------------------------------------------------
# Notification daemon
# --------------------------------------------------
mako &
# --------------------------------------------------
# PipeWire
# --------------------------------------------------
if ! pgrep -x pipewire >/dev/null 2>&1; then
pipewire &
fi
# --------------------------------------------------
# WirePlumber
# --------------------------------------------------
if ! pgrep -x wireplumber >/dev/null 2>&1; then
wireplumber &
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"
# --------------------------------------------------
# 15. zenith-cli
# --------------------------------------------------
echo "[*] Установка zenith-cli..."
if [ -d "$ZENITH_DIR/.git" ]; then
echo "[*] Репозиторий zenith-cli уже существует."
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
# --------------------------------------------------
# 16. Проверка build.sh
# --------------------------------------------------
echo "[*] Проверка build.sh..."
if [ ! -f "$ZENITH_DIR/build.sh" ]; then
echo "[!] build.sh не найден:"
echo " $ZENITH_DIR/build.sh"
exit 1
fi
# --------------------------------------------------
# 17. Проверка CMakeLists.txt
# --------------------------------------------------
echo "[*] Проверка CMakeLists.txt..."
if [ ! -f "$ZENITH_DIR/CMakeLists.txt" ]; then
echo "[!] CMakeLists.txt не найден:"
echo " $ZENITH_DIR/CMakeLists.txt"
exit 1
fi
# --------------------------------------------------
# 18. Сборка zenith-cli
# --------------------------------------------------
echo "[*] Сборка zenith-cli..."
su - "$USER_NAME" -c "
set -eu
cd '$ZENITH_DIR'
chmod +x build.sh
echo '[*] Запуск build.sh...'
./build.sh
echo '[*] Проверка результата сборки...'
if [ ! -f './zenith-cli' ]; then
echo '[!] ./zenith-cli не найден после сборки.'
exit 1
fi
if [ ! -x './zenith-cli' ]; then
chmod +x './zenith-cli'
fi
mkdir -p '$LOCAL_BIN'
cp './zenith-cli' '$LOCAL_BIN/zenith-cli'
chmod +x '$LOCAL_BIN/zenith-cli'
echo '[+] zenith-cli успешно собран.'
echo '[+] Установлен в: $LOCAL_BIN/zenith-cli'
"
# --------------------------------------------------
# 19. Проверка бинарника zenith-cli
# --------------------------------------------------
echo "[*] Проверка zenith-cli..."
if [ ! -x "$LOCAL_BIN/zenith-cli" ]; then
echo "[!] Бинарник zenith-cli не установлен."
exit 1
fi
# --------------------------------------------------
# 20. PATH
# --------------------------------------------------
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
# --------------------------------------------------
# 21. Автологин tty1
# --------------------------------------------------
echo "[*] Настройка автоматического входа..."
if [ -f /etc/inittab ]; then
if [ ! -f /etc/inittab.bak ]; then
echo "[*] Создание резервной копии /etc/inittab..."
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..."
echo \
"tty1::respawn:/sbin/getty -a $USER_NAME 38400 tty1" \
>> /etc/inittab
fi
else
echo "[!] /etc/inittab не найден."
echo "[!] Автологин не настроен."
fi
# --------------------------------------------------
# 22. Автозапуск LabWC
# --------------------------------------------------
echo "[*] Настройка запуска LabWC..."
if ! grep -qF '# LABWC-AUTOSTART' "$PROFILE"; then
cat >> "$PROFILE" << 'EOF'
# LABWC-AUTOSTART
#
# Запуск LabWC только на tty1.
#
# dbus-run-session создаёт отдельную D-Bus session bus
# для графической сессии.
#
if [ "$(tty 2>/dev/null)" = "/dev/tty1" ] &&
[ -z "${WAYLAND_DISPLAY:-}" ]; then
exec dbus-run-session -- labwc
fi
EOF
fi
# --------------------------------------------------
# 23. Права
# --------------------------------------------------
echo "[*] Настройка владельцев файлов..."
chown -R "$USER_NAME:$USER_NAME" "$HOME_DIR/.config"
chown "$USER_NAME:$USER_NAME" "$PROFILE"
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
# --------------------------------------------------
# 24. Финальная проверка
# --------------------------------------------------
echo
echo "=================================================="
echo "[*] Финальная проверка"
echo "=================================================="
printf '%-20s' "LabWC:"
if command -v labwc >/dev/null 2>&1; then
echo "OK"
else
echo "ERROR"
fi
printf '%-20s' "Waybar:"
if command -v waybar >/dev/null 2>&1; then
echo "OK"
else
echo "ERROR"
fi
printf '%-20s' "PipeWire:"
if command -v pipewire >/dev/null 2>&1; then
echo "OK"
else
echo "ERROR"
fi
printf '%-20s' "WirePlumber:"
if command -v wireplumber >/dev/null 2>&1; then
echo "OK"
else
echo "ERROR"
fi
printf '%-20s' "NetworkManager:"
if command -v nmcli >/dev/null 2>&1; then
echo "OK"
else
echo "ERROR"
fi
printf '%-20s' "D-Bus session:"
if command -v dbus-run-session >/dev/null 2>&1; then
echo "OK"
else
echo "ERROR"
fi
printf '%-20s' "Bash:"
if command -v bash >/dev/null 2>&1; then
echo "OK"
else
echo "ERROR"
fi
printf '%-20s' "CMake:"
if command -v cmake >/dev/null 2>&1; then
echo "OK"
else
echo "ERROR"
fi
printf '%-20s' "OpenCV:"
if apk info -e opencv-dev >/dev/null 2>&1; then
echo "OK"
else
echo "ERROR"
fi
printf '%-20s' "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 "После перезагрузки:"
echo
echo " 1. $USER_NAME будет автоматически авторизован на tty1."
echo " 2. LabWC запустится через dbus-run-session."
echo " 3. Waybar, Mako и NetworkManager applet запустятся автоматически."
echo " 4. PipeWire и WirePlumber будут запущены в пользовательской сессии."
echo " 5. zenith-cli будет доступен как:"
echo
echo " zenith-cli"
echo
echo "=================================================="