2012-06-23 43 views
8

我编写了一个通过dbus作为会话服务运行的程序。
我想让它作为系统服务运行(创建一个dbus.SystemBus总线名称),如果由root(uid 0)执行的话。
我想运行dbus.SystemBus我目前运行的dbus.SessionBus,但得到一个策略错误。
代码(Python的,但它并不重要),从一切不必要的,我跑清除是这样的: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() 

,并得到:

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 

回答

15

最简单的办法让同去上面的例子是编辑/etc/dbus-1/system.conf和添加下列行:

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

Relevant documentation

+1

我需要重新加载dbus服务(Centos 7):'''systemctl reload dbus''' for this work – Joris