1 /* 2 // Copyright (c) 2018 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 <bmcweb_config.h> 19 20 #include <app.hpp> 21 #include <async_resp.hpp> 22 #include <http_request.hpp> 23 #include <nlohmann/json.hpp> 24 #include <persistent_data.hpp> 25 #include <registries/privilege_registry.hpp> 26 #include <utils/systemd_utils.hpp> 27 28 namespace redfish 29 { 30 31 inline void 32 handleServiceRootGet(const crow::Request& /*req*/, 33 const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) 34 { 35 36 std::string uuid = persistent_data::getConfig().systemUuid; 37 asyncResp->res.jsonValue["@odata.type"] = 38 "#ServiceRoot.v1_11_0.ServiceRoot"; 39 asyncResp->res.jsonValue["@odata.id"] = "/redfish/v1"; 40 asyncResp->res.jsonValue["Id"] = "RootService"; 41 asyncResp->res.jsonValue["Name"] = "Root Service"; 42 asyncResp->res.jsonValue["RedfishVersion"] = "1.9.0"; 43 asyncResp->res.jsonValue["Links"]["Sessions"] = { 44 {"@odata.id", "/redfish/v1/SessionService/Sessions"}}; 45 asyncResp->res.jsonValue["AccountService"] = { 46 {"@odata.id", "/redfish/v1/AccountService"}}; 47 asyncResp->res.jsonValue["Chassis"] = { 48 {"@odata.id", "/redfish/v1/Chassis"}}; 49 asyncResp->res.jsonValue["JsonSchemas"] = { 50 {"@odata.id", "/redfish/v1/JsonSchemas"}}; 51 asyncResp->res.jsonValue["Managers"] = { 52 {"@odata.id", "/redfish/v1/Managers"}}; 53 asyncResp->res.jsonValue["SessionService"] = { 54 {"@odata.id", "/redfish/v1/SessionService"}}; 55 asyncResp->res.jsonValue["Systems"] = { 56 {"@odata.id", "/redfish/v1/Systems"}}; 57 asyncResp->res.jsonValue["Registries"] = { 58 {"@odata.id", "/redfish/v1/Registries"}}; 59 60 asyncResp->res.jsonValue["UpdateService"] = { 61 {"@odata.id", "/redfish/v1/UpdateService"}}; 62 asyncResp->res.jsonValue["UUID"] = uuid; 63 asyncResp->res.jsonValue["CertificateService"] = { 64 {"@odata.id", "/redfish/v1/CertificateService"}}; 65 asyncResp->res.jsonValue["Tasks"] = { 66 {"@odata.id", "/redfish/v1/TaskService"}}; 67 asyncResp->res.jsonValue["EventService"] = { 68 {"@odata.id", "/redfish/v1/EventService"}}; 69 asyncResp->res.jsonValue["TelemetryService"] = { 70 {"@odata.id", "/redfish/v1/TelemetryService"}}; 71 asyncResp->res.jsonValue["Cables"] = {{"@odata.id", "/redfish/v1/Cables"}}; 72 73 nlohmann::json& protocolFeatures = 74 asyncResp->res.jsonValue["ProtocolFeaturesSupported"]; 75 protocolFeatures["ExcerptQuery"] = false; 76 protocolFeatures["ExpandQuery"]["ExpandAll"] = false; 77 protocolFeatures["ExpandQuery"]["Levels"] = false; 78 protocolFeatures["ExpandQuery"]["Links"] = false; 79 protocolFeatures["ExpandQuery"]["NoLinks"] = false; 80 protocolFeatures["FilterQuery"] = false; 81 protocolFeatures["OnlyMemberQuery"] = bmcwebInsecureEnableQueryParams; 82 protocolFeatures["SelectQuery"] = false; 83 protocolFeatures["DeepOperations"]["DeepPOST"] = false; 84 protocolFeatures["DeepOperations"]["DeepPATCH"] = false; 85 } 86 87 inline void requestRoutesServiceRoot(App& app) 88 { 89 BMCWEB_ROUTE(app, "/redfish/v1/") 90 .privileges(redfish::privileges::getServiceRoot) 91 .methods(boost::beast::http::verb::get)(handleServiceRootGet); 92 } 93 94 } // namespace redfish 95