#include <sdbus-c++/sdbus-c++.h>
#include <optional>
#include <string>
#include <vector>
namespace {
// ListUnitsByPatterns(in as states, in as patterns, out a(ssssssouso))
using UnitEntry = sdbus::Struct<
std::string, // 0 name osmo-gbproxy@23142_192.168.250.31.service
std::string, // 1 description
std::string, // 2 load_state loaded / not-found
std::string, // 3 active_state active / inactive / failed
std::string, // 4 sub_state running / dead
std::string, // 5 followed
sdbus::ObjectPath, // 6 object_path
uint32_t, // 7 job_id
std::string, // 8 job_type
sdbus::ObjectPath>; // 9 job_object_path
constexpr char kDest[] = "org.freedesktop.systemd1";
constexpr char kPath[] = "/org/freedesktop/systemd1";
constexpr char kIface[] = "org.freedesktop.systemd1.Manager";
} // namespace
struct LiveInstance {
std::string ip;
uint16_t port;
std::string unit;
};
std::vector<LiveInstance> SystemdCtl::ListActiveInstances() {
std::vector<std::string> states = {"active"};
std::vector<std::string> patterns = {"osmo-gbproxy@*.service"};
std::vector<UnitEntry> raw;
auto method = proxy_->createMethodCall(kIface, "ListUnitsByPatterns");
method << states << patterns;
auto reply = proxy_->callMethod(method);
reply >> raw;
std::vector<LiveInstance> out;
out.reserve(raw.size());
for (const auto& u : raw) {
const std::string& name = u.get<0>();
if (auto parsed = ParseUnitName(name)) {
out.push_back({parsed->ip, parsed->port, name});
} else {
spdlog::warn("unparsable unit name, skipped: {}", name);
}
}
return out;
}