Установка корневого сеанса и сеанса пользователя на одну и ту же шину?

У меня есть скрипт, который должен быть запущен в root, с привязками к dbus.

DBUS_SESSION_BUS_ADDRESS = 'address set under .dbus file ...'

class NewApp(dbus.service.Object):

    def __init__(self):
        busname = dbus.service.BusName('org.newapp', dbus.SessionBus(mainloop=DBusGMainLoop()))
        dbus.service.Object.__init__(self, busname, '/org/newapp')

    @dbus.service.method('org.newapp', out_signature='s')
    def do_stuff(self):
        return 'stuff'

if __name__ == '__main__':
    na = NewApp
    na()
    gobject.MainLoop().run()

Где do_stuff имеет код, который должен иметь доступ root. Я обнаружил, что когда вы запускаете программу под пользователем root, это создает отдельный сеанс dbus, и мне нужно будет установить 'DBUS_SESSION_BUS_ADDRESS'. Я думал о том, чтобы разделить скрипт на два разных файла и просто импортировать другой, но я хотел бы знать, как это сделать также.

Это доставляет мне неприятности, я не уверен, где и как правильно установить адрес. Если у кого-то есть понимание, я был бы очень признателен.

3
задан 24 December 2012 в 05:36

1 ответ

Если вы пишете сценарий, который требует запуска от имени пользователя root и который должен быть доступен пользователям через DBus, вам следует предоставлять доступ к API через системную шину, а не сессионную шину.

В качестве примера посмотрите, как работает системный сервис NetworkManager.

Дополнительную документацию о работе разрешений в DBus см. В http://www.freedesktop.org/wiki/Software/dbus

.
0
ответ дан 24 December 2012 в 05:36

Другие вопросы по тегам:

Похожие вопросы: