Files
labwc-alpine/fix.sh
T
2026-09-06 21:24:33 +06:00

334 lines
8.5 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/bin/sh
#
# fix-sddm.sh
# Восстановление SDDM + LabWC на Alpine Linux/OpenRC.
#
# Запуск от root:
# ./fix-sddm.sh ivan
#
set -u
USER_NAME="${1:-ivan}"
HOME_DIR="/home/$USER_NAME"
if [ "$(id -u)" -ne 0 ]; then
echo "[!] Запусти скрипт от root:"
echo " su -"
echo " ./fix-sddm.sh $USER_NAME"
exit 1
fi
if ! id "$USER_NAME" >/dev/null 2>&1; then
echo "[!] Пользователь не найден: $USER_NAME"
exit 1
fi
if [ ! -f /etc/alpine-release ]; then
echo "[!] Этот скрипт предназначен для Alpine Linux."
exit 1
fi
echo
echo "=================================================="
echo " SDDM + LabWC recovery for Alpine Linux"
echo "=================================================="
echo
echo "[*] User: $USER_NAME"
echo "[*] Home: $HOME_DIR"
echo
echo "[*] Проверка пакетов SDDM/OpenRC..."
apk update
apk add sddm sddm-openrc
echo
echo "[*] Удаление старого неправильного конфига SDDM..."
rm -f /etc/sddm.conf.d/wayland.conf
rm -f /etc/sddm.conf.d/labwc.conf
mkdir -p /etc/sddm.conf.d
cat > /etc/sddm.conf.d/00-general.conf << 'EOF'
[General]
DisplayServer=x11
[Autologin]
Relogin=false
EOF
chmod 644 /etc/sddm.conf.d/00-general.conf
echo "[+] Создан базовый конфиг SDDM."
echo "[+] Автологин выключен."
echo
echo "[*] Удаление старого autologin-wrapper..."
rm -f /usr/local/sbin/autologin-login
echo
echo "[*] Восстановление tty1 в /etc/inittab..."
if [ -f /etc/inittab ]; then
if [ ! -f /etc/inittab.before-sddm-fix.bak ]; then
cp /etc/inittab /etc/inittab.before-sddm-fix.bak
echo "[+] Создана резервная копия: /etc/inittab.before-sddm-fix.bak"
fi
# Удаляем строку, созданную старым скриптом.
sed -i '\|/usr/local/sbin/autologin-login|d' /etc/inittab
# Для SDDM tty1 лучше не занимать agetty.
# Оставляем tty2+ как аварийные консоли.
sed -i 's|^tty1::respawn:|#tty1::respawn:|' /etc/inittab
kill -HUP 1 2>/dev/null || true
echo "[+] Старый getty-autologin удалён."
echo "[+] tty1 освобождён для display manager."
else
echo "[!] /etc/inittab отсутствует; пропускаю."
fi
echo
echo "[*] Удаление автозапуска LabWC из .profile..."
PROFILE="$HOME_DIR/.profile"
if [ -f "$PROFILE" ]; then
if grep -qF '# LABWC-AUTOSTART' "$PROFILE"; then
if [ ! -f "$PROFILE.before-sddm-fix.bak" ]; then
cp "$PROFILE" "$PROFILE.before-sddm-fix.bak"
fi
# Удаляет блок до конца файла.
# Это безопасно, если LABWC-AUTOSTART является последним блоком,
# как в исходном setup-скрипте.
sed -i '/^# LABWC-AUTOSTART$/,$d' "$PROFILE"
echo "[+] Блок LABWC-AUTOSTART удалён из $PROFILE."
else
echo "[+] В $PROFILE нет старого блока LABWC-AUTOSTART."
fi
else
echo "[!] $PROFILE отсутствует; пропускаю."
fi
echo
echo "[*] Удаление ручного XDG_RUNTIME_DIR из .profile..."
if [ -f "$PROFILE" ] && grep -qF '# XDG-RUNTIME-DIR' "$PROFILE"; then
if [ ! -f "$PROFILE.before-runtime-fix.bak" ]; then
cp "$PROFILE" "$PROFILE.before-runtime-fix.bak"
fi
sed -i '/^# XDG-RUNTIME-DIR$/,/^fi$/d' "$PROFILE"
echo "[+] Старый блок XDG-RUNTIME-DIR удалён."
fi
echo
echo "[*] Настройка групп пользователя..."
for GROUP_NAME in wheel seat video input; do
if ! getent group "$GROUP_NAME" >/dev/null 2>&1; then
echo "[*] Создаю группу: $GROUP_NAME"
addgroup "$GROUP_NAME"
fi
if id -nG "$USER_NAME" | tr ' ' '\n' | grep -qx "$GROUP_NAME"; then
echo "[+] $USER_NAME уже состоит в группе $GROUP_NAME."
else
echo "[*] Добавляю $USER_NAME в группу $GROUP_NAME..."
addgroup "$USER_NAME" "$GROUP_NAME"
fi
done
echo
echo "[*] Создание desktop-файла LabWC..."
mkdir -p /usr/share/wayland-sessions
cat > /usr/share/wayland-sessions/labwc.desktop << 'EOF'
[Desktop Entry]
Name=LabWC
Comment=LabWC Wayland compositor
Exec=labwc
TryExec=labwc
Type=Application
DesktopNames=labwc
EOF
chmod 644 /usr/share/wayland-sessions/labwc.desktop
echo "[+] Создан: /usr/share/wayland-sessions/labwc.desktop"
echo
echo "[*] Исправление LabWC environment..."
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
LIBSEAT_BACKEND=seatd
EOF
echo "[+] environment создан."
echo
echo "[*] Исправление LabWC autostart..."
cat > "$HOME_DIR/.config/labwc/autostart" << 'EOF'
#!/bin/sh
if command -v nm-applet >/dev/null 2>&1; then
nm-applet &
fi
if command -v waybar >/dev/null 2>&1; then
waybar &
fi
if command -v mako >/dev/null 2>&1; then
mako &
fi
if command -v pipewire >/dev/null 2>&1 &&
! pgrep -x pipewire >/dev/null 2>&1
then
pipewire &
fi
if command -v wireplumber >/dev/null 2>&1 &&
! pgrep -x wireplumber >/dev/null 2>&1
then
wireplumber &
fi
EOF
chmod 755 "$HOME_DIR/.config/labwc/autostart"
chown -R "$USER_NAME:$USER_NAME" "$HOME_DIR/.config"
echo "[+] autostart создан."
echo "[+] Ручное создание XDG_RUNTIME_DIR в autostart удалено."
echo
echo "[*] Остановка старых процессов SDDM..."
rc-service sddm stop 2>/dev/null || true
sleep 2
echo "[*] Найденные процессы до очистки:"
ps -eo pid,ppid,user,stat,comm,args |
grep -E '[s]ddm|[s]upervise-daemon' || true
# Останавливаем сам SDDM и supervisor, если тот был запущен
# специально для SDDM.
pkill -TERM -f '/usr/bin/sddm' 2>/dev/null || true
pkill -TERM -f 'supervise-daemon.*sddm' 2>/dev/null || true
sleep 3
pkill -KILL -f '/usr/bin/sddm' 2>/dev/null || true
pkill -KILL -f 'supervise-daemon.*sddm' 2>/dev/null || true
sleep 2
echo "[*] Проверка процессов после очистки:"
ps -eo pid,ppid,user,stat,comm,args |
grep -E '[s]ddm|[s]upervise-daemon' || true
echo
echo "[*] Очистка stale PID-файлов SDDM..."
rm -f /run/sddm.pid
rm -f /run/sddm/sddm.pid
rm -f /run/openrc/started/sddm
rm -f /run/openrc/daemons/sddm
echo
echo "[*] Включение служб OpenRC..."
rc-update add dbus default 2>/dev/null || true
rc-update add seatd default 2>/dev/null || true
rc-update add sddm default 2>/dev/null || true
echo
echo "[*] Запуск dbus..."
rc-service dbus start 2>/dev/null || true
echo "[*] Запуск seatd..."
rc-service seatd start 2>/dev/null || true
echo
echo "=================================================="
echo " Проверка перед запуском SDDM"
echo "=================================================="
echo
echo "[*] DRM:"
ls -la /dev/dri 2>&1 || true
echo
echo "[*] SDDM init script:"
ls -l /etc/init.d/sddm 2>&1 || true
echo
echo "[*] Пакеты:"
apk info -e sddm sddm-openrc 2>&1 || true
echo
echo "[*] Группы пользователя:"
id "$USER_NAME"
echo
echo "=================================================="
echo " Попытка запуска SDDM"
echo "=================================================="
rc-service sddm start || true
echo
echo "[*] Статус SDDM:"
rc-service sddm status || true
echo
echo "[*] Процессы SDDM:"
ps -eo pid,ppid,user,stat,comm,args |
grep -E '[s]ddm|[s]upervise-daemon' || true
echo
echo "=================================================="
echo " Готово"
echo "=================================================="
echo
echo "[*] Перезагрузи виртуальную машину:"
echo
echo " reboot"
echo
echo "[*] После перезагрузки:"
echo " 1. Должен появиться экран SDDM."
echo " 2. Войди как: $USER_NAME"
echo " 3. В меню сессий выбери LabWC."
echo
echo "[!] Если SDDM снова не покажет графический экран,"
echo "[!] скопируй вывод этого скрипта и результат:"
echo
echo " ls -la /dev/dri"
echo " lspci -nn | grep -Ei 'vga|3d|display'"
echo " logread | tail -150"
echo