检查 D-Bus 对象是不是存在

Posted

技术标签:

【中文标题】检查 D-Bus 对象是不是存在【英文标题】:Check if D-Bus object exists检查 D-Bus 对象是否存在 【发布时间】:2018-03-16 23:18:48 【问题描述】:

我目前正在使用 GDBus 与 ConsoleKit 交谈。我使用 ConsoleKit2 XML 文件和gdbus-codegen 来生成代码。一切正常。但是如何检查对象是否存在?例如我想看看是否有/org/freedesktop/ConsoleKit/Session2(只是一个例子,我知道我可以枚举 Seat 对象中的所有 Session)。

我尝试使用 org.freedesktop.DBus.Peer.Ping 函数,但它会返回

dbus-send --system --print-reply --reply-timeout=2000 --type=method_call --dest=org.freedesktop.DBus /org/freedesktop/ConsoleKit/Seat1  org.freedesktop.DBus.Peer.Ping

Error org.freedesktop.DBus.Error.AccessDenied: Rejected send message, 1 matched rules; type="method_call", sender=":1.168" (uid=1000 pid=18279 comm="dbus-send --system --print-reply --reply-timeout=2") interface="org.freedesktop.DBus.Peer" member="Ping" error name="(unset)" requested_reply="0" destination="org.freedesktop.DBus" (bus)

【问题讨论】:

【参考方案1】:

您有几个选项,按从最喜欢到最不喜欢的顺序列出:

    使用GetSessions()枚举座位对象中的所有会话。 尝试在该会话的对象路径上调用您想要的方法,看看它是否因来自org.freedesktop.DBus.Error 的错误而失败。 在/org/freedesktop/ConsoleKit 上调用Introspect() 方法并解析生成的XML blob 中的<node> 元素以查看当前对象路径层次结构。

第一个选项可能是最容易实现的,也是您打算如何使用 ConsoleKit API。请注意,席位和会话编号不是确定性的,因此您不应仅在代码中硬编码会话对象路径,因为该路径可能会在未来启动时发生变化。

另请注意,正如 ConsoleKit website 所说,ConsoleKit 已被弃用,而应考虑使用 systemd-logind。

【讨论】:

感谢您的帮助。第二个想法也出现在我的脑海中,但我认为它会很丑陋。那么它将是第 1 个。我知道它不是确定性的,我只是以硬编码路径为例。我也知道 logind 是这样做的新方法,我的应用程序的下一步将是登录支持,但是由于某些发行版仍然使用 consolekit(例如 Gentoo Linux 仍然可以使用 Consolekit),我想同时支持这两者。再次感谢您。

以上是关于检查 D-Bus 对象是不是存在的主要内容,如果未能解决你的问题,请参考以下文章

wxPython 检查对象是不是存在

在类的实例化期间如何检查该类的对象是不是已经存在,如果存在,则指向已经存在的对象? [复制]

Firebase 存储安全规则:检查是不是存在另一个对象/检查对象的元数据

检查 JavaScript 对象中是不是存在键?

检查对象中是不是存在键[重复]

检查对象是不是已经存在?