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 "persistent_data.hpp" 24 #include "query.hpp" 25 #include "registries/privilege_registry.hpp" 26 #include "utils/systemd_utils.hpp" 27 28 #include <nlohmann/json.hpp> 29 30 namespace redfish 31 { 32 33 inline void 34 handleServiceRootHead(App& app, const crow::Request& req, 35 const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) 36 { 37 if (!redfish::setUpRedfishRoute(app, req, asyncResp)) 38 { 39 return; 40 } 41 42 asyncResp->res.addHeader( 43 boost::beast::http::field::link, 44 "</redfish/v1/JsonSchemas/ServiceRoot/ServiceRoot.json>; rel=describedby"); 45 } 46 47 inline void handleServiceRootGetImpl( 48 const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) 49 { 50 asyncResp->res.addHeader( 51 boost::beast::http::field::link, 52 "</redfish/v1/JsonSchemas/ServiceRoot/ServiceRoot.json>; rel=describedby"); 53 54 std::string uuid = persistent_data::getConfig().systemUuid; 55 asyncResp->res.jsonValue["@odata.type"] = 56 "#ServiceRoot.v1_15_0.ServiceRoot"; 57 asyncResp->res.jsonValue["@odata.id"] = "/redfish/v1"; 58 asyncResp->res.jsonValue["Id"] = "RootService"; 59 asyncResp->res.jsonValue["Name"] = "Root Service"; 60 asyncResp->res.jsonValue["RedfishVersion"] = "1.17.0"; 61 asyncResp->res.jsonValue["Links"]["Sessions"]["@odata.id"] = 62 "/redfish/v1/SessionService/Sessions"; 63 asyncResp->res.jsonValue["AccountService"]["@odata.id"] = 64 "/redfish/v1/AccountService"; 65 if constexpr (BMCWEB_REDFISH_AGGREGATION) 66 { 67 asyncResp->res.jsonValue["AggregationService"]["@odata.id"] = 68 "/redfish/v1/AggregationService"; 69 } 70 asyncResp->res.jsonValue["Chassis"]["@odata.id"] = "/redfish/v1/Chassis"; 71 asyncResp->res.jsonValue["JsonSchemas"]["@odata.id"] = 72 "/redfish/v1/JsonSchemas"; 73 asyncResp->res.jsonValue["Managers"]["@odata.id"] = "/redfish/v1/Managers"; 74 asyncResp->res.jsonValue["SessionService"]["@odata.id"] = 75 "/redfish/v1/SessionService"; 76 asyncResp->res.jsonValue["Systems"]["@odata.id"] = "/redfish/v1/Systems"; 77 asyncResp->res.jsonValue["Registries"]["@odata.id"] = 78 "/redfish/v1/Registries"; 79 asyncResp->res.jsonValue["UpdateService"]["@odata.id"] = 80 "/redfish/v1/UpdateService"; 81 asyncResp->res.jsonValue["UUID"] = uuid; 82 asyncResp->res.jsonValue["CertificateService"]["@odata.id"] = 83 "/redfish/v1/CertificateService"; 84 asyncResp->res.jsonValue["Tasks"]["@odata.id"] = "/redfish/v1/TaskService"; 85 asyncResp->res.jsonValue["EventService"]["@odata.id"] = 86 "/redfish/v1/EventService"; 87 asyncResp->res.jsonValue["TelemetryService"]["@odata.id"] = 88 "/redfish/v1/TelemetryService"; 89 asyncResp->res.jsonValue["Cables"]["@odata.id"] = "/redfish/v1/Cables"; 90 91 asyncResp->res.jsonValue["Links"]["ManagerProvidingService"]["@odata.id"] = 92 boost::urls::format("/redfish/v1/Managers/{}", 93 BMCWEB_REDFISH_MANAGER_URI_NAME); 94 95 nlohmann::json& protocolFeatures = 96 asyncResp->res.jsonValue["ProtocolFeaturesSupported"]; 97 protocolFeatures["ExcerptQuery"] = false; 98 99 protocolFeatures["ExpandQuery"]["ExpandAll"] = 100 BMCWEB_INSECURE_ENABLE_REDFISH_QUERY; 101 // This is the maximum level defined in ServiceRoot.v1_13_0.json 102 if constexpr (BMCWEB_INSECURE_ENABLE_REDFISH_QUERY) 103 { 104 protocolFeatures["ExpandQuery"]["MaxLevels"] = 6; 105 } 106 protocolFeatures["ExpandQuery"]["Levels"] = 107 BMCWEB_INSECURE_ENABLE_REDFISH_QUERY; 108 protocolFeatures["ExpandQuery"]["Links"] = 109 BMCWEB_INSECURE_ENABLE_REDFISH_QUERY; 110 protocolFeatures["ExpandQuery"]["NoLinks"] = 111 BMCWEB_INSECURE_ENABLE_REDFISH_QUERY; 112 protocolFeatures["FilterQuery"] = BMCWEB_INSECURE_ENABLE_REDFISH_QUERY; 113 protocolFeatures["OnlyMemberQuery"] = true; 114 protocolFeatures["SelectQuery"] = true; 115 protocolFeatures["DeepOperations"]["DeepPOST"] = false; 116 protocolFeatures["DeepOperations"]["DeepPATCH"] = false; 117 } 118 inline void 119 handleServiceRootGet(App& app, const crow::Request& req, 120 const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) 121 { 122 if (!redfish::setUpRedfishRoute(app, req, asyncResp)) 123 { 124 return; 125 } 126 127 handleServiceRootGetImpl(asyncResp); 128 } 129 130 inline void requestRoutesServiceRoot(App& app) 131 { 132 BMCWEB_ROUTE(app, "/redfish/v1/") 133 .privileges(redfish::privileges::headServiceRoot) 134 .methods(boost::beast::http::verb::head)( 135 std::bind_front(handleServiceRootHead, std::ref(app))); 136 BMCWEB_ROUTE(app, "/redfish/v1/") 137 .privileges(redfish::privileges::getServiceRoot) 138 .methods(boost::beast::http::verb::get)( 139 std::bind_front(handleServiceRootGet, std::ref(app))); 140 } 141 142 } // namespace redfish 143