LINUX.ORG.RU

Отладка DBus — как это вообще делают?

 , , ,


1

1

Понадобилось отладить немного нестандартную конфигурацию dbus. Полез гуглить, все примеры какие-то дико перегруженные. Можно ведь сделать простой чат на dbus-monitor и dbus-send? Как это проще всего сделать?
Суть: на одной машине запускается dbus-daemon, слушающий определённый TCP-порт. К нему с других машин могут подключаться dbus-monitor'ы, чтобы получать сообщения и dbus-send'ы, чтобы отправить сообщения. Как это должно работать? Или я что-то делаю не так?

★★★★★

пишется на любом скриптовом языке простой сервис, где описываются сигналы и методы (я делал на perl) далее это регистрируется в dbus двумя файлами service и conf (права). все.

anonymous2 ★★★★★
()
dbus-monitor --address tcp:host=X.X.X.X,port=Y

Адрес указывается без пробелов. host можно указать имя или ip, port номер порта, который слушает демон.

BRE ★★
()
Ответ на: комментарий от BRE

А как при этом запускать демон? Уже кучу конфигов перепробовал, почему-то с сетью ничего не получается, локально через сокеты работает нормально.
Но я так полагаю, это не совсем то, что мне нужно. Мне нужно запустить шины session и system на удалённой машине на tcp:host=localhost,port=Y. А потом на других машинах установить DBUS_SESSION_BUS_ADDRESS и DBUS_SYSTEM_BUS_ADDRESS.
Но это не так важно, сначала нужно заставить это работать хоть как-то.

CYB3R ★★★★★
() автор топика

Мне bustle нравится.

invy ★★★★★
()
Ответ на: комментарий от CYB3R

Я запускаю еще одну шину со своим конфигом и к ней уже подключаются все сервисы комплекса.

Если нужно запустить системную и сесионную шины, то можно попробовать в их конфиги добавить следующий строки:

  <allow_anonymous/>
  <listen>tcp:host=localhost,port=45555</listen>

BRE ★★
()
Последнее исправление: BRE (всего исправлений: 1)
Ответ на: комментарий от BRE

Сейчас в свой session.conf добавил следующее:

  <listen>tcp:host=localhost,bind=*,port=45555,family=ipv4</listen> 
  <listen>unix:tmpdir=/tmp</listen>

  <auth>EXTERNAL</auth>
  <auth>ANONYMOUS</auth>

  <allow_anonymous/>
Почему-то без bind и family это не работает.
После этого запустил dbus-launch и получил следующий вывод:
DBUS_SESSION_BUS_ADDRESS=unix:abstract=/tmp/dbus-Odxlmjtoww,guid=7e433cd7f13c1bdee2047cdd58983807;tcp:host=localhost,port=45555,family=ipv4,guid=2837a07e8b09373684d9732258983807
DBUS_SESSION_BUS_PID=716
После этого я смог запустить на другой машине:
DBUS_SESSION_BUS_ADDRESS=tcp:host=otherhost,port=45555,family=ipv4,guid=2837a07e8b09373684d9732258983807 ./gdbus-demo-server
и
DBUS_SESSION_BUS_ADDRESS=tcp:host=otherhost,port=45555,family=ipv4,guid=2837a07e8b09373684d9732258983807 ./gdbus-demo-client
И они прекрасно заработали! Проблема только в том, что обязательно нужно как-то получить этот guid, а куда он попадает при старте системы, я не представляю.

CYB3R ★★★★★
() автор топика
Ответ на: комментарий от CYB3R

Попробуй вначале запустить отдельную шину и подключаться к ней. Вот рабочий конфиг (переделал из session.conf):

<!-- This configuration file controls the per-user-login-session message bus.
     Add a session-local.conf and edit that rather than changing this 
     file directly. -->

<!DOCTYPE busconfig PUBLIC "-//freedesktop//DTD D-Bus Bus Configuration 1.0//EN"
 "http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd">
<busconfig>
  <!-- Our well-known bus type, don't change this -->
  <type>complex</type>

  <!-- If we fork, keep the user's original umask to avoid affecting
       the behavior of child processes. -->
  <keep_umask/>

  <allow_anonymous/>

  <listen>tcp:host=localhost,port=5000</listen>

  <standard_session_servicedirs />

  <policy context="default">
    <!-- Allow everything to be sent -->
    <allow send_destination="*" eavesdrop="true"/>
    <!-- Allow everything to be received -->
    <allow eavesdrop="true"/>
    <!-- Allow anyone to own anything -->
    <allow own="*"/>
  </policy>

  <include if_selinux_enabled="yes" selinux_root_relative="yes">contexts/dbus_contexts</include>

  <!-- the memory limits are 1G instead of say 4G because they can't exceed 32-bit signed int max -->
  <limit name="max_incoming_bytes">1000000000</limit>
  <limit name="max_incoming_unix_fds">250000000</limit>
  <limit name="max_outgoing_bytes">1000000000</limit>
  <limit name="max_outgoing_unix_fds">250000000</limit>
  <limit name="max_message_size">1000000000</limit>
  <!-- We do not override max_message_unix_fds here since the in-kernel
       limit is also relatively low -->
  <limit name="service_start_timeout">120000</limit>  
  <limit name="auth_timeout">240000</limit>
  <limit name="pending_fd_timeout">150000</limit>
  <limit name="max_completed_connections">100000</limit>  
  <limit name="max_incomplete_connections">10000</limit>
  <limit name="max_connections_per_user">100000</limit>
  <limit name="max_pending_service_starts">10000</limit>
  <limit name="max_names_per_connection">50000</limit>
  <limit name="max_match_rules_per_connection">50000</limit>
  <limit name="max_replies_per_connection">50000</limit>

</busconfig>

Запускаю шину так:

dbus-daemon --config-file complex.conf --fork

Если так будет работать без guid, то разбираться с тонкостями системных шин.

BRE ★★
()
Последнее исправление: BRE (всего исправлений: 1)
Ответ на: комментарий от BRE

Без bind и family у меня этот конфиг вообще не работает, с ними клиент и сервер пишут следующее:

(process:28050): GLib-GIO-WARNING **: Problems looking up entry in keyring: Error opening keyring '~/.dbus-keyrings/org_freedesktop_general' for reading: Failed to open file '~/.dbus-keyrings/org_freedesktop_general': No such file or directory

CYB3R ★★★★★
() автор топика
Ответ на: комментарий от CYB3R

Добавил ещё <auth>ANONYMOUS</auth> и всё заработало! Даже без всяких guid.

CYB3R ★★★★★
() автор топика
Ответ на: комментарий от BRE

Действительно странно, так как у меня тоже арч.

CYB3R ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.