LINUX.ORG.RU

Использование системной шины DBus

 , , , ,


0

2

Доброго времени суток! Есть необходимость задействовать DBus для связи приложений, запущенных от разных юзверей (root<->user). С sessionBus проблем нет, а вот с systemBus наблюдается очень плохая картина. И то, и другое на Qt.

Прототип сервера:

#include <QtCore/QCoreApplication>
#include <QtDBus/QtDBus>
#include "apserver.h"
#include <QDebug>
#define _NameObject_ "com.wifi.hostapd.ap.server"

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    APServer ServerAP;

    QDBusConnection connection = QDBusConnection::systemBus();
    if(!connection.isConnected())
    {
        qDebug() << "Unconnected. Exit.";
        return -2;
    }

    bool ret = connection.registerService(_NameObject_);
    if(ret)
        qDebug()  << "Registred 1";
    else {
        qDebug() << "Unregistred 1. Exit.";
        return -1;
    }
    ret = connection.registerObject("/", &ServerAP, QDBusConnection::ExportAllSlots);
    if(ret)
        qDebug()  << "Registred 2";
    
    return a.exec();
}
Заголовок класса APServer
#ifndef APSERVER_H
#define APSERVER_H
#include "traffic.h"

class APServer : public Traffic
{
    Q_OBJECT
public:
    APServer();
    
signals:
    
public slots:
    Q_INVOKABLE void test(QString a);
    
};

#endif // APSERVER_H

Прототип клиента:

#include <QtGui/QApplication>
#include "apclient.h"
#include <QDebug>
#include <QtDBus>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    if(!QDBusConnection::systemBus().isConnected()) {
        qDebug() << "Error connection to DBus";
        return 1;
    }

    QDBusInterface iface("com.wifi.hostapd.ap.server", "/", "", QDBusConnection::systemBus());
    iface.call("test", "test from client");

    //APClient w;
    //w.show();
    
    return a.exec();
}

В файле /etc/dbus-1/system.d/com.wifi.hostapd.ap.server.conf сейчас такое содержимое (по образу и подобию skype.conf из того же каталога):

<!DOCTYPE busconfig PUBLIC "-//freedesktop//DTD D-BUS Bus Configuration 1.0//EN"
 "http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd">
<busconfig>

  <!-- ../system.conf have denied everything, so we just punch some holes -->

  <policy context="default">
    <allow own="com.wifi.hostapd.ap.server"/>

    <allow send_destination="com.wifi.hostapd.ap.server"/>
    <allow receive_sender="com.wifi.hostapd.ap.server"/>

    <allow send_path="/"/>
  </policy>

</busconfig>

Результат: тишина. qdbusviewer при попытке обратиться к объекту выдаёт:

Error: Call to object / at com.wifi.hostapd.ap.server: org.freedesktop.DBus.Error.AccessDenied (Rejected send message, 1 matched rules; type=«method_call», sender=":1.72" (uid=1000 pid=19780 comm=«qdbusviewer ») interface=«org.freedesktop.DBus.Introspectable» member=«Introspect» error name="(unset)" requested_reply=«0» destination=«com.wifi.hostapd.ap.server» (uid=1000 pid=18059 comm="./WiFi-Hostapd-AP-Server ")) failed

Система:

1. DBus: D-Bus Message Bus Daemon 1.4.18 Copyright (C) 2002, 2003 Red Hat, Inc., CodeFactory AB, and others This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

2. OS: Ubuntu 12.04.2 x64

3. Qt: версия 4.8.1.

Что посоветуете? Заранее, спасибо!

PS, к сожалению, все примеры в сети только для sessionBus, потому не подходят (да, читал. И по ним же разбирался, что есть что).

Ответ на: комментарий от Pavval

Сменил на

<allow send_path="/com/wifi/hostapd/ap/server"/>

И действительно, qdbusviewer теперь видит методы. Спасибо!

А заодно решил и проблему с вызовам методов из клиента. Оказывается, третий аргумент тоже должен быть указан. Странно, но в примерах этого не делают. Постараюсь до конца разобраться с Qt+DBus и написать об этом где-нибудь. :)

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