forked from Kistler-Group/sdbus-cpp
Add support for opening a connection to a remote system bus using ssh (#77)
This commit is contained in:
@ -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_ */
|
||||
|
@ -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));
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -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_;
|
||||
};
|
||||
|
||||
}}
|
||||
|
@ -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;
|
||||
|
@ -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_);
|
||||
|
@ -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;
|
||||
|
Reference in New Issue
Block a user