2026-09-06 02:04:47 +06:00
#!/bin/sh
2026-09-06 14:24:56 +06:00
# ============================================================
2026-09-06 02:04:47 +06:00
# LabWC Alpine Setup Script
2026-09-06 14:29:46 +06:00
# Version 9
2026-09-06 02:04:47 +06:00
#
2026-09-06 14:24:56 +06:00
# Запуск:
2026-09-06 02:04:47 +06:00
#
# ./setup.sh
2026-09-06 14:24:56 +06:00
# ./setup.sh ivan
2026-09-06 02:04:47 +06:00
#
2026-09-06 14:24:56 +06:00
# Можно запускать:
# - от root
# - от обычного пользователя
2026-09-06 02:04:47 +06:00
#
2026-09-06 14:24:56 +06:00
# Если запущено не от root, скрипт автоматически использует sudo.
2026-09-06 14:29:46 +06:00
#
# ВАЖНО:
# - mesa-dri НЕ используется
# - networkmanager-applet НЕ является обязательным
# - xdg-desktop-portal-gtk НЕ является обязательным
# - seatd != группа seat
2026-09-06 14:24:56 +06:00
# ============================================================
2026-09-06 02:04:47 +06:00
set -eu
2026-09-06 14:24:56 +06:00
# ============================================================
# 0. Параметры
# ============================================================
2026-09-06 02:04:47 +06:00
USER_NAME = " ${ 1 :- ivan } "
2026-09-06 14:24:56 +06:00
2026-09-06 02:04:47 +06:00
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 "
2026-09-06 14:29:46 +06:00
# ============================================================
# 1. Определяем абсолютный путь к самому скрипту
# ============================================================
case " $0 " in
/*)
SCRIPT_PATH = " $0 "
; ;
*)
SCRIPT_PATH = " $( pwd ) / $0 "
; ;
esac
2026-09-06 02:04:47 +06:00
2026-09-06 14:24:56 +06:00
# ============================================================
2026-09-06 14:29:46 +06:00
# 2. Проверка имени пользователя
2026-09-06 14:24:56 +06:00
# ============================================================
2026-09-06 02:04:47 +06:00
case " $USER_NAME " in
"" | *[ !a-zA-Z0-9_-] *)
echo " [!] Некорректное имя пользователя: $USER_NAME "
exit 1
; ;
esac
2026-09-06 14:24:56 +06:00
# ============================================================
2026-09-06 14:29:46 +06:00
# 3. Автоматический переход в root
2026-09-06 14:24:56 +06:00
# ============================================================
if [ " $( id -u) " -ne 0 ] ; then
2026-09-06 14:29:46 +06:00
echo
2026-09-06 14:24:56 +06:00
echo "=================================================="
2026-09-06 14:29:46 +06:00
echo " [*] Скрипт запущен от: $( id -un) "
2026-09-06 14:24:56 +06:00
echo "[*] Требуются root-права."
echo "=================================================="
2026-09-06 14:29:46 +06:00
echo
2026-09-06 14:24:56 +06:00
if ! command -v sudo >/dev/null 2>& 1; then
2026-09-06 14:29:46 +06:00
2026-09-06 14:24:56 +06:00
echo "[!] sudo не установлен."
echo
echo "[!] Один раз выполните от root:"
echo
echo " apk add sudo"
echo
2026-09-06 14:29:46 +06:00
echo "[!] После этого снова:"
echo
echo " ./setup.sh"
echo
2026-09-06 14:24:56 +06:00
exit 1
fi
echo "[*] Перезапуск через sudo..."
2026-09-06 14:29:46 +06:00
echo
2026-09-06 14:24:56 +06:00
exec sudo " $SCRIPT_PATH " " $@ "
fi
# ============================================================
2026-09-06 14:29:46 +06:00
# 4. Root
2026-09-06 14:24:56 +06:00
# ============================================================
echo
echo "=================================================="
2026-09-06 14:29:46 +06:00
echo " LabWC Alpine Setup - Version 9"
2026-09-06 14:24:56 +06:00
echo "=================================================="
2026-09-06 14:29:46 +06:00
echo
2026-09-06 14:24:56 +06:00
echo "[*] Root: OK"
echo " [*] User: $USER_NAME "
echo " [*] Home: $HOME_DIR "
echo
# ============================================================
2026-09-06 14:29:46 +06:00
# 5. Проверка Alpine
2026-09-06 14:24:56 +06:00
# ============================================================
2026-09-06 02:04:47 +06:00
2026-09-06 14:29:46 +06:00
if [ ! -f /etc/alpine-release ] ; then
2026-09-06 02:04:47 +06:00
2026-09-06 14:29:46 +06:00
echo "[!] Это не похоже на Alpine Linux."
echo "[!] /etc/alpine-release не найден."
2026-09-06 02:04:47 +06:00
2026-09-06 14:24:56 +06:00
exit 1
2026-09-06 02:04:47 +06:00
fi
2026-09-06 14:29:46 +06:00
ALPINE_VERSION = " $( cat /etc/alpine-release) "
2026-09-06 02:04:47 +06:00
2026-09-06 14:29:46 +06:00
echo " [*] Alpine: $ALPINE_VERSION "
2026-09-06 02:04:47 +06:00
2026-09-06 14:24:56 +06:00
# ============================================================
2026-09-06 14:29:46 +06:00
# 6. Проверка repositories
2026-09-06 14:24:56 +06:00
# ============================================================
2026-09-06 02:04:47 +06:00
2026-09-06 14:29:46 +06:00
if [ ! -f /etc/apk/repositories ] ; then
2026-09-06 02:04:47 +06:00
2026-09-06 14:29:46 +06:00
echo "[!] /etc/apk/repositories не найден."
2026-09-06 02:04:47 +06:00
2026-09-06 14:29:46 +06:00
exit 1
2026-09-06 02:04:47 +06:00
fi
2026-09-06 14:24:56 +06:00
echo
2026-09-06 14:29:46 +06:00
echo "[*] Проверка repositories..."
2026-09-06 14:21:26 +06:00
2026-09-06 14:24:56 +06:00
# ============================================================
2026-09-06 14:29:46 +06:00
# 7. Функции
2026-09-06 14:24:56 +06:00
# ============================================================
2026-09-06 02:04:47 +06:00
2026-09-06 14:29:46 +06:00
package_exists( ) {
PACKAGE = " $1 "
2026-09-06 02:04:47 +06:00
2026-09-06 14:29:46 +06:00
apk search -x " $PACKAGE " 2>/dev/null |
grep -Eq " ^ ${ PACKAGE } (-[0-9].*)? $"
}
2026-09-06 02:04:47 +06:00
2026-09-06 14:29:46 +06:00
install_required( ) {
PACKAGE = " $1 "
2026-09-06 02:04:47 +06:00
2026-09-06 14:29:46 +06:00
echo
echo " [*] Обязательный пакет: $PACKAGE "
2026-09-06 02:04:47 +06:00
2026-09-06 14:29:46 +06:00
if apk info -e " $PACKAGE " >/dev/null 2>& 1; then
2026-09-06 02:04:47 +06:00
2026-09-06 14:29:46 +06:00
echo " [+] $PACKAGE уже установлен. "
2026-09-06 02:04:47 +06:00
2026-09-06 14:29:46 +06:00
return 0
2026-09-06 02:04:47 +06:00
fi
2026-09-06 14:24:56 +06:00
2026-09-06 14:29:46 +06:00
if ! package_exists " $PACKAGE " ; then
2026-09-06 14:21:26 +06:00
2026-09-06 14:29:46 +06:00
echo
echo "[!!!] ОШИБКА"
echo " [!!!] Пакет ' $PACKAGE ' отсутствует. "
echo
echo " [!] Alpine: $ALPINE_VERSION "
echo
echo "[!] Репозитории:"
cat /etc/apk/repositories
echo
2026-09-06 14:21:26 +06:00
2026-09-06 14:29:46 +06:00
exit 1
2026-09-06 14:21:26 +06:00
2026-09-06 14:29:46 +06:00
fi
2026-09-06 02:04:47 +06:00
2026-09-06 14:29:46 +06:00
apk add " $PACKAGE "
}
2026-09-06 02:04:47 +06:00
2026-09-06 14:29:46 +06:00
install_optional( ) {
PACKAGE = " $1 "
2026-09-06 02:04:47 +06:00
2026-09-06 14:29:46 +06:00
echo
echo " [*] Необязательный пакет: $PACKAGE "
2026-09-06 02:04:47 +06:00
2026-09-06 14:29:46 +06:00
if apk info -e " $PACKAGE " >/dev/null 2>& 1; then
2026-09-06 02:04:47 +06:00
2026-09-06 14:29:46 +06:00
echo " [+] $PACKAGE уже установлен. "
2026-09-06 02:04:47 +06:00
2026-09-06 14:29:46 +06:00
return 0
2026-09-06 02:04:47 +06:00
2026-09-06 14:24:56 +06:00
fi
2026-09-06 02:04:47 +06:00
2026-09-06 14:29:46 +06:00
if package_exists " $PACKAGE " ; then
2026-09-06 02:04:47 +06:00
2026-09-06 14:29:46 +06:00
apk add " $PACKAGE "
2026-09-06 02:04:47 +06:00
2026-09-06 14:29:46 +06:00
echo " [+] $PACKAGE установлен. "
2026-09-06 02:04:47 +06:00
2026-09-06 14:29:46 +06:00
else
2026-09-06 02:04:47 +06:00
2026-09-06 14:29:46 +06:00
echo " [!] $PACKAGE отсутствует в текущих репозиториях. "
echo "[!] Пропуск."
2026-09-06 02:04:47 +06:00
2026-09-06 14:29:46 +06:00
fi
}
2026-09-06 02:04:47 +06:00
2026-09-06 14:29:46 +06:00
add_user_group( ) {
GROUP_NAME = " $1 "
2026-09-06 02:04:47 +06:00
2026-09-06 14:29:46 +06:00
if ! getent group " $GROUP_NAME " >/dev/null 2>& 1; then
2026-09-06 02:04:47 +06:00
2026-09-06 14:29:46 +06:00
echo " [!] Группа ' $GROUP_NAME ' отсутствует. "
echo "[!] Пропуск."
2026-09-06 02:04:47 +06:00
2026-09-06 14:29:46 +06:00
return 0
2026-09-06 02:04:47 +06:00
2026-09-06 14:29:46 +06:00
fi
2026-09-06 02:04:47 +06:00
2026-09-06 14:29:46 +06:00
if id -nG " $USER_NAME " 2>/dev/null |
tr ' ' '\n' |
grep -qx " $GROUP_NAME "
then
2026-09-06 14:24:56 +06:00
2026-09-06 14:29:46 +06:00
echo " [+] $USER_NAME уже состоит в группе $GROUP_NAME . "
2026-09-06 02:04:47 +06:00
2026-09-06 14:29:46 +06:00
else
2026-09-06 02:04:47 +06:00
2026-09-06 14:29:46 +06:00
echo " [*] Добавление $USER_NAME в группу $GROUP_NAME ... "
2026-09-06 14:24:56 +06:00
2026-09-06 14:29:46 +06:00
addgroup " $USER_NAME " " $GROUP_NAME "
2026-09-06 14:24:56 +06:00
2026-09-06 14:29:46 +06:00
echo " [+] $USER_NAME добавлен в $GROUP_NAME . "
2026-09-06 02:04:47 +06:00
2026-09-06 14:29:46 +06:00
fi
}
2026-09-06 02:04:47 +06:00
2026-09-06 14:29:46 +06:00
enable_service( ) {
SERVICE = " $1 "
2026-09-06 02:04:47 +06:00
2026-09-06 14:29:46 +06:00
echo
echo " [*] Настройка службы: $SERVICE "
2026-09-06 02:04:47 +06:00
2026-09-06 14:29:46 +06:00
if ! command -v rc-service >/dev/null 2>& 1; then
2026-09-06 02:04:47 +06:00
2026-09-06 14:29:46 +06:00
echo "[!] rc-service отсутствует."
echo "[!] Пропуск."
2026-09-06 02:04:47 +06:00
2026-09-06 14:29:46 +06:00
return 0
2026-09-06 02:04:47 +06:00
fi
2026-09-06 14:29:46 +06:00
if rc-service " $SERVICE " status >/dev/null 2>& 1; then
2026-09-06 02:04:47 +06:00
2026-09-06 14:29:46 +06:00
echo " [+] $SERVICE уже запущен. "
2026-09-06 02:04:47 +06:00
2026-09-06 14:29:46 +06:00
else
2026-09-06 02:04:47 +06:00
2026-09-06 14:29:46 +06:00
echo " [*] Запуск $SERVICE ... "
2026-09-06 02:04:47 +06:00
2026-09-06 14:29:46 +06:00
rc-service " $SERVICE " start 2>/dev/null || {
echo " [!] Не удалось запустить $SERVICE сейчас. "
echo "[!] Продолжаем."
}
2026-09-06 02:04:47 +06:00
2026-09-06 14:29:46 +06:00
fi
2026-09-06 02:04:47 +06:00
2026-09-06 14:29:46 +06:00
rc-update add " $SERVICE " default 2>/dev/null || {
2026-09-06 02:04:47 +06:00
2026-09-06 14:29:46 +06:00
echo " [!] Не удалось добавить $SERVICE в default. "
echo "[!] Продолжаем."
2026-09-06 14:21:26 +06:00
2026-09-06 14:29:46 +06:00
}
2026-09-06 14:21:26 +06:00
2026-09-06 14:29:46 +06:00
}
2026-09-06 14:21:26 +06:00
2026-09-06 14:24:56 +06:00
2026-09-06 14:29:46 +06:00
check_command( ) {
NAME = " $1 "
COMMAND = " $2 "
2026-09-06 14:21:26 +06:00
2026-09-06 14:29:46 +06:00
printf '%-25s' " $NAME : "
2026-09-06 14:21:26 +06:00
2026-09-06 14:29:46 +06:00
if command -v " $COMMAND " >/dev/null 2>& 1; then
echo "OK"
else
echo "ERROR"
fi
}
2026-09-06 14:21:26 +06:00
2026-09-06 14:24:56 +06:00
# ============================================================
2026-09-06 14:29:46 +06:00
# 8. Community
2026-09-06 14:24:56 +06:00
# ============================================================
2026-09-06 02:04:47 +06:00
2026-09-06 14:24:56 +06:00
echo
2026-09-06 14:29:46 +06:00
echo "=================================================="
echo "[*] Проверка community"
echo "=================================================="
2026-09-06 02:04:47 +06:00
2026-09-06 14:29:46 +06:00
if grep -qE '^[[:space:]]*[^#[:space:]].*/community/?[[:space:]]*$' \
/etc/apk/repositories
then
2026-09-06 02:04:47 +06:00
2026-09-06 14:29:46 +06:00
echo "[+] community уже включён."
2026-09-06 02:04:47 +06:00
2026-09-06 14:29:46 +06:00
elif grep -qE '^[[:space:]]*#.*\/community/?[[:space:]]*$' \
/etc/apk/repositories
then
2026-09-06 02:04:47 +06:00
2026-09-06 14:29:46 +06:00
echo "[*] Раскомментирование community..."
2026-09-06 02:04:47 +06:00
2026-09-06 14:29:46 +06:00
sed -i \
's|^[[:space:]]*#\(.*\/community/?[[:space:]]*\)$|\1|' \
/etc/apk/repositories
2026-09-06 02:04:47 +06:00
2026-09-06 14:29:46 +06:00
echo "[+] community включён."
2026-09-06 02:04:47 +06:00
else
2026-09-06 14:29:46 +06:00
echo "[!] Репозиторий community не найден."
echo
echo "[!] Текущий /etc/apk/repositories:"
echo
cat /etc/apk/repositories
echo
exit 1
2026-09-06 02:04:47 +06:00
fi
2026-09-06 14:24:56 +06:00
# ============================================================
2026-09-06 14:29:46 +06:00
# 9. APK update
2026-09-06 14:24:56 +06:00
# ============================================================
2026-09-06 02:04:47 +06:00
2026-09-06 14:24:56 +06:00
echo
2026-09-06 14:29:46 +06:00
echo "=================================================="
echo "[*] Обновление APK"
echo "=================================================="
2026-09-06 02:04:47 +06:00
2026-09-06 14:29:46 +06:00
apk update
2026-09-06 02:04:47 +06:00
2026-09-06 14:24:56 +06:00
# ============================================================
2026-09-06 14:29:46 +06:00
# 10. Базовые инструменты
2026-09-06 14:24:56 +06:00
# ============================================================
2026-09-06 02:04:47 +06:00
2026-09-06 14:24:56 +06:00
echo
2026-09-06 14:29:46 +06:00
echo "=================================================="
echo "[*] Базовые инструменты"
echo "=================================================="
2026-09-06 02:04:47 +06:00
2026-09-06 14:29:46 +06:00
install_required sudo
install_required nano
install_required git
install_required bash
install_required build-base
2026-09-06 02:04:47 +06:00
2026-09-06 14:24:56 +06:00
# ============================================================
2026-09-06 14:29:46 +06:00
# 11. Пользователь
2026-09-06 14:24:56 +06:00
# ============================================================
2026-09-06 14:21:26 +06:00
echo
echo "=================================================="
2026-09-06 14:29:46 +06:00
echo " [*] Пользователь $USER_NAME "
2026-09-06 14:21:26 +06:00
echo "=================================================="
2026-09-06 14:29:46 +06:00
if id " $USER_NAME " >/dev/null 2>& 1 then
:
2026-09-06 02:04:47 +06:00
fi
2026-09-06 14:31:15 +06:00
Стоп — здесь я не хочу оставлять тебе поломанный кусок. В 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 "=================================================="