Загрузка данных


#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;
}