1 /* 2 // Copyright (c) 2019 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 */ 16 #pragma once 17 18 #include "registries.hpp" 19 #include "registries/base_message_registry.hpp" 20 #include "registries/openbmc_message_registry.hpp" 21 #include "registries/resource_event_message_registry.hpp" 22 #include "registries/task_event_message_registry.hpp" 23 24 #include <app.hpp> 25 #include <registries/privilege_registry.hpp> 26 27 namespace redfish 28 { 29 30 inline void handleMessageRegistryFileCollectionGet( 31 const crow::Request& /*req*/, 32 const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) 33 { 34 // Collections don't include the static data added by SubRoute 35 // because it has a duplicate entry for members 36 37 asyncResp->res.jsonValue = { 38 {"@odata.type", 39 "#MessageRegistryFileCollection.MessageRegistryFileCollection"}, 40 {"@odata.id", "/redfish/v1/Registries"}, 41 {"Name", "MessageRegistryFile Collection"}, 42 {"Description", "Collection of MessageRegistryFiles"}, 43 {"Members@odata.count", 4}, 44 {"Members", 45 {{{"@odata.id", "/redfish/v1/Registries/Base"}}, 46 {{"@odata.id", "/redfish/v1/Registries/TaskEvent"}}, 47 {{"@odata.id", "/redfish/v1/Registries/ResourceEvent"}}, 48 {{"@odata.id", "/redfish/v1/Registries/OpenBMC"}}}}}; 49 } 50 51 inline void requestRoutesMessageRegistryFileCollection(App& app) 52 { 53 /** 54 * Functions triggers appropriate requests on DBus 55 */ 56 BMCWEB_ROUTE(app, "/redfish/v1/Registries/") 57 .privileges(redfish::privileges::getMessageRegistryFileCollection) 58 .methods(boost::beast::http::verb::get)( 59 handleMessageRegistryFileCollectionGet); 60 } 61 62 inline void handleMessageRoutesMessageRegistryFileGet( 63 const crow::Request& /*req*/, 64 const std::shared_ptr<bmcweb::AsyncResp>& asyncResp, 65 const std::string& registry) 66 { 67 const message_registries::Header* header = nullptr; 68 std::string dmtf = "DMTF "; 69 const char* url = nullptr; 70 71 if (registry == "Base") 72 { 73 header = &message_registries::base::header; 74 url = message_registries::base::url; 75 } 76 else if (registry == "TaskEvent") 77 { 78 header = &message_registries::task_event::header; 79 url = message_registries::task_event::url; 80 } 81 else if (registry == "OpenBMC") 82 { 83 header = &message_registries::openbmc::header; 84 dmtf.clear(); 85 } 86 else if (registry == "ResourceEvent") 87 { 88 header = &message_registries::resource_event::header; 89 url = message_registries::resource_event::url; 90 } 91 else 92 { 93 messages::resourceNotFound( 94 asyncResp->res, "#MessageRegistryFile.v1_1_0.MessageRegistryFile", 95 registry); 96 return; 97 } 98 99 asyncResp->res.jsonValue = { 100 {"@odata.id", "/redfish/v1/Registries/" + registry}, 101 {"@odata.type", "#MessageRegistryFile.v1_1_0.MessageRegistryFile"}, 102 {"Name", registry + " Message Registry File"}, 103 {"Description", dmtf + registry + " Message Registry File Location"}, 104 {"Id", header->registryPrefix}, 105 {"Registry", header->id}, 106 {"Languages", {"en"}}, 107 {"Languages@odata.count", 1}, 108 {"Location", 109 {{{"Language", "en"}, 110 {"Uri", "/redfish/v1/Registries/" + registry + "/" + registry}}}}, 111 {"Location@odata.count", 1}}; 112 113 if (url != nullptr) 114 { 115 asyncResp->res.jsonValue["Location"][0]["PublicationUri"] = url; 116 } 117 } 118 119 inline void requestRoutesMessageRegistryFile(App& app) 120 { 121 BMCWEB_ROUTE(app, "/redfish/v1/Registries/<str>/") 122 .privileges(redfish::privileges::getMessageRegistryFile) 123 .methods(boost::beast::http::verb::get)( 124 handleMessageRoutesMessageRegistryFileGet); 125 } 126 127 inline void handleMessageRegistryGet( 128 const crow::Request& /*req*/, 129 const std::shared_ptr<bmcweb::AsyncResp>& asyncResp, 130 const std::string& registry, const std::string& registryMatch) 131 132 { 133 const message_registries::Header* header = nullptr; 134 std::vector<const message_registries::MessageEntry*> registryEntries; 135 if (registry == "Base") 136 { 137 header = &message_registries::base::header; 138 for (const message_registries::MessageEntry& entry : 139 message_registries::base::registry) 140 { 141 registryEntries.emplace_back(&entry); 142 } 143 } 144 else if (registry == "TaskEvent") 145 { 146 header = &message_registries::task_event::header; 147 for (const message_registries::MessageEntry& entry : 148 message_registries::task_event::registry) 149 { 150 registryEntries.emplace_back(&entry); 151 } 152 } 153 else if (registry == "OpenBMC") 154 { 155 header = &message_registries::openbmc::header; 156 for (const message_registries::MessageEntry& entry : 157 message_registries::openbmc::registry) 158 { 159 registryEntries.emplace_back(&entry); 160 } 161 } 162 else if (registry == "ResourceEvent") 163 { 164 header = &message_registries::resource_event::header; 165 for (const message_registries::MessageEntry& entry : 166 message_registries::resource_event::registry) 167 { 168 registryEntries.emplace_back(&entry); 169 } 170 } 171 else 172 { 173 messages::resourceNotFound( 174 asyncResp->res, "#MessageRegistryFile.v1_1_0.MessageRegistryFile", 175 registry); 176 return; 177 } 178 179 if (registry != registryMatch) 180 { 181 messages::resourceNotFound(asyncResp->res, header->type, registryMatch); 182 return; 183 } 184 185 asyncResp->res.jsonValue = {{"@Redfish.Copyright", header->copyright}, 186 {"@odata.type", header->type}, 187 {"Id", header->id}, 188 {"Name", header->name}, 189 {"Language", header->language}, 190 {"Description", header->description}, 191 {"RegistryPrefix", header->registryPrefix}, 192 {"RegistryVersion", header->registryVersion}, 193 {"OwningEntity", header->owningEntity}}; 194 195 nlohmann::json& messageObj = asyncResp->res.jsonValue["Messages"]; 196 197 // Go through the Message Registry and populate each Message 198 for (const message_registries::MessageEntry* message : registryEntries) 199 { 200 nlohmann::json& obj = messageObj[message->first]; 201 obj = {{"Description", message->second.description}, 202 {"Message", message->second.message}, 203 {"Severity", message->second.severity}, 204 {"MessageSeverity", message->second.messageSeverity}, 205 {"NumberOfArgs", message->second.numberOfArgs}, 206 {"Resolution", message->second.resolution}}; 207 if (message->second.numberOfArgs > 0) 208 { 209 nlohmann::json& messageParamArray = obj["ParamTypes"]; 210 messageParamArray = nlohmann::json::array(); 211 for (const char* str : message->second.paramTypes) 212 { 213 if (str == nullptr) 214 { 215 break; 216 } 217 messageParamArray.push_back(str); 218 } 219 } 220 } 221 } 222 223 inline void requestRoutesMessageRegistry(App& app) 224 { 225 BMCWEB_ROUTE(app, "/redfish/v1/Registries/<str>/<str>/") 226 .privileges(redfish::privileges::getMessageRegistryFile) 227 .methods(boost::beast::http::verb::get)(handleMessageRegistryGet); 228 } 229 } // namespace redfish 230