Проверьте, существует ли объект D-Bus

В настоящее время я разговариваю с ConsoleKit с GDBus. Я использовал XML-файлы ConsoleKit2 и gdbus-codegen сгенерировать код. Все работает нормально. Но как я могу проверить, существует ли объект? Например, я хочу посмотреть, есть ли /org/freedesktop/ConsoleKit/Session2 (просто пример, я знаю, что могу перечислить все сеансы в объекте Seat).

Я пытался использовать 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 ответ

Решение

У вас есть несколько вариантов, перечисленных в порядке от наиболее предпочтительного до наименее предпочтительного:

  1. Перечислите все сеансы в объекте seat, используя GetSessions(),
  2. Попробуйте вызвать метод, который вы хотите на пути к объекту этого сеанса и посмотреть, если это не с ошибкой из org.freedesktop.DBus.Error,
  3. Позвоните Introspect() метод на /org/freedesktop/ConsoleKit и разобрать <node> элементы из получившегося блоба XML, чтобы увидеть текущую иерархию пути объекта.

Первый вариант, вероятно, самый простой для реализации, и он предназначен для использования API-интерфейса ConsoleKit. Обратите внимание, что нумерация мест и сеансов не является детерминированной, поэтому вам не следует просто жестко кодировать путь объекта сеанса в своем коде, так как этот путь может измениться в будущих загрузках.

Также обратите внимание, что, как говорится на веб-сайте ConsoleKit, ConsoleKit не рекомендуется в пользу systemd-logind, который вы должны использовать вместо этого.

Другие вопросы по тегам