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 <query.hpp> 26 #include <registries/privilege_registry.hpp> 27 #include <utils/systemd_utils.hpp> 28 29 namespace redfish 30 { 31 32 inline void 33 handleServiceRootGet(const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) 34 { 35 std::string uuid = persistent_data::getConfig().systemUuid; 36 asyncResp->res.jsonValue["@odata.type"] = 37 "#ServiceRoot.v1_11_0.ServiceRoot"; 38 asyncResp->res.jsonValue["@odata.id"] = "/redfish/v1"; 39 asyncResp->res.jsonValue["Id"] = "RootService"; 40 asyncResp->res.jsonValue["Name"] = "Root Service"; 41 asyncResp->res.jsonValue["RedfishVersion"] = "1.9.0"; 42 asyncResp->res.jsonValue["Links"]["Sessions"] = { 43 {"@odata.id", "/redfish/v1/SessionService/Sessions"}}; 44 asyncResp->res.jsonValue["AccountService"] = { 45 {"@odata.id", "/redfish/v1/AccountService"}}; 46 asyncResp->res.jsonValue["Chassis"] = { 47 {"@odata.id", "/redfish/v1/Chassis"}}; 48 asyncResp->res.jsonValue["JsonSchemas"] = { 49 {"@odata.id", "/redfish/v1/JsonSchemas"}}; 50 asyncResp->res.jsonValue["Managers"] = { 51 {"@odata.id", "/redfish/v1/Managers"}}; 52 asyncResp->res.jsonValue["SessionService"] = { 53 {"@odata.id", "/redfish/v1/SessionService"}}; 54 asyncResp->res.jsonValue["Systems"] = { 55 {"@odata.id", "/redfish/v1/Systems"}}; 56 asyncResp->res.jsonValue["Registries"] = { 57 {"@odata.id", "/redfish/v1/Registries"}}; 58 59 asyncResp->res.jsonValue["UpdateService"] = { 60 {"@odata.id", "/redfish/v1/UpdateService"}}; 61 asyncResp->res.jsonValue["UUID"] = uuid; 62 asyncResp->res.jsonValue["CertificateService"] = { 63 {"@odata.id", "/redfish/v1/CertificateService"}}; 64 asyncResp->res.jsonValue["Tasks"] = { 65 {"@odata.id", "/redfish/v1/TaskService"}}; 66 asyncResp->res.jsonValue["EventService"] = { 67 {"@odata.id", "/redfish/v1/EventService"}}; 68 asyncResp->res.jsonValue["TelemetryService"] = { 69 {"@odata.id", "/redfish/v1/TelemetryService"}}; 70 asyncResp->res.jsonValue["Cables"] = {{"@odata.id", "/redfish/v1/Cables"}}; 71 72 nlohmann::json& protocolFeatures = 73 asyncResp->res.jsonValue["ProtocolFeaturesSupported"]; 74 protocolFeatures["ExcerptQuery"] = false; 75 76 protocolFeatures["ExpandQuery"]["ExpandAll"] = 77 bmcwebInsecureEnableQueryParams; 78 // This is the maximum level defined in ServiceRoot.v1_13_0.json 79 if (bmcwebInsecureEnableQueryParams) 80 { 81 protocolFeatures["ExpandQuery"]["MaxLevels"] = 6; 82 } 83 protocolFeatures["ExpandQuery"]["Levels"] = bmcwebInsecureEnableQueryParams; 84 protocolFeatures["ExpandQuery"]["Links"] = bmcwebInsecureEnableQueryParams; 85 protocolFeatures["ExpandQuery"]["NoLinks"] = 86 bmcwebInsecureEnableQueryParams; 87 protocolFeatures["FilterQuery"] = false; 88 protocolFeatures["OnlyMemberQuery"] = bmcwebInsecureEnableQueryParams; 89 protocolFeatures["SelectQuery"] = false; 90 protocolFeatures["DeepOperations"]["DeepPOST"] = false; 91 protocolFeatures["DeepOperations"]["DeepPATCH"] = false; 92 } 93 94 inline void requestRoutesServiceRoot(App& app) 95 { 96 BMCWEB_ROUTE(app, "/redfish/v1/") 97 .privileges(redfish::privileges::getServiceRoot) 98 .methods(boost::beast::http::verb::get)( 99 [&app](const crow::Request& req, 100 const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) { 101 if (!redfish::setUpRedfishRoute(app, req, asyncResp->res)) 102 { 103 return; 104 } 105 handleServiceRootGet(asyncResp); 106 }); 107 } 108 109 } // namespace redfish 110