mirror of
https://github.com/swift-project/pilotclient.git
synced 2026-04-17 19:05:31 +08:00
Launch shipped dbus-daemon if first connection attempt was unsuccessful
This commit is contained in:
committed by
Mathew Sutcliffe
parent
c14c25d278
commit
6ff9df5c05
80
share/dbus-1/session.conf
Normal file
80
share/dbus-1/session.conf
Normal file
@@ -0,0 +1,80 @@
|
|||||||
|
<!-- 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>session</type>
|
||||||
|
|
||||||
|
<!-- If we fork, keep the user's original umask to avoid affecting
|
||||||
|
the behavior of child processes. -->
|
||||||
|
<keep_umask/>
|
||||||
|
|
||||||
|
<listen>autolaunch:</listen>
|
||||||
|
|
||||||
|
<!-- On Unix systems, the most secure authentication mechanism is
|
||||||
|
EXTERNAL, which uses credential-passing over Unix sockets.
|
||||||
|
|
||||||
|
This authentication mechanism is not available on Windows,
|
||||||
|
is not suitable for use with the tcp: or nonce-tcp: transports,
|
||||||
|
and will not work on obscure flavours of Unix that do not have
|
||||||
|
a supported credentials-passing mechanism. On those platforms/transports,
|
||||||
|
comment out the <auth> element to allow fallback to DBUS_COOKIE_SHA1. -->
|
||||||
|
<!--<auth>EXTERNAL</auth>-->
|
||||||
|
|
||||||
|
<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 legacy configuration location -->
|
||||||
|
<include ignore_missing="yes">../../etc/dbus-1/session.conf</include>
|
||||||
|
|
||||||
|
<!-- Config files are placed here that among other things,
|
||||||
|
further restrict the above policy for specific services. -->
|
||||||
|
<includedir>session.d</includedir>
|
||||||
|
|
||||||
|
<includedir>../../etc/dbus-1/session.d</includedir>
|
||||||
|
|
||||||
|
<!-- This is included last so local configuration can override what's
|
||||||
|
in this standard file -->
|
||||||
|
<include ignore_missing="yes">../../etc/dbus-1/session-local.conf</include>
|
||||||
|
|
||||||
|
<include if_selinux_enabled="yes" selinux_root_relative="yes">contexts/dbus_contexts</include>
|
||||||
|
|
||||||
|
<!-- For the session bus, override the default relatively-low limits
|
||||||
|
with essentially infinite limits, since the bus is just running
|
||||||
|
as the user anyway, using up bus resources is not something we need
|
||||||
|
to worry about. In some cases, we do set the limits lower than
|
||||||
|
"all available memory" if exceeding the limit is almost certainly a bug,
|
||||||
|
having the bus enforce a limit is nicer than a huge memory leak. But the
|
||||||
|
intent is that these limits should never be hit. -->
|
||||||
|
|
||||||
|
<!-- 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>
|
||||||
@@ -10,7 +10,7 @@
|
|||||||
#include "blackmisc/logmessage.h"
|
#include "blackmisc/logmessage.h"
|
||||||
#include "blackmisc/network/networkutils.h"
|
#include "blackmisc/network/networkutils.h"
|
||||||
#include "dbus_server.h"
|
#include "dbus_server.h"
|
||||||
#include <QDebug>
|
#include <QProcess>
|
||||||
#include <QMetaClassInfo>
|
#include <QMetaClassInfo>
|
||||||
|
|
||||||
using namespace BlackMisc;
|
using namespace BlackMisc;
|
||||||
@@ -35,6 +35,12 @@ namespace BlackCore
|
|||||||
// we use a session bus connection instead of a real P2P connection
|
// we use a session bus connection instead of a real P2P connection
|
||||||
this->m_serverMode = CDBusServer::SERVERMODE_SESSIONBUS;
|
this->m_serverMode = CDBusServer::SERVERMODE_SESSIONBUS;
|
||||||
QDBusConnection connection = QDBusConnection::connectToBus(QDBusConnection::SessionBus, ServiceName());
|
QDBusConnection connection = QDBusConnection::connectToBus(QDBusConnection::SessionBus, ServiceName());
|
||||||
|
if (!connection.isConnected())
|
||||||
|
{
|
||||||
|
launchDbusDaemon();
|
||||||
|
connection = QDBusConnection::connectToBus(QDBusConnection::SessionBus, ServiceName());
|
||||||
|
}
|
||||||
|
|
||||||
if (!connection.registerService(service))
|
if (!connection.registerService(service))
|
||||||
{
|
{
|
||||||
// registration fails can either mean something wrong with DBus or service already exists
|
// registration fails can either mean something wrong with DBus or service already exists
|
||||||
@@ -48,6 +54,12 @@ namespace BlackCore
|
|||||||
// we use a system bus connection instead of a real P2P connection
|
// we use a system bus connection instead of a real P2P connection
|
||||||
this->m_serverMode = CDBusServer::SERVERMODE_SYSTEMBUS;
|
this->m_serverMode = CDBusServer::SERVERMODE_SYSTEMBUS;
|
||||||
QDBusConnection connection = QDBusConnection::systemBus();
|
QDBusConnection connection = QDBusConnection::systemBus();
|
||||||
|
if (!connection.isConnected())
|
||||||
|
{
|
||||||
|
launchDbusDaemon();
|
||||||
|
connection = QDBusConnection::systemBus();
|
||||||
|
}
|
||||||
|
|
||||||
if (!connection.registerService(service))
|
if (!connection.registerService(service))
|
||||||
{
|
{
|
||||||
// registration fails can either mean something wrong with DBus or service already exists
|
// registration fails can either mean something wrong with DBus or service already exists
|
||||||
@@ -91,6 +103,14 @@ namespace BlackCore
|
|||||||
return sn;
|
return sn;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CDBusServer::launchDbusDaemon()
|
||||||
|
{
|
||||||
|
const QString program = QStringLiteral("dbus-daemon");
|
||||||
|
const QStringList arguments = { QStringLiteral("--config-file=../share/dbus-1/session.conf") };
|
||||||
|
bool success = QProcess::startDetached(program, arguments);
|
||||||
|
if (!success) { CLogMessage(this).warning("Failed to launch dbus-daemon!"); }
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Check for P2P address
|
* Check for P2P address
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -113,6 +113,9 @@ namespace BlackCore
|
|||||||
QMap<QString, QObject *> m_objects; //!< Mapping of all exposed objects, for P2P registration when connection establishes, also to later unregister objects
|
QMap<QString, QObject *> m_objects; //!< Mapping of all exposed objects, for P2P registration when connection establishes, also to later unregister objects
|
||||||
QMap<QString, QDBusConnection> m_DBusConnections; //!< Mapping of all DBusConnection objects
|
QMap<QString, QDBusConnection> m_DBusConnections; //!< Mapping of all DBusConnection objects
|
||||||
|
|
||||||
|
//! Manually launch our shipped dbus daemon
|
||||||
|
void launchDbusDaemon();
|
||||||
|
|
||||||
//! Check if address means a real server with P2P connection
|
//! Check if address means a real server with P2P connection
|
||||||
static bool isP2P(const QString &address);
|
static bool isP2P(const QString &address);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user