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