Bug 51809 - Невозможно войти из lightdm в классический gnome
Summary: Невозможно войти из lightdm в классический gnome
Status: CLOSED FIXED
Alias: None
Product: Sisyphus
Classification: Development
Component: lightdm (show other bugs)
Version: unstable
Hardware: all Linux
: P5 normal
Assignee: manowar@altlinux.org
QA Contact: qa-sisyphus
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2024-10-23 16:45 MSK by Ivan A. Melnikov
Modified: 2024-10-26 17:06 MSK (History)
4 users (show)

See Also:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Ivan A. Melnikov 2024-10-23 16:45:39 MSK
Раньше было можно, теперь падает.

- возьмите систему с lightdm
- установите пакет gnome-regular
- выберете сеанс "Классический GNOME c Xorg"
- войдите в систему

Ожидание: запустится классический GNOME
Реальность: что-то падает и снова появляется приглашение входа в систему от lightdm.
Comment 1 Ivan A. Melnikov 2024-10-23 16:47:00 MSK
При этом у пользователя в ~/.xsession-errors:0 появляется что-то такое:

Running Xsession[13468] env GNOME_SHELL_SESSION_MODE=classic gnome-session
Agent pid 13511
runwm: window manager "env gnome_shell_session_mode=classic gnome-session" not found.
Comment 2 Ivan A. Melnikov 2024-10-23 17:00:40 MSK
Примерная цепочка событий:

Для старта сессии нужно запустить такую команду:

# grep ^Exec /usr/share/xsessions/gnome-classic-xorg.desktop
Exec=env GNOME_SHELL_SESSION_MODE=classic gnome-session

lightdm по умолчанию пытается эту команду завернуть в Xsession:

# grep ^session-wrapper /etc/lightdm/lightdm.conf
session-wrapper=/etc/X11/Xsession

Однако раз session-wrapper есть, вся строка из Exec попадает в один, первый аргумент session-wrapper'а (т.е. /etc/X11/Xsession), вместо того чтобы разделиться на отдельные аргументы:

https://git.altlinux.org/gears/l/lightdm.git?p=lightdm.git;a=blob;f=lightdm/src/seat.c;h=09c78004f4ee72cf09be075b34f35527f71c7adf#l942

/etc/X11/Xsession (пакет xinitrc) видит, что его первый аргумент -- это не абсолютный путь к бинарнику, и передаёт его в rundm

https://git.altlinux.org/gears/x/xinitrc.git?a=blob;f=xinitrc/install/etc/X11/Xsession;h=4dc829853de54fa74f77d0435539cfa2dfde23ea#l219

rundm, естественно, к такому не готов.
Comment 3 Ivan A. Melnikov 2024-10-23 17:06:03 MSK
> Примерная цепочка событий:
[...]

То есть, сейчас получается, что lightdm работает, только если в Exec указан полный путь к исполняемому файлу, причём без аргументов. Спецификация на desktop-файлы[1] разрешает указывать имена без пути (чтобы их поискали в $PATH) и аргументы через пробел. Так что если в /usr/share/xsessions лежат обычные настоящие desktop-файлы без каких-либо дополнительных ограничений, lightdm неправ в том, как он их обрабатывает.

[1] https://specifications.freedesktop.org/desktop-entry-spec/latest/exec-variables.html
Comment 4 manowar@altlinux.org 2024-10-24 13:15:55 MSK
Да, как единую строку читает "Exec": https://git.altlinux.org/gears/l/lightdm.git?p=lightdm.git;a=blob;f=lightdm/src/session-config.c;h=e0bca920eea15a6afe62457abb25468645054a1f;hb=0c7668cc9d018f80cd3e3b602ae1f76f63150288#l32

Нужно сделать разбиение на аргументы командной строки, вероятно, с учётом возможного экранирования. Нет ли на этот счёт известного готового решения?
Comment 5 Ivan A. Melnikov 2024-10-24 23:35:16 MSK
(In reply to manowar@altlinux.org from comment #4)
> Нужно сделать разбиение на аргументы командной строки, вероятно, с учётом
> возможного экранирования. Нет ли на этот счёт известного готового решения?

В том же get_session_argv чуть ниже используется g_shell_parse_argv из glib. На первый взгляд оно делает всё что нужно.
Comment 6 manowar@altlinux.org 2024-10-25 13:13:59 MSK
Спасибо, и правда. Осталось понять тогда, почему в lightdm в случае, когда есть обёртка, всё укладывается в один аргумент. То есть, как будто бы специально это сделано.
Comment 7 manowar@altlinux.org 2024-10-25 14:35:06 MSK
Да, я нашёл комит специально отменяющий правильное, на наш взгляд, поведение: https://git.altlinux.org/people/manowar/packages/?p=lightdm.git;a=commitdiff;h=964619ba615cd6c57070ad59cdcca8f132d9dfb1 .
Comment 8 manowar@altlinux.org 2024-10-25 15:03:46 MSK
https://github.com/canonical/lightdm/issues/381
Comment 9 manowar@altlinux.org 2024-10-25 16:46:07 MSK
Ну как бы вот: это что-то убунто-специфическое и старое:

--- a/tests/src/lightdm-session
+++ b/tests/src/lightdm-session
@@ -1,5 +1,4 @@
 #!/bin/sh
 
-# Run the session expecting the full command to be the first argument.  It has
-# to be like this for backwards compatibility instead of having a normal argument list
-exec $1
+# Run the session expecting an argument list.
+exec "$@"

Но мы вполне можем сделать по своему, мне кажется.
Comment 10 manowar@altlinux.org 2024-10-25 16:59:49 MSK
Сделал:

https://git.altlinux.org/people/manowar/packages/?p=lightdm.git;a=commitdiff;h=1055b1486093458dbaf2dedc53f267597479e1ee

Но не особо полегчало-то. :) Теперь:

runwm: window manager "env" not found.

Оно и понятно, раз

> Exec=env GNOME_SHELL_SESSION_MODE=classic gnome-session

и

> /etc/X11/Xsession (пакет xinitrc) видит, что его первый
> аргумент -- это не абсолютный путь к бинарнику, и передаёт
> его в rundm
Comment 11 Ivan A. Melnikov 2024-10-25 17:08:52 MSK
> runwm: window manager "env" not found.

А разве "env" не должен привратиться в /usr/bin/env?

То есть, разве g_find_program_in_path (argv[0]) не нужен и в ветке if-a c session-wrapper?
Comment 12 manowar@altlinux.org 2024-10-25 17:21:08 MSK
Так он там есть:

+    if (session_wrapper)
+    {
+        path = g_find_program_in_path (session_wrapper);
+       prepend_argv (&argv, path ? path : session_wrapper);
+    }
Comment 13 manowar@altlinux.org 2024-10-25 17:37:59 MSK
А, не сразу понял твою мысль, извини. :)
Comment 14 Repository Robot 2024-10-25 19:28:10 MSK
lightdm-1.32.0-alt9 -> sisyphus:

 Fri Oct 25 2024 Paul Wolneykien <manowar@altlinux> 1.32.0-alt9
 - Fix: Invoke session wrapper with splitted arguments (closes: 51809).
Comment 15 Ivan A. Melnikov 2024-10-26 17:06:03 MSK
Спасибо!