blob: 0aff148ced2caf90b181998abd85e699890cc595 [file] [log] [blame]
James Feist3cb5fec2018-01-23 14:41:51 -08001/*
2// Copyright (c) 2017 Intel Corporation
3//
4// Licensed under the Apache License, Version 2.0 (the "License");
5// you may not use this file except in compliance with the License.
6// You may obtain a copy of the License at
7//
8// http://www.apache.org/licenses/LICENSE-2.0
9//
10// Unless required by applicable law or agreed to in writing, software
11// distributed under the License is distributed on an "AS IS" BASIS,
12// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13// See the License for the specific language governing permissions and
14// limitations under the License.
15*/
Brad Bishop1fb9f3f2020-08-28 08:15:13 -040016/// \file Utils.hpp
James Feist3cb5fec2018-01-23 14:41:51 -080017
18#pragma once
James Feist481c5d52019-08-13 14:40:40 -070019
James Feist1df06a42019-04-11 14:23:04 -070020#include <boost/container/flat_map.hpp>
James Feistb4383f42018-08-06 16:54:10 -070021#include <nlohmann/json.hpp>
James Feist1df06a42019-04-11 14:23:04 -070022#include <sdbusplus/asio/connection.hpp>
James Feist68500ff2018-08-08 15:40:42 -070023#include <sdbusplus/exception.hpp>
James Feist3cb5fec2018-01-23 14:41:51 -080024
James Feist8c505da2020-05-28 10:06:33 -070025#include <filesystem>
26#include <fstream>
27#include <iostream>
28
James Feist1df06a42019-04-11 14:23:04 -070029constexpr const char* configurationOutDir = "/var/configuration/";
30constexpr const char* versionHashFile = "/var/configuration/version";
31constexpr const char* versionFile = "/etc/os-release";
32
Johnathan Mantey9b867872020-10-13 15:00:51 -070033extern boost::asio::io_context io;
34
James Feist481c5d52019-08-13 14:40:40 -070035using BasicVariantType =
36 std::variant<std::string, int64_t, uint64_t, double, int32_t, uint32_t,
Brad Bishopcd1868e2020-08-28 17:58:52 -040037 int16_t, uint16_t, uint8_t, bool, std::vector<uint8_t>>;
James Feist481c5d52019-08-13 14:40:40 -070038
39enum class TemplateOperation
40{
41 addition,
42 division,
43 multiplication,
44 subtraction,
45 modulo,
46};
47
James Feist61f5ac42020-03-11 14:37:25 -070048namespace properties
49{
50constexpr const char* interface = "org.freedesktop.DBus.Properties";
51constexpr const char* get = "Get";
52} // namespace properties
53
54namespace power
55{
56const static constexpr char* busname = "xyz.openbmc_project.State.Host";
57const static constexpr char* interface = "xyz.openbmc_project.State.Host";
58const static constexpr char* path = "/xyz/openbmc_project/state/host0";
59const static constexpr char* property = "CurrentHostState";
60} // namespace power
61
James Feista465ccc2019-02-08 12:51:01 -080062bool findFiles(const std::filesystem::path& dirPath,
63 const std::string& matchString,
64 std::vector<std::filesystem::path>& foundPaths);
James Feistb4383f42018-08-06 16:54:10 -070065
Nikhil Potaded8884f12019-03-27 13:27:13 -070066bool getI2cDevicePaths(
67 const std::filesystem::path& dirPath,
68 boost::container::flat_map<size_t, std::filesystem::path>& busPaths);
69
James Feista465ccc2019-02-08 12:51:01 -080070bool validateJson(const nlohmann::json& schemaFile,
71 const nlohmann::json& input);
James Feist1df06a42019-04-11 14:23:04 -070072
73bool isPowerOn(void);
74void setupPowerMatch(const std::shared_ptr<sdbusplus::asio::connection>& conn);
James Feist68500ff2018-08-08 15:40:42 -070075struct DBusInternalError final : public sdbusplus::exception_t
76{
James Feista465ccc2019-02-08 12:51:01 -080077 const char* name() const noexcept override
James Feist68500ff2018-08-08 15:40:42 -070078 {
79 return "org.freedesktop.DBus.Error.Failed";
80 };
James Feista465ccc2019-02-08 12:51:01 -080081 const char* description() const noexcept override
James Feist68500ff2018-08-08 15:40:42 -070082 {
83 return "internal error";
84 };
James Feista465ccc2019-02-08 12:51:01 -080085 const char* what() const noexcept override
James Feist68500ff2018-08-08 15:40:42 -070086 {
87 return "org.freedesktop.DBus.Error.Failed: "
88 "internal error";
89 };
90};
James Feist1df06a42019-04-11 14:23:04 -070091
92inline bool fwVersionIsSame(void)
93{
94 std::ifstream version(versionFile);
95 if (!version.good())
96 {
97 std::cerr << "Can't read " << versionFile << "\n";
98 return false;
99 }
100
101 std::string versionData;
102 std::string line;
103 while (std::getline(version, line))
104 {
105 versionData += line;
106 }
107
108 std::string expectedHash =
109 std::to_string(std::hash<std::string>{}(versionData));
110
111 std::filesystem::create_directory(configurationOutDir);
112 std::ifstream hashFile(versionHashFile);
113 if (hashFile.good())
114 {
115
116 std::string hashString;
117 hashFile >> hashString;
118
119 if (expectedHash == hashString)
120 {
121 return true;
122 }
123 hashFile.close();
124 }
125
126 std::ofstream output(versionHashFile);
127 output << expectedHash;
128 return false;
James Feist481c5d52019-08-13 14:40:40 -0700129}
130
James Feist35f5e0e2020-03-16 14:02:27 -0700131std::optional<std::string> templateCharReplace(
James Feist481c5d52019-08-13 14:40:40 -0700132 nlohmann::json::iterator& keyPair,
Matt Spinlere789bf12021-02-24 12:33:01 -0600133 const boost::container::flat_map<
134 std::string, boost::container::flat_map<std::string, BasicVariantType>>&
135 allInterfaces,
136 const size_t foundDeviceIdx,
137 const std::optional<std::string>& replaceStr = std::nullopt);
138
139std::optional<std::string> templateCharReplace(
140 nlohmann::json::iterator& keyPair,
James Feist481c5d52019-08-13 14:40:40 -0700141 const boost::container::flat_map<std::string, BasicVariantType>&
142 foundDevice,
James Feist35f5e0e2020-03-16 14:02:27 -0700143 const size_t foundDeviceIdx,
James Feist1ffa4a42020-04-22 18:27:17 -0700144 const std::optional<std::string>& replaceStr = std::nullopt);
145
146inline bool deviceHasLogging(const nlohmann::json& json)
147{
148 auto logging = json.find("Logging");
149 if (logging != json.end())
150 {
151 auto ptr = logging->get_ptr<const std::string*>();
152 if (ptr)
153 {
154 if (*ptr == "Off")
155 {
156 return false;
157 }
158 }
159 }
160 return true;
161}
Brad Bishop3cb8a602020-08-25 17:40:54 -0400162
163/// \brief Match a Dbus property against a probe statement.
164/// \param probe the probe statement to match against.
165/// \param dbusValue the property value being matched to a probe.
166/// \return true if the dbusValue matched the probe otherwise false.
167bool matchProbe(const nlohmann::json& probe, const BasicVariantType& dbusValue);