Bug 51564 - `ast.literal_eval(v.get_string())` в `gpr_init.py` приводит к падению при определённых политиках
Summary: `ast.literal_eval(v.get_string())` в `gpr_init.py` приводит к падению при опр...
Status: REOPENED
Alias: None
Product: Sisyphus
Classification: Development
Component: gpresult (show other bugs)
Version: unstable
Hardware: x86_64 Linux
: P5 normal
Assignee: alxvmr@altlinux.org
QA Contact: qa-sisyphus
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2024-09-26 08:04 MSK by Anton Shevtsov
Modified: 2025-06-02 15:35 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 Anton Shevtsov 2024-09-26 08:04:38 MSK
День добрый,

Беру srpm и пересобираю для p10, для стендовых условий.
Версия 0.0.1 работала без каких либо проблем, версия 0.0.2 сразу же выпадает в ошибку. Все окружение тоже самое. 

Как воспроизвести вам, понятия не имею ;) , но скажите лучше куда мне самому посмотреть.

[domainuser1@host-15 Рабочий стол]$ gpresult 
Traceback (most recent call last):
  File "/usr/bin/gpresult", line 9, in <module>
    sys.exit(main())
  File "/usr/lib/python3/site-packages/gpresult/gpresult.py", line 130, in main
    gpos = gpr_get_policies.get_policies(obj)
  File "/usr/lib/python3/site-packages/gpresult/gpr_get_policies.py", line 23, in get_policies
    gpr_init.init_data(path, 'user')
  File "/usr/lib/python3/site-packages/gpresult/gpr_init.py", line 203, in init_data
    init_preferences(path, obj)
  File "/usr/lib/python3/site-packages/gpresult/gpr_init.py", line 193, in init_preferences
    preference_list = ast.literal_eval(v.get_string())
  File "/usr/lib64/python3.9/ast.py", line 62, in literal_eval
    node_or_string = parse(node_or_string, mode='eval')
  File "/usr/lib64/python3.9/ast.py", line 50, in parse
    return compile(source, filename, mode, flags,
  File "<unknown>", line 1
    [{'login': '', 'password': '', 'dir': 'L', 'path': '\\\\dc.test.alt\\share', 'action': 'U', 'thisDrive': 'NOCHANGE', 'allDrives': 'NOCHANGE', 'label': 'DefaultPolicyDrive', 'persistent': '0', 'useLetter': '1', 'policy_name': 'Default Domain Policy'}, {'login': '', 'password': '', 'dir': 'W', 'path': '\\\\dc.test.alt\\share', 'action': 'U', 'thisDrive': 'NOCHANGE', 'allDrives': 'NOCHANGE', 'label': ''Мой диск'', 'persistent': '1', 'useLetter': '1', 'policy_name': 'Сетевые_шары'}]
                                                                                                                                                                                                                                                                                                                                                                                                                       ^
SyntaxError: invalid syntax
Comment 1 Anton Shevtsov 2024-09-26 08:14:37 MSK
Проблема решена, но вам надо это учесть.
Смысл в том, что раньше если в имени шары был пробел, то все падало и решалось взятие в двойные кавычки ("Мой диск"). 

В 0.0.2 это приводит к 'label': ''Мой диск''
убрал совсем кавычки, все работает, но осадочек остался ;)
Comment 2 Artem Varaksa 2025-03-14 19:04:16 MSK
Воспроизвёл с версией 0.0.4-alt1 и нашёл шаги воспроизведения.

Воспроизводится при создании объекта типа "Значок" (подробные шаги ниже). Однако, что странно, при его последующем изменении ошибка уже не воспроизводится, даже если сделать ещё одно изменение и вернуть указанные параметры в исходное значение. При этом, если создать новый значок, ошибка снова воспроизведётся.

В моём случае спотыкается на "<" в:
> 'desktop_file': <xdg.DesktopEntry.DesktopEntry object at 0x7fe7cbda6b70>
>                 ^

Проблема, думаю, в `/usr/lib/python3/site-packages/gpresult/gpr_init.py:194` (`init_preferences`): `ast.literal_eval(v.get_string())` не будет работать во всех случаях, в частном случае со сложными объектами типа `xdg.DesktopEntry.DesktopEntry`.

Полный вывод:

> [testuser@q2 ~]$ gpresult -c
> Traceback (most recent call last):
>   File "/usr/bin/gpresult", line 9, in <module>
>     sys.exit(main())
>              ^^^^^^
>   File "/usr/lib/python3/site-packages/gpresult/gpresult.py", line 150, in main
>     gpos = gpr_get_policies.get_policies(obj)
>            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>   File "/usr/lib/python3/site-packages/gpresult/gpr_get_policies.py", line 19, in get_policies
>     gpr_init.init_data(path, 'machine')
>   File "/usr/lib/python3/site-packages/gpresult/gpr_init.py", line 204, in init_data
>     init_preferences(path, obj)
>   File "/usr/lib/python3/site-packages/gpresult/gpr_init.py", line 194, in init_preferences
>     preference_list = ast.literal_eval(v.get_string())
>                       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>   File "/usr/lib64/python3.12/ast.py", line 66, in literal_eval
>     node_or_string = parse(node_or_string.lstrip(" \t"), mode='eval')
>                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>   File "/usr/lib64/python3.12/ast.py", line 52, in parse
>     return compile(source, filename, mode, flags,
>            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>   File "<unknown>", line 1
>     [{'dest': 'q', 'path': 'q', 'expanded_path': None, 'arguments': '', 'name': 'q', 'action': 'C', 'changed': '2025-03-14 18:14:01', 'icon': '', 'comment': '', 'is_in_user_context': False, 'type': 'FILESYSTEM', 'desktop_file_template': None, 'clsid': '{4F2F7C55-2790-433e-8127-0739D1CFA327}', 'guid': '{6255b5aa-94bd-408f-b87d-af2f5dbefc00}', 'policy_name': 'qq', 'desktop_file': <xdg.DesktopEntry.DesktopEntry object at 0x7fe7cbda6b70>}]
>                                                                                                                                                                                                                                                                                                                                                                                              ^
> SyntaxError: invalid syntax


Шаги воспроизведения
====================

I. Развернуть сервер домена samba и присоединить клиента.

II. Для задания групповых политик установить на сервере (если на нём есть графика) или на клиенте (на котором войти в пользователя администратора домена Administrator или выполнить $ kinit administrator):

# apt-get install -y admc gpui

1. Создать чистую групповую политику: открыть приложение ADMC -> Объекты групповой политики -> ПКМ на имени домена (например samba.testdomain) -> Создать политику и связать с этим подразделением -> ввести любое имя -> ОК

2. Нажать ПКМ на созданную политику -> Изменить...

3. Зайти в разделы Компьютер → Настройки → Настройки Системы и создать объект Значки -> ПКМ в пустой области справа -> Новый -> Значок -> ввести Название: q, Целевой путь: q -> нажать ОК):

III. На клиенте установить gpresult. Войти в обычного доменного пользователя и обновить групповые политики:

# apt-get install -y gpresult
$ gpupdate

IV. Выполнить:

$ gpresult -c
Comment 3 Artem Varaksa 2025-03-14 19:12:07 MSK
(In reply to Artem Varaksa from comment #2)
> Воспроизводится при создании объекта типа "Значок" (подробные шаги ниже).
> Однако, что странно, при его последующем изменении ошибка уже не
> воспроизводится, даже если сделать ещё одно изменение и вернуть указанные
> параметры в исходное значение.

Уточнение: даже просто `$ gpupdate` без изменений может починить.

> При этом, если создать новый значок, ошибка снова воспроизведётся.

Уточнение: ошибка плавающая, даже при создании значка воспроизводится не всегда.
Comment 4 alxvmr 2025-06-02 14:07:12 MSK
(Ответ для Artem Varaksa на комментарий #2)
> Воспроизвёл с версией 0.0.4-alt1 и нашёл шаги воспроизведения.
> 
> Воспроизводится при создании объекта типа "Значок" (подробные шаги ниже).
> Однако, что странно, при его последующем изменении ошибка уже не
> воспроизводится, даже если сделать ещё одно изменение и вернуть указанные
> параметры в исходное значение. При этом, если создать новый значок, ошибка
> снова воспроизведётся.
> 
> В моём случае спотыкается на "<" в:
> > 'desktop_file': <xdg.DesktopEntry.DesktopEntry object at 0x7fe7cbda6b70>
> >                 ^
> 
> Проблема, думаю, в `/usr/lib/python3/site-packages/gpresult/gpr_init.py:194`
> (`init_preferences`): `ast.literal_eval(v.get_string())` не будет работать
> во всех случаях, в частном случае со сложными объектами типа
> `xdg.DesktopEntry.DesktopEntry`.
> 
> Полный вывод:
> 
> > [testuser@q2 ~]$ gpresult -c
> > Traceback (most recent call last):
> >   File "/usr/bin/gpresult", line 9, in <module>
> >     sys.exit(main())
> >              ^^^^^^
> >   File "/usr/lib/python3/site-packages/gpresult/gpresult.py", line 150, in main
> >     gpos = gpr_get_policies.get_policies(obj)
> >            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> >   File "/usr/lib/python3/site-packages/gpresult/gpr_get_policies.py", line 19, in get_policies
> >     gpr_init.init_data(path, 'machine')
> >   File "/usr/lib/python3/site-packages/gpresult/gpr_init.py", line 204, in init_data
> >     init_preferences(path, obj)
> >   File "/usr/lib/python3/site-packages/gpresult/gpr_init.py", line 194, in init_preferences
> >     preference_list = ast.literal_eval(v.get_string())
> >                       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> >   File "/usr/lib64/python3.12/ast.py", line 66, in literal_eval
> >     node_or_string = parse(node_or_string.lstrip(" \t"), mode='eval')
> >                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> >   File "/usr/lib64/python3.12/ast.py", line 52, in parse
> >     return compile(source, filename, mode, flags,
> >            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> >   File "<unknown>", line 1
> >     [{'dest': 'q', 'path': 'q', 'expanded_path': None, 'arguments': '', 'name': 'q', 'action': 'C', 'changed': '2025-03-14 18:14:01', 'icon': '', 'comment': '', 'is_in_user_context': False, 'type': 'FILESYSTEM', 'desktop_file_template': None, 'clsid': '{4F2F7C55-2790-433e-8127-0739D1CFA327}', 'guid': '{6255b5aa-94bd-408f-b87d-af2f5dbefc00}', 'policy_name': 'qq', 'desktop_file': <xdg.DesktopEntry.DesktopEntry object at 0x7fe7cbda6b70>}]
> >                                                                                                                                                                                                                                                                                                                                                                                              ^
> > SyntaxError: invalid syntax
> 
> 
> Шаги воспроизведения
> ====================
> 
> I. Развернуть сервер домена samba и присоединить клиента.
> 
> II. Для задания групповых политик установить на сервере (если на нём есть
> графика) или на клиенте (на котором войти в пользователя администратора
> домена Administrator или выполнить $ kinit administrator):
> 
> # apt-get install -y admc gpui
> 
> 1. Создать чистую групповую политику: открыть приложение ADMC -> Объекты
> групповой политики -> ПКМ на имени домена (например samba.testdomain) ->
> Создать политику и связать с этим подразделением -> ввести любое имя -> ОК
> 
> 2. Нажать ПКМ на созданную политику -> Изменить...
> 
> 3. Зайти в разделы Компьютер → Настройки → Настройки Системы и создать
> объект Значки -> ПКМ в пустой области справа -> Новый -> Значок -> ввести
> Название: q, Целевой путь: q -> нажать ОК):
> 
> III. На клиенте установить gpresult. Войти в обычного доменного пользователя
> и обновить групповые политики:
> 
> # apt-get install -y gpresult
> $ gpupdate
> 
> IV. Выполнить:
> 
> $ gpresult -c

Добрый день!
Тестирую с gpresult-0.0.5, ошибка не воспроизводится. Можете, пожалуйста, предоставить доступ к стенду? Могу для этого создать задачу.(Ответ для Artem Varaksa на комментарий #2)
> Воспроизвёл с версией 0.0.4-alt1 и нашёл шаги воспроизведения.
> 
> Воспроизводится при создании объекта типа "Значок" (подробные шаги ниже).
> Однако, что странно, при его последующем изменении ошибка уже не
> воспроизводится, даже если сделать ещё одно изменение и вернуть указанные
> параметры в исходное значение. При этом, если создать новый значок, ошибка
> снова воспроизведётся.
> 
> В моём случае спотыкается на "<" в:
> > 'desktop_file': <xdg.DesktopEntry.DesktopEntry object at 0x7fe7cbda6b70>
> >                 ^
> 
> Проблема, думаю, в `/usr/lib/python3/site-packages/gpresult/gpr_init.py:194`
> (`init_preferences`): `ast.literal_eval(v.get_string())` не будет работать
> во всех случаях, в частном случае со сложными объектами типа
> `xdg.DesktopEntry.DesktopEntry`.
> 
> Полный вывод:
> 
> > [testuser@q2 ~]$ gpresult -c
> > Traceback (most recent call last):
> >   File "/usr/bin/gpresult", line 9, in <module>
> >     sys.exit(main())
> >              ^^^^^^
> >   File "/usr/lib/python3/site-packages/gpresult/gpresult.py", line 150, in main
> >     gpos = gpr_get_policies.get_policies(obj)
> >            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> >   File "/usr/lib/python3/site-packages/gpresult/gpr_get_policies.py", line 19, in get_policies
> >     gpr_init.init_data(path, 'machine')
> >   File "/usr/lib/python3/site-packages/gpresult/gpr_init.py", line 204, in init_data
> >     init_preferences(path, obj)
> >   File "/usr/lib/python3/site-packages/gpresult/gpr_init.py", line 194, in init_preferences
> >     preference_list = ast.literal_eval(v.get_string())
> >                       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> >   File "/usr/lib64/python3.12/ast.py", line 66, in literal_eval
> >     node_or_string = parse(node_or_string.lstrip(" \t"), mode='eval')
> >                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> >   File "/usr/lib64/python3.12/ast.py", line 52, in parse
> >     return compile(source, filename, mode, flags,
> >            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> >   File "<unknown>", line 1
> >     [{'dest': 'q', 'path': 'q', 'expanded_path': None, 'arguments': '', 'name': 'q', 'action': 'C', 'changed': '2025-03-14 18:14:01', 'icon': '', 'comment': '', 'is_in_user_context': False, 'type': 'FILESYSTEM', 'desktop_file_template': None, 'clsid': '{4F2F7C55-2790-433e-8127-0739D1CFA327}', 'guid': '{6255b5aa-94bd-408f-b87d-af2f5dbefc00}', 'policy_name': 'qq', 'desktop_file': <xdg.DesktopEntry.DesktopEntry object at 0x7fe7cbda6b70>}]
> >                                                                                                                                                                                                                                                                                                                                                                                              ^
> > SyntaxError: invalid syntax
> 
> 
> Шаги воспроизведения
> ====================
> 
> I. Развернуть сервер домена samba и присоединить клиента.
> 
> II. Для задания групповых политик установить на сервере (если на нём есть
> графика) или на клиенте (на котором войти в пользователя администратора
> домена Administrator или выполнить $ kinit administrator):
> 
> # apt-get install -y admc gpui
> 
> 1. Создать чистую групповую политику: открыть приложение ADMC -> Объекты
> групповой политики -> ПКМ на имени домена (например samba.testdomain) ->
> Создать политику и связать с этим подразделением -> ввести любое имя -> ОК
> 
> 2. Нажать ПКМ на созданную политику -> Изменить...
> 
> 3. Зайти в разделы Компьютер → Настройки → Настройки Системы и создать
> объект Значки -> ПКМ в пустой области справа -> Новый -> Значок -> ввести
> Название: q, Целевой путь: q -> нажать ОК):
> 
> III. На клиенте установить gpresult. Войти в обычного доменного пользователя
> и обновить групповые политики:
> 
> # apt-get install -y gpresult
> $ gpupdate
> 
> IV. Выполнить:
> 
> $ gpresult -c

Добрый день!
Проводила тест на версии gpresult-0.0.5 (по логике он не отличается от 0.0.4) и gpupdate 0.13.2 - sysuphus (к сожалению, Вашу версию gpupdate не знаю). Описанная проблема не воспроизвелась, тем более в /etc/dconf/db/policy.d/policy.ini отсутствует в значках ключ "dektop_file".

Судя по логам, проблема из-за того, что значение ключа dekstop_file сохраняется не в виде строки, а в виде объекта. Данный процесс происходит на стороне gpupdate. Данный ключ был убран из gpupdate в версии 0.13.0-alt1 (ссылка на коммит с исправлением - https://github.com/altlinux/gpupdate/commit/93bcac5f193ab66227d472522d99297813dc626e).

Соответственно, если обновиться до gpupdate 0.13.0-alt1 проблема должна исчезнуть.
Comment 5 Artem Varaksa 2025-06-02 15:21:27 MSK
Спасибо, вероятно это решит проблему, да.

Если стенд всё ещё нужен, создайте пожалуйста задачу. (Похоже, в вашем комментарии смешались 2 разных ответа.)
Comment 6 alxvmr 2025-06-02 15:35:14 MSK
(Ответ для Artem Varaksa на комментарий #5)
> Спасибо, вероятно это решит проблему, да.
> 
> Если стенд всё ещё нужен, создайте пожалуйста задачу. (Похоже, в вашем
> комментарии смешались 2 разных ответа.)

Да, извините, случайно неактуальный ответ прикрепила.
Стенд пока не нужен.