-
Notifications
You must be signed in to change notification settings - Fork 52
/
Copy pathutils.hpp
163 lines (140 loc) · 5.03 KB
/
utils.hpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
/*
// Copyright (c) 2017 Intel Corporation
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
*/
/// \file utils.hpp
#pragma once
#include <boost/container/flat_map.hpp>
#include <nlohmann/json.hpp>
#include <sdbusplus/asio/connection.hpp>
#include <sdbusplus/exception.hpp>
#include <filesystem>
#include <fstream>
#include <iostream>
constexpr const char* configurationOutDir = "/var/configuration/";
constexpr const char* versionHashFile = "/var/configuration/version";
constexpr const char* versionFile = "/etc/os-release";
// NOLINTNEXTLINE(cppcoreguidelines-avoid-non-const-global-variables)
extern boost::asio::io_context io;
using DBusValueVariant =
std::variant<std::string, int64_t, uint64_t, double, int32_t, uint32_t,
int16_t, uint16_t, uint8_t, bool, std::vector<uint8_t>>;
using DBusInterface = boost::container::flat_map<std::string, DBusValueVariant>;
using DBusObject = boost::container::flat_map<std::string, DBusInterface>;
using MapperGetSubTreeResponse =
boost::container::flat_map<std::string, DBusObject>;
namespace properties
{
constexpr const char* interface = "org.freedesktop.DBus.Properties";
constexpr const char* get = "Get";
} // namespace properties
namespace power
{
const static constexpr char* busname = "xyz.openbmc_project.State.Host";
const static constexpr char* interface = "xyz.openbmc_project.State.Host";
const static constexpr char* path = "/xyz/openbmc_project/state/host0";
const static constexpr char* property = "CurrentHostState";
} // namespace power
bool findFiles(const std::filesystem::path& dirPath,
const std::string& matchString,
std::vector<std::filesystem::path>& foundPaths);
bool findFiles(const std::vector<std::filesystem::path>&& dirPaths,
const std::string& matchString,
std::vector<std::filesystem::path>& foundPaths);
bool getI2cDevicePaths(
const std::filesystem::path& dirPath,
boost::container::flat_map<size_t, std::filesystem::path>& busPaths);
bool validateJson(const nlohmann::json& schemaFile,
const nlohmann::json& input);
bool isPowerOn();
void setupPowerMatch(const std::shared_ptr<sdbusplus::asio::connection>& conn);
struct DBusInternalError final : public sdbusplus::exception_t
{
const char* name() const noexcept override
{
return "org.freedesktop.DBus.Error.Failed";
}
const char* description() const noexcept override
{
return "internal error";
}
const char* what() const noexcept override
{
return "org.freedesktop.DBus.Error.Failed: "
"internal error";
}
int get_errno() const noexcept override
{
return EACCES;
}
};
inline bool fwVersionIsSame()
{
std::ifstream version(versionFile);
if (!version.good())
{
std::cerr << "Can't read " << versionFile << "\n";
return false;
}
std::string versionData;
std::string line;
while (std::getline(version, line))
{
versionData += line;
}
std::string expectedHash =
std::to_string(std::hash<std::string>{}(versionData));
std::filesystem::create_directory(configurationOutDir);
std::ifstream hashFile(versionHashFile);
if (hashFile.good())
{
std::string hashString;
hashFile >> hashString;
if (expectedHash == hashString)
{
return true;
}
hashFile.close();
}
std::ofstream output(versionHashFile);
output << expectedHash;
return false;
}
std::optional<std::string> templateCharReplace(
nlohmann::json::iterator& keyPair, const DBusObject& object, size_t index,
const std::optional<std::string>& replaceStr = std::nullopt);
std::optional<std::string> templateCharReplace(
nlohmann::json::iterator& keyPair, const DBusInterface& interface,
size_t index, const std::optional<std::string>& replaceStr = std::nullopt);
inline bool deviceHasLogging(const nlohmann::json& json)
{
auto logging = json.find("Logging");
if (logging != json.end())
{
const auto* ptr = logging->get_ptr<const std::string*>();
if (ptr != nullptr)
{
if (*ptr == "Off")
{
return false;
}
}
}
return true;
}
/// \brief Match a Dbus property against a probe statement.
/// \param probe the probe statement to match against.
/// \param dbusValue the property value being matched to a probe.
/// \return true if the dbusValue matched the probe otherwise false.
bool matchProbe(const nlohmann::json& probe, const DBusValueVariant& dbusValue);