2012-06-23 22 views
8

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 

Respuesta

15

La forma más sencilla de ponerse en marcha con el ejemplo anterior es editar /etc/dbus-1/system.conf y añadir la línea siguiente:

<policy> 
    ... 
    <allow own="org.testobj.service"/> 
</policy> 

Relevant documentation.

+1

FYI que necesitaba volver a cargar el servicio dbus (Centos 7): '' 'systemctl reload dbus''' para que esto funcione – Joris

Cuestiones relacionadas