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
handleServiceRootHead(App & app,const crow::Request & req,const std::shared_ptr<bmcweb::AsyncResp> & asyncResp)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
handleServiceRootGetImpl(const std::shared_ptr<bmcweb::AsyncResp> & asyncResp)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
handleServiceRootGet(App & app,const crow::Request & req,const std::shared_ptr<bmcweb::AsyncResp> & asyncResp)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
requestRoutesServiceRoot(App & app)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