/* // 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 #include #include #include #include #include #include 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>; using DBusInterface = boost::container::flat_map; using DBusObject = boost::container::flat_map; using MapperGetSubTreeResponse = boost::container::flat_map; 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& foundPaths); bool findFiles(const std::vector&& dirPaths, const std::string& matchString, std::vector& foundPaths); bool getI2cDevicePaths( const std::filesystem::path& dirPath, boost::container::flat_map& busPaths); bool validateJson(const nlohmann::json& schemaFile, const nlohmann::json& input); bool isPowerOn(); void setupPowerMatch(const std::shared_ptr& 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{}(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 templateCharReplace( nlohmann::json::iterator& keyPair, const DBusObject& object, size_t index, const std::optional& replaceStr = std::nullopt); std::optional templateCharReplace( nlohmann::json::iterator& keyPair, const DBusInterface& interface, size_t index, const std::optional& 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(); 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);