У меня есть скрипт, который должен быть запущен в 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'. Я думал о том, чтобы разделить скрипт на два разных файла и просто импортировать другой, но я хотел бы знать, как это сделать также.
Это доставляет мне неприятности, я не уверен, где и как правильно установить адрес. Если у кого-то есть понимание, я был бы очень признателен.
Если вы пишете сценарий, который требует запуска от имени пользователя root и который должен быть доступен пользователям через DBus, вам следует предоставлять доступ к API через системную шину, а не сессионную шину.
В качестве примера посмотрите, как работает системный сервис NetworkManager.
Дополнительную документацию о работе разрешений в DBus см. В http://www.freedesktop.org/wiki/Software/dbus
.