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);
|
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_ */
|
#endif /* SDBUS_CXX_ICONNECTION_H_ */
|
||||||
|
@ -64,6 +64,21 @@ Connection::Connection(Connection::BusType type, std::unique_ptr<ISdBus>&& inter
|
|||||||
loopExitFd_ = createProcessingLoopExitDescriptor();
|
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()
|
Connection::~Connection()
|
||||||
{
|
{
|
||||||
leaveProcessingLoop();
|
leaveProcessingLoop();
|
||||||
@ -294,6 +309,8 @@ sd_bus* Connection::openBus(Connection::BusType type)
|
|||||||
r = iface_->sd_bus_open_system(&bus);
|
r = iface_->sd_bus_open_system(&bus);
|
||||||
else if (type == BusType::eSession)
|
else if (type == BusType::eSession)
|
||||||
r = iface_->sd_bus_open_user(&bus);
|
r = iface_->sd_bus_open_user(&bus);
|
||||||
|
else if (type == BusType::eRemoteSystem)
|
||||||
|
r = iface_->sd_bus_open_system_remote(&bus, host_.c_str());
|
||||||
else
|
else
|
||||||
assert(false);
|
assert(false);
|
||||||
|
|
||||||
@ -449,4 +466,12 @@ std::unique_ptr<sdbus::IConnection> createSessionBusConnection(const std::string
|
|||||||
return conn;
|
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
|
enum class BusType
|
||||||
{
|
{
|
||||||
eSystem,
|
eSystem,
|
||||||
eSession
|
eSession,
|
||||||
|
eRemoteSystem,
|
||||||
};
|
};
|
||||||
|
|
||||||
Connection(BusType type, std::unique_ptr<ISdBus>&& interface);
|
Connection(BusType type, std::unique_ptr<ISdBus>&& interface);
|
||||||
|
Connection(const std::string& host, std::unique_ptr<ISdBus>&& interface);
|
||||||
~Connection() override;
|
~Connection() override;
|
||||||
|
|
||||||
void requestName(const std::string& name) override;
|
void requestName(const std::string& name) override;
|
||||||
@ -122,6 +124,7 @@ namespace sdbus { namespace internal {
|
|||||||
|
|
||||||
std::thread asyncLoopThread_;
|
std::thread asyncLoopThread_;
|
||||||
int loopExitFd_{-1};
|
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_user(sd_bus **ret) = 0;
|
||||||
virtual int sd_bus_open_system(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_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_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;
|
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);
|
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)
|
int SdBus::sd_bus_request_name(sd_bus *bus, const char *name, uint64_t flags)
|
||||||
{
|
{
|
||||||
std::unique_lock<std::recursive_mutex> lock(sdbusMutex_);
|
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_user(sd_bus **ret) override;
|
||||||
virtual int sd_bus_open_system(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_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_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;
|
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