Add support for opening a connection to a remote system bus using ssh (#77)

This commit is contained in:
Jay
2019-11-03 14:21:39 -05:00
committed by Stanislav Angelovič
parent c139110112
commit 099bc857ad
6 changed files with 45 additions and 1 deletions

View File

@ -243,6 +243,15 @@ namespace sdbus {
*/
std::unique_ptr<sdbus::IConnection> createSessionBusConnection(const std::string& name);
/*!
* @brief Creates/opens D-Bus system connection on a remote host using ssh
*
* @param[in] host Name of the host to connect
* @return Connection instance
*
* @throws sdbus::Error in case of failure
*/
std::unique_ptr<sdbus::IConnection> createRemoteSystemBusConnection(const std::string& host);
}
#endif /* SDBUS_CXX_ICONNECTION_H_ */

View File

@ -64,6 +64,21 @@ Connection::Connection(Connection::BusType type, std::unique_ptr<ISdBus>&& inter
loopExitFd_ = createProcessingLoopExitDescriptor();
}
Connection::Connection(const std::string& host, std::unique_ptr<ISdBus> &&interface)
: iface_(std::move(interface))
, busType_(BusType::eRemoteSystem)
, host_(host)
{
assert(iface_ != nullptr);
auto bus = openBus(busType_);
bus_.reset(bus);
finishHandshake(bus);
loopExitFd_ = createProcessingLoopExitDescriptor();
}
Connection::~Connection()
{
leaveProcessingLoop();
@ -294,6 +309,8 @@ sd_bus* Connection::openBus(Connection::BusType type)
r = iface_->sd_bus_open_system(&bus);
else if (type == BusType::eSession)
r = iface_->sd_bus_open_user(&bus);
else if (type == BusType::eRemoteSystem)
r = iface_->sd_bus_open_system_remote(&bus, host_.c_str());
else
assert(false);
@ -449,4 +466,12 @@ std::unique_ptr<sdbus::IConnection> createSessionBusConnection(const std::string
return conn;
}
std::unique_ptr<sdbus::IConnection> createRemoteSystemBusConnection(const std::string& host)
{
auto interface = std::make_unique<sdbus::internal::SdBus>();
assert(interface != nullptr);
return std::make_unique<sdbus::internal::Connection>( host
, std::move(interface));
}
}

View File

@ -46,10 +46,12 @@ namespace sdbus { namespace internal {
enum class BusType
{
eSystem,
eSession
eSession,
eRemoteSystem,
};
Connection(BusType type, std::unique_ptr<ISdBus>&& interface);
Connection(const std::string& host, std::unique_ptr<ISdBus>&& interface);
~Connection() override;
void requestName(const std::string& name) override;
@ -122,6 +124,7 @@ namespace sdbus { namespace internal {
std::thread asyncLoopThread_;
int loopExitFd_{-1};
std::string host_;
};
}}

View File

@ -67,6 +67,7 @@ namespace sdbus { namespace internal {
virtual int sd_bus_open_user(sd_bus **ret) = 0;
virtual int sd_bus_open_system(sd_bus **ret) = 0;
virtual int sd_bus_open_system_remote(sd_bus **ret, const char* host) = 0;
virtual int sd_bus_request_name(sd_bus *bus, const char *name, uint64_t flags) = 0;
virtual int sd_bus_release_name(sd_bus *bus, const char *name) = 0;
virtual int sd_bus_add_object_vtable(sd_bus *bus, sd_bus_slot **slot, const char *path, const char *interface, const sd_bus_vtable *vtable, void *userdata) = 0;

View File

@ -164,6 +164,11 @@ int SdBus::sd_bus_open_system(sd_bus **ret)
return ::sd_bus_open_system(ret);
}
int SdBus::sd_bus_open_system_remote(sd_bus **ret, const char *host)
{
return ::sd_bus_open_system_remote(ret, host);
}
int SdBus::sd_bus_request_name(sd_bus *bus, const char *name, uint64_t flags)
{
std::unique_lock<std::recursive_mutex> lock(sdbusMutex_);

View File

@ -59,6 +59,7 @@ public:
virtual int sd_bus_open_user(sd_bus **ret) override;
virtual int sd_bus_open_system(sd_bus **ret) override;
virtual int sd_bus_open_system_remote(sd_bus **ret, const char* hsot) override;
virtual int sd_bus_request_name(sd_bus *bus, const char *name, uint64_t flags) override;
virtual int sd_bus_release_name(sd_bus *bus, const char *name) override;
virtual int sd_bus_add_object_vtable(sd_bus *bus, sd_bus_slot **slot, const char *path, const char *interface, const sd_bus_vtable *vtable, void *userdata) override;