Skip to content

Conversation

@kiper220-alt
Copy link

No description provided.

@kiper220-alt kiper220-alt force-pushed the apt1_runner branch 2 times, most recently from 9b06876 to ee99731 Compare August 27, 2025 11:19
@kiper220-alt
Copy link
Author

При написании данного раннера, использующего org.altlinux.alterator.apt1 столкнулся с интересной проблемой, которую пока не придумал, как можно изящно решить.
Для того, чтобы не завязываться на одном интерфейсе apt1_runner(и наоборот) была написана функция, которая проверяет наличие объекта org.altlinux.alterator.apt1:

def check_apt1():
dbus_interface = 'org.altlinux.alterator.apt1'
bus_name = 'org.altlinux.alterator'
object_path = '/org/altlinux/alterator/apt'
try:
bus = dbus.SystemBus()
if bus.name_has_owner(bus_name):
dbus.Interface(bus.get_object(bus_name, object_path), dbus_interface)
return True
else:
return False
except dbus.exceptions.DBusException as e:
return False

Однако, данный код приводит к падению в:

gpupdate/gpoa/util/dbus.py

Lines 204 to 212 in ee99731

def __init__(self):
try:
self.session_bus = dbus.SessionBus()
self.session_dbus = self.session_bus.get_object('org.freedesktop.DBus', '/org/freedesktop/DBus')
self.session_iface = dbus.Interface(self.session_dbus, 'org.freedesktop.DBus')
except dbus.exceptions.DBusException as exc:
logdata = {'error': str(exc)}
log('E31', logdata)
raise exc

Изучив проблему подробнее, оказалось, что для падения необходимо и достаточно вызвать:

bus = dbus.SystemBus();
bus.close() # не обязательно, т.к. падает даже без вызова close()

Есть вероятность (*), что python3-module-dbus полагается на некоторый кэш, который хранится в самом python3-module-dbus(в случае сессионной шины), а та шина, которая хранится в переменных окружения по какой либо причине (*) игнорируется.

На данный момент данная проблема возможно не является критической.

(*) — это требует изучения и, при выявлении возможных проблем, может потребовать отдельного PR с исправлениями. Изучением данной проблемы я постараюсь заняться.

P.S. переменные окрушения и стэктрейс в месте происхождения ошибки:

environ({'HOME': '/home/DOMAIN.ALT/user1', 'USER': 'user1', 'USERNAME': 'user1', 'LANG': 'C.UTF-8', 'DBUS_SESSION_BUS_ADDRESS': 'unix:path=/run/dbus/users/dbus-7t96R7rFEV,guid=efd0533d8af05a7d9dba04d068b04992', 'DBUS_SESSION_BUS_PID': '42706'})
Apply group policies for user1.
2025-08-28 16:20:34.203|[E00031]| Error connecting to DBus Session daemon|{'error': 'org.freedesktop.DBus.Error.NotSupported: Unable to autolaunch a dbus-daemon without a $DISPLAY for X11'}
  File "/usr/sbin/gpoa", line 198, in <module>
    main()
  File "/usr/sbin/gpoa", line 193, in main
    controller.run()
  File "/usr/sbin/gpoa", line 129, in run
    self.start_backend()
  File "/usr/sbin/gpoa", line 157, in start_backend
    self.start_frontend()
  File "/usr/sbin/gpoa", line 175, in start_frontend
    appl.apply_parameters()
  File "/usr/lib/python3/site-packages/gpoa/frontend/frontend_manager.py", line 238, in apply_parameters
    self.user_apply()
  File "/usr/lib/python3/site-packages/gpoa/frontend/frontend_manager.py", line 219, in user_apply
    with_privileges(self.username, lambda: apply_user_context(self.user_appliers))
  File "/usr/lib/python3/site-packages/gpoa/util/system.py", line 120, in with_privileges
    session = dbus_session()
  File "/usr/lib/python3/site-packages/gpoa/util/dbus.py", line 213, in __init__

P.S.S. ошибка проявляется только в данном PR. В последнем commit в master ветке на текущий момент (63e5ffc) ошибка не воспроизводилась.

@kiper220-alt
Copy link
Author

В данном PR как решение вышеописанной проблемы был добавлен скрипт select_runner, который вызывается в качестве подпроцесса, задача которого определить runner("apt1" или "pkcon") для вызова.
Runner по умолчанию — "apt1".

parser.add_argument('-b', '--backend', type=str, choices=backends.keys(), default='apt1', help='priority backend (default: %(default)s)')

Его алгоритм:

  1. Проверяем runner по умолчанию. При доступности, он выводится в stdout, иначе поиск продолжается.
    if backends[args.backend]():
    print(args.backend)
    return 0
  2. Проверяем остальные runner-ы. При доступности, доступный runner выводится в stdout, иначе поиск продолжается.
    for el in backends:
    if el == args.backend:
    continue
    if backends[el]():
    print(el)
    return 0
  3. Если ничего не нашли, завершаем работу с пустым stdout и exitcode=1.
    return 1

Остаётся протестировать в полной мере. По крайней мере на моём тестовом стенде с простой политикой всё работает(машинная и пользовательская политики):
image
Удаление тоже работает.

Также есть вопрос, стоит ли добавить конфликт со старыми версиями alterator-backend-packages, в которых отсутствует метод AppyAsync, который необходим?
Проверка на данный метод имеется в select_runner:

if not bus.get_object(bus_name, object_path).has_method(dbus_interface, 'ApplyAsync'):
bus.close()
return False

@kiper220-alt kiper220-alt marked this pull request as ready for review August 29, 2025 11:31
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant