xref: /openbmc/bmcweb/redfish-core/lib/bios.hpp (revision 504af5a0568171b72caf13234cc81380b261fa21)
140e9b92eSEd Tanous // SPDX-License-Identifier: Apache-2.0
240e9b92eSEd Tanous // SPDX-FileCopyrightText: Copyright OpenBMC Authors
3d82a3acdSCarol Wang #pragma once
4d82a3acdSCarol Wang 
5d7857201SEd Tanous #include "bmcweb_config.h"
6d7857201SEd Tanous 
73ccb3adbSEd Tanous #include "app.hpp"
8d7857201SEd Tanous #include "async_resp.hpp"
9d7857201SEd Tanous #include "dbus_singleton.hpp"
10d7857201SEd Tanous #include "error_messages.hpp"
11d7857201SEd Tanous #include "http_request.hpp"
12d7857201SEd Tanous #include "logging.hpp"
133ccb3adbSEd Tanous #include "query.hpp"
143ccb3adbSEd Tanous #include "registries/privilege_registry.hpp"
153ccb3adbSEd Tanous #include "utils/sw_utils.hpp"
1645ca1b86SEd Tanous 
17d7857201SEd Tanous #include <boost/beast/http/verb.hpp>
18d7857201SEd Tanous 
19d7857201SEd Tanous #include <format>
20d7857201SEd Tanous #include <functional>
21d7857201SEd Tanous #include <memory>
22d7857201SEd Tanous #include <string>
23253f11b8SEd Tanous 
24d82a3acdSCarol Wang namespace redfish
25d82a3acdSCarol Wang {
26d82a3acdSCarol Wang /**
27d82a3acdSCarol Wang  * BiosService class supports handle get method for bios.
28d82a3acdSCarol Wang  */
handleBiosServiceGet(crow::App & app,const crow::Request & req,const std::shared_ptr<bmcweb::AsyncResp> & asyncResp,const std::string & systemName)29*504af5a0SPatrick Williams inline void handleBiosServiceGet(
30*504af5a0SPatrick Williams     crow::App& app, const crow::Request& req,
3122d268cbSEd Tanous     const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
3222d268cbSEd Tanous     const std::string& systemName)
3358eaf5f0SJohn Edward Broadbent {
343ba00073SCarson Labrado     if (!redfish::setUpRedfishRoute(app, req, asyncResp))
3545ca1b86SEd Tanous     {
3645ca1b86SEd Tanous         return;
3745ca1b86SEd Tanous     }
3825b54dbaSEd Tanous     if constexpr (BMCWEB_EXPERIMENTAL_REDFISH_MULTI_COMPUTER_SYSTEM)
397f3e84a1SEd Tanous     {
407f3e84a1SEd Tanous         // Option currently returns no systems.  TBD
417f3e84a1SEd Tanous         messages::resourceNotFound(asyncResp->res, "ComputerSystem",
427f3e84a1SEd Tanous                                    systemName);
437f3e84a1SEd Tanous         return;
447f3e84a1SEd Tanous     }
45253f11b8SEd Tanous     if (systemName != BMCWEB_REDFISH_SYSTEM_URI_NAME)
4622d268cbSEd Tanous     {
4722d268cbSEd Tanous         messages::resourceNotFound(asyncResp->res, "ComputerSystem",
4822d268cbSEd Tanous                                    systemName);
4922d268cbSEd Tanous         return;
5022d268cbSEd Tanous     }
51253f11b8SEd Tanous     asyncResp->res.jsonValue["@odata.id"] = std::format(
52253f11b8SEd Tanous         "/redfish/v1/Systems/{}/Bios", BMCWEB_REDFISH_SYSTEM_URI_NAME);
5358eaf5f0SJohn Edward Broadbent     asyncResp->res.jsonValue["@odata.type"] = "#Bios.v1_1_0.Bios";
5458eaf5f0SJohn Edward Broadbent     asyncResp->res.jsonValue["Name"] = "BIOS Configuration";
5558eaf5f0SJohn Edward Broadbent     asyncResp->res.jsonValue["Description"] = "BIOS Configuration Service";
5658eaf5f0SJohn Edward Broadbent     asyncResp->res.jsonValue["Id"] = "BIOS";
5720fa6a2cSEd Tanous     asyncResp->res.jsonValue["Actions"]["#Bios.ResetBios"]["target"] =
58253f11b8SEd Tanous         std::format("/redfish/v1/Systems/{}/Bios/Actions/Bios.ResetBios",
5920fa6a2cSEd Tanous                     BMCWEB_REDFISH_SYSTEM_URI_NAME);
6058eaf5f0SJohn Edward Broadbent 
6158eaf5f0SJohn Edward Broadbent     // Get the ActiveSoftwareImage and SoftwareImages
62eee0013eSWilly Tu     sw_util::populateSoftwareInformation(asyncResp, sw_util::biosPurpose, "",
6358eaf5f0SJohn Edward Broadbent                                          true);
6458eaf5f0SJohn Edward Broadbent }
6545ca1b86SEd Tanous 
requestRoutesBiosService(App & app)667e860f15SJohn Edward Broadbent inline void requestRoutesBiosService(App& app)
67d82a3acdSCarol Wang {
6822d268cbSEd Tanous     BMCWEB_ROUTE(app, "/redfish/v1/Systems/<str>/Bios/")
69ed398213SEd Tanous         .privileges(redfish::privileges::getBios)
7045ca1b86SEd Tanous         .methods(boost::beast::http::verb::get)(
7145ca1b86SEd Tanous             std::bind_front(handleBiosServiceGet, std::ref(app)));
72d82a3acdSCarol Wang }
7358eaf5f0SJohn Edward Broadbent 
74d82a3acdSCarol Wang /**
75d82a3acdSCarol Wang  * BiosReset class supports handle POST method for Reset bios.
76d82a3acdSCarol Wang  * The class retrieves and sends data directly to D-Bus.
777e860f15SJohn Edward Broadbent  *
78d82a3acdSCarol Wang  * Function handles POST method request.
79d82a3acdSCarol Wang  * Analyzes POST body message before sends Reset request data to D-Bus.
80d82a3acdSCarol Wang  */
handleBiosResetPost(crow::App & app,const crow::Request & req,const std::shared_ptr<bmcweb::AsyncResp> & asyncResp,const std::string & systemName)81*504af5a0SPatrick Williams inline void handleBiosResetPost(
82*504af5a0SPatrick Williams     crow::App& app, const crow::Request& req,
8322d268cbSEd Tanous     const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
8422d268cbSEd Tanous     const std::string& systemName)
857e860f15SJohn Edward Broadbent {
863ba00073SCarson Labrado     if (!redfish::setUpRedfishRoute(app, req, asyncResp))
8745ca1b86SEd Tanous     {
8845ca1b86SEd Tanous         return;
8945ca1b86SEd Tanous     }
9022d268cbSEd Tanous 
9125b54dbaSEd Tanous     if constexpr (BMCWEB_EXPERIMENTAL_REDFISH_MULTI_COMPUTER_SYSTEM)
927f3e84a1SEd Tanous     {
937f3e84a1SEd Tanous         // Option currently returns no systems.  TBD
947f3e84a1SEd Tanous         messages::resourceNotFound(asyncResp->res, "ComputerSystem",
957f3e84a1SEd Tanous                                    systemName);
967f3e84a1SEd Tanous         return;
977f3e84a1SEd Tanous     }
987f3e84a1SEd Tanous 
99253f11b8SEd Tanous     if (systemName != BMCWEB_REDFISH_SYSTEM_URI_NAME)
10022d268cbSEd Tanous     {
10122d268cbSEd Tanous         messages::resourceNotFound(asyncResp->res, "ComputerSystem",
10222d268cbSEd Tanous                                    systemName);
10322d268cbSEd Tanous         return;
10422d268cbSEd Tanous     }
10522d268cbSEd Tanous 
106d82a3acdSCarol Wang     crow::connections::systemBus->async_method_call(
1075e7e2dc5SEd Tanous         [asyncResp](const boost::system::error_code& ec) {
108d82a3acdSCarol Wang             if (ec)
109d82a3acdSCarol Wang             {
11062598e31SEd Tanous                 BMCWEB_LOG_ERROR("Failed to reset bios: {}", ec);
111d82a3acdSCarol Wang                 messages::internalError(asyncResp->res);
112d82a3acdSCarol Wang                 return;
113d82a3acdSCarol Wang             }
114d82a3acdSCarol Wang         },
11558eaf5f0SJohn Edward Broadbent         "org.open_power.Software.Host.Updater", "/xyz/openbmc_project/software",
116d82a3acdSCarol Wang         "xyz.openbmc_project.Common.FactoryReset", "Reset");
117d82a3acdSCarol Wang }
11858eaf5f0SJohn Edward Broadbent 
requestRoutesBiosReset(App & app)11958eaf5f0SJohn Edward Broadbent inline void requestRoutesBiosReset(App& app)
12058eaf5f0SJohn Edward Broadbent {
12122d268cbSEd Tanous     BMCWEB_ROUTE(app, "/redfish/v1/Systems/<str>/Bios/Actions/Bios.ResetBios/")
122b7ff3445SJohn Edward Broadbent         .privileges(redfish::privileges::postBios)
12345ca1b86SEd Tanous         .methods(boost::beast::http::verb::post)(
12445ca1b86SEd Tanous             std::bind_front(handleBiosResetPost, std::ref(app)));
12558eaf5f0SJohn Edward Broadbent }
12658eaf5f0SJohn Edward Broadbent 
127d82a3acdSCarol Wang } // namespace redfish
128