#!/bin/sh # ============================================================ # LabWC Alpine Setup Script # Version 9 # # Запуск: # # ./setup.sh # ./setup.sh ivan # # Можно запускать: # - от root # - от обычного пользователя # # Если запущено не от root, скрипт автоматически использует sudo. # # ВАЖНО: # - mesa-dri НЕ используется # - networkmanager-applet НЕ является обязательным # - xdg-desktop-portal-gtk НЕ является обязательным # - seatd != группа seat # ============================================================ 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" # ============================================================ # 1. Определяем абсолютный путь к самому скрипту # ============================================================ case "$0" in /*) SCRIPT_PATH="$0" ;; *) SCRIPT_PATH="$(pwd)/$0" ;; esac # ============================================================ # 2. Проверка имени пользователя # ============================================================ case "$USER_NAME" in ""|*[!a-zA-Z0-9_-]*) echo "[!] Некорректное имя пользователя: $USER_NAME" exit 1 ;; esac # ============================================================ # 3. Автоматический переход в root # ============================================================ 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 echo "[!] После этого снова:" echo echo " ./setup.sh" echo exit 1 fi echo "[*] Перезапуск через sudo..." echo exec sudo "$SCRIPT_PATH" "$@" fi # ============================================================ # 4. Root # ============================================================ echo echo "==================================================" echo " LabWC Alpine Setup - Version 9" echo "==================================================" echo echo "[*] Root: OK" echo "[*] User: $USER_NAME" echo "[*] Home: $HOME_DIR" echo # ============================================================ # 5. Проверка Alpine # ============================================================ if [ ! -f /etc/alpine-release ]; then echo "[!] Это не похоже на Alpine Linux." echo "[!] /etc/alpine-release не найден." exit 1 fi ALPINE_VERSION="$(cat /etc/alpine-release)" echo "[*] Alpine: $ALPINE_VERSION" # ============================================================ # 6. Проверка repositories # ============================================================ if [ ! -f /etc/apk/repositories ]; then echo "[!] /etc/apk/repositories не найден." exit 1 fi echo echo "[*] Проверка repositories..." # ============================================================ # 7. Функции # ============================================================ 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 "[!!!] Пакет '$PACKAGE' отсутствует." echo echo "[!] Alpine: $ALPINE_VERSION" 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 "[+] $PACKAGE уже установлен." return 0 fi if package_exists "$PACKAGE"; then apk add "$PACKAGE" echo "[+] $PACKAGE установлен." else echo "[!] $PACKAGE отсутствует в текущих репозиториях." echo "[!] Пропуск." fi } add_user_group() { GROUP_NAME="$1" if ! getent group "$GROUP_NAME" >/dev/null 2>&1; then echo "[!] Группа '$GROUP_NAME' отсутствует." echo "[!] Пропуск." 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" echo "[+] $USER_NAME добавлен в $GROUP_NAME." fi } enable_service() { SERVICE="$1" echo echo "[*] Настройка службы: $SERVICE" if ! command -v rc-service >/dev/null 2>&1; then echo "[!] rc-service отсутствует." echo "[!] Пропуск." 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 || { echo "[!] Не удалось запустить $SERVICE сейчас." echo "[!] Продолжаем." } fi rc-update add "$SERVICE" default 2>/dev/null || { echo "[!] Не удалось добавить $SERVICE в default." echo "[!] Продолжаем." } } check_command() { NAME="$1" COMMAND="$2" printf '%-25s' "$NAME:" if command -v "$COMMAND" >/dev/null 2>&1; then echo "OK" else echo "ERROR" fi } # ============================================================ # 8. 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 echo "[+] community включён." else echo "[!] Репозиторий community не найден." echo echo "[!] Текущий /etc/apk/repositories:" echo cat /etc/apk/repositories echo exit 1 fi # ============================================================ # 9. APK update # ============================================================ echo echo "==================================================" echo "[*] Обновление APK" echo "==================================================" apk update # ============================================================ # 10. Базовые инструменты # ============================================================ echo echo "==================================================" echo "[*] Базовые инструменты" echo "==================================================" install_required sudo install_required nano install_required git install_required bash install_required build-base # ============================================================ # 11. Пользователь # ============================================================ echo echo "==================================================" echo "[*] Пользователь $USER_NAME" echo "==================================================" if id "$USER_NAME" >/dev/null 2>&1 then : fi