blob: 6f4e4bf541deb2fc7cfd9f1d6ed268aa227e3b13 [file] [log] [blame]
Patrick Williams1334b7b2021-02-22 17:15:12 -06001#include "config.h"
Ratan Gupta212f53e2018-04-30 17:28:05 +05302
3#include "snmp_serialize.hpp"
Patrick Williams1334b7b2021-02-22 17:15:12 -06004
Ratan Gupta212f53e2018-04-30 17:28:05 +05305#include "snmp_client.hpp"
Patrick Williams1334b7b2021-02-22 17:15:12 -06006
7#include <cereal/archives/binary.hpp>
8#include <cereal/types/string.hpp>
9#include <cereal/types/vector.hpp>
Ratan Gupta212f53e2018-04-30 17:28:05 +053010#include <phosphor-logging/log.hpp>
Patrick Williams1334b7b2021-02-22 17:15:12 -060011
12#include <fstream>
Ratan Gupta212f53e2018-04-30 17:28:05 +053013
14// Register class version
15// From cereal documentation;
16// "This macro should be placed at global scope"
17CEREAL_CLASS_VERSION(phosphor::network::snmp::Client, CLASS_VERSION);
18
19namespace phosphor
20{
21namespace network
22{
23namespace snmp
24{
25
26using namespace phosphor::logging;
27
28/** @brief Function required by Cereal to perform serialization.
29 * @tparam Archive - Cereal archive type (binary in our case).
30 * @param[in] archive - reference to Cereal archive.
31 * @param[in] manager - const reference to snmp manager info.
32 * @param[in] version - Class version that enables handling
33 * a serialized data across code levels
34 */
35template <class Archive>
Ratan Gupta34d129a2021-12-04 21:04:51 +053036void save(Archive& archive, const Client& manager,
37 const std::uint32_t /*version*/)
Ratan Gupta212f53e2018-04-30 17:28:05 +053038{
39 archive(manager.address(), manager.port());
40}
41
42/** @brief Function required by Cereal to perform deserialization.
43 * @tparam Archive - Cereal archive type (binary in our case).
44 * @param[in] archive - reference to Cereal archive.
45 * @param[in] manager - reference to snmp manager info.
46 * @param[in] version - Class version that enables handling
47 * a serialized data across code levels
48 */
49template <class Archive>
Ratan Gupta34d129a2021-12-04 21:04:51 +053050void load(Archive& archive, Client& manager, const std::uint32_t /*version*/)
Ratan Gupta212f53e2018-04-30 17:28:05 +053051{
52 std::string ipaddress{};
53 uint16_t port{};
54
55 archive(ipaddress, port);
56
57 manager.address(ipaddress);
58 manager.port(port);
59}
60
Ratan Guptaa7ff3852018-11-16 14:05:57 +053061fs::path serialize(Id id, const Client& manager, const fs::path& dir)
Ratan Gupta212f53e2018-04-30 17:28:05 +053062{
63 fs::path fileName = dir;
64 fs::create_directories(dir);
Ratan Guptaa7ff3852018-11-16 14:05:57 +053065 fileName /= std::to_string(id);
Ratan Gupta212f53e2018-04-30 17:28:05 +053066
67 std::ofstream os(fileName.string(), std::ios::binary);
68 cereal::BinaryOutputArchive oarchive(os);
69 oarchive(manager);
70 return fileName;
71}
72
73bool deserialize(const fs::path& path, Client& manager)
74{
75 try
76 {
77 if (fs::exists(path))
78 {
79 std::ifstream is(path.c_str(), std::ios::in | std::ios::binary);
80 cereal::BinaryInputArchive iarchive(is);
81 iarchive(manager);
82 return true;
83 }
84 return false;
85 }
Patrick Williamsc3600d82021-10-06 12:38:25 -050086 catch (const cereal::Exception& e)
Ratan Gupta212f53e2018-04-30 17:28:05 +053087 {
88 log<level::ERR>(e.what());
89 std::error_code ec;
90 fs::remove(path, ec);
91 return false;
92 }
93 catch (const fs::filesystem_error& e)
94 {
95 return false;
96 }
97}
98
99} // namespace snmp
100} // namespace network
101} // namespace phosphor