blob: 2a041090fac539ec7f03d12514272bb8da38e2b9 [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>
36void save(Archive& archive, const Client& manager, const std::uint32_t version)
37{
38 archive(manager.address(), manager.port());
39}
40
41/** @brief Function required by Cereal to perform deserialization.
42 * @tparam Archive - Cereal archive type (binary in our case).
43 * @param[in] archive - reference to Cereal archive.
44 * @param[in] manager - reference to snmp manager info.
45 * @param[in] version - Class version that enables handling
46 * a serialized data across code levels
47 */
48template <class Archive>
49void load(Archive& archive, Client& manager, const std::uint32_t version)
50{
51 std::string ipaddress{};
52 uint16_t port{};
53
54 archive(ipaddress, port);
55
56 manager.address(ipaddress);
57 manager.port(port);
58}
59
Ratan Guptaa7ff3852018-11-16 14:05:57 +053060fs::path serialize(Id id, const Client& manager, const fs::path& dir)
Ratan Gupta212f53e2018-04-30 17:28:05 +053061{
62 fs::path fileName = dir;
63 fs::create_directories(dir);
Ratan Guptaa7ff3852018-11-16 14:05:57 +053064 fileName /= std::to_string(id);
Ratan Gupta212f53e2018-04-30 17:28:05 +053065
66 std::ofstream os(fileName.string(), std::ios::binary);
67 cereal::BinaryOutputArchive oarchive(os);
68 oarchive(manager);
69 return fileName;
70}
71
72bool deserialize(const fs::path& path, Client& manager)
73{
74 try
75 {
76 if (fs::exists(path))
77 {
78 std::ifstream is(path.c_str(), std::ios::in | std::ios::binary);
79 cereal::BinaryInputArchive iarchive(is);
80 iarchive(manager);
81 return true;
82 }
83 return false;
84 }
85 catch (cereal::Exception& e)
86 {
87 log<level::ERR>(e.what());
88 std::error_code ec;
89 fs::remove(path, ec);
90 return false;
91 }
92 catch (const fs::filesystem_error& e)
93 {
94 return false;
95 }
96}
97
98} // namespace snmp
99} // namespace network
100} // namespace phosphor