| #ifndef THIRD_PARTY_GBMCWEB_REDFISH_CORE_LIB_MESSAGE_REGISTRIES_H_ | |
| #define THIRD_PARTY_GBMCWEB_REDFISH_CORE_LIB_MESSAGE_REGISTRIES_H_ | |
| /* | |
| // Copyright (c) 2019 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. | |
| */ | |
| #include <array> | |
| #include <functional> | |
| #include <memory> | |
| #include <string> | |
| #include <utility> | |
| #include <vector> | |
| #include "app.hpp" | |
| #include "http_request.hpp" | |
| #include "utility.hpp" | |
| #include "async_resp.hpp" | |
| #include "error_messages.hpp" | |
| #include "query.hpp" | |
| #include "registries.hpp" | |
| #include "registries/base_message_registry.hpp" | |
| #include "registries/openbmc_message_registry.hpp" | |
| #include "registries/privilege_registry.hpp" | |
| #include "registries/resource_event_message_registry.hpp" | |
| #include "registries/task_event_message_registry.hpp" | |
| #include <nlohmann/json.hpp> | |
| namespace redfish { | |
| inline void handleMessageRegistryFileCollectionGet( | |
| crow::App& app, const crow::Request& req, | |
| const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) { | |
| if (!redfish::setUpRedfishRoute(app, req, asyncResp)) { | |
| return; | |
| } | |
| // Collections don't include the static data added by SubRoute | |
| // because it has a duplicate entry for members | |
| asyncResp->res.jsonValue["@odata.type"] = | |
| "#MessageRegistryFileCollection.MessageRegistryFileCollection"; | |
| asyncResp->res.jsonValue["@odata.id"] = "/redfish/v1/Registries"; | |
| asyncResp->res.jsonValue["Name"] = "MessageRegistryFile Collection"; | |
| asyncResp->res.jsonValue["Description"] = | |
| "Collection of MessageRegistryFiles"; | |
| nlohmann::json& members = asyncResp->res.jsonValue["Members"]; | |
| for (const char* memberName : | |
| std::to_array({"Base", "TaskEvent", "ResourceEvent", "OpenBMC"})) { | |
| nlohmann::json::object_t member; | |
| member["@odata.id"] = | |
| crow::utility::urlFromPieces("redfish", "v1", "Registries", memberName); | |
| members.emplace_back(std::move(member)); | |
| } | |
| asyncResp->res.jsonValue["Members@odata.count"] = members.size(); | |
| } | |
| inline void requestRoutesMessageRegistryFileCollection(App& app) { | |
| /** | |
| * Functions triggers appropriate requests on DBus | |
| */ | |
| BMCWEB_ROUTE(app, "/redfish/v1/Registries/") | |
| .privileges(redfish::privileges::getMessageRegistryFileCollection) | |
| .methods(boost::beast::http::verb::get)(std::bind_front( | |
| handleMessageRegistryFileCollectionGet, std::ref(app))); | |
| } | |
| inline void handleMessageRoutesMessageRegistryFileGet( | |
| crow::App& app, const crow::Request& req, | |
| const std::shared_ptr<bmcweb::AsyncResp>& asyncResp, | |
| const std::string& registry) { | |
| if (!redfish::setUpRedfishRoute(app, req, asyncResp)) { | |
| return; | |
| } | |
| const registries::Header* header = nullptr; | |
| std::string dmtf = "DMTF "; | |
| const char* url = nullptr; | |
| if (registry == "Base") { | |
| header = ®istries::base::header; | |
| url = registries::base::url; | |
| } else if (registry == "TaskEvent") { | |
| header = ®istries::task_event::header; | |
| url = registries::task_event::url; | |
| } else if (registry == "OpenBMC") { | |
| header = ®istries::openbmc::header; | |
| dmtf.clear(); | |
| } else if (registry == "ResourceEvent") { | |
| header = ®istries::resource_event::header; | |
| url = registries::resource_event::url; | |
| } else { | |
| messages::resourceNotFound(asyncResp->res, "MessageRegistryFile", registry); | |
| return; | |
| } | |
| asyncResp->res.jsonValue["@odata.id"] = | |
| crow::utility::urlFromPieces("redfish", "v1", "Registries", registry); | |
| asyncResp->res.jsonValue["@odata.type"] = | |
| "#MessageRegistryFile.v1_1_0.MessageRegistryFile"; | |
| asyncResp->res.jsonValue["Name"] = registry + " Message Registry File"; | |
| asyncResp->res.jsonValue["Description"] = | |
| dmtf + registry + " Message Registry File Location"; | |
| asyncResp->res.jsonValue["Id"] = header->registryPrefix; | |
| asyncResp->res.jsonValue["Registry"] = header->id; | |
| nlohmann::json::array_t languages; | |
| languages.emplace_back("en"); | |
| asyncResp->res.jsonValue["Languages@odata.count"] = languages.size(); | |
| asyncResp->res.jsonValue["Languages"] = std::move(languages); | |
| nlohmann::json::array_t locationMembers; | |
| nlohmann::json::object_t location; | |
| location["Language"] = "en"; | |
| location["Uri"] = "/redfish/v1/Registries/" + registry + "/" + registry; | |
| if (url != nullptr) { | |
| location["PublicationUri"] = url; | |
| } | |
| locationMembers.emplace_back(std::move(location)); | |
| asyncResp->res.jsonValue["Location@odata.count"] = locationMembers.size(); | |
| asyncResp->res.jsonValue["Location"] = std::move(locationMembers); | |
| } | |
| inline void requestRoutesMessageRegistryFile(App& app) { | |
| BMCWEB_ROUTE(app, "/redfish/v1/Registries/<str>/") | |
| .privileges(redfish::privileges::getMessageRegistryFile) | |
| .methods(boost::beast::http::verb::get)(std::bind_front( | |
| handleMessageRoutesMessageRegistryFileGet, std::ref(app))); | |
| } | |
| inline void handleMessageRegistryGet( | |
| crow::App& app, const crow::Request& req, | |
| const std::shared_ptr<bmcweb::AsyncResp>& asyncResp, | |
| const std::string& registry, const std::string& registryMatch) | |
| { | |
| if (!redfish::setUpRedfishRoute(app, req, asyncResp)) { | |
| return; | |
| } | |
| const registries::Header* header = nullptr; | |
| std::vector<const registries::MessageEntry*> registryEntries; | |
| if (registry == "Base") { | |
| header = ®istries::base::header; | |
| for (const registries::MessageEntry& entry : registries::base::registry) { | |
| registryEntries.emplace_back(&entry); | |
| } | |
| } else if (registry == "TaskEvent") { | |
| header = ®istries::task_event::header; | |
| for (const registries::MessageEntry& entry : | |
| registries::task_event::registry) { | |
| registryEntries.emplace_back(&entry); | |
| } | |
| } else if (registry == "OpenBMC") { | |
| header = ®istries::openbmc::header; | |
| for (const registries::MessageEntry& entry : | |
| registries::openbmc::registry) { | |
| registryEntries.emplace_back(&entry); | |
| } | |
| } else if (registry == "ResourceEvent") { | |
| header = ®istries::resource_event::header; | |
| for (const registries::MessageEntry& entry : | |
| registries::resource_event::registry) { | |
| registryEntries.emplace_back(&entry); | |
| } | |
| } else { | |
| messages::resourceNotFound(asyncResp->res, "MessageRegistryFile", registry); | |
| return; | |
| } | |
| if (registry != registryMatch) { | |
| messages::resourceNotFound(asyncResp->res, header->type, registryMatch); | |
| return; | |
| } | |
| asyncResp->res.jsonValue["@Redfish.Copyright"] = header->copyright; | |
| asyncResp->res.jsonValue["@odata.type"] = header->type; | |
| asyncResp->res.jsonValue["Id"] = header->id; | |
| asyncResp->res.jsonValue["Name"] = header->name; | |
| asyncResp->res.jsonValue["Language"] = header->language; | |
| asyncResp->res.jsonValue["Description"] = header->description; | |
| asyncResp->res.jsonValue["RegistryPrefix"] = header->registryPrefix; | |
| asyncResp->res.jsonValue["RegistryVersion"] = header->registryVersion; | |
| asyncResp->res.jsonValue["OwningEntity"] = header->owningEntity; | |
| nlohmann::json& messageObj = asyncResp->res.jsonValue["Messages"]; | |
| // Go through the Message Registry and populate each Message | |
| for (const registries::MessageEntry* message : registryEntries) { | |
| nlohmann::json& obj = messageObj[message->first]; | |
| obj["Description"] = message->second.description; | |
| obj["Message"] = message->second.message; | |
| obj["Severity"] = message->second.messageSeverity; | |
| obj["MessageSeverity"] = message->second.messageSeverity; | |
| obj["NumberOfArgs"] = message->second.numberOfArgs; | |
| obj["Resolution"] = message->second.resolution; | |
| if (message->second.numberOfArgs > 0) { | |
| nlohmann::json& messageParamArray = obj["ParamTypes"]; | |
| messageParamArray = nlohmann::json::array(); | |
| for (const char* str : message->second.paramTypes) { | |
| if (str == nullptr) { | |
| break; | |
| } | |
| messageParamArray.emplace_back(str); | |
| } | |
| } | |
| } | |
| } | |
| inline void requestRoutesMessageRegistry(App& app) { | |
| BMCWEB_ROUTE(app, "/redfish/v1/Registries/<str>/<str>/") | |
| .privileges(redfish::privileges::getMessageRegistryFile) | |
| .methods(boost::beast::http::verb::get)( | |
| std::bind_front(handleMessageRegistryGet, std::ref(app))); | |
| } | |
| } // namespace redfish | |
| #endif // THIRD_PARTY_GBMCWEB_REDFISH_CORE_LIB_MESSAGE_REGISTRIES_H_ |