Escribí un programa que se ejecuta como servicio de sesión a través de dbus.
Quería hacer que se ejecutara como servicio del sistema (creando un nombre de bus dbus.SystemBus) si lo ejecutara root (uid 0).
Estoy tratando de ejecutar para dbus.SystemBus lo que actualmente ejecuto para dbus.SessionBus pero obtengo un error de política.
El código (pitón pero en realidad no importa), desaparecido de todo lo innecesario, corro es la siguiente:Políticas de DBus SystemBus
import gobject
import dbus
import dbus.service
from dbus.mainloop.glib import DBusGMainLoop
DBusGMainLoop(set_as_default=True)
loop = gobject.MainLoop()
class dbusService(dbus.service.Object):
def __init__(self):
bus_name = dbus.service.BusName('org.testobj.service', bus=dbus.SystemBus())
dbus.service.Object.__init__(self, bus_name, '/org/testobj/service')
a = dbusService()
y obtener:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 3, in __init__
File "/usr/lib/python2.7/site-packages/dbus/service.py", line 131, in __new__ retval = bus.request_name(name, name_flags)
File "/usr/lib/python2.7/site-packages/dbus/bus.py", line 303, in request_name 'su', (name, flags))
File "/usr/lib/python2.7/site-packages/dbus/connection.py", line 651, in call_blocking message, timeout)
dbus.exceptions.DBusException: org.freedesktop.DBus.Error.AccessDenied: Connection ":1.48" is not allowed to own the service "org.testobj.service" due to security policies in the configuration file
FYI que necesitaba volver a cargar el servicio dbus (Centos 7): '' 'systemctl reload dbus''' para que esto funcione – Joris