2012-06-23 11 views
8

Ich schrieb ein Programm, das als Session-Service über dbus läuft.
Ich wollte es als System-Service (Erstellen eines dbus.SystemBus-Bus-Namen) laufen lassen, wenn es von root (UID 0) ausgeführt wird.
Ich versuche, für dbus.SystemBus zu laufen, was ich derzeit für dbus.SessionBus ausführen, aber einen Richtlinienfehler erhalten.
Der Code (Python, aber es ist nicht wirklich wichtig), von allem unnötigen gelöscht, ich laufe, ist dies:DBus SystemBus Policies

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() 

und erhalten:

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 

Antwort

15

Der einfachste Weg, mit dem loslegen Beispiel oben ist /etc/dbus-1/system.conf und fügen Sie die folgende Zeile zu bearbeiten:

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

Relevant documentation.

+1

FYI, dass ich den dbus-Dienst (Centos 7) neu laden musste: '' 'systemctl reload dbus''', damit dies funktioniert – Joris