#!/bin/sh # ============================================================================= # Labwc Installer for Alpine Linux (KVM/QEMU) # ============================================================================= # Запускать от root: sh install_labwc.sh [username] # Если username не указан — используется текущий не-root пользователь # ============================================================================= set -e # --- Цвета --- RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # No Color info() { printf "${BLUE}[INFO]${NC} %s\n" "$1"; } ok() { printf "${GREEN}[OK]${NC} %s\n" "$1"; } warn() { printf "${YELLOW}[WARN]${NC} %s\n" "$1"; } error() { printf "${RED}[ERROR]${NC} %s\n" "$1"; } # --- Проверка root --- if [ "$(id -u)" -ne 0 ]; then error "Этот скрипт нужно запускать от root (su или sudo)" exit 1 fi # --- Определение пользователя --- if [ -n "$1" ]; then TARGET_USER="$1" else # Ищем первого не-root пользователя с домашней директорией TARGET_USER=$(awk -F: '$3 >= 1000 && $3 < 65534 {print $1; exit}' /etc/passwd) if [ -z "$TARGET_USER" ]; then error "Не найден обычный пользователь. Создайте пользователя: adduser username" error "Или запустите: sh $0 username" exit 1 fi fi if ! id "$TARGET_USER" >/dev/null 2>&1; then error "Пользователь '$TARGET_USER' не существует" exit 1 fi USER_UID=$(id -u "$TARGET_USER") USER_GID=$(id -g "$TARGET_USER") USER_HOME=$(getent passwd "$TARGET_USER" | cut -d: -f6) info "Целевой пользователь: $TARGET_USER (uid=$USER_UID, home=$USER_HOME)" # --- Добавление community репозитория --- info "Настройка репозиториев..." ALPINE_VERSION=$(cat /etc/alpine-release | cut -d'.' -f1,2) COMMUNITY_URL="https://dl-cdn.alpinelinux.org/alpine/v${ALPINE_VERSION}/community" if ! grep -q "$COMMUNITY_URL" /etc/apk/repositories 2>/dev/null; then echo "$COMMUNITY_URL" >> /etc/apk/repositories ok "Добавлен community репозиторий" else ok "Community репозиторий уже настроен" fi apk update # --- Установка пакетов --- info "Установка labwc и зависимостей..." PACKAGES=" labwc wlroots seatd seatd-launch elogind polkit-elogind wayland-utils wayland-protocols mesa-dri-gallium mesa-va-gallium libseat xf86-video-qxl xf86-video-virtio xwayland foot waybar wofi swaybg swayidle swaylock mako grim slurp wl-clipboard xdg-utils font-dejavu font-noto adwaita-icon-theme papirus-icon-theme pipewire wireplumber pipewire-pulse pavucontrol " apk add $PACKAGES ok "Пакеты установлены" # --- Настройка служб --- info "Настройка служб..." rc-update add seatd default 2>/dev/null || true rc-update add elogind default 2>/dev/null || true rc-update add pipewire default 2>/dev/null || true rc-service seatd start 2>/dev/null || true rc-service elogind start 2>/dev/null || true ok "Службы настроены" # --- Права пользователя --- info "Настройка прав пользователя..." # Добавляем пользователя в необходимые группы for group in seat video audio input; do if getent group "$group" >/dev/null 2>&1; then adduser "$TARGET_USER" "$group" 2>/dev/null || true fi done ok "Пользователь $TARGET_USER добавлен в группы" # --- Создание XDG_RUNTIME_DIR --- info "Настройка XDG_RUNTIME_DIR..." RUNDIR="/run/user/$USER_UID" mkdir -p "$RUNDIR" chown "$TARGET_USER:$TARGET_USER" "$RUNDIR" chmod 700 "$RUNDIR" # Добавляем в /etc/profile.d для persistency mkdir -p /etc/profile.d cat > /etc/profile.d/xdg-runtime.sh << 'EOF' if [ -z "$XDG_RUNTIME_DIR" ]; then export XDG_RUNTIME_DIR=/run/user/$(id -u) fi if [ ! -d "$XDG_RUNTIME_DIR" ]; then mkdir -p "$XDG_RUNTIME_DIR" chmod 700 "$XDG_RUNTIME_DIR" fi EOF chmod 644 /etc/profile.d/xdg-runtime.sh ok "XDG_RUNTIME_DIR настроен" # --- Конфигурация labwc --- info "Создание конфигурации labwc..." LABWC_DIR="$USER_HOME/.config/labwc" mkdir -p "$LABWC_DIR" # rc.xml — только если не существует if [ ! -f "$LABWC_DIR/rc.xml" ]; then cat > "$LABWC_DIR/rc.xml" << 'EOF' 8 no Clearlooks 8 sans 10 sans 10 sans 10 EOF ok "Создан $LABWC_DIR/rc.xml" else warn "$LABWC_DIR/rc.xml уже существует, пропускаю" fi # autostart — только если не существует if [ ! -f "$LABWC_DIR/autostart" ]; then cat > "$LABWC_DIR/autostart" << 'EOF' #!/bin/sh # Автозапуск labwc # Фон swaybg -c '#2e3440' & # Панель waybar & # Уведомления mako & # Буфер обмена wl-paste --watch cliphist store & # Экранный блокировщик при простое swayidle -w \ timeout 300 'swaylock -f -c 000000' \ timeout 600 'wlopm --off \*' \ resume 'wlopm --on \*' \ before-sleep 'swaylock -f -c 000000' & EOF chmod +x "$LABWC_DIR/autostart" ok "Создан $LABWC_DIR/autostart" else warn "$LABWC_DIR/autostart уже существует, пропускаю" fi # menu.xml — контекстное меню if [ ! -f "$LABWC_DIR/menu.xml" ]; then cat > "$LABWC_DIR/menu.xml" << 'EOF' EOF ok "Создан $LABWC_DIR/menu.xml" else warn "$LABWC_DIR/menu.xml уже существует, пропускаю" fi # --- Настройка waybar --- info "Настройка waybar..." WAYBAR_DIR="$USER_HOME/.config/waybar" mkdir -p "$WAYBAR_DIR" if [ ! -f "$WAYBAR_DIR/config" ]; then cat > "$WAYBAR_DIR/config" << 'EOF' { "layer": "top", "position": "top", "height": 30, "spacing": 4, "modules-left": ["sway/workspaces", "sway/window"], "modules-center": ["clock"], "modules-right": ["pulseaudio", "network", "cpu", "memory", "tray"], "clock": { "format": "{:%Y-%m-%d %H:%M}", "tooltip-format": "{:%Y %B}\n{calendar}", "format-alt": "{:%H:%M:%S}" }, "cpu": { "format": "CPU {usage}%", "tooltip": false }, "memory": { "format": "RAM {}%" }, "network": { "format-wifi": "WiFi {signalStrength}%", "format-ethernet": "Eth {ipaddr}/{cidr}", "tooltip-format": "{ifname} via {gwaddr}", "format-linked": "{ifname} (No IP)", "format-disconnected": "Disconnected", "format-alt": "{ifname}: {ipaddr}/{cidr}" }, "pulseaudio": { "format": "Vol {volume}%", "format-muted": "Muted", "on-click": "pavucontrol" }, "tray": { "spacing": 10 } } EOF ok "Создан $WAYBAR_DIR/config" else warn "$WAYBAR_DIR/config уже существует, пропускаю" fi if [ ! -f "$WAYBAR_DIR/style.css" ]; then cat > "$WAYBAR_DIR/style.css" << 'EOF' * { border: none; border-radius: 0; font-family: "DejaVu Sans", sans-serif; font-size: 13px; min-height: 0; } window#waybar { background-color: #2e3440; color: #d8dee9; transition-property: background-color; transition-duration: .5s; } #workspaces button { padding: 0 10px; color: #d8dee9; } #workspaces button.focused { background-color: #4c566a; color: #eceff4; } #workspaces button.urgent { background-color: #bf616a; } #clock, #cpu, #memory, #network, #pulseaudio, #tray { padding: 0 10px; margin: 0 4px; color: #d8dee9; } #clock { background-color: #434c5e; } #tray { background-color: #3b4252; } EOF ok "Создан $WAYBAR_DIR/style.css" else warn "$WAYBAR_DIR/style.css уже существует, пропускаю" fi # --- Настройка foot (терминал) --- info "Настройка foot..." FOOT_DIR="$USER_HOME/.config/foot" mkdir -p "$FOOT_DIR" if [ ! -f "$FOOT_DIR/foot.ini" ]; then cat > "$FOOT_DIR/foot.ini" << 'EOF' [main] font=monospace:size=10 pad=8x8 [scrollback] lines=10000 [cursor] style=block blink=no [colors] alpha=0.95 background=2e3440 foreground=d8dee9 regular0=3b4252 regular1=bf616a regular2=a3be8c regular3=ebcb8b regular4=81a1c1 regular5=b48ead regular6=88c0d0 regular7=e5e9f0 EOF ok "Создан $FOOT_DIR/foot.ini" else warn "$FOOT_DIR/foot.ini уже существует, пропускаю" fi # --- Настройка mako (уведомления) --- info "Настройка mako..." MAKO_DIR="$USER_HOME/.config/mako" mkdir -p "$MAKO_DIR" if [ ! -f "$MAKO_DIR/config" ]; then cat > "$MAKO_DIR/config" << 'EOF' font=DejaVu Sans 10 background-color=#2e3440 text-color=#d8dee9 width=300 height=100 margin=10 padding=10 border-size=2 border-color=#4c566a border-radius=8 progress-color=over #88c0d0 icons=1 max-icon-size=48 layer=overlay anchor=top-right default-timeout=5000 EOF ok "Создан $MAKO_DIR/config" else warn "$MAKO_DIR/config уже существует, пропускаю" fi # --- Настройка автозапуска labwc при входе --- info "Настройка автозапуска labwc..." BASH_PROFILE="$USER_HOME/.bash_profile" AUTOSTART_MARKER="# === labwc autostart ===" if [ -f "$BASH_PROFILE" ] && grep -q "$AUTOSTART_MARKER" "$BASH_PROFILE" 2>/dev/null; then warn "Автозапуск labwc уже настроен в .bash_profile" else cat >> "$BASH_PROFILE" << EOF $AUTOSTART_MARKER if [ -z "\$WAYLAND_DISPLAY" ] && [ "\$(tty)" = "/dev/tty1" ]; then exec labwc fi # === end labwc autostart === EOF ok "Автозапуск labwc добавлен в .bash_profile" fi # --- Права на конфиги --- chown -R "$TARGET_USER:$TARGET_USER" "$USER_HOME/.config" # --- Создание директорий --- mkdir -p "$USER_HOME/Pictures" "$USER_HOME/Downloads" chown "$TARGET_USER:$TARGET_USER" "$USER_HOME/Pictures" "$USER_HOME/Downloads" # --- Финал --- echo "" echo "============================================================" echo " Labwc установлен и настроен!" echo "============================================================" echo "" echo "Пользователь: $TARGET_USER" echo "" echo "Горячие клавиши:" echo " Win+Enter — Терминал (foot)" echo " Win+D — Меню приложений (wofi)" echo " Win+Shift+D — Запуск команды (wofi --show run)" echo " Win+L — Блокировка экрана" echo " Win+Q — Закрыть окно" echo " Win+F — Развернуть окно" echo " Win+1..4 — Переключение рабочих столов" echo " Print — Скриншот области" echo " Win+Shift+E — Выход из labwc" echo "" echo "Действия после установки:" echo " 1. Перезагрузитесь: reboot" echo " 2. Войдите как $TARGET_USER на tty1" echo " 3. Labwc запустится автоматически" echo "" echo "Если labwc не запустился автоматически:" echo " login: $TARGET_USER" echo " $ labwc" echo "" ok "Установка завершена!"