blob: a8194bac2c02f70f184a450e06c4d9ecca420a4a [file] [log] [blame]
#include "managed_store_serialization.h"
#include <cerrno>
#include <cstddef>
#include <cstdint>
#include <cstring>
#include <filesystem>
#include <fstream>
#include <ios>
#include <iterator>
#include <optional>
#include <string>
#include <tuple>
#include <utility>
#include <variant>
#include <vector>
#include "nlohmann/json.hpp"
#include "dbus_utility.hpp" // NOLINT
#include "async_resp.hpp" // NOLINT
#include "http_request.hpp" // NOLINT
#include "sdbusplus/message/native_types.hpp"
namespace serialize {
using dbus::utility::DbusVariantType;
using dbus::utility::MapperGetObject;
using dbus::utility::MapperGetSubTreePathsResponse;
using dbus::utility::MapperGetSubTreeResponse;
using dbus::utility::MapperServiceMap;
using dbus::utility::SystemdListUnits;
using dbus::utility::SystemdUnitStruct;
enum class Serialize : uint8_t {
string_type,
int64_t_type,
uint64_t_type,
double_type,
int32_t_type,
uint32_t_type,
uint16_t_type,
int16_t_type,
uint8_t_type,
bool_type,
size_t_type,
iter_type,
tup_type
};
static std::string SerializeToString(enum Serialize in) {
switch (in) {
case Serialize::string_type:
return "string";
case Serialize::int64_t_type:
return "int64_t";
case Serialize::uint64_t_type:
return "uint64_t";
case Serialize::double_type:
return "double";
case Serialize::int32_t_type:
return "int32_t";
case Serialize::uint32_t_type:
return "uint32_t";
case Serialize::uint16_t_type:
return "uint16_t";
case Serialize::int16_t_type:
return "int16_t";
case Serialize::uint8_t_type:
return "uint8_t";
case Serialize::bool_type:
return "bool";
case Serialize::size_t_type:
return "size_t";
case Serialize::iter_type:
return "iter_type";
case Serialize::tup_type:
return "tup";
default:
BMCWEB_LOG_STATEFUL_DEBUG << "unable to serialize enum value ";
return "unknown";
}
}
template <typename T>
nlohmann::json iterate_serialize(const std::vector<T>& in) {
nlohmann::json arr = nlohmann::json::array();
for (auto& itor : in) {
DbusVariantType temp = itor;
arr.push_back(Serialize(temp));
}
return arr;
}
nlohmann::json Serialize(const DbusVariantType& v) {
nlohmann::json j;
if (const std::string* pval = std::get_if<std::string>(&v)) {
j["type"] = "string";
j["val"] = *pval;
return j;
}
if (const int64_t* pval = std::get_if<int64_t>(&v)) {
j["type"] = SerializeToString(Serialize::int64_t_type);
j["val"] = *pval;
return j;
}
if (const uint64_t* pval = std::get_if<uint64_t>(&v)) {
j["type"] = SerializeToString(Serialize::uint64_t_type);
j["val"] = *pval;
return j;
}
if (const double* pval = std::get_if<double>(&v)) {
j["type"] = SerializeToString(Serialize::double_type);
j["val"] = *pval;
return j;
}
if (const int32_t* pval = std::get_if<int32_t>(&v)) {
j["type"] = SerializeToString(Serialize::int32_t_type);
j["val"] = *pval;
return j;
}
if (const uint32_t* pval = std::get_if<uint32_t>(&v)) {
j["type"] = SerializeToString(Serialize::uint32_t_type);
j["val"] = *pval;
return j;
}
if (const uint16_t* pval = std::get_if<uint16_t>(&v)) {
j["type"] = SerializeToString(Serialize::uint16_t_type);
j["val"] = *pval;
return j;
}
if (const int16_t* pval = std::get_if<int16_t>(&v)) {
j["type"] = SerializeToString(Serialize::int16_t_type);
j["val"] = *pval;
return j;
}
if (const uint8_t* pval = std::get_if<uint8_t>(&v)) {
j["type"] = SerializeToString(Serialize::uint8_t_type);
j["val"] = *pval;
return j;
}
if (const bool* pval = std::get_if<bool>(&v)) {
j["type"] = SerializeToString(Serialize::bool_type);
j["val"] = *pval;
return j;
}
if (const size_t* pval = std::get_if<size_t>(&v)) {
j["type"] = SerializeToString(Serialize::size_t_type);
j["val"] = *pval;
return j;
}
if (const std::vector<std::tuple<std::string, std::string, std::string>>* t =
std::get_if<
std::vector<std::tuple<std::string, std::string, std::string>>>(
&v)) {
j["type"] = SerializeToString(Serialize::iter_type);
j["iterType"] = "v_t_s_s_s";
j["val"] = iterate_serialize(*t);
return j;
}
if (const std::vector<std::string>* t =
std::get_if<std::vector<std::string>>(&v)) {
j["type"] = SerializeToString(Serialize::iter_type);
j["iterType"] = "v_s";
j["val"] = iterate_serialize(*t);
return j;
}
if (const std::vector<double>* t = std::get_if<std::vector<double>>(&v)) {
j["type"] = SerializeToString(Serialize::iter_type);
j["iterType"] = "v_d";
j["val"] = iterate_serialize(*t);
return j;
}
if (const std::vector<uint32_t>* t = std::get_if<std::vector<uint32_t>>(&v)) {
j["type"] = SerializeToString(Serialize::iter_type);
j["iterType"] = "v_u32";
j["val"] = iterate_serialize(*t);
return j;
}
if (const std::vector<uint16_t>* t = std::get_if<std::vector<uint16_t>>(&v)) {
j["type"] = SerializeToString(Serialize::iter_type);
j["iterType"] = "v_u16";
j["val"] = iterate_serialize(*t);
return j;
}
if (const std::vector<std::tuple<std::string, std::string>>* t =
std::get_if<std::vector<std::tuple<std::string, std::string>>>(&v)) {
j["type"] = SerializeToString(Serialize::iter_type);
j["iterType"] = "v_t_s_s";
j["val"] = iterate_serialize(*t);
return j;
}
if (const std::vector<std::tuple<uint32_t, std::vector<uint32_t>>>* t =
std::get_if<std::vector<std::tuple<uint32_t, std::vector<uint32_t>>>>(
&v)) {
j["type"] = SerializeToString(Serialize::iter_type);
;
j["iterType"] = "v_t_u32_v_u32";
j["val"] = iterate_serialize(*t);
return j;
}
if (const std::vector<std::tuple<uint32_t, size_t>>* t =
std::get_if<std::vector<std::tuple<uint32_t, size_t>>>(&v)) {
j["type"] = SerializeToString(Serialize::iter_type);
;
j["iterType"] = "v_t_u32_size";
j["val"] = iterate_serialize(*t);
return j;
}
if (const std::tuple<std::string, std::string, std::string>* t =
std::get_if<std::tuple<std::string, std::string, std::string>>(&v)) {
j["type"] = SerializeToString(Serialize::tup_type);
j["iterType"] = "t_s_s_s";
nlohmann::json arr = nlohmann::json::array();
DbusVariantType tmp_var = std::get<0>(*t);
arr.push_back(Serialize(tmp_var));
tmp_var = std::get<1>(*t);
arr.push_back(Serialize(tmp_var));
tmp_var = std::get<2>(*t);
arr.push_back(Serialize(tmp_var));
j["val"] = arr;
return j;
}
if (const std::tuple<std::string, std::string>* t =
std::get_if<std::tuple<std::string, std::string>>(&v)) {
j["type"] = SerializeToString(Serialize::tup_type);
j["iterType"] = "t_s_s";
nlohmann::json arr = nlohmann::json::array();
DbusVariantType tmp_var = std::get<0>(*t);
arr.push_back(Serialize(tmp_var));
tmp_var = std::get<1>(*t);
arr.push_back(Serialize(tmp_var));
j["val"] = arr;
return j;
}
if (const std::tuple<uint32_t, std::vector<uint32_t>>* t =
std::get_if<std::tuple<uint32_t, std::vector<uint32_t>>>(&v)) {
j["type"] = SerializeToString(Serialize::tup_type);
;
j["iterType"] = "t_u32_v_u32";
nlohmann::json arr = nlohmann::json::array();
DbusVariantType tmp_var = std::get<0>(*t);
arr.push_back(Serialize(tmp_var));
tmp_var = std::get<1>(*t);
arr.push_back(Serialize(tmp_var));
j["val"] = arr;
return j;
}
/*
* TODO deal with sdbusplus::message::object_path,and size_t
*/
BMCWEB_LOG_STATEFUL_DEBUG << "unable to serialize DbusVariantType, index "
<< v.index();
return j;
}
inline DbusVariantType DeserializeIter(nlohmann::json::reference j,
const std::string& type) {
if (type == "v_t_s_s_s") {
std::vector<std::tuple<std::string, std::string, std::string>> vec;
for (nlohmann::json::iterator itor = j.begin(); itor != j.end(); itor++) {
DbusVariantType tmp = Deserialize(*itor);
if (const std::tuple<std::string, std::string, std::string>* pval =
std::get_if<std::tuple<std::string, std::string, std::string>>(
&tmp)) {
vec.push_back(*pval);
} else {
BMCWEB_LOG_STATEFUL_DEBUG
<< "unable to deserialize vector tuple string string string";
}
}
return vec;
}
if (type == "v_s") {
std::vector<std::string> vec;
for (nlohmann::json::iterator itor = j.begin(); itor != j.end(); itor++) {
DbusVariantType tmp = Deserialize(*itor);
if (const std::string* pval = std::get_if<std::string>(&tmp)) {
vec.push_back(*pval);
} else {
BMCWEB_LOG_STATEFUL_DEBUG << "unable to deserialize vector of string";
}
}
return vec;
}
if (type == "v_d") {
std::vector<double> vec;
for (nlohmann::json::iterator itor = j.begin(); itor != j.end(); itor++) {
DbusVariantType tmp = Deserialize(*itor);
if (const double* pval = std::get_if<double>(&tmp)) {
vec.push_back(*pval);
} else {
BMCWEB_LOG_STATEFUL_DEBUG << "unable to deserialize vector double";
}
}
return vec;
}
if (type == "v_u32") {
std::vector<uint32_t> vec;
for (nlohmann::json::iterator itor = j.begin(); itor != j.end(); itor++) {
DbusVariantType tmp = Deserialize(*itor);
if (const std::uint32_t* pval = std::get_if<uint32_t>(&tmp)) {
vec.push_back(*pval);
} else {
BMCWEB_LOG_STATEFUL_DEBUG << "unable to deserialize vector u32";
}
}
return vec;
}
if (type == "v_u16") {
std::vector<uint16_t> vec;
for (nlohmann::json::iterator itor = j.begin(); itor != j.end(); itor++) {
DbusVariantType tmp = Deserialize(*itor);
if (const std::uint16_t* pval = std::get_if<uint16_t>(&tmp)) {
vec.push_back(*pval);
} else {
BMCWEB_LOG_STATEFUL_DEBUG << "unable to deserialize vector u16";
}
}
return vec;
}
if (type == "v_t_s_s") {
std::vector<std::tuple<std::string, std::string>> vec;
for (nlohmann::json::iterator itor = j.begin(); itor != j.end(); itor++) {
DbusVariantType tmp = Deserialize(*itor);
if (const std::tuple<std::string, std::string>* pval =
std::get_if<std::tuple<std::string, std::string>>(&tmp)) {
vec.push_back(*pval);
} else {
BMCWEB_LOG_STATEFUL_DEBUG
<< "unable to deserialize vector tuple string string";
}
}
return vec;
}
if (type == "v_t_u32_v_u32") {
std::vector<std::tuple<uint32_t, std::vector<uint32_t>>> vec;
for (nlohmann::json::iterator itor = j.begin(); itor != j.end(); itor++) {
DbusVariantType tmp = Deserialize(*itor);
if (const std::tuple<uint32_t, std::vector<uint32_t>>* pval =
std::get_if<std::tuple<uint32_t, std::vector<uint32_t>>>(&tmp)) {
vec.push_back(*pval);
} else {
BMCWEB_LOG_STATEFUL_DEBUG
<< "unable to deserialize vector tuple uint32 vector uint32";
}
}
return vec;
}
if (type == "v_t_u32_size") {
std::vector<std::tuple<uint32_t, size_t>> vec;
for (nlohmann::json::iterator itor = j.begin(); itor != j.end(); itor++) {
DbusVariantType tmp = Deserialize(*itor);
if (const std::tuple<uint32_t, size_t>* pval =
std::get_if<std::tuple<uint32_t, size_t>>(&tmp)) {
vec.push_back(*pval);
} else {
BMCWEB_LOG_STATEFUL_DEBUG << "unable to deserialize vector uint32 size";
}
}
return vec;
}
BMCWEB_LOG_STATEFUL_DEBUG << "deserialize: unknown iter type, iterType: "
<< type;
return {};
}
inline DbusVariantType DeserializeTup(nlohmann::json::reference j,
const std::string& type) {
if (type == "t_s_s") {
std::tuple<std::string, std::string> tup;
DbusVariantType tmp = Deserialize(j[0]);
if (const std::string* pval = std::get_if<std::string>(&tmp)) {
std::get<0>(tup) = *pval;
} else {
BMCWEB_LOG_ERROR << "Unable to derizlize tup t_s_s 0";
}
tmp = Deserialize(j[1]);
if (const std::string* pval = std::get_if<std::string>(&tmp)) {
std::get<1>(tup) = *pval;
} else {
BMCWEB_LOG_ERROR << "Unable to derizlize tup t_s_s 1";
}
return tup;
}
if (type == "t_s_s_s") {
std::tuple<std::string, std::string, std::string> tup;
DbusVariantType tmp = Deserialize(j[0]);
if (const std::string* pval = std::get_if<std::string>(&tmp)) {
std::get<0>(tup) = *pval;
} else {
BMCWEB_LOG_ERROR << "Unable to derizlize up t_s_s_s 0";
}
tmp = Deserialize(j[1]);
if (const std::string* pval = std::get_if<std::string>(&tmp)) {
std::get<1>(tup) = *pval;
} else {
BMCWEB_LOG_ERROR << "Unable to derizlize up t_s_s_s 1";
}
tmp = Deserialize(j[2]);
if (const std::string* pval = std::get_if<std::string>(&tmp)) {
std::get<2>(tup) = *pval;
} else {
BMCWEB_LOG_ERROR << "Unable to derizlize up t_s_s_s 2";
}
return tup;
}
if (type == "t_u32_v_u32") {
std::tuple<uint32_t, std::vector<uint32_t>> tup;
DbusVariantType tmp = Deserialize(j[0]);
if (const uint32_t* pval = std::get_if<uint32_t>(&tmp)) {
std::get<0>(tup) = *pval;
} else {
BMCWEB_LOG_ERROR << "Unable to derizlize tup t_u32_v_u32 0";
}
tmp = Deserialize(j[1]);
if (const std::vector<uint32_t>* pval =
std::get_if<std::vector<uint32_t>>(&tmp)) {
std::get<1>(tup) = *pval;
} else {
BMCWEB_LOG_ERROR << "Unable to derizlize tup t_u32_v_u32 2";
}
return tup;
}
BMCWEB_LOG_STATEFUL_DEBUG << "deserialize: unknown tuple type, iterType: "
<< type;
return {};
}
DbusVariantType Deserialize(nlohmann::json::reference j) {
try {
std::string vtype = j["type"];
BMCWEB_LOG_STATEFUL_DEBUG << "deserialize: vtype: ";
BMCWEB_LOG_STATEFUL_DEBUG << vtype;
if (vtype == SerializeToString(Serialize::string_type)) {
std::string r = j["val"];
return {r};
}
if (vtype == SerializeToString(Serialize::int64_t_type)) {
int64_t r = j["val"];
return {r};
}
if (vtype == SerializeToString(Serialize::uint64_t_type)) {
uint64_t r = j["val"];
return {r};
}
if (vtype == SerializeToString(Serialize::double_type)) {
if (j["val"].is_null()) {
return {0.0};
}
double r = j["val"];
return {r};
}
if (vtype == SerializeToString(Serialize::int32_t_type)) {
int32_t r = j["val"];
return {r};
}
if (vtype == SerializeToString(Serialize::uint32_t_type)) {
uint32_t r = j["val"];
return {r};
}
if (vtype == SerializeToString(Serialize::int16_t_type)) {
int16_t r = j["val"];
return {r};
}
if (vtype == SerializeToString(Serialize::uint16_t_type)) {
uint16_t r = j["val"];
return {r};
}
if (vtype == SerializeToString(Serialize::uint8_t_type)) {
uint8_t r = j["val"];
return {r};
}
if (vtype == SerializeToString(Serialize::bool_type)) {
bool r = j["val"];
return {r};
}
if (vtype == SerializeToString(Serialize::size_t_type)) {
size_t r = j["val"];
return {r};
}
if (vtype == SerializeToString(Serialize::iter_type)) {
nlohmann::json::reference ref = j["val"];
std::string iter_type = j["iterType"];
DbusVariantType r = DeserializeIter(ref, iter_type);
return r;
}
if (vtype == SerializeToString(Serialize::tup_type)) {
nlohmann::json::reference ref = j["val"];
std::string iter_type = j["iterType"];
DbusVariantType r = DeserializeTup(ref, iter_type);
return r;
}
BMCWEB_LOG_STATEFUL_DEBUG << "deserialize: unknown Type: " << vtype;
return {};
} catch (...) {
BMCWEB_LOG_STATEFUL_DEBUG << "deserialize: catch ";
return {};
}
}
using DBusPropertiesMap = std::vector<std::pair<std::string, DbusVariantType>>;
using DBusInteracesMap = std::vector<std::pair<std::string, DBusPropertiesMap>>;
using ManagedObjectType =
std::vector<std::pair<sdbusplus::message::object_path, DBusInteracesMap>>;
nlohmann::json SerializePropMap(DBusPropertiesMap& in) {
nlohmann::json j;
j["type"] = "PropMap";
nlohmann::json arr = nlohmann::json::array();
for (DBusPropertiesMap::iterator itor = in.begin(); itor != in.end();
itor++) {
nlohmann::json tmp;
tmp["string"] = itor->first;
DbusVariantType var = itor->second;
tmp["val"] = Serialize(var);
arr.push_back(tmp);
}
j["val"] = arr;
return j;
}
DBusPropertiesMap DeserializePropMap(nlohmann::json::reference j) {
BMCWEB_LOG_STATEFUL_DEBUG << "deserialize propMap" << j.dump();
DBusPropertiesMap ret;
nlohmann::json::reference val = j["val"];
for (nlohmann::json::iterator itor = val.begin(); itor != val.end(); itor++) {
nlohmann::json::reference innerval = (*itor)["val"];
DbusVariantType tmp_variant = Deserialize(innerval);
std::pair<std::string, DbusVariantType> tmp = {(*itor)["string"],
tmp_variant};
ret.push_back(tmp);
}
return ret;
}
nlohmann::json SerializeInterfaceMap(DBusInteracesMap& in) {
nlohmann::json j;
j["type"] = "interaceMap";
nlohmann::json arr = nlohmann::json::array();
for (DBusInteracesMap::iterator itor = in.begin(); itor != in.end(); itor++) {
nlohmann::json tmp;
tmp["string"] = itor->first;
tmp["val"] = SerializePropMap(itor->second);
arr.push_back(tmp);
}
j["val"] = arr;
return j;
}
DBusInteracesMap DeserializeInterfaceMap(nlohmann::json::reference& j) {
DBusInteracesMap ret;
nlohmann::json::reference val = j["val"];
for (nlohmann::json::iterator itor = val.begin(); itor != val.end(); itor++) {
nlohmann::json::reference innerval = (*itor)["val"];
std::pair<std::string, DBusPropertiesMap> tmp = {
(*itor)["string"], DeserializePropMap(innerval)};
ret.push_back(tmp);
}
return ret;
}
nlohmann::json SerializeObject(ManagedObjectType& in) {
nlohmann::json j;
j["type"] = "object";
nlohmann::json arr = nlohmann::json::array();
for (ManagedObjectType::iterator itor = in.begin(); itor != in.end();
itor++) {
nlohmann::json tmp;
tmp["string"] = itor->first;
tmp["val"] = SerializeInterfaceMap(itor->second);
arr.push_back(tmp);
}
j["val"] = arr;
return j;
}
ManagedObjectType DeserializeObject(nlohmann::json::reference j) {
ManagedObjectType ret;
nlohmann::json::reference val = j["val"];
for (nlohmann::json::iterator itor = val.begin(); itor != val.end(); itor++) {
nlohmann::json::reference innerval = (*itor)["val"];
std::pair<std::string, DBusInteracesMap> tmp = {
(*itor)["string"], DeserializeInterfaceMap(innerval)};
ret.push_back(tmp);
}
return ret;
}
nlohmann::json SerializeMapperServiceMap(
const dbus::utility::MapperServiceMap& in) {
nlohmann::json j;
j["type"] = "mapperServiceMap";
nlohmann::json arr = nlohmann::json::array();
for (MapperServiceMap::const_iterator itor = in.begin(); itor != in.end();
itor++) {
nlohmann::json elem;
elem["string"] = itor->first;
nlohmann::json inner_arr = nlohmann::json::array();
for (std::vector<std::string>::const_iterator inner_itor =
itor->second.begin();
inner_itor != itor->second.end(); inner_itor++) {
nlohmann::json inner_elem;
inner_elem["type"] = "string";
inner_elem["val"] = *inner_itor;
inner_arr.push_back(inner_elem);
}
elem["val"] = inner_arr;
arr.push_back(elem);
}
j["val"] = arr;
return j;
}
MapperServiceMap DeserializeMapperServiceMap(nlohmann::json::reference j) {
MapperServiceMap ret;
nlohmann::json::reference val = j["val"];
for (nlohmann::json::iterator itor = val.begin(); itor != val.end(); itor++) {
std::vector<std::string> inner_tmp = {};
for (nlohmann::json::iterator inner_itor = (*itor)["val"].begin();
inner_itor != (*itor)["val"].end(); inner_itor++) {
inner_tmp.push_back((*inner_itor)["val"]);
}
const std::pair<std::string, std::vector<std::string>> tmp = {
(*itor)["string"], inner_tmp};
ret.push_back(tmp);
}
return ret;
}
nlohmann::json SerializeSubtree(dbus::utility::MapperGetSubTreeResponse& in) {
nlohmann::json j;
j["type"] = "subTreeResponse";
nlohmann::json arr = nlohmann::json::array();
for (MapperGetSubTreeResponse::iterator itor = in.begin(); itor != in.end();
itor++) {
nlohmann::json tmp;
tmp["string"] = itor->first;
tmp["val"] = SerializeMapperServiceMap(itor->second);
arr.push_back(tmp);
}
j["val"] = arr;
return j;
}
MapperGetSubTreeResponse DeserializeSubtree(
nlohmann::json::reference j) {
MapperGetSubTreeResponse ret;
nlohmann::json::reference val = j["val"];
for (nlohmann::json::iterator itor = val.begin(); itor != val.end(); itor++) {
nlohmann::json::reference innerval = (*itor)["val"];
std::pair<std::string, MapperServiceMap> tmp = {
(*itor)["string"], DeserializeMapperServiceMap(innerval)};
ret.push_back(tmp);
}
return ret;
}
nlohmann::json SerializeSubtreePaths(MapperGetSubTreePathsResponse& in) {
nlohmann::json j;
j["type"] = "subTreePathsResponse";
nlohmann::json arr = nlohmann::json::array();
for (MapperGetSubTreePathsResponse::iterator itor = in.begin();
itor != in.end(); itor++) {
arr.push_back(*itor);
}
j["val"] = arr;
return j;
}
MapperGetSubTreePathsResponse DeserializeSubtreePaths(
nlohmann::json::reference j) {
MapperGetSubTreePathsResponse ret;
nlohmann::json::reference val = j["val"];
for (nlohmann::json::iterator itor = val.begin(); itor != val.end(); itor++) {
ret.push_back(*itor);
}
return ret;
}
// MapperObject is equivalent to MapperServiceMap
nlohmann::json SerializeMapperObject(MapperGetObject& in) {
return SerializeMapperServiceMap(in);
}
MapperGetObject DeserializeMapperObject(nlohmann::json::reference j) {
return DeserializeMapperServiceMap(j);
}
nlohmann::json SerializeSystemdUnitStruct(SystemdUnitStruct& in) {
nlohmann::json j;
j["type"] = "systemdUnitStruct";
nlohmann::json::reference val = j["val"];
// Serialize all parts of the systemd unit struct a(ssssssouso)
val["name"] = std::get<0>(in);
val["description"] = std::get<1>(in);
val["load_state"] = std::get<2>(in);
val["active_state"] = std::get<3>(in);
val["substate"] = std::get<4>(in);
val["followed_unit"] = std::get<5>(in);
val["unit_path"] = std::get<6>(in).str;
val["job_id"] = std::get<7>(in);
val["job_type"] = std::get<8>(in);
val["job_path"] = std::get<9>(in).str;
return j;
}
nlohmann::json SerializeSystemdListUnits(SystemdListUnits& in) {
nlohmann::json j;
j["type"] = "systemdListUnits";
nlohmann::json arr = nlohmann::json::array();
for (SystemdListUnits::iterator itor = in.begin(); itor != in.end(); itor++) {
arr.push_back(SerializeSystemdUnitStruct(*itor));
}
j["val"] = arr;
return j;
}
SystemdUnitStruct DeserializeSystemdUnitStruct(
nlohmann::json::reference j) {
SystemdUnitStruct ret;
nlohmann::json::reference val = j["val"];
return std::make_tuple(
val["name"], val["description"], val["load_state"], val["active_state"],
val["substate"], val["followed_unit"],
sdbusplus::message::object_path(val["unit_path"]), val["job_id"],
val["job_type"], sdbusplus::message::object_path(val["job_path"]));
}
SystemdListUnits DeserializeSystemdListUnits(
nlohmann::json::reference j) {
SystemdListUnits ret;
nlohmann::json::reference val = j["val"];
for (nlohmann::json::iterator itor = val.begin(); itor != val.end(); itor++) {
ret.push_back(DeserializeSystemdUnitStruct(*itor));
}
return ret;
}
std::optional<std::string> ReadBinaryFileToString(
const std::filesystem::path& file) {
std::ifstream f(file, std::ios_base::in | std::ios::binary);
if (!f.is_open()) {
BMCWEB_LOG_STATEFUL_DEBUG << "unable to open file " << file;
return std::nullopt;
}
std::string content{std::istreambuf_iterator<char>(f),
std::istreambuf_iterator<char>()};
if (!f) {
BMCWEB_LOG_STATEFUL_DEBUG << "unable to read file " << file
<< strerror(errno);
return std::nullopt;
}
f.close();
if (!f) {
BMCWEB_LOG_STATEFUL_DEBUG << "unable to close file " << file
<< strerror(errno);
return std::nullopt;
}
return content;
}
} // namespace serialize