1c5b2abe0SLewanczyk, Dawid /* 2c5b2abe0SLewanczyk, Dawid // Copyright (c) 2018 Intel Corporation 3c5b2abe0SLewanczyk, Dawid // 4c5b2abe0SLewanczyk, Dawid // Licensed under the Apache License, Version 2.0 (the "License"); 5c5b2abe0SLewanczyk, Dawid // you may not use this file except in compliance with the License. 6c5b2abe0SLewanczyk, Dawid // You may obtain a copy of the License at 7c5b2abe0SLewanczyk, Dawid // 8c5b2abe0SLewanczyk, Dawid // http://www.apache.org/licenses/LICENSE-2.0 9c5b2abe0SLewanczyk, Dawid // 10c5b2abe0SLewanczyk, Dawid // Unless required by applicable law or agreed to in writing, software 11c5b2abe0SLewanczyk, Dawid // distributed under the License is distributed on an "AS IS" BASIS, 12c5b2abe0SLewanczyk, Dawid // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13c5b2abe0SLewanczyk, Dawid // See the License for the specific language governing permissions and 14c5b2abe0SLewanczyk, Dawid // limitations under the License. 15c5b2abe0SLewanczyk, Dawid */ 16c5b2abe0SLewanczyk, Dawid #pragma once 17c5b2abe0SLewanczyk, Dawid 18b49ac873SJames Feist #include "health.hpp" 191c8fba97SJames Feist #include "led.hpp" 20f5c9f8bdSJason M. Bills #include "pcie.hpp" 21c5d03ff4SJennifer Lee #include "redfish_util.hpp" 22c5d03ff4SJennifer Lee 237e860f15SJohn Edward Broadbent #include <app.hpp> 249712f8acSEd Tanous #include <boost/container/flat_map.hpp> 25ed398213SEd Tanous #include <registries/privilege_registry.hpp> 26cb7e1e7bSAndrew Geissler #include <utils/fw_utils.hpp> 27c5b2abe0SLewanczyk, Dawid #include <utils/json_utils.hpp> 281214b7e7SGunnar Mills 29abf2add6SEd Tanous #include <variant> 30c5b2abe0SLewanczyk, Dawid 311abe55efSEd Tanous namespace redfish 321abe55efSEd Tanous { 33c5b2abe0SLewanczyk, Dawid 349d3ae10eSAlpana Kumari /** 359d3ae10eSAlpana Kumari * @brief Updates the Functional State of DIMMs 369d3ae10eSAlpana Kumari * 379d3ae10eSAlpana Kumari * @param[in] aResp Shared pointer for completing asynchronous calls 389d3ae10eSAlpana Kumari * @param[in] dimmState Dimm's Functional state, true/false 399d3ae10eSAlpana Kumari * 409d3ae10eSAlpana Kumari * @return None. 419d3ae10eSAlpana Kumari */ 428d1b46d7Szhanghch05 inline void 438d1b46d7Szhanghch05 updateDimmProperties(const std::shared_ptr<bmcweb::AsyncResp>& aResp, 449d3ae10eSAlpana Kumari const std::variant<bool>& dimmState) 459d3ae10eSAlpana Kumari { 469d3ae10eSAlpana Kumari const bool* isDimmFunctional = std::get_if<bool>(&dimmState); 479d3ae10eSAlpana Kumari if (isDimmFunctional == nullptr) 489d3ae10eSAlpana Kumari { 499d3ae10eSAlpana Kumari messages::internalError(aResp->res); 509d3ae10eSAlpana Kumari return; 519d3ae10eSAlpana Kumari } 529d3ae10eSAlpana Kumari BMCWEB_LOG_DEBUG << "Dimm Functional: " << *isDimmFunctional; 539d3ae10eSAlpana Kumari 549d3ae10eSAlpana Kumari // Set it as Enabled if at least one DIMM is functional 559d3ae10eSAlpana Kumari // Update STATE only if previous State was DISABLED and current Dimm is 569d3ae10eSAlpana Kumari // ENABLED. 579d3ae10eSAlpana Kumari nlohmann::json& prevMemSummary = 589d3ae10eSAlpana Kumari aResp->res.jsonValue["MemorySummary"]["Status"]["State"]; 599d3ae10eSAlpana Kumari if (prevMemSummary == "Disabled") 609d3ae10eSAlpana Kumari { 619d3ae10eSAlpana Kumari if (*isDimmFunctional == true) 629d3ae10eSAlpana Kumari { 639d3ae10eSAlpana Kumari aResp->res.jsonValue["MemorySummary"]["Status"]["State"] = 649d3ae10eSAlpana Kumari "Enabled"; 659d3ae10eSAlpana Kumari } 669d3ae10eSAlpana Kumari } 679d3ae10eSAlpana Kumari } 689d3ae10eSAlpana Kumari 6957e8c9beSAlpana Kumari /* 7057e8c9beSAlpana Kumari * @brief Update "ProcessorSummary" "Count" based on Cpu PresenceState 7157e8c9beSAlpana Kumari * 7257e8c9beSAlpana Kumari * @param[in] aResp Shared pointer for completing asynchronous calls 7357e8c9beSAlpana Kumari * @param[in] cpuPresenceState CPU present or not 7457e8c9beSAlpana Kumari * 7557e8c9beSAlpana Kumari * @return None. 7657e8c9beSAlpana Kumari */ 778d1b46d7Szhanghch05 inline void 788d1b46d7Szhanghch05 modifyCpuPresenceState(const std::shared_ptr<bmcweb::AsyncResp>& aResp, 7957e8c9beSAlpana Kumari const std::variant<bool>& cpuPresenceState) 8057e8c9beSAlpana Kumari { 8157e8c9beSAlpana Kumari const bool* isCpuPresent = std::get_if<bool>(&cpuPresenceState); 8257e8c9beSAlpana Kumari 8357e8c9beSAlpana Kumari if (isCpuPresent == nullptr) 8457e8c9beSAlpana Kumari { 8557e8c9beSAlpana Kumari messages::internalError(aResp->res); 8657e8c9beSAlpana Kumari return; 8757e8c9beSAlpana Kumari } 8857e8c9beSAlpana Kumari BMCWEB_LOG_DEBUG << "Cpu Present: " << *isCpuPresent; 8957e8c9beSAlpana Kumari 9057e8c9beSAlpana Kumari if (*isCpuPresent == true) 9157e8c9beSAlpana Kumari { 92b4b9595aSJames Feist nlohmann::json& procCount = 93b4b9595aSJames Feist aResp->res.jsonValue["ProcessorSummary"]["Count"]; 94b4b9595aSJames Feist auto procCountPtr = 95b4b9595aSJames Feist procCount.get_ptr<nlohmann::json::number_integer_t*>(); 96b4b9595aSJames Feist if (procCountPtr != nullptr) 97b4b9595aSJames Feist { 98b4b9595aSJames Feist // shouldn't be possible to be nullptr 99b4b9595aSJames Feist *procCountPtr += 1; 10057e8c9beSAlpana Kumari } 101b4b9595aSJames Feist } 10257e8c9beSAlpana Kumari } 10357e8c9beSAlpana Kumari 10457e8c9beSAlpana Kumari /* 10557e8c9beSAlpana Kumari * @brief Update "ProcessorSummary" "Status" "State" based on 10657e8c9beSAlpana Kumari * CPU Functional State 10757e8c9beSAlpana Kumari * 10857e8c9beSAlpana Kumari * @param[in] aResp Shared pointer for completing asynchronous calls 10957e8c9beSAlpana Kumari * @param[in] cpuFunctionalState is CPU functional true/false 11057e8c9beSAlpana Kumari * 11157e8c9beSAlpana Kumari * @return None. 11257e8c9beSAlpana Kumari */ 11323a21a1cSEd Tanous inline void 1148d1b46d7Szhanghch05 modifyCpuFunctionalState(const std::shared_ptr<bmcweb::AsyncResp>& aResp, 11557e8c9beSAlpana Kumari const std::variant<bool>& cpuFunctionalState) 11657e8c9beSAlpana Kumari { 11757e8c9beSAlpana Kumari const bool* isCpuFunctional = std::get_if<bool>(&cpuFunctionalState); 11857e8c9beSAlpana Kumari 11957e8c9beSAlpana Kumari if (isCpuFunctional == nullptr) 12057e8c9beSAlpana Kumari { 12157e8c9beSAlpana Kumari messages::internalError(aResp->res); 12257e8c9beSAlpana Kumari return; 12357e8c9beSAlpana Kumari } 12457e8c9beSAlpana Kumari BMCWEB_LOG_DEBUG << "Cpu Functional: " << *isCpuFunctional; 12557e8c9beSAlpana Kumari 12657e8c9beSAlpana Kumari nlohmann::json& prevProcState = 12757e8c9beSAlpana Kumari aResp->res.jsonValue["ProcessorSummary"]["Status"]["State"]; 12857e8c9beSAlpana Kumari 12957e8c9beSAlpana Kumari // Set it as Enabled if at least one CPU is functional 13057e8c9beSAlpana Kumari // Update STATE only if previous State was Non_Functional and current CPU is 13157e8c9beSAlpana Kumari // Functional. 13257e8c9beSAlpana Kumari if (prevProcState == "Disabled") 13357e8c9beSAlpana Kumari { 13457e8c9beSAlpana Kumari if (*isCpuFunctional == true) 13557e8c9beSAlpana Kumari { 13657e8c9beSAlpana Kumari aResp->res.jsonValue["ProcessorSummary"]["Status"]["State"] = 13757e8c9beSAlpana Kumari "Enabled"; 13857e8c9beSAlpana Kumari } 13957e8c9beSAlpana Kumari } 14057e8c9beSAlpana Kumari } 14157e8c9beSAlpana Kumari 14257e8c9beSAlpana Kumari /* 143c5b2abe0SLewanczyk, Dawid * @brief Retrieves computer system properties over dbus 144c5b2abe0SLewanczyk, Dawid * 145c5b2abe0SLewanczyk, Dawid * @param[in] aResp Shared pointer for completing asynchronous calls 1468f9ee3cdSGunnar Mills * @param[in] systemHealth Shared HealthPopulate pointer 147c5b2abe0SLewanczyk, Dawid * 148c5b2abe0SLewanczyk, Dawid * @return None. 149c5b2abe0SLewanczyk, Dawid */ 150b5a76932SEd Tanous inline void 1518d1b46d7Szhanghch05 getComputerSystem(const std::shared_ptr<bmcweb::AsyncResp>& aResp, 152b5a76932SEd Tanous const std::shared_ptr<HealthPopulate>& systemHealth) 1531abe55efSEd Tanous { 15455c7b7a2SEd Tanous BMCWEB_LOG_DEBUG << "Get available system components."; 1559d3ae10eSAlpana Kumari 15655c7b7a2SEd Tanous crow::connections::systemBus->async_method_call( 1575bc2dc8eSJames Feist [aResp, systemHealth]( 158c5b2abe0SLewanczyk, Dawid const boost::system::error_code ec, 159c5b2abe0SLewanczyk, Dawid const std::vector<std::pair< 1606c34de48SEd Tanous std::string, 1611214b7e7SGunnar Mills std::vector<std::pair<std::string, std::vector<std::string>>>>>& 1621214b7e7SGunnar Mills subtree) { 1631abe55efSEd Tanous if (ec) 1641abe55efSEd Tanous { 16555c7b7a2SEd Tanous BMCWEB_LOG_DEBUG << "DBUS response error"; 166f12894f8SJason M. Bills messages::internalError(aResp->res); 167c5b2abe0SLewanczyk, Dawid return; 168c5b2abe0SLewanczyk, Dawid } 169c5b2abe0SLewanczyk, Dawid // Iterate over all retrieved ObjectPaths. 1706c34de48SEd Tanous for (const std::pair<std::string, 1716c34de48SEd Tanous std::vector<std::pair< 1721214b7e7SGunnar Mills std::string, std::vector<std::string>>>>& 1731214b7e7SGunnar Mills object : subtree) 1741abe55efSEd Tanous { 175c5b2abe0SLewanczyk, Dawid const std::string& path = object.first; 17655c7b7a2SEd Tanous BMCWEB_LOG_DEBUG << "Got path: " << path; 1771abe55efSEd Tanous const std::vector< 1781214b7e7SGunnar Mills std::pair<std::string, std::vector<std::string>>>& 1791214b7e7SGunnar Mills connectionNames = object.second; 1801abe55efSEd Tanous if (connectionNames.size() < 1) 1811abe55efSEd Tanous { 182c5b2abe0SLewanczyk, Dawid continue; 183c5b2abe0SLewanczyk, Dawid } 184029573d4SEd Tanous 1855bc2dc8eSJames Feist auto memoryHealth = std::make_shared<HealthPopulate>( 1865bc2dc8eSJames Feist aResp, aResp->res.jsonValue["MemorySummary"]["Status"]); 1875bc2dc8eSJames Feist 1885bc2dc8eSJames Feist auto cpuHealth = std::make_shared<HealthPopulate>( 1895bc2dc8eSJames Feist aResp, aResp->res.jsonValue["ProcessorSummary"]["Status"]); 1905bc2dc8eSJames Feist 1915bc2dc8eSJames Feist systemHealth->children.emplace_back(memoryHealth); 1925bc2dc8eSJames Feist systemHealth->children.emplace_back(cpuHealth); 1935bc2dc8eSJames Feist 1946c34de48SEd Tanous // This is not system, so check if it's cpu, dimm, UUID or 1956c34de48SEd Tanous // BiosVer 19604a258f4SEd Tanous for (const auto& connection : connectionNames) 1971abe55efSEd Tanous { 19804a258f4SEd Tanous for (const auto& interfaceName : connection.second) 1991abe55efSEd Tanous { 20004a258f4SEd Tanous if (interfaceName == 20104a258f4SEd Tanous "xyz.openbmc_project.Inventory.Item.Dimm") 2021abe55efSEd Tanous { 2031abe55efSEd Tanous BMCWEB_LOG_DEBUG 20404a258f4SEd Tanous << "Found Dimm, now get its properties."; 2059d3ae10eSAlpana Kumari 20655c7b7a2SEd Tanous crow::connections::systemBus->async_method_call( 2079d3ae10eSAlpana Kumari [aResp, service{connection.first}, 208f23b7296SEd Tanous path](const boost::system::error_code ec2, 2096c34de48SEd Tanous const std::vector< 2101214b7e7SGunnar Mills std::pair<std::string, VariantType>>& 2111214b7e7SGunnar Mills properties) { 212cb13a392SEd Tanous if (ec2) 2131abe55efSEd Tanous { 2141abe55efSEd Tanous BMCWEB_LOG_ERROR 215cb13a392SEd Tanous << "DBUS response error " << ec2; 216f12894f8SJason M. Bills messages::internalError(aResp->res); 217c5b2abe0SLewanczyk, Dawid return; 218c5b2abe0SLewanczyk, Dawid } 2196c34de48SEd Tanous BMCWEB_LOG_DEBUG << "Got " 2206c34de48SEd Tanous << properties.size() 221c5b2abe0SLewanczyk, Dawid << " Dimm properties."; 2229d3ae10eSAlpana Kumari 2239d3ae10eSAlpana Kumari if (properties.size() > 0) 2249d3ae10eSAlpana Kumari { 22504a258f4SEd Tanous for (const std::pair<std::string, 2261214b7e7SGunnar Mills VariantType>& 2271214b7e7SGunnar Mills property : properties) 2281abe55efSEd Tanous { 2295fd7ba65SCheng C Yang if (property.first != 2305fd7ba65SCheng C Yang "MemorySizeInKB") 2311abe55efSEd Tanous { 2325fd7ba65SCheng C Yang continue; 2335fd7ba65SCheng C Yang } 2345fd7ba65SCheng C Yang const uint32_t* value = 2358d78b7a9SPatrick Williams std::get_if<uint32_t>( 2361b6b96c5SEd Tanous &property.second); 2375fd7ba65SCheng C Yang if (value == nullptr) 2381abe55efSEd Tanous { 2395fd7ba65SCheng C Yang BMCWEB_LOG_DEBUG 2405fd7ba65SCheng C Yang << "Find incorrect type of " 2415fd7ba65SCheng C Yang "MemorySize"; 2425fd7ba65SCheng C Yang continue; 2435fd7ba65SCheng C Yang } 2445fd7ba65SCheng C Yang nlohmann::json& totalMemory = 2455fd7ba65SCheng C Yang aResp->res 2465fd7ba65SCheng C Yang .jsonValue["MemorySummar" 2475fd7ba65SCheng C Yang "y"] 2485fd7ba65SCheng C Yang ["TotalSystemMe" 2495fd7ba65SCheng C Yang "moryGiB"]; 2505fd7ba65SCheng C Yang uint64_t* preValue = 2515fd7ba65SCheng C Yang totalMemory 2525fd7ba65SCheng C Yang .get_ptr<uint64_t*>(); 2535fd7ba65SCheng C Yang if (preValue == nullptr) 2545fd7ba65SCheng C Yang { 2555fd7ba65SCheng C Yang continue; 2565fd7ba65SCheng C Yang } 2575fd7ba65SCheng C Yang aResp->res 2585fd7ba65SCheng C Yang .jsonValue["MemorySummary"] 2596c34de48SEd Tanous ["TotalSystemMemoryGi" 2605fd7ba65SCheng C Yang "B"] = 2615fd7ba65SCheng C Yang *value / (1024 * 1024) + 2625fd7ba65SCheng C Yang *preValue; 2635fd7ba65SCheng C Yang aResp->res 2645fd7ba65SCheng C Yang .jsonValue["MemorySummary"] 2659d3ae10eSAlpana Kumari ["Status"]["State"] = 2661abe55efSEd Tanous "Enabled"; 267c5b2abe0SLewanczyk, Dawid } 268c5b2abe0SLewanczyk, Dawid } 2699d3ae10eSAlpana Kumari else 2709d3ae10eSAlpana Kumari { 2719d3ae10eSAlpana Kumari auto getDimmProperties = 2729d3ae10eSAlpana Kumari [aResp]( 2739d3ae10eSAlpana Kumari const boost::system::error_code 274cb13a392SEd Tanous ec3, 2751214b7e7SGunnar Mills const std::variant<bool>& 2761214b7e7SGunnar Mills dimmState) { 277cb13a392SEd Tanous if (ec3) 2789d3ae10eSAlpana Kumari { 2799d3ae10eSAlpana Kumari BMCWEB_LOG_ERROR 2809d3ae10eSAlpana Kumari << "DBUS response " 2819d3ae10eSAlpana Kumari "error " 282cb13a392SEd Tanous << ec3; 2839d3ae10eSAlpana Kumari return; 2849d3ae10eSAlpana Kumari } 2859d3ae10eSAlpana Kumari updateDimmProperties(aResp, 2869d3ae10eSAlpana Kumari dimmState); 2879d3ae10eSAlpana Kumari }; 2889d3ae10eSAlpana Kumari crow::connections::systemBus 2899d3ae10eSAlpana Kumari ->async_method_call( 2909d3ae10eSAlpana Kumari std::move(getDimmProperties), 2919d3ae10eSAlpana Kumari service, path, 2929d3ae10eSAlpana Kumari "org.freedesktop.DBus." 2939d3ae10eSAlpana Kumari "Properties", 2949d3ae10eSAlpana Kumari "Get", 2959d3ae10eSAlpana Kumari "xyz.openbmc_project.State." 2969d3ae10eSAlpana Kumari "Decorator.OperationalStatus", 2979d3ae10eSAlpana Kumari "Functional"); 2989d3ae10eSAlpana Kumari } 299c5b2abe0SLewanczyk, Dawid }, 30004a258f4SEd Tanous connection.first, path, 3016c34de48SEd Tanous "org.freedesktop.DBus.Properties", "GetAll", 3026c34de48SEd Tanous "xyz.openbmc_project.Inventory.Item.Dimm"); 3035bc2dc8eSJames Feist 3045bc2dc8eSJames Feist memoryHealth->inventory.emplace_back(path); 3051abe55efSEd Tanous } 30604a258f4SEd Tanous else if (interfaceName == 30704a258f4SEd Tanous "xyz.openbmc_project.Inventory.Item.Cpu") 3081abe55efSEd Tanous { 3091abe55efSEd Tanous BMCWEB_LOG_DEBUG 31004a258f4SEd Tanous << "Found Cpu, now get its properties."; 31157e8c9beSAlpana Kumari 312a0803efaSEd Tanous crow::connections::systemBus->async_method_call( 31357e8c9beSAlpana Kumari [aResp, service{connection.first}, 314f23b7296SEd Tanous path](const boost::system::error_code ec2, 3156c34de48SEd Tanous const std::vector< 3161214b7e7SGunnar Mills std::pair<std::string, VariantType>>& 3171214b7e7SGunnar Mills properties) { 318cb13a392SEd Tanous if (ec2) 3191abe55efSEd Tanous { 3201abe55efSEd Tanous BMCWEB_LOG_ERROR 321cb13a392SEd Tanous << "DBUS response error " << ec2; 322f12894f8SJason M. Bills messages::internalError(aResp->res); 323c5b2abe0SLewanczyk, Dawid return; 324c5b2abe0SLewanczyk, Dawid } 3256c34de48SEd Tanous BMCWEB_LOG_DEBUG << "Got " 3266c34de48SEd Tanous << properties.size() 327c5b2abe0SLewanczyk, Dawid << " Cpu properties."; 32857e8c9beSAlpana Kumari 32957e8c9beSAlpana Kumari auto getCpuPresenceState = 33057e8c9beSAlpana Kumari [aResp]( 331*a1978347SAli Ahmed const boost::system::error_code ec3, 3321214b7e7SGunnar Mills const std::variant<bool>& 3331214b7e7SGunnar Mills cpuPresenceCheck) { 334cb13a392SEd Tanous if (ec3) 33557e8c9beSAlpana Kumari { 33657e8c9beSAlpana Kumari BMCWEB_LOG_ERROR 337*a1978347SAli Ahmed << "DBUS response error " 338cb13a392SEd Tanous << ec3; 33957e8c9beSAlpana Kumari return; 34057e8c9beSAlpana Kumari } 34157e8c9beSAlpana Kumari modifyCpuPresenceState( 34257e8c9beSAlpana Kumari aResp, cpuPresenceCheck); 34357e8c9beSAlpana Kumari }; 34457e8c9beSAlpana Kumari 34557e8c9beSAlpana Kumari auto getCpuFunctionalState = 34657e8c9beSAlpana Kumari [aResp]( 347*a1978347SAli Ahmed const boost::system::error_code ec3, 3481214b7e7SGunnar Mills const std::variant<bool>& 3491214b7e7SGunnar Mills cpuFunctionalCheck) { 350cb13a392SEd Tanous if (ec3) 35157e8c9beSAlpana Kumari { 35257e8c9beSAlpana Kumari BMCWEB_LOG_ERROR 353*a1978347SAli Ahmed << "DBUS response error " 354cb13a392SEd Tanous << ec3; 35557e8c9beSAlpana Kumari return; 35657e8c9beSAlpana Kumari } 35757e8c9beSAlpana Kumari modifyCpuFunctionalState( 35857e8c9beSAlpana Kumari aResp, cpuFunctionalCheck); 35957e8c9beSAlpana Kumari }; 360*a1978347SAli Ahmed 36157e8c9beSAlpana Kumari // Get the Presence of CPU 36257e8c9beSAlpana Kumari crow::connections::systemBus 36357e8c9beSAlpana Kumari ->async_method_call( 36457e8c9beSAlpana Kumari std::move(getCpuPresenceState), 36557e8c9beSAlpana Kumari service, path, 36657e8c9beSAlpana Kumari "org.freedesktop.DBus." 36757e8c9beSAlpana Kumari "Properties", 36857e8c9beSAlpana Kumari "Get", 36957e8c9beSAlpana Kumari "xyz.openbmc_project.Inventory." 37057e8c9beSAlpana Kumari "Item", 37157e8c9beSAlpana Kumari "Present"); 37257e8c9beSAlpana Kumari 37357e8c9beSAlpana Kumari // Get the Functional State 37457e8c9beSAlpana Kumari crow::connections::systemBus 37557e8c9beSAlpana Kumari ->async_method_call( 376*a1978347SAli Ahmed std::move(getCpuFunctionalState), 37757e8c9beSAlpana Kumari service, path, 37857e8c9beSAlpana Kumari "org.freedesktop.DBus." 37957e8c9beSAlpana Kumari "Properties", 38057e8c9beSAlpana Kumari "Get", 38157e8c9beSAlpana Kumari "xyz.openbmc_project.State." 38257e8c9beSAlpana Kumari "Decorator." 38357e8c9beSAlpana Kumari "OperationalStatus", 38457e8c9beSAlpana Kumari "Functional"); 38557e8c9beSAlpana Kumari 38657e8c9beSAlpana Kumari // Get the MODEL from 38757e8c9beSAlpana Kumari // xyz.openbmc_project.Inventory.Decorator.Asset 38857e8c9beSAlpana Kumari // support it later as Model is Empty 38957e8c9beSAlpana Kumari // currently. 390c5b2abe0SLewanczyk, Dawid }, 39104a258f4SEd Tanous connection.first, path, 3926c34de48SEd Tanous "org.freedesktop.DBus.Properties", "GetAll", 3936c34de48SEd Tanous "xyz.openbmc_project.Inventory.Item.Cpu"); 3945bc2dc8eSJames Feist 3955bc2dc8eSJames Feist cpuHealth->inventory.emplace_back(path); 3961abe55efSEd Tanous } 39704a258f4SEd Tanous else if (interfaceName == 39804a258f4SEd Tanous "xyz.openbmc_project.Common.UUID") 3991abe55efSEd Tanous { 4001abe55efSEd Tanous BMCWEB_LOG_DEBUG 40104a258f4SEd Tanous << "Found UUID, now get its properties."; 40255c7b7a2SEd Tanous crow::connections::systemBus->async_method_call( 4031214b7e7SGunnar Mills [aResp]( 404cb13a392SEd Tanous const boost::system::error_code ec3, 4056c34de48SEd Tanous const std::vector< 4061214b7e7SGunnar Mills std::pair<std::string, VariantType>>& 4071214b7e7SGunnar Mills properties) { 408cb13a392SEd Tanous if (ec3) 4091abe55efSEd Tanous { 4101abe55efSEd Tanous BMCWEB_LOG_DEBUG 411cb13a392SEd Tanous << "DBUS response error " << ec3; 412f12894f8SJason M. Bills messages::internalError(aResp->res); 413c5b2abe0SLewanczyk, Dawid return; 414c5b2abe0SLewanczyk, Dawid } 4156c34de48SEd Tanous BMCWEB_LOG_DEBUG << "Got " 4166c34de48SEd Tanous << properties.size() 417c5b2abe0SLewanczyk, Dawid << " UUID properties."; 4181abe55efSEd Tanous for (const std::pair<std::string, 4191214b7e7SGunnar Mills VariantType>& 4201214b7e7SGunnar Mills property : properties) 4211abe55efSEd Tanous { 42204a258f4SEd Tanous if (property.first == "UUID") 4231abe55efSEd Tanous { 424c5b2abe0SLewanczyk, Dawid const std::string* value = 4258d78b7a9SPatrick Williams std::get_if<std::string>( 4261b6b96c5SEd Tanous &property.second); 42704a258f4SEd Tanous 4281abe55efSEd Tanous if (value != nullptr) 4291abe55efSEd Tanous { 430029573d4SEd Tanous std::string valueStr = *value; 43104a258f4SEd Tanous if (valueStr.size() == 32) 4321abe55efSEd Tanous { 433029573d4SEd Tanous valueStr.insert(8, 1, '-'); 434029573d4SEd Tanous valueStr.insert(13, 1, '-'); 435029573d4SEd Tanous valueStr.insert(18, 1, '-'); 436029573d4SEd Tanous valueStr.insert(23, 1, '-'); 43704a258f4SEd Tanous } 438029573d4SEd Tanous BMCWEB_LOG_DEBUG << "UUID = " 43904a258f4SEd Tanous << valueStr; 440029573d4SEd Tanous aResp->res.jsonValue["UUID"] = 44104a258f4SEd Tanous valueStr; 442c5b2abe0SLewanczyk, Dawid } 443c5b2abe0SLewanczyk, Dawid } 444c5b2abe0SLewanczyk, Dawid } 445c5b2abe0SLewanczyk, Dawid }, 44604a258f4SEd Tanous connection.first, path, 4476c34de48SEd Tanous "org.freedesktop.DBus.Properties", "GetAll", 4481abe55efSEd Tanous "xyz.openbmc_project.Common.UUID"); 449c5b2abe0SLewanczyk, Dawid } 450029573d4SEd Tanous else if (interfaceName == 451029573d4SEd Tanous "xyz.openbmc_project.Inventory.Item.System") 4521abe55efSEd Tanous { 453029573d4SEd Tanous crow::connections::systemBus->async_method_call( 4541214b7e7SGunnar Mills [aResp]( 455cb13a392SEd Tanous const boost::system::error_code ec2, 456029573d4SEd Tanous const std::vector< 4571214b7e7SGunnar Mills std::pair<std::string, VariantType>>& 4581214b7e7SGunnar Mills propertiesList) { 459cb13a392SEd Tanous if (ec2) 460029573d4SEd Tanous { 461e4a4b9a9SJames Feist // doesn't have to include this 462e4a4b9a9SJames Feist // interface 463029573d4SEd Tanous return; 464029573d4SEd Tanous } 465698654b6SGunnar Mills BMCWEB_LOG_DEBUG 466698654b6SGunnar Mills << "Got " << propertiesList.size() 467029573d4SEd Tanous << " properties for system"; 468029573d4SEd Tanous for (const std::pair<std::string, 4691214b7e7SGunnar Mills VariantType>& 4701214b7e7SGunnar Mills property : propertiesList) 471029573d4SEd Tanous { 472fc5afcf9Sbeccabroek const std::string& propertyName = 473fc5afcf9Sbeccabroek property.first; 474fc5afcf9Sbeccabroek if ((propertyName == "PartNumber") || 475fc5afcf9Sbeccabroek (propertyName == "SerialNumber") || 476fc5afcf9Sbeccabroek (propertyName == "Manufacturer") || 4775235d964SSunnySrivastava1984 (propertyName == "Model") || 4785235d964SSunnySrivastava1984 (propertyName == "SubModel")) 479fc5afcf9Sbeccabroek { 480029573d4SEd Tanous const std::string* value = 481fc5afcf9Sbeccabroek std::get_if<std::string>( 482029573d4SEd Tanous &property.second); 483029573d4SEd Tanous if (value != nullptr) 484029573d4SEd Tanous { 485029573d4SEd Tanous aResp->res 486fc5afcf9Sbeccabroek .jsonValue[propertyName] = 487029573d4SEd Tanous *value; 488029573d4SEd Tanous } 489029573d4SEd Tanous } 490fc5afcf9Sbeccabroek } 491c1e236a6SGunnar Mills 492cb7e1e7bSAndrew Geissler // Grab the bios version 493f97ddba7SGunnar Mills fw_util::populateFirmwareInformation( 494cb7e1e7bSAndrew Geissler aResp, fw_util::biosPurpose, 49572d566d9SGunnar Mills "BiosVersion", false); 496029573d4SEd Tanous }, 497029573d4SEd Tanous connection.first, path, 498029573d4SEd Tanous "org.freedesktop.DBus.Properties", "GetAll", 499029573d4SEd Tanous "xyz.openbmc_project.Inventory.Decorator." 500029573d4SEd Tanous "Asset"); 501e4a4b9a9SJames Feist 502e4a4b9a9SJames Feist crow::connections::systemBus->async_method_call( 503e4a4b9a9SJames Feist [aResp]( 504cb13a392SEd Tanous const boost::system::error_code ec2, 505e4a4b9a9SJames Feist const std::variant<std::string>& property) { 506cb13a392SEd Tanous if (ec2) 507e4a4b9a9SJames Feist { 508e4a4b9a9SJames Feist // doesn't have to include this 509e4a4b9a9SJames Feist // interface 510e4a4b9a9SJames Feist return; 511e4a4b9a9SJames Feist } 512e4a4b9a9SJames Feist 513e4a4b9a9SJames Feist const std::string* value = 514e4a4b9a9SJames Feist std::get_if<std::string>(&property); 515e4a4b9a9SJames Feist if (value != nullptr) 516e4a4b9a9SJames Feist { 517e4a4b9a9SJames Feist aResp->res.jsonValue["AssetTag"] = 518e4a4b9a9SJames Feist *value; 519e4a4b9a9SJames Feist } 520e4a4b9a9SJames Feist }, 521e4a4b9a9SJames Feist connection.first, path, 522e4a4b9a9SJames Feist "org.freedesktop.DBus.Properties", "Get", 523e4a4b9a9SJames Feist "xyz.openbmc_project.Inventory.Decorator." 524e4a4b9a9SJames Feist "AssetTag", 525e4a4b9a9SJames Feist "AssetTag"); 526029573d4SEd Tanous } 527029573d4SEd Tanous } 528029573d4SEd Tanous } 529c5b2abe0SLewanczyk, Dawid } 530c5b2abe0SLewanczyk, Dawid }, 531c5b2abe0SLewanczyk, Dawid "xyz.openbmc_project.ObjectMapper", 532c5b2abe0SLewanczyk, Dawid "/xyz/openbmc_project/object_mapper", 533c5b2abe0SLewanczyk, Dawid "xyz.openbmc_project.ObjectMapper", "GetSubTree", 5346617338dSEd Tanous "/xyz/openbmc_project/inventory", int32_t(0), 5356617338dSEd Tanous std::array<const char*, 5>{ 5366617338dSEd Tanous "xyz.openbmc_project.Inventory.Decorator.Asset", 5376617338dSEd Tanous "xyz.openbmc_project.Inventory.Item.Cpu", 5386617338dSEd Tanous "xyz.openbmc_project.Inventory.Item.Dimm", 5396617338dSEd Tanous "xyz.openbmc_project.Inventory.Item.System", 5406617338dSEd Tanous "xyz.openbmc_project.Common.UUID", 5416617338dSEd Tanous }); 542c5b2abe0SLewanczyk, Dawid } 543c5b2abe0SLewanczyk, Dawid 544c5b2abe0SLewanczyk, Dawid /** 545c5b2abe0SLewanczyk, Dawid * @brief Retrieves host state properties over dbus 546c5b2abe0SLewanczyk, Dawid * 547c5b2abe0SLewanczyk, Dawid * @param[in] aResp Shared pointer for completing asynchronous calls. 548c5b2abe0SLewanczyk, Dawid * 549c5b2abe0SLewanczyk, Dawid * @return None. 550c5b2abe0SLewanczyk, Dawid */ 5518d1b46d7Szhanghch05 inline void getHostState(const std::shared_ptr<bmcweb::AsyncResp>& aResp) 5521abe55efSEd Tanous { 55355c7b7a2SEd Tanous BMCWEB_LOG_DEBUG << "Get host information."; 55455c7b7a2SEd Tanous crow::connections::systemBus->async_method_call( 555c5d03ff4SJennifer Lee [aResp](const boost::system::error_code ec, 556abf2add6SEd Tanous const std::variant<std::string>& hostState) { 5571abe55efSEd Tanous if (ec) 5581abe55efSEd Tanous { 55955c7b7a2SEd Tanous BMCWEB_LOG_DEBUG << "DBUS response error " << ec; 560f12894f8SJason M. Bills messages::internalError(aResp->res); 561c5b2abe0SLewanczyk, Dawid return; 562c5b2abe0SLewanczyk, Dawid } 5636617338dSEd Tanous 564abf2add6SEd Tanous const std::string* s = std::get_if<std::string>(&hostState); 56555c7b7a2SEd Tanous BMCWEB_LOG_DEBUG << "Host state: " << *s; 5666617338dSEd Tanous if (s != nullptr) 5671abe55efSEd Tanous { 568c5b2abe0SLewanczyk, Dawid // Verify Host State 56994732661SAndrew Geissler if (*s == "xyz.openbmc_project.State.Host.HostState.Running") 5701abe55efSEd Tanous { 57155c7b7a2SEd Tanous aResp->res.jsonValue["PowerState"] = "On"; 5726617338dSEd Tanous aResp->res.jsonValue["Status"]["State"] = "Enabled"; 5731abe55efSEd Tanous } 57483935af9SAndrew Geissler else if (*s == "xyz.openbmc_project.State.Host.HostState." 5758c888608SGunnar Mills "Quiesced") 5768c888608SGunnar Mills { 5778c888608SGunnar Mills aResp->res.jsonValue["PowerState"] = "On"; 5788c888608SGunnar Mills aResp->res.jsonValue["Status"]["State"] = "Quiesced"; 5798c888608SGunnar Mills } 5808c888608SGunnar Mills else if (*s == "xyz.openbmc_project.State.Host.HostState." 58183935af9SAndrew Geissler "DiagnosticMode") 58283935af9SAndrew Geissler { 58383935af9SAndrew Geissler aResp->res.jsonValue["PowerState"] = "On"; 58483935af9SAndrew Geissler aResp->res.jsonValue["Status"]["State"] = "InTest"; 58583935af9SAndrew Geissler } 5861a2a1437SAndrew Geissler else if (*s == "xyz.openbmc_project.State.Host.HostState." 5871a2a1437SAndrew Geissler "TransitioningToRunning") 5881a2a1437SAndrew Geissler { 5891a2a1437SAndrew Geissler aResp->res.jsonValue["PowerState"] = "PoweringOn"; 59015c27bf8SNoah Brewer aResp->res.jsonValue["Status"]["State"] = "Starting"; 5911a2a1437SAndrew Geissler } 5921a2a1437SAndrew Geissler else if (*s == "xyz.openbmc_project.State.Host.HostState." 5931a2a1437SAndrew Geissler "TransitioningToOff") 5941a2a1437SAndrew Geissler { 5951a2a1437SAndrew Geissler aResp->res.jsonValue["PowerState"] = "PoweringOff"; 5961a2a1437SAndrew Geissler aResp->res.jsonValue["Status"]["State"] = "Disabled"; 5971a2a1437SAndrew Geissler } 5981abe55efSEd Tanous else 5991abe55efSEd Tanous { 60055c7b7a2SEd Tanous aResp->res.jsonValue["PowerState"] = "Off"; 6016617338dSEd Tanous aResp->res.jsonValue["Status"]["State"] = "Disabled"; 602c5b2abe0SLewanczyk, Dawid } 603c5b2abe0SLewanczyk, Dawid } 604c5b2abe0SLewanczyk, Dawid }, 6056c34de48SEd Tanous "xyz.openbmc_project.State.Host", "/xyz/openbmc_project/state/host0", 6066617338dSEd Tanous "org.freedesktop.DBus.Properties", "Get", 6076617338dSEd Tanous "xyz.openbmc_project.State.Host", "CurrentHostState"); 608c5b2abe0SLewanczyk, Dawid } 609c5b2abe0SLewanczyk, Dawid 610c5b2abe0SLewanczyk, Dawid /** 611786d0f60SGunnar Mills * @brief Translates boot source DBUS property value to redfish. 612491d8ee7SSantosh Puranik * 613491d8ee7SSantosh Puranik * @param[in] dbusSource The boot source in DBUS speak. 614491d8ee7SSantosh Puranik * 615491d8ee7SSantosh Puranik * @return Returns as a string, the boot source in Redfish terms. If translation 616491d8ee7SSantosh Puranik * cannot be done, returns an empty string. 617491d8ee7SSantosh Puranik */ 61823a21a1cSEd Tanous inline std::string dbusToRfBootSource(const std::string& dbusSource) 619491d8ee7SSantosh Puranik { 620491d8ee7SSantosh Puranik if (dbusSource == "xyz.openbmc_project.Control.Boot.Source.Sources.Default") 621491d8ee7SSantosh Puranik { 622491d8ee7SSantosh Puranik return "None"; 623491d8ee7SSantosh Puranik } 6243174e4dfSEd Tanous if (dbusSource == "xyz.openbmc_project.Control.Boot.Source.Sources.Disk") 625491d8ee7SSantosh Puranik { 626491d8ee7SSantosh Puranik return "Hdd"; 627491d8ee7SSantosh Puranik } 6283174e4dfSEd Tanous if (dbusSource == 629a71dc0b7SSantosh Puranik "xyz.openbmc_project.Control.Boot.Source.Sources.ExternalMedia") 630491d8ee7SSantosh Puranik { 631491d8ee7SSantosh Puranik return "Cd"; 632491d8ee7SSantosh Puranik } 6333174e4dfSEd Tanous if (dbusSource == "xyz.openbmc_project.Control.Boot.Source.Sources.Network") 634491d8ee7SSantosh Puranik { 635491d8ee7SSantosh Puranik return "Pxe"; 636491d8ee7SSantosh Puranik } 6373174e4dfSEd Tanous if (dbusSource == 638944ffaf9SJohnathan Mantey "xyz.openbmc_project.Control.Boot.Source.Sources.RemovableMedia") 6399f16b2c1SJennifer Lee { 6409f16b2c1SJennifer Lee return "Usb"; 6419f16b2c1SJennifer Lee } 642491d8ee7SSantosh Puranik return ""; 643491d8ee7SSantosh Puranik } 644491d8ee7SSantosh Puranik 645491d8ee7SSantosh Puranik /** 646cd9a4666SKonstantin Aladyshev * @brief Translates boot type DBUS property value to redfish. 647cd9a4666SKonstantin Aladyshev * 648cd9a4666SKonstantin Aladyshev * @param[in] dbusType The boot type in DBUS speak. 649cd9a4666SKonstantin Aladyshev * 650cd9a4666SKonstantin Aladyshev * @return Returns as a string, the boot type in Redfish terms. If translation 651cd9a4666SKonstantin Aladyshev * cannot be done, returns an empty string. 652cd9a4666SKonstantin Aladyshev */ 653cd9a4666SKonstantin Aladyshev inline std::string dbusToRfBootType(const std::string& dbusType) 654cd9a4666SKonstantin Aladyshev { 655cd9a4666SKonstantin Aladyshev if (dbusType == "xyz.openbmc_project.Control.Boot.Type.Types.Legacy") 656cd9a4666SKonstantin Aladyshev { 657cd9a4666SKonstantin Aladyshev return "Legacy"; 658cd9a4666SKonstantin Aladyshev } 659cd9a4666SKonstantin Aladyshev if (dbusType == "xyz.openbmc_project.Control.Boot.Type.Types.EFI") 660cd9a4666SKonstantin Aladyshev { 661cd9a4666SKonstantin Aladyshev return "UEFI"; 662cd9a4666SKonstantin Aladyshev } 663cd9a4666SKonstantin Aladyshev return ""; 664cd9a4666SKonstantin Aladyshev } 665cd9a4666SKonstantin Aladyshev 666cd9a4666SKonstantin Aladyshev /** 667786d0f60SGunnar Mills * @brief Translates boot mode DBUS property value to redfish. 668491d8ee7SSantosh Puranik * 669491d8ee7SSantosh Puranik * @param[in] dbusMode The boot mode in DBUS speak. 670491d8ee7SSantosh Puranik * 671491d8ee7SSantosh Puranik * @return Returns as a string, the boot mode in Redfish terms. If translation 672491d8ee7SSantosh Puranik * cannot be done, returns an empty string. 673491d8ee7SSantosh Puranik */ 67423a21a1cSEd Tanous inline std::string dbusToRfBootMode(const std::string& dbusMode) 675491d8ee7SSantosh Puranik { 676491d8ee7SSantosh Puranik if (dbusMode == "xyz.openbmc_project.Control.Boot.Mode.Modes.Regular") 677491d8ee7SSantosh Puranik { 678491d8ee7SSantosh Puranik return "None"; 679491d8ee7SSantosh Puranik } 6803174e4dfSEd Tanous if (dbusMode == "xyz.openbmc_project.Control.Boot.Mode.Modes.Safe") 681491d8ee7SSantosh Puranik { 682491d8ee7SSantosh Puranik return "Diags"; 683491d8ee7SSantosh Puranik } 6843174e4dfSEd Tanous if (dbusMode == "xyz.openbmc_project.Control.Boot.Mode.Modes.Setup") 685491d8ee7SSantosh Puranik { 686491d8ee7SSantosh Puranik return "BiosSetup"; 687491d8ee7SSantosh Puranik } 688491d8ee7SSantosh Puranik return ""; 689491d8ee7SSantosh Puranik } 690491d8ee7SSantosh Puranik 691491d8ee7SSantosh Puranik /** 692786d0f60SGunnar Mills * @brief Translates boot source from Redfish to the DBus boot paths. 693491d8ee7SSantosh Puranik * 694491d8ee7SSantosh Puranik * @param[in] rfSource The boot source in Redfish. 695944ffaf9SJohnathan Mantey * @param[out] bootSource The DBus source 696944ffaf9SJohnathan Mantey * @param[out] bootMode the DBus boot mode 697491d8ee7SSantosh Puranik * 698944ffaf9SJohnathan Mantey * @return Integer error code. 699491d8ee7SSantosh Puranik */ 7008d1b46d7Szhanghch05 inline int assignBootParameters(const std::shared_ptr<bmcweb::AsyncResp>& aResp, 701944ffaf9SJohnathan Mantey const std::string& rfSource, 702944ffaf9SJohnathan Mantey std::string& bootSource, std::string& bootMode) 703491d8ee7SSantosh Puranik { 704c21865c4SKonstantin Aladyshev bootSource = "xyz.openbmc_project.Control.Boot.Source.Sources.Default"; 705c21865c4SKonstantin Aladyshev bootMode = "xyz.openbmc_project.Control.Boot.Mode.Modes.Regular"; 706944ffaf9SJohnathan Mantey 707491d8ee7SSantosh Puranik if (rfSource == "None") 708491d8ee7SSantosh Puranik { 709944ffaf9SJohnathan Mantey return 0; 710491d8ee7SSantosh Puranik } 7113174e4dfSEd Tanous if (rfSource == "Pxe") 712491d8ee7SSantosh Puranik { 713944ffaf9SJohnathan Mantey bootSource = "xyz.openbmc_project.Control.Boot.Source.Sources.Network"; 714944ffaf9SJohnathan Mantey } 715944ffaf9SJohnathan Mantey else if (rfSource == "Hdd") 716944ffaf9SJohnathan Mantey { 717944ffaf9SJohnathan Mantey bootSource = "xyz.openbmc_project.Control.Boot.Source.Sources.Disk"; 718944ffaf9SJohnathan Mantey } 719944ffaf9SJohnathan Mantey else if (rfSource == "Diags") 720944ffaf9SJohnathan Mantey { 721944ffaf9SJohnathan Mantey bootMode = "xyz.openbmc_project.Control.Boot.Mode.Modes.Safe"; 722944ffaf9SJohnathan Mantey } 723944ffaf9SJohnathan Mantey else if (rfSource == "Cd") 724944ffaf9SJohnathan Mantey { 725944ffaf9SJohnathan Mantey bootSource = 726944ffaf9SJohnathan Mantey "xyz.openbmc_project.Control.Boot.Source.Sources.ExternalMedia"; 727944ffaf9SJohnathan Mantey } 728944ffaf9SJohnathan Mantey else if (rfSource == "BiosSetup") 729944ffaf9SJohnathan Mantey { 730944ffaf9SJohnathan Mantey bootMode = "xyz.openbmc_project.Control.Boot.Mode.Modes.Setup"; 731491d8ee7SSantosh Puranik } 7329f16b2c1SJennifer Lee else if (rfSource == "Usb") 7339f16b2c1SJennifer Lee { 734944ffaf9SJohnathan Mantey bootSource = 735944ffaf9SJohnathan Mantey "xyz.openbmc_project.Control.Boot.Source.Sources.RemovableMedia"; 7369f16b2c1SJennifer Lee } 737491d8ee7SSantosh Puranik else 738491d8ee7SSantosh Puranik { 739944ffaf9SJohnathan Mantey BMCWEB_LOG_DEBUG << "Invalid property value for " 740944ffaf9SJohnathan Mantey "BootSourceOverrideTarget: " 741944ffaf9SJohnathan Mantey << bootSource; 742944ffaf9SJohnathan Mantey messages::propertyValueNotInList(aResp->res, rfSource, 743944ffaf9SJohnathan Mantey "BootSourceTargetOverride"); 744944ffaf9SJohnathan Mantey return -1; 745491d8ee7SSantosh Puranik } 746944ffaf9SJohnathan Mantey return 0; 747491d8ee7SSantosh Puranik } 7481981771bSAli Ahmed 749978b8803SAndrew Geissler /** 750978b8803SAndrew Geissler * @brief Retrieves boot progress of the system 751978b8803SAndrew Geissler * 752978b8803SAndrew Geissler * @param[in] aResp Shared pointer for generating response message. 753978b8803SAndrew Geissler * 754978b8803SAndrew Geissler * @return None. 755978b8803SAndrew Geissler */ 7568d1b46d7Szhanghch05 inline void getBootProgress(const std::shared_ptr<bmcweb::AsyncResp>& aResp) 757978b8803SAndrew Geissler { 758978b8803SAndrew Geissler crow::connections::systemBus->async_method_call( 759978b8803SAndrew Geissler [aResp](const boost::system::error_code ec, 760978b8803SAndrew Geissler const std::variant<std::string>& bootProgress) { 761978b8803SAndrew Geissler if (ec) 762978b8803SAndrew Geissler { 763978b8803SAndrew Geissler // BootProgress is an optional object so just do nothing if 764978b8803SAndrew Geissler // not found 765978b8803SAndrew Geissler return; 766978b8803SAndrew Geissler } 767978b8803SAndrew Geissler 768978b8803SAndrew Geissler const std::string* bootProgressStr = 769978b8803SAndrew Geissler std::get_if<std::string>(&bootProgress); 770978b8803SAndrew Geissler 771978b8803SAndrew Geissler if (!bootProgressStr) 772978b8803SAndrew Geissler { 773978b8803SAndrew Geissler // Interface implemented but property not found, return error 774978b8803SAndrew Geissler // for that 775978b8803SAndrew Geissler messages::internalError(aResp->res); 776978b8803SAndrew Geissler return; 777978b8803SAndrew Geissler } 778978b8803SAndrew Geissler 779978b8803SAndrew Geissler BMCWEB_LOG_DEBUG << "Boot Progress: " << *bootProgressStr; 780978b8803SAndrew Geissler 781978b8803SAndrew Geissler // Now convert the D-Bus BootProgress to the appropriate Redfish 782978b8803SAndrew Geissler // enum 783978b8803SAndrew Geissler std::string rfBpLastState = "None"; 784978b8803SAndrew Geissler if (*bootProgressStr == "xyz.openbmc_project.State.Boot.Progress." 785978b8803SAndrew Geissler "ProgressStages.Unspecified") 786978b8803SAndrew Geissler { 787978b8803SAndrew Geissler rfBpLastState = "None"; 788978b8803SAndrew Geissler } 789978b8803SAndrew Geissler else if (*bootProgressStr == 790978b8803SAndrew Geissler "xyz.openbmc_project.State.Boot.Progress.ProgressStages." 791978b8803SAndrew Geissler "PrimaryProcInit") 792978b8803SAndrew Geissler { 793978b8803SAndrew Geissler rfBpLastState = "PrimaryProcessorInitializationStarted"; 794978b8803SAndrew Geissler } 795978b8803SAndrew Geissler else if (*bootProgressStr == 796978b8803SAndrew Geissler "xyz.openbmc_project.State.Boot.Progress.ProgressStages." 797978b8803SAndrew Geissler "BusInit") 798978b8803SAndrew Geissler { 799978b8803SAndrew Geissler rfBpLastState = "BusInitializationStarted"; 800978b8803SAndrew Geissler } 801978b8803SAndrew Geissler else if (*bootProgressStr == 802978b8803SAndrew Geissler "xyz.openbmc_project.State.Boot.Progress.ProgressStages." 803978b8803SAndrew Geissler "MemoryInit") 804978b8803SAndrew Geissler { 805978b8803SAndrew Geissler rfBpLastState = "MemoryInitializationStarted"; 806978b8803SAndrew Geissler } 807978b8803SAndrew Geissler else if (*bootProgressStr == 808978b8803SAndrew Geissler "xyz.openbmc_project.State.Boot.Progress.ProgressStages." 809978b8803SAndrew Geissler "SecondaryProcInit") 810978b8803SAndrew Geissler { 811978b8803SAndrew Geissler rfBpLastState = "SecondaryProcessorInitializationStarted"; 812978b8803SAndrew Geissler } 813978b8803SAndrew Geissler else if (*bootProgressStr == 814978b8803SAndrew Geissler "xyz.openbmc_project.State.Boot.Progress.ProgressStages." 815978b8803SAndrew Geissler "PCIInit") 816978b8803SAndrew Geissler { 817978b8803SAndrew Geissler rfBpLastState = "PCIResourceConfigStarted"; 818978b8803SAndrew Geissler } 819978b8803SAndrew Geissler else if (*bootProgressStr == 820978b8803SAndrew Geissler "xyz.openbmc_project.State.Boot.Progress.ProgressStages." 821978b8803SAndrew Geissler "SystemInitComplete") 822978b8803SAndrew Geissler { 823978b8803SAndrew Geissler rfBpLastState = "SystemHardwareInitializationComplete"; 824978b8803SAndrew Geissler } 825978b8803SAndrew Geissler else if (*bootProgressStr == 826978b8803SAndrew Geissler "xyz.openbmc_project.State.Boot.Progress.ProgressStages." 827978b8803SAndrew Geissler "OSStart") 828978b8803SAndrew Geissler { 829978b8803SAndrew Geissler rfBpLastState = "OSBootStarted"; 830978b8803SAndrew Geissler } 831978b8803SAndrew Geissler else if (*bootProgressStr == 832978b8803SAndrew Geissler "xyz.openbmc_project.State.Boot.Progress.ProgressStages." 833978b8803SAndrew Geissler "OSRunning") 834978b8803SAndrew Geissler { 835978b8803SAndrew Geissler rfBpLastState = "OSRunning"; 836978b8803SAndrew Geissler } 837978b8803SAndrew Geissler else 838978b8803SAndrew Geissler { 839978b8803SAndrew Geissler BMCWEB_LOG_DEBUG << "Unsupported D-Bus BootProgress " 840978b8803SAndrew Geissler << *bootProgressStr; 841978b8803SAndrew Geissler // Just return the default 842978b8803SAndrew Geissler } 843978b8803SAndrew Geissler 844978b8803SAndrew Geissler aResp->res.jsonValue["BootProgress"]["LastState"] = rfBpLastState; 845978b8803SAndrew Geissler }, 846978b8803SAndrew Geissler "xyz.openbmc_project.State.Host", "/xyz/openbmc_project/state/host0", 847978b8803SAndrew Geissler "org.freedesktop.DBus.Properties", "Get", 848978b8803SAndrew Geissler "xyz.openbmc_project.State.Boot.Progress", "BootProgress"); 849978b8803SAndrew Geissler } 850491d8ee7SSantosh Puranik 851491d8ee7SSantosh Puranik /** 852c21865c4SKonstantin Aladyshev * @brief Retrieves boot override type over DBUS and fills out the response 853cd9a4666SKonstantin Aladyshev * 854cd9a4666SKonstantin Aladyshev * @param[in] aResp Shared pointer for generating response message. 855cd9a4666SKonstantin Aladyshev * 856cd9a4666SKonstantin Aladyshev * @return None. 857cd9a4666SKonstantin Aladyshev */ 858cd9a4666SKonstantin Aladyshev 859c21865c4SKonstantin Aladyshev inline void getBootOverrideType(const std::shared_ptr<bmcweb::AsyncResp>& aResp) 860cd9a4666SKonstantin Aladyshev { 861cd9a4666SKonstantin Aladyshev crow::connections::systemBus->async_method_call( 862cd9a4666SKonstantin Aladyshev [aResp](const boost::system::error_code ec, 863cd9a4666SKonstantin Aladyshev const std::variant<std::string>& bootType) { 864cd9a4666SKonstantin Aladyshev if (ec) 865cd9a4666SKonstantin Aladyshev { 866cd9a4666SKonstantin Aladyshev // not an error, don't have to have the interface 867cd9a4666SKonstantin Aladyshev return; 868cd9a4666SKonstantin Aladyshev } 869cd9a4666SKonstantin Aladyshev 870cd9a4666SKonstantin Aladyshev const std::string* bootTypeStr = 871cd9a4666SKonstantin Aladyshev std::get_if<std::string>(&bootType); 872cd9a4666SKonstantin Aladyshev 873cd9a4666SKonstantin Aladyshev if (!bootTypeStr) 874cd9a4666SKonstantin Aladyshev { 875cd9a4666SKonstantin Aladyshev messages::internalError(aResp->res); 876cd9a4666SKonstantin Aladyshev return; 877cd9a4666SKonstantin Aladyshev } 878cd9a4666SKonstantin Aladyshev 879cd9a4666SKonstantin Aladyshev BMCWEB_LOG_DEBUG << "Boot type: " << *bootTypeStr; 880cd9a4666SKonstantin Aladyshev 881cd9a4666SKonstantin Aladyshev aResp->res.jsonValue["Boot"]["BootSourceOverrideMode@Redfish." 882cd9a4666SKonstantin Aladyshev "AllowableValues"] = {"Legacy", 883cd9a4666SKonstantin Aladyshev "UEFI"}; 884cd9a4666SKonstantin Aladyshev 885cd9a4666SKonstantin Aladyshev auto rfType = dbusToRfBootType(*bootTypeStr); 886cd9a4666SKonstantin Aladyshev if (rfType.empty()) 887cd9a4666SKonstantin Aladyshev { 888cd9a4666SKonstantin Aladyshev messages::internalError(aResp->res); 889cd9a4666SKonstantin Aladyshev return; 890cd9a4666SKonstantin Aladyshev } 891cd9a4666SKonstantin Aladyshev 892cd9a4666SKonstantin Aladyshev aResp->res.jsonValue["Boot"]["BootSourceOverrideMode"] = rfType; 893cd9a4666SKonstantin Aladyshev }, 894c21865c4SKonstantin Aladyshev "xyz.openbmc_project.Settings", 895c21865c4SKonstantin Aladyshev "/xyz/openbmc_project/control/host0/boot", 896cd9a4666SKonstantin Aladyshev "org.freedesktop.DBus.Properties", "Get", 897cd9a4666SKonstantin Aladyshev "xyz.openbmc_project.Control.Boot.Type", "BootType"); 898cd9a4666SKonstantin Aladyshev } 899cd9a4666SKonstantin Aladyshev 900cd9a4666SKonstantin Aladyshev /** 901c21865c4SKonstantin Aladyshev * @brief Retrieves boot override mode over DBUS and fills out the response 902491d8ee7SSantosh Puranik * 903491d8ee7SSantosh Puranik * @param[in] aResp Shared pointer for generating response message. 904491d8ee7SSantosh Puranik * 905491d8ee7SSantosh Puranik * @return None. 906491d8ee7SSantosh Puranik */ 907c21865c4SKonstantin Aladyshev 908c21865c4SKonstantin Aladyshev inline void getBootOverrideMode(const std::shared_ptr<bmcweb::AsyncResp>& aResp) 909491d8ee7SSantosh Puranik { 910491d8ee7SSantosh Puranik crow::connections::systemBus->async_method_call( 911c21865c4SKonstantin Aladyshev [aResp](const boost::system::error_code ec, 912491d8ee7SSantosh Puranik const std::variant<std::string>& bootMode) { 913491d8ee7SSantosh Puranik if (ec) 914491d8ee7SSantosh Puranik { 915491d8ee7SSantosh Puranik BMCWEB_LOG_DEBUG << "DBUS response error " << ec; 916491d8ee7SSantosh Puranik messages::internalError(aResp->res); 917491d8ee7SSantosh Puranik return; 918491d8ee7SSantosh Puranik } 919491d8ee7SSantosh Puranik 920491d8ee7SSantosh Puranik const std::string* bootModeStr = 921491d8ee7SSantosh Puranik std::get_if<std::string>(&bootMode); 922491d8ee7SSantosh Puranik 923491d8ee7SSantosh Puranik if (!bootModeStr) 924491d8ee7SSantosh Puranik { 925491d8ee7SSantosh Puranik messages::internalError(aResp->res); 926491d8ee7SSantosh Puranik return; 927491d8ee7SSantosh Puranik } 928491d8ee7SSantosh Puranik 929491d8ee7SSantosh Puranik BMCWEB_LOG_DEBUG << "Boot mode: " << *bootModeStr; 930491d8ee7SSantosh Puranik 931491d8ee7SSantosh Puranik aResp->res.jsonValue["Boot"]["BootSourceOverrideTarget@Redfish." 932491d8ee7SSantosh Puranik "AllowableValues"] = { 933944ffaf9SJohnathan Mantey "None", "Pxe", "Hdd", "Cd", "Diags", "BiosSetup", "Usb"}; 934491d8ee7SSantosh Puranik 935491d8ee7SSantosh Puranik if (*bootModeStr != 936491d8ee7SSantosh Puranik "xyz.openbmc_project.Control.Boot.Mode.Modes.Regular") 937491d8ee7SSantosh Puranik { 938491d8ee7SSantosh Puranik auto rfMode = dbusToRfBootMode(*bootModeStr); 939491d8ee7SSantosh Puranik if (!rfMode.empty()) 940491d8ee7SSantosh Puranik { 941491d8ee7SSantosh Puranik aResp->res.jsonValue["Boot"]["BootSourceOverrideTarget"] = 942491d8ee7SSantosh Puranik rfMode; 943491d8ee7SSantosh Puranik } 944491d8ee7SSantosh Puranik } 945491d8ee7SSantosh Puranik }, 946c21865c4SKonstantin Aladyshev "xyz.openbmc_project.Settings", 947c21865c4SKonstantin Aladyshev "/xyz/openbmc_project/control/host0/boot", 948491d8ee7SSantosh Puranik "org.freedesktop.DBus.Properties", "Get", 949491d8ee7SSantosh Puranik "xyz.openbmc_project.Control.Boot.Mode", "BootMode"); 950491d8ee7SSantosh Puranik } 951491d8ee7SSantosh Puranik 952491d8ee7SSantosh Puranik /** 953c21865c4SKonstantin Aladyshev * @brief Retrieves boot override source over DBUS 954491d8ee7SSantosh Puranik * 955491d8ee7SSantosh Puranik * @param[in] aResp Shared pointer for generating response message. 956491d8ee7SSantosh Puranik * 957491d8ee7SSantosh Puranik * @return None. 958491d8ee7SSantosh Puranik */ 959c21865c4SKonstantin Aladyshev 960c21865c4SKonstantin Aladyshev inline void 961c21865c4SKonstantin Aladyshev getBootOverrideSource(const std::shared_ptr<bmcweb::AsyncResp>& aResp) 962491d8ee7SSantosh Puranik { 963491d8ee7SSantosh Puranik crow::connections::systemBus->async_method_call( 964c21865c4SKonstantin Aladyshev [aResp](const boost::system::error_code ec, 965491d8ee7SSantosh Puranik const std::variant<std::string>& bootSource) { 966491d8ee7SSantosh Puranik if (ec) 967491d8ee7SSantosh Puranik { 968491d8ee7SSantosh Puranik BMCWEB_LOG_DEBUG << "DBUS response error " << ec; 969491d8ee7SSantosh Puranik messages::internalError(aResp->res); 970491d8ee7SSantosh Puranik return; 971491d8ee7SSantosh Puranik } 972491d8ee7SSantosh Puranik 973491d8ee7SSantosh Puranik const std::string* bootSourceStr = 974491d8ee7SSantosh Puranik std::get_if<std::string>(&bootSource); 975491d8ee7SSantosh Puranik 976491d8ee7SSantosh Puranik if (!bootSourceStr) 977491d8ee7SSantosh Puranik { 978491d8ee7SSantosh Puranik messages::internalError(aResp->res); 979491d8ee7SSantosh Puranik return; 980491d8ee7SSantosh Puranik } 981491d8ee7SSantosh Puranik BMCWEB_LOG_DEBUG << "Boot source: " << *bootSourceStr; 982491d8ee7SSantosh Puranik 983491d8ee7SSantosh Puranik auto rfSource = dbusToRfBootSource(*bootSourceStr); 984491d8ee7SSantosh Puranik if (!rfSource.empty()) 985491d8ee7SSantosh Puranik { 986491d8ee7SSantosh Puranik aResp->res.jsonValue["Boot"]["BootSourceOverrideTarget"] = 987491d8ee7SSantosh Puranik rfSource; 988491d8ee7SSantosh Puranik } 989cd9a4666SKonstantin Aladyshev 990cd9a4666SKonstantin Aladyshev // Get BootMode as BootSourceOverrideTarget is constructed 991cd9a4666SKonstantin Aladyshev // from both BootSource and BootMode 992c21865c4SKonstantin Aladyshev getBootOverrideMode(aResp); 993491d8ee7SSantosh Puranik }, 994c21865c4SKonstantin Aladyshev "xyz.openbmc_project.Settings", 995c21865c4SKonstantin Aladyshev "/xyz/openbmc_project/control/host0/boot", 996491d8ee7SSantosh Puranik "org.freedesktop.DBus.Properties", "Get", 997491d8ee7SSantosh Puranik "xyz.openbmc_project.Control.Boot.Source", "BootSource"); 998491d8ee7SSantosh Puranik } 999491d8ee7SSantosh Puranik 1000491d8ee7SSantosh Puranik /** 1001c21865c4SKonstantin Aladyshev * @brief This functions abstracts all the logic behind getting a 1002c21865c4SKonstantin Aladyshev * "BootSourceOverrideEnabled" property from an overall boot override enable 1003c21865c4SKonstantin Aladyshev * state 1004491d8ee7SSantosh Puranik * 1005491d8ee7SSantosh Puranik * @param[in] aResp Shared pointer for generating response message. 1006491d8ee7SSantosh Puranik * 1007491d8ee7SSantosh Puranik * @return None. 1008491d8ee7SSantosh Puranik */ 1009491d8ee7SSantosh Puranik 1010c21865c4SKonstantin Aladyshev inline void 1011c21865c4SKonstantin Aladyshev processBootOverrideEnable(const std::shared_ptr<bmcweb::AsyncResp>& aResp, 1012c21865c4SKonstantin Aladyshev const bool bootOverrideEnableSetting) 1013c21865c4SKonstantin Aladyshev { 1014c21865c4SKonstantin Aladyshev if (!bootOverrideEnableSetting) 1015c21865c4SKonstantin Aladyshev { 1016c21865c4SKonstantin Aladyshev aResp->res.jsonValue["Boot"]["BootSourceOverrideEnabled"] = "Disabled"; 1017c21865c4SKonstantin Aladyshev return; 1018c21865c4SKonstantin Aladyshev } 1019c21865c4SKonstantin Aladyshev 1020c21865c4SKonstantin Aladyshev // If boot source override is enabled, we need to check 'one_time' 1021c21865c4SKonstantin Aladyshev // property to set a correct value for the "BootSourceOverrideEnabled" 1022491d8ee7SSantosh Puranik crow::connections::systemBus->async_method_call( 1023c5d03ff4SJennifer Lee [aResp](const boost::system::error_code ec, 102419bd78d9SPatrick Williams const std::variant<bool>& oneTime) { 1025491d8ee7SSantosh Puranik if (ec) 1026491d8ee7SSantosh Puranik { 1027491d8ee7SSantosh Puranik BMCWEB_LOG_DEBUG << "DBUS response error " << ec; 1028c21865c4SKonstantin Aladyshev messages::internalError(aResp->res); 1029491d8ee7SSantosh Puranik return; 1030491d8ee7SSantosh Puranik } 1031491d8ee7SSantosh Puranik 1032491d8ee7SSantosh Puranik const bool* oneTimePtr = std::get_if<bool>(&oneTime); 1033491d8ee7SSantosh Puranik 1034491d8ee7SSantosh Puranik if (!oneTimePtr) 1035491d8ee7SSantosh Puranik { 1036491d8ee7SSantosh Puranik messages::internalError(aResp->res); 1037491d8ee7SSantosh Puranik return; 1038491d8ee7SSantosh Puranik } 1039c21865c4SKonstantin Aladyshev 1040c21865c4SKonstantin Aladyshev bool oneTimeSetting = *oneTimePtr; 1041c21865c4SKonstantin Aladyshev 1042c21865c4SKonstantin Aladyshev if (oneTimeSetting) 1043c21865c4SKonstantin Aladyshev { 1044c21865c4SKonstantin Aladyshev aResp->res.jsonValue["Boot"]["BootSourceOverrideEnabled"] = 1045c21865c4SKonstantin Aladyshev "Once"; 1046c21865c4SKonstantin Aladyshev } 1047c21865c4SKonstantin Aladyshev else 1048c21865c4SKonstantin Aladyshev { 1049c21865c4SKonstantin Aladyshev aResp->res.jsonValue["Boot"]["BootSourceOverrideEnabled"] = 1050c21865c4SKonstantin Aladyshev "Continuous"; 1051c21865c4SKonstantin Aladyshev } 1052491d8ee7SSantosh Puranik }, 1053491d8ee7SSantosh Puranik "xyz.openbmc_project.Settings", 1054491d8ee7SSantosh Puranik "/xyz/openbmc_project/control/host0/boot/one_time", 1055491d8ee7SSantosh Puranik "org.freedesktop.DBus.Properties", "Get", 1056491d8ee7SSantosh Puranik "xyz.openbmc_project.Object.Enable", "Enabled"); 1057491d8ee7SSantosh Puranik } 1058491d8ee7SSantosh Puranik 1059491d8ee7SSantosh Puranik /** 1060c21865c4SKonstantin Aladyshev * @brief Retrieves boot override enable over DBUS 1061c21865c4SKonstantin Aladyshev * 1062c21865c4SKonstantin Aladyshev * @param[in] aResp Shared pointer for generating response message. 1063c21865c4SKonstantin Aladyshev * 1064c21865c4SKonstantin Aladyshev * @return None. 1065c21865c4SKonstantin Aladyshev */ 1066c21865c4SKonstantin Aladyshev 1067c21865c4SKonstantin Aladyshev inline void 1068c21865c4SKonstantin Aladyshev getBootOverrideEnable(const std::shared_ptr<bmcweb::AsyncResp>& aResp) 1069c21865c4SKonstantin Aladyshev { 1070c21865c4SKonstantin Aladyshev crow::connections::systemBus->async_method_call( 1071c21865c4SKonstantin Aladyshev [aResp](const boost::system::error_code ec, 1072c21865c4SKonstantin Aladyshev const std::variant<bool>& bootOverrideEnable) { 1073c21865c4SKonstantin Aladyshev if (ec) 1074c21865c4SKonstantin Aladyshev { 1075c21865c4SKonstantin Aladyshev BMCWEB_LOG_DEBUG << "DBUS response error " << ec; 1076c21865c4SKonstantin Aladyshev messages::internalError(aResp->res); 1077c21865c4SKonstantin Aladyshev return; 1078c21865c4SKonstantin Aladyshev } 1079c21865c4SKonstantin Aladyshev 1080c21865c4SKonstantin Aladyshev const bool* bootOverrideEnablePtr = 1081c21865c4SKonstantin Aladyshev std::get_if<bool>(&bootOverrideEnable); 1082c21865c4SKonstantin Aladyshev 1083c21865c4SKonstantin Aladyshev if (!bootOverrideEnablePtr) 1084c21865c4SKonstantin Aladyshev { 1085c21865c4SKonstantin Aladyshev messages::internalError(aResp->res); 1086c21865c4SKonstantin Aladyshev return; 1087c21865c4SKonstantin Aladyshev } 1088c21865c4SKonstantin Aladyshev 1089c21865c4SKonstantin Aladyshev processBootOverrideEnable(aResp, *bootOverrideEnablePtr); 1090c21865c4SKonstantin Aladyshev }, 1091c21865c4SKonstantin Aladyshev "xyz.openbmc_project.Settings", 1092c21865c4SKonstantin Aladyshev "/xyz/openbmc_project/control/host0/boot", 1093c21865c4SKonstantin Aladyshev "org.freedesktop.DBus.Properties", "Get", 1094c21865c4SKonstantin Aladyshev "xyz.openbmc_project.Object.Enable", "Enabled"); 1095c21865c4SKonstantin Aladyshev } 1096c21865c4SKonstantin Aladyshev 1097c21865c4SKonstantin Aladyshev /** 1098c21865c4SKonstantin Aladyshev * @brief Retrieves boot source override properties 1099c21865c4SKonstantin Aladyshev * 1100c21865c4SKonstantin Aladyshev * @param[in] aResp Shared pointer for generating response message. 1101c21865c4SKonstantin Aladyshev * 1102c21865c4SKonstantin Aladyshev * @return None. 1103c21865c4SKonstantin Aladyshev */ 1104c21865c4SKonstantin Aladyshev inline void getBootProperties(const std::shared_ptr<bmcweb::AsyncResp>& aResp) 1105c21865c4SKonstantin Aladyshev { 1106c21865c4SKonstantin Aladyshev BMCWEB_LOG_DEBUG << "Get boot information."; 1107c21865c4SKonstantin Aladyshev 1108c21865c4SKonstantin Aladyshev getBootOverrideSource(aResp); 1109c21865c4SKonstantin Aladyshev getBootOverrideType(aResp); 1110c21865c4SKonstantin Aladyshev getBootOverrideEnable(aResp); 1111c21865c4SKonstantin Aladyshev } 1112c21865c4SKonstantin Aladyshev 1113c21865c4SKonstantin Aladyshev /** 1114c0557e1aSGunnar Mills * @brief Retrieves the Last Reset Time 1115c0557e1aSGunnar Mills * 1116c0557e1aSGunnar Mills * "Reset" is an overloaded term in Redfish, "Reset" includes power on 1117c0557e1aSGunnar Mills * and power off. Even though this is the "system" Redfish object look at the 1118c0557e1aSGunnar Mills * chassis D-Bus interface for the LastStateChangeTime since this has the 1119c0557e1aSGunnar Mills * last power operation time. 1120c0557e1aSGunnar Mills * 1121c0557e1aSGunnar Mills * @param[in] aResp Shared pointer for generating response message. 1122c0557e1aSGunnar Mills * 1123c0557e1aSGunnar Mills * @return None. 1124c0557e1aSGunnar Mills */ 11258d1b46d7Szhanghch05 inline void getLastResetTime(const std::shared_ptr<bmcweb::AsyncResp>& aResp) 1126c0557e1aSGunnar Mills { 1127c0557e1aSGunnar Mills BMCWEB_LOG_DEBUG << "Getting System Last Reset Time"; 1128c0557e1aSGunnar Mills 1129c0557e1aSGunnar Mills crow::connections::systemBus->async_method_call( 1130c0557e1aSGunnar Mills [aResp](const boost::system::error_code ec, 1131c0557e1aSGunnar Mills std::variant<uint64_t>& lastResetTime) { 1132c0557e1aSGunnar Mills if (ec) 1133c0557e1aSGunnar Mills { 1134c0557e1aSGunnar Mills BMCWEB_LOG_DEBUG << "D-BUS response error " << ec; 1135c0557e1aSGunnar Mills return; 1136c0557e1aSGunnar Mills } 1137c0557e1aSGunnar Mills 1138c0557e1aSGunnar Mills const uint64_t* lastResetTimePtr = 1139c0557e1aSGunnar Mills std::get_if<uint64_t>(&lastResetTime); 1140c0557e1aSGunnar Mills 1141c0557e1aSGunnar Mills if (!lastResetTimePtr) 1142c0557e1aSGunnar Mills { 1143c0557e1aSGunnar Mills messages::internalError(aResp->res); 1144c0557e1aSGunnar Mills return; 1145c0557e1aSGunnar Mills } 1146c0557e1aSGunnar Mills // LastStateChangeTime is epoch time, in milliseconds 1147c0557e1aSGunnar Mills // https://github.com/openbmc/phosphor-dbus-interfaces/blob/33e8e1dd64da53a66e888d33dc82001305cd0bf9/xyz/openbmc_project/State/Chassis.interface.yaml#L19 1148c0557e1aSGunnar Mills time_t lastResetTimeStamp = 1149c0557e1aSGunnar Mills static_cast<time_t>(*lastResetTimePtr / 1000); 1150c0557e1aSGunnar Mills 1151c0557e1aSGunnar Mills // Convert to ISO 8601 standard 1152c0557e1aSGunnar Mills aResp->res.jsonValue["LastResetTime"] = 1153c0557e1aSGunnar Mills crow::utility::getDateTime(lastResetTimeStamp); 1154c0557e1aSGunnar Mills }, 1155c0557e1aSGunnar Mills "xyz.openbmc_project.State.Chassis", 1156c0557e1aSGunnar Mills "/xyz/openbmc_project/state/chassis0", 1157c0557e1aSGunnar Mills "org.freedesktop.DBus.Properties", "Get", 1158c0557e1aSGunnar Mills "xyz.openbmc_project.State.Chassis", "LastStateChangeTime"); 1159c0557e1aSGunnar Mills } 1160c0557e1aSGunnar Mills 1161c0557e1aSGunnar Mills /** 11626bd5a8d2SGunnar Mills * @brief Retrieves Automatic Retry properties. Known on D-Bus as AutoReboot. 11636bd5a8d2SGunnar Mills * 11646bd5a8d2SGunnar Mills * @param[in] aResp Shared pointer for generating response message. 11656bd5a8d2SGunnar Mills * 11666bd5a8d2SGunnar Mills * @return None. 11676bd5a8d2SGunnar Mills */ 11688d1b46d7Szhanghch05 inline void getAutomaticRetry(const std::shared_ptr<bmcweb::AsyncResp>& aResp) 11696bd5a8d2SGunnar Mills { 11706bd5a8d2SGunnar Mills BMCWEB_LOG_DEBUG << "Get Automatic Retry policy"; 11716bd5a8d2SGunnar Mills 11726bd5a8d2SGunnar Mills crow::connections::systemBus->async_method_call( 11736bd5a8d2SGunnar Mills [aResp](const boost::system::error_code ec, 11746bd5a8d2SGunnar Mills std::variant<bool>& autoRebootEnabled) { 11756bd5a8d2SGunnar Mills if (ec) 11766bd5a8d2SGunnar Mills { 11776bd5a8d2SGunnar Mills BMCWEB_LOG_DEBUG << "D-BUS response error " << ec; 11786bd5a8d2SGunnar Mills return; 11796bd5a8d2SGunnar Mills } 11806bd5a8d2SGunnar Mills 11816bd5a8d2SGunnar Mills const bool* autoRebootEnabledPtr = 11826bd5a8d2SGunnar Mills std::get_if<bool>(&autoRebootEnabled); 11836bd5a8d2SGunnar Mills 11846bd5a8d2SGunnar Mills if (!autoRebootEnabledPtr) 11856bd5a8d2SGunnar Mills { 11866bd5a8d2SGunnar Mills messages::internalError(aResp->res); 11876bd5a8d2SGunnar Mills return; 11886bd5a8d2SGunnar Mills } 11896bd5a8d2SGunnar Mills 11906bd5a8d2SGunnar Mills BMCWEB_LOG_DEBUG << "Auto Reboot: " << *autoRebootEnabledPtr; 11916bd5a8d2SGunnar Mills if (*autoRebootEnabledPtr == true) 11926bd5a8d2SGunnar Mills { 11936bd5a8d2SGunnar Mills aResp->res.jsonValue["Boot"]["AutomaticRetryConfig"] = 11946bd5a8d2SGunnar Mills "RetryAttempts"; 11956bd5a8d2SGunnar Mills // If AutomaticRetry (AutoReboot) is enabled see how many 11966bd5a8d2SGunnar Mills // attempts are left 11976bd5a8d2SGunnar Mills crow::connections::systemBus->async_method_call( 1198cb13a392SEd Tanous [aResp](const boost::system::error_code ec2, 11996bd5a8d2SGunnar Mills std::variant<uint32_t>& autoRebootAttemptsLeft) { 1200cb13a392SEd Tanous if (ec2) 12016bd5a8d2SGunnar Mills { 1202cb13a392SEd Tanous BMCWEB_LOG_DEBUG << "D-BUS response error " << ec2; 12036bd5a8d2SGunnar Mills return; 12046bd5a8d2SGunnar Mills } 12056bd5a8d2SGunnar Mills 12066bd5a8d2SGunnar Mills const uint32_t* autoRebootAttemptsLeftPtr = 12076bd5a8d2SGunnar Mills std::get_if<uint32_t>(&autoRebootAttemptsLeft); 12086bd5a8d2SGunnar Mills 12096bd5a8d2SGunnar Mills if (!autoRebootAttemptsLeftPtr) 12106bd5a8d2SGunnar Mills { 12116bd5a8d2SGunnar Mills messages::internalError(aResp->res); 12126bd5a8d2SGunnar Mills return; 12136bd5a8d2SGunnar Mills } 12146bd5a8d2SGunnar Mills 12156bd5a8d2SGunnar Mills BMCWEB_LOG_DEBUG << "Auto Reboot Attempts Left: " 12166bd5a8d2SGunnar Mills << *autoRebootAttemptsLeftPtr; 12176bd5a8d2SGunnar Mills 12186bd5a8d2SGunnar Mills aResp->res 12196bd5a8d2SGunnar Mills .jsonValue["Boot"] 12206bd5a8d2SGunnar Mills ["RemainingAutomaticRetryAttempts"] = 12216bd5a8d2SGunnar Mills *autoRebootAttemptsLeftPtr; 12226bd5a8d2SGunnar Mills }, 12236bd5a8d2SGunnar Mills "xyz.openbmc_project.State.Host", 12246bd5a8d2SGunnar Mills "/xyz/openbmc_project/state/host0", 12256bd5a8d2SGunnar Mills "org.freedesktop.DBus.Properties", "Get", 12266bd5a8d2SGunnar Mills "xyz.openbmc_project.Control.Boot.RebootAttempts", 12276bd5a8d2SGunnar Mills "AttemptsLeft"); 12286bd5a8d2SGunnar Mills } 12296bd5a8d2SGunnar Mills else 12306bd5a8d2SGunnar Mills { 12316bd5a8d2SGunnar Mills aResp->res.jsonValue["Boot"]["AutomaticRetryConfig"] = 12326bd5a8d2SGunnar Mills "Disabled"; 12336bd5a8d2SGunnar Mills } 12346bd5a8d2SGunnar Mills 12356bd5a8d2SGunnar Mills // Not on D-Bus. Hardcoded here: 12366bd5a8d2SGunnar Mills // https://github.com/openbmc/phosphor-state-manager/blob/1dbbef42675e94fb1f78edb87d6b11380260535a/meson_options.txt#L71 12376bd5a8d2SGunnar Mills aResp->res.jsonValue["Boot"]["AutomaticRetryAttempts"] = 3; 123869f35306SGunnar Mills 123969f35306SGunnar Mills // "AutomaticRetryConfig" can be 3 values, Disabled, RetryAlways, 124069f35306SGunnar Mills // and RetryAttempts. OpenBMC only supports Disabled and 124169f35306SGunnar Mills // RetryAttempts. 124269f35306SGunnar Mills aResp->res.jsonValue["Boot"]["AutomaticRetryConfig@Redfish." 124369f35306SGunnar Mills "AllowableValues"] = {"Disabled", 124469f35306SGunnar Mills "RetryAttempts"}; 12456bd5a8d2SGunnar Mills }, 12466bd5a8d2SGunnar Mills "xyz.openbmc_project.Settings", 12476bd5a8d2SGunnar Mills "/xyz/openbmc_project/control/host0/auto_reboot", 12486bd5a8d2SGunnar Mills "org.freedesktop.DBus.Properties", "Get", 12496bd5a8d2SGunnar Mills "xyz.openbmc_project.Control.Boot.RebootPolicy", "AutoReboot"); 12506bd5a8d2SGunnar Mills } 12516bd5a8d2SGunnar Mills 12526bd5a8d2SGunnar Mills /** 1253c6a620f2SGeorge Liu * @brief Retrieves power restore policy over DBUS. 1254c6a620f2SGeorge Liu * 1255c6a620f2SGeorge Liu * @param[in] aResp Shared pointer for generating response message. 1256c6a620f2SGeorge Liu * 1257c6a620f2SGeorge Liu * @return None. 1258c6a620f2SGeorge Liu */ 12598d1b46d7Szhanghch05 inline void 12608d1b46d7Szhanghch05 getPowerRestorePolicy(const std::shared_ptr<bmcweb::AsyncResp>& aResp) 1261c6a620f2SGeorge Liu { 1262c6a620f2SGeorge Liu BMCWEB_LOG_DEBUG << "Get power restore policy"; 1263c6a620f2SGeorge Liu 1264c6a620f2SGeorge Liu crow::connections::systemBus->async_method_call( 1265c6a620f2SGeorge Liu [aResp](const boost::system::error_code ec, 126619bd78d9SPatrick Williams std::variant<std::string>& policy) { 1267c6a620f2SGeorge Liu if (ec) 1268c6a620f2SGeorge Liu { 1269c6a620f2SGeorge Liu BMCWEB_LOG_DEBUG << "DBUS response error " << ec; 1270c6a620f2SGeorge Liu return; 1271c6a620f2SGeorge Liu } 1272c6a620f2SGeorge Liu 1273c6a620f2SGeorge Liu const boost::container::flat_map<std::string, std::string> 1274c6a620f2SGeorge Liu policyMaps = { 1275c6a620f2SGeorge Liu {"xyz.openbmc_project.Control.Power.RestorePolicy.Policy." 1276c6a620f2SGeorge Liu "AlwaysOn", 1277c6a620f2SGeorge Liu "AlwaysOn"}, 1278c6a620f2SGeorge Liu {"xyz.openbmc_project.Control.Power.RestorePolicy.Policy." 1279c6a620f2SGeorge Liu "AlwaysOff", 1280c6a620f2SGeorge Liu "AlwaysOff"}, 1281c6a620f2SGeorge Liu {"xyz.openbmc_project.Control.Power.RestorePolicy.Policy." 128237ec9072SGunnar Mills "Restore", 1283c6a620f2SGeorge Liu "LastState"}}; 1284c6a620f2SGeorge Liu 1285c6a620f2SGeorge Liu const std::string* policyPtr = std::get_if<std::string>(&policy); 1286c6a620f2SGeorge Liu 1287c6a620f2SGeorge Liu if (!policyPtr) 1288c6a620f2SGeorge Liu { 1289c6a620f2SGeorge Liu messages::internalError(aResp->res); 1290c6a620f2SGeorge Liu return; 1291c6a620f2SGeorge Liu } 1292c6a620f2SGeorge Liu 1293c6a620f2SGeorge Liu auto policyMapsIt = policyMaps.find(*policyPtr); 1294c6a620f2SGeorge Liu if (policyMapsIt == policyMaps.end()) 1295c6a620f2SGeorge Liu { 1296c6a620f2SGeorge Liu messages::internalError(aResp->res); 1297c6a620f2SGeorge Liu return; 1298c6a620f2SGeorge Liu } 1299c6a620f2SGeorge Liu 1300c6a620f2SGeorge Liu aResp->res.jsonValue["PowerRestorePolicy"] = policyMapsIt->second; 1301c6a620f2SGeorge Liu }, 1302c6a620f2SGeorge Liu "xyz.openbmc_project.Settings", 1303c6a620f2SGeorge Liu "/xyz/openbmc_project/control/host0/power_restore_policy", 1304c6a620f2SGeorge Liu "org.freedesktop.DBus.Properties", "Get", 1305c6a620f2SGeorge Liu "xyz.openbmc_project.Control.Power.RestorePolicy", 1306c6a620f2SGeorge Liu "PowerRestorePolicy"); 1307c6a620f2SGeorge Liu } 1308c6a620f2SGeorge Liu 1309c6a620f2SGeorge Liu /** 13101981771bSAli Ahmed * @brief Get TrustedModuleRequiredToBoot property. Determines whether or not 13111981771bSAli Ahmed * TPM is required for booting the host. 13121981771bSAli Ahmed * 13131981771bSAli Ahmed * @param[in] aResp Shared pointer for generating response message. 13141981771bSAli Ahmed * 13151981771bSAli Ahmed * @return None. 13161981771bSAli Ahmed */ 13171981771bSAli Ahmed inline void getTrustedModuleRequiredToBoot( 13181981771bSAli Ahmed const std::shared_ptr<bmcweb::AsyncResp>& aResp) 13191981771bSAli Ahmed { 13201981771bSAli Ahmed BMCWEB_LOG_DEBUG << "Get TPM required to boot."; 13211981771bSAli Ahmed 13221981771bSAli Ahmed crow::connections::systemBus->async_method_call( 13231981771bSAli Ahmed [aResp]( 13241981771bSAli Ahmed const boost::system::error_code ec, 13251981771bSAli Ahmed std::vector<std::pair< 13261981771bSAli Ahmed std::string, 13271981771bSAli Ahmed std::vector<std::pair<std::string, std::vector<std::string>>>>>& 13281981771bSAli Ahmed subtree) { 13291981771bSAli Ahmed if (ec) 13301981771bSAli Ahmed { 13311981771bSAli Ahmed BMCWEB_LOG_DEBUG 13321981771bSAli Ahmed << "DBUS response error on TPM.Policy GetSubTree" << ec; 13331981771bSAli Ahmed // This is an optional D-Bus object so just return if 13341981771bSAli Ahmed // error occurs 13351981771bSAli Ahmed return; 13361981771bSAli Ahmed } 13371981771bSAli Ahmed if (subtree.size() == 0) 13381981771bSAli Ahmed { 13391981771bSAli Ahmed // As noted above, this is an optional interface so just return 13401981771bSAli Ahmed // if there is no instance found 13411981771bSAli Ahmed return; 13421981771bSAli Ahmed } 13431981771bSAli Ahmed 13441981771bSAli Ahmed /* When there is more than one TPMEnable object... */ 13451981771bSAli Ahmed if (subtree.size() > 1) 13461981771bSAli Ahmed { 13471981771bSAli Ahmed BMCWEB_LOG_DEBUG 13481981771bSAli Ahmed << "DBUS response has more than 1 TPM Enable object:" 13491981771bSAli Ahmed << subtree.size(); 13501981771bSAli Ahmed // Throw an internal Error and return 13511981771bSAli Ahmed messages::internalError(aResp->res); 13521981771bSAli Ahmed return; 13531981771bSAli Ahmed } 13541981771bSAli Ahmed 13551981771bSAli Ahmed // Make sure the Dbus response map has a service and objectPath 13561981771bSAli Ahmed // field 13571981771bSAli Ahmed if (subtree[0].first.empty() || subtree[0].second.size() != 1) 13581981771bSAli Ahmed { 13591981771bSAli Ahmed BMCWEB_LOG_DEBUG << "TPM.Policy mapper error!"; 13601981771bSAli Ahmed messages::internalError(aResp->res); 13611981771bSAli Ahmed return; 13621981771bSAli Ahmed } 13631981771bSAli Ahmed 13641981771bSAli Ahmed const std::string& path = subtree[0].first; 13651981771bSAli Ahmed const std::string& serv = subtree[0].second.begin()->first; 13661981771bSAli Ahmed 13671981771bSAli Ahmed // Valid TPM Enable object found, now reading the current value 13681981771bSAli Ahmed crow::connections::systemBus->async_method_call( 13691981771bSAli Ahmed [aResp](const boost::system::error_code ec, 13701981771bSAli Ahmed std::variant<bool>& tpmRequired) { 13711981771bSAli Ahmed if (ec) 13721981771bSAli Ahmed { 13731981771bSAli Ahmed BMCWEB_LOG_DEBUG 13741981771bSAli Ahmed << "D-BUS response error on TPM.Policy Get" << ec; 13751981771bSAli Ahmed messages::internalError(aResp->res); 13761981771bSAli Ahmed return; 13771981771bSAli Ahmed } 13781981771bSAli Ahmed 13791981771bSAli Ahmed const bool* tpmRequiredVal = 13801981771bSAli Ahmed std::get_if<bool>(&tpmRequired); 13811981771bSAli Ahmed 13821981771bSAli Ahmed if (!tpmRequiredVal) 13831981771bSAli Ahmed { 13841981771bSAli Ahmed messages::internalError(aResp->res); 13851981771bSAli Ahmed return; 13861981771bSAli Ahmed } 13871981771bSAli Ahmed 13881981771bSAli Ahmed if (*tpmRequiredVal == true) 13891981771bSAli Ahmed { 13901981771bSAli Ahmed aResp->res 13911981771bSAli Ahmed .jsonValue["Boot"]["TrustedModuleRequiredToBoot"] = 13921981771bSAli Ahmed "Required"; 13931981771bSAli Ahmed } 13941981771bSAli Ahmed else 13951981771bSAli Ahmed { 13961981771bSAli Ahmed aResp->res 13971981771bSAli Ahmed .jsonValue["Boot"]["TrustedModuleRequiredToBoot"] = 13981981771bSAli Ahmed "Disabled"; 13991981771bSAli Ahmed } 14001981771bSAli Ahmed }, 14011981771bSAli Ahmed serv, path, "org.freedesktop.DBus.Properties", "Get", 14021981771bSAli Ahmed "xyz.openbmc_project.Control.TPM.Policy", "TPMEnable"); 14031981771bSAli Ahmed }, 14041981771bSAli Ahmed "xyz.openbmc_project.ObjectMapper", 14051981771bSAli Ahmed "/xyz/openbmc_project/object_mapper", 14061981771bSAli Ahmed "xyz.openbmc_project.ObjectMapper", "GetSubTree", "/", int32_t(0), 14071981771bSAli Ahmed std::array<const char*, 1>{"xyz.openbmc_project.Control.TPM.Policy"}); 14081981771bSAli Ahmed } 14091981771bSAli Ahmed 14101981771bSAli Ahmed /** 14111c05dae3SAli Ahmed * @brief Set TrustedModuleRequiredToBoot property. Determines whether or not 14121c05dae3SAli Ahmed * TPM is required for booting the host. 14131c05dae3SAli Ahmed * 14141c05dae3SAli Ahmed * @param[in] aResp Shared pointer for generating response message. 14151c05dae3SAli Ahmed * @param[in] tpmRequired Value to set TPM Required To Boot property to. 14161c05dae3SAli Ahmed * 14171c05dae3SAli Ahmed * @return None. 14181c05dae3SAli Ahmed */ 14191c05dae3SAli Ahmed inline void setTrustedModuleRequiredToBoot( 14201c05dae3SAli Ahmed const std::shared_ptr<bmcweb::AsyncResp>& aResp, const bool tpmRequired) 14211c05dae3SAli Ahmed { 14221c05dae3SAli Ahmed BMCWEB_LOG_DEBUG << "Set TrustedModuleRequiredToBoot."; 14231c05dae3SAli Ahmed 14241c05dae3SAli Ahmed crow::connections::systemBus->async_method_call( 14251c05dae3SAli Ahmed [aResp, tpmRequired]( 14261c05dae3SAli Ahmed const boost::system::error_code ec, 14271c05dae3SAli Ahmed std::vector<std::pair< 14281c05dae3SAli Ahmed std::string, 14291c05dae3SAli Ahmed std::vector<std::pair<std::string, std::vector<std::string>>>>>& 14301c05dae3SAli Ahmed subtree) { 14311c05dae3SAli Ahmed if (ec) 14321c05dae3SAli Ahmed { 14331c05dae3SAli Ahmed BMCWEB_LOG_DEBUG 14341c05dae3SAli Ahmed << "DBUS response error on TPM.Policy GetSubTree" << ec; 14351c05dae3SAli Ahmed messages::internalError(aResp->res); 14361c05dae3SAli Ahmed return; 14371c05dae3SAli Ahmed } 14381c05dae3SAli Ahmed if (subtree.size() == 0) 14391c05dae3SAli Ahmed { 14401c05dae3SAli Ahmed messages::propertyValueNotInList(aResp->res, "ComputerSystem", 14411c05dae3SAli Ahmed "TrustedModuleRequiredToBoot"); 14421c05dae3SAli Ahmed return; 14431c05dae3SAli Ahmed } 14441c05dae3SAli Ahmed 14451c05dae3SAli Ahmed /* When there is more than one TPMEnable object... */ 14461c05dae3SAli Ahmed if (subtree.size() > 1) 14471c05dae3SAli Ahmed { 14481c05dae3SAli Ahmed BMCWEB_LOG_DEBUG 14491c05dae3SAli Ahmed << "DBUS response has more than 1 TPM Enable object:" 14501c05dae3SAli Ahmed << subtree.size(); 14511c05dae3SAli Ahmed // Throw an internal Error and return 14521c05dae3SAli Ahmed messages::internalError(aResp->res); 14531c05dae3SAli Ahmed return; 14541c05dae3SAli Ahmed } 14551c05dae3SAli Ahmed 14561c05dae3SAli Ahmed // Make sure the Dbus response map has a service and objectPath 14571c05dae3SAli Ahmed // field 14581c05dae3SAli Ahmed if (subtree[0].first.empty() || subtree[0].second.size() != 1) 14591c05dae3SAli Ahmed { 14601c05dae3SAli Ahmed BMCWEB_LOG_DEBUG << "TPM.Policy mapper error!"; 14611c05dae3SAli Ahmed messages::internalError(aResp->res); 14621c05dae3SAli Ahmed return; 14631c05dae3SAli Ahmed } 14641c05dae3SAli Ahmed 14651c05dae3SAli Ahmed const std::string& path = subtree[0].first; 14661c05dae3SAli Ahmed const std::string& serv = subtree[0].second.begin()->first; 14671c05dae3SAli Ahmed 14681c05dae3SAli Ahmed if (serv.empty()) 14691c05dae3SAli Ahmed { 14701c05dae3SAli Ahmed BMCWEB_LOG_DEBUG << "TPM.Policy service mapper error!"; 14711c05dae3SAli Ahmed messages::internalError(aResp->res); 14721c05dae3SAli Ahmed return; 14731c05dae3SAli Ahmed } 14741c05dae3SAli Ahmed 14751c05dae3SAli Ahmed // Valid TPM Enable object found, now setting the value 14761c05dae3SAli Ahmed crow::connections::systemBus->async_method_call( 14771c05dae3SAli Ahmed [aResp](const boost::system::error_code ec) { 14781c05dae3SAli Ahmed if (ec) 14791c05dae3SAli Ahmed { 14801c05dae3SAli Ahmed BMCWEB_LOG_DEBUG << "DBUS response error: Set " 14811c05dae3SAli Ahmed "TrustedModuleRequiredToBoot" 14821c05dae3SAli Ahmed << ec; 14831c05dae3SAli Ahmed messages::internalError(aResp->res); 14841c05dae3SAli Ahmed return; 14851c05dae3SAli Ahmed } 14861c05dae3SAli Ahmed BMCWEB_LOG_DEBUG << "Set TrustedModuleRequiredToBoot done."; 14871c05dae3SAli Ahmed }, 14881c05dae3SAli Ahmed serv, path, "org.freedesktop.DBus.Properties", "Set", 14891c05dae3SAli Ahmed "xyz.openbmc_project.Control.TPM.Policy", "TPMEnable", 14901c05dae3SAli Ahmed std::variant<bool>(tpmRequired)); 14911c05dae3SAli Ahmed }, 14921c05dae3SAli Ahmed "xyz.openbmc_project.ObjectMapper", 14931c05dae3SAli Ahmed "/xyz/openbmc_project/object_mapper", 14941c05dae3SAli Ahmed "xyz.openbmc_project.ObjectMapper", "GetSubTree", "/", int32_t(0), 14951c05dae3SAli Ahmed std::array<const char*, 1>{"xyz.openbmc_project.Control.TPM.Policy"}); 14961c05dae3SAli Ahmed } 14971c05dae3SAli Ahmed 14981c05dae3SAli Ahmed /** 1499491d8ee7SSantosh Puranik * @brief Sets boot properties into DBUS object(s). 1500491d8ee7SSantosh Puranik * 1501491d8ee7SSantosh Puranik * @param[in] aResp Shared pointer for generating response message. 1502cd9a4666SKonstantin Aladyshev * @param[in] bootType The boot type to set. 1503cd9a4666SKonstantin Aladyshev * @return Integer error code. 1504cd9a4666SKonstantin Aladyshev */ 1505cd9a4666SKonstantin Aladyshev inline void setBootType(const std::shared_ptr<bmcweb::AsyncResp>& aResp, 1506cd9a4666SKonstantin Aladyshev const std::optional<std::string>& bootType) 1507cd9a4666SKonstantin Aladyshev { 1508c21865c4SKonstantin Aladyshev std::string bootTypeStr; 1509cd9a4666SKonstantin Aladyshev 1510c21865c4SKonstantin Aladyshev if (!bootType) 1511cd9a4666SKonstantin Aladyshev { 1512c21865c4SKonstantin Aladyshev return; 1513c21865c4SKonstantin Aladyshev } 1514c21865c4SKonstantin Aladyshev 1515cd9a4666SKonstantin Aladyshev // Source target specified 1516cd9a4666SKonstantin Aladyshev BMCWEB_LOG_DEBUG << "Boot type: " << *bootType; 1517cd9a4666SKonstantin Aladyshev // Figure out which DBUS interface and property to use 1518cd9a4666SKonstantin Aladyshev if (*bootType == "Legacy") 1519cd9a4666SKonstantin Aladyshev { 1520cd9a4666SKonstantin Aladyshev bootTypeStr = "xyz.openbmc_project.Control.Boot.Type.Types.Legacy"; 1521cd9a4666SKonstantin Aladyshev } 1522cd9a4666SKonstantin Aladyshev else if (*bootType == "UEFI") 1523cd9a4666SKonstantin Aladyshev { 1524cd9a4666SKonstantin Aladyshev bootTypeStr = "xyz.openbmc_project.Control.Boot.Type.Types.EFI"; 1525cd9a4666SKonstantin Aladyshev } 1526cd9a4666SKonstantin Aladyshev else 1527cd9a4666SKonstantin Aladyshev { 1528cd9a4666SKonstantin Aladyshev BMCWEB_LOG_DEBUG << "Invalid property value for " 1529cd9a4666SKonstantin Aladyshev "BootSourceOverrideMode: " 1530cd9a4666SKonstantin Aladyshev << *bootType; 1531cd9a4666SKonstantin Aladyshev messages::propertyValueNotInList(aResp->res, *bootType, 1532cd9a4666SKonstantin Aladyshev "BootSourceOverrideMode"); 1533cd9a4666SKonstantin Aladyshev return; 1534cd9a4666SKonstantin Aladyshev } 1535cd9a4666SKonstantin Aladyshev 1536cd9a4666SKonstantin Aladyshev // Act on validated parameters 1537cd9a4666SKonstantin Aladyshev BMCWEB_LOG_DEBUG << "DBUS boot type: " << bootTypeStr; 1538cd9a4666SKonstantin Aladyshev 1539cd9a4666SKonstantin Aladyshev crow::connections::systemBus->async_method_call( 1540c21865c4SKonstantin Aladyshev [aResp](const boost::system::error_code ec) { 1541cd9a4666SKonstantin Aladyshev if (ec) 1542cd9a4666SKonstantin Aladyshev { 1543cd9a4666SKonstantin Aladyshev BMCWEB_LOG_DEBUG << "DBUS response error " << ec; 1544cd9a4666SKonstantin Aladyshev if (ec.value() == boost::asio::error::host_unreachable) 1545cd9a4666SKonstantin Aladyshev { 1546cd9a4666SKonstantin Aladyshev messages::resourceNotFound(aResp->res, "Set", "BootType"); 1547cd9a4666SKonstantin Aladyshev return; 1548cd9a4666SKonstantin Aladyshev } 1549cd9a4666SKonstantin Aladyshev messages::internalError(aResp->res); 1550cd9a4666SKonstantin Aladyshev return; 1551cd9a4666SKonstantin Aladyshev } 1552cd9a4666SKonstantin Aladyshev BMCWEB_LOG_DEBUG << "Boot type update done."; 1553cd9a4666SKonstantin Aladyshev }, 1554c21865c4SKonstantin Aladyshev "xyz.openbmc_project.Settings", 1555c21865c4SKonstantin Aladyshev "/xyz/openbmc_project/control/host0/boot", 1556cd9a4666SKonstantin Aladyshev "org.freedesktop.DBus.Properties", "Set", 1557cd9a4666SKonstantin Aladyshev "xyz.openbmc_project.Control.Boot.Type", "BootType", 1558cd9a4666SKonstantin Aladyshev std::variant<std::string>(bootTypeStr)); 1559cd9a4666SKonstantin Aladyshev } 1560cd9a4666SKonstantin Aladyshev 1561cd9a4666SKonstantin Aladyshev /** 1562cd9a4666SKonstantin Aladyshev * @brief Sets boot properties into DBUS object(s). 1563cd9a4666SKonstantin Aladyshev * 1564cd9a4666SKonstantin Aladyshev * @param[in] aResp Shared pointer for generating response message. 1565c21865c4SKonstantin Aladyshev * @param[in] bootType The boot type to set. 1566c21865c4SKonstantin Aladyshev * @return Integer error code. 1567c21865c4SKonstantin Aladyshev */ 1568c21865c4SKonstantin Aladyshev inline void setBootEnable(const std::shared_ptr<bmcweb::AsyncResp>& aResp, 1569c21865c4SKonstantin Aladyshev const std::optional<std::string>& bootEnable) 1570c21865c4SKonstantin Aladyshev { 1571c21865c4SKonstantin Aladyshev if (!bootEnable) 1572c21865c4SKonstantin Aladyshev { 1573c21865c4SKonstantin Aladyshev return; 1574c21865c4SKonstantin Aladyshev } 1575c21865c4SKonstantin Aladyshev // Source target specified 1576c21865c4SKonstantin Aladyshev BMCWEB_LOG_DEBUG << "Boot enable: " << *bootEnable; 1577c21865c4SKonstantin Aladyshev 1578c21865c4SKonstantin Aladyshev bool bootOverrideEnable = false; 1579c21865c4SKonstantin Aladyshev bool bootOverridePersistent = false; 1580c21865c4SKonstantin Aladyshev // Figure out which DBUS interface and property to use 1581c21865c4SKonstantin Aladyshev if (*bootEnable == "Disabled") 1582c21865c4SKonstantin Aladyshev { 1583c21865c4SKonstantin Aladyshev bootOverrideEnable = false; 1584c21865c4SKonstantin Aladyshev } 1585c21865c4SKonstantin Aladyshev else if (*bootEnable == "Once") 1586c21865c4SKonstantin Aladyshev { 1587c21865c4SKonstantin Aladyshev bootOverrideEnable = true; 1588c21865c4SKonstantin Aladyshev bootOverridePersistent = false; 1589c21865c4SKonstantin Aladyshev } 1590c21865c4SKonstantin Aladyshev else if (*bootEnable == "Continuous") 1591c21865c4SKonstantin Aladyshev { 1592c21865c4SKonstantin Aladyshev bootOverrideEnable = true; 1593c21865c4SKonstantin Aladyshev bootOverridePersistent = true; 1594c21865c4SKonstantin Aladyshev } 1595c21865c4SKonstantin Aladyshev else 1596c21865c4SKonstantin Aladyshev { 1597c21865c4SKonstantin Aladyshev BMCWEB_LOG_DEBUG << "Invalid property value for " 1598c21865c4SKonstantin Aladyshev "BootSourceOverrideEnabled: " 1599c21865c4SKonstantin Aladyshev << *bootEnable; 1600c21865c4SKonstantin Aladyshev messages::propertyValueNotInList(aResp->res, *bootEnable, 1601c21865c4SKonstantin Aladyshev "BootSourceOverrideEnabled"); 1602c21865c4SKonstantin Aladyshev return; 1603c21865c4SKonstantin Aladyshev } 1604c21865c4SKonstantin Aladyshev 1605c21865c4SKonstantin Aladyshev // Act on validated parameters 1606c21865c4SKonstantin Aladyshev BMCWEB_LOG_DEBUG << "DBUS boot override enable: " << bootOverrideEnable; 1607c21865c4SKonstantin Aladyshev 1608c21865c4SKonstantin Aladyshev crow::connections::systemBus->async_method_call( 1609c21865c4SKonstantin Aladyshev [aResp](const boost::system::error_code ec) { 1610c21865c4SKonstantin Aladyshev if (ec) 1611c21865c4SKonstantin Aladyshev { 1612c21865c4SKonstantin Aladyshev BMCWEB_LOG_DEBUG << "DBUS response error " << ec; 1613c21865c4SKonstantin Aladyshev messages::internalError(aResp->res); 1614c21865c4SKonstantin Aladyshev return; 1615c21865c4SKonstantin Aladyshev } 1616c21865c4SKonstantin Aladyshev BMCWEB_LOG_DEBUG << "Boot override enable update done."; 1617c21865c4SKonstantin Aladyshev }, 1618c21865c4SKonstantin Aladyshev "xyz.openbmc_project.Settings", 1619c21865c4SKonstantin Aladyshev "/xyz/openbmc_project/control/host0/boot", 1620c21865c4SKonstantin Aladyshev "org.freedesktop.DBus.Properties", "Set", 1621c21865c4SKonstantin Aladyshev "xyz.openbmc_project.Object.Enable", "Enabled", 1622c21865c4SKonstantin Aladyshev std::variant<bool>(bootOverrideEnable)); 1623c21865c4SKonstantin Aladyshev 1624c21865c4SKonstantin Aladyshev if (!bootOverrideEnable) 1625c21865c4SKonstantin Aladyshev { 1626c21865c4SKonstantin Aladyshev return; 1627c21865c4SKonstantin Aladyshev } 1628c21865c4SKonstantin Aladyshev 1629c21865c4SKonstantin Aladyshev // In case boot override is enabled we need to set correct value for the 1630c21865c4SKonstantin Aladyshev // 'one_time' enable DBus interface 1631c21865c4SKonstantin Aladyshev BMCWEB_LOG_DEBUG << "DBUS boot override persistent: " 1632c21865c4SKonstantin Aladyshev << bootOverridePersistent; 1633c21865c4SKonstantin Aladyshev 1634c21865c4SKonstantin Aladyshev crow::connections::systemBus->async_method_call( 1635c21865c4SKonstantin Aladyshev [aResp](const boost::system::error_code ec) { 1636c21865c4SKonstantin Aladyshev if (ec) 1637c21865c4SKonstantin Aladyshev { 1638c21865c4SKonstantin Aladyshev BMCWEB_LOG_DEBUG << "DBUS response error " << ec; 1639c21865c4SKonstantin Aladyshev messages::internalError(aResp->res); 1640c21865c4SKonstantin Aladyshev return; 1641c21865c4SKonstantin Aladyshev } 1642c21865c4SKonstantin Aladyshev BMCWEB_LOG_DEBUG << "Boot one_time update done."; 1643c21865c4SKonstantin Aladyshev }, 1644c21865c4SKonstantin Aladyshev "xyz.openbmc_project.Settings", 1645c21865c4SKonstantin Aladyshev "/xyz/openbmc_project/control/host0/boot/one_time", 1646c21865c4SKonstantin Aladyshev "org.freedesktop.DBus.Properties", "Set", 1647c21865c4SKonstantin Aladyshev "xyz.openbmc_project.Object.Enable", "Enabled", 1648c21865c4SKonstantin Aladyshev std::variant<bool>(!bootOverridePersistent)); 1649c21865c4SKonstantin Aladyshev } 1650c21865c4SKonstantin Aladyshev 1651c21865c4SKonstantin Aladyshev /** 1652c21865c4SKonstantin Aladyshev * @brief Sets boot properties into DBUS object(s). 1653c21865c4SKonstantin Aladyshev * 1654c21865c4SKonstantin Aladyshev * @param[in] aResp Shared pointer for generating response message. 1655491d8ee7SSantosh Puranik * @param[in] bootSource The boot source to set. 1656491d8ee7SSantosh Puranik * 1657265c1602SJohnathan Mantey * @return Integer error code. 1658491d8ee7SSantosh Puranik */ 1659cd9a4666SKonstantin Aladyshev inline void setBootModeOrSource(const std::shared_ptr<bmcweb::AsyncResp>& aResp, 1660cd9a4666SKonstantin Aladyshev const std::optional<std::string>& bootSource) 1661491d8ee7SSantosh Puranik { 1662c21865c4SKonstantin Aladyshev std::string bootSourceStr; 1663c21865c4SKonstantin Aladyshev std::string bootModeStr; 1664944ffaf9SJohnathan Mantey 1665c21865c4SKonstantin Aladyshev if (!bootSource) 1666491d8ee7SSantosh Puranik { 1667c21865c4SKonstantin Aladyshev return; 1668c21865c4SKonstantin Aladyshev } 1669c21865c4SKonstantin Aladyshev 1670491d8ee7SSantosh Puranik // Source target specified 1671491d8ee7SSantosh Puranik BMCWEB_LOG_DEBUG << "Boot source: " << *bootSource; 1672491d8ee7SSantosh Puranik // Figure out which DBUS interface and property to use 1673c21865c4SKonstantin Aladyshev if (assignBootParameters(aResp, *bootSource, bootSourceStr, bootModeStr)) 1674491d8ee7SSantosh Puranik { 1675944ffaf9SJohnathan Mantey BMCWEB_LOG_DEBUG 1676944ffaf9SJohnathan Mantey << "Invalid property value for BootSourceOverrideTarget: " 1677491d8ee7SSantosh Puranik << *bootSource; 1678491d8ee7SSantosh Puranik messages::propertyValueNotInList(aResp->res, *bootSource, 1679491d8ee7SSantosh Puranik "BootSourceTargetOverride"); 1680491d8ee7SSantosh Puranik return; 1681491d8ee7SSantosh Puranik } 1682491d8ee7SSantosh Puranik 1683944ffaf9SJohnathan Mantey // Act on validated parameters 1684944ffaf9SJohnathan Mantey BMCWEB_LOG_DEBUG << "DBUS boot source: " << bootSourceStr; 1685944ffaf9SJohnathan Mantey BMCWEB_LOG_DEBUG << "DBUS boot mode: " << bootModeStr; 1686944ffaf9SJohnathan Mantey 1687491d8ee7SSantosh Puranik crow::connections::systemBus->async_method_call( 1688491d8ee7SSantosh Puranik [aResp](const boost::system::error_code ec) { 1689491d8ee7SSantosh Puranik if (ec) 1690491d8ee7SSantosh Puranik { 1691491d8ee7SSantosh Puranik BMCWEB_LOG_DEBUG << "DBUS response error " << ec; 1692491d8ee7SSantosh Puranik messages::internalError(aResp->res); 1693491d8ee7SSantosh Puranik return; 1694491d8ee7SSantosh Puranik } 1695491d8ee7SSantosh Puranik BMCWEB_LOG_DEBUG << "Boot source update done."; 1696491d8ee7SSantosh Puranik }, 1697c21865c4SKonstantin Aladyshev "xyz.openbmc_project.Settings", 1698c21865c4SKonstantin Aladyshev "/xyz/openbmc_project/control/host0/boot", 1699491d8ee7SSantosh Puranik "org.freedesktop.DBus.Properties", "Set", 1700491d8ee7SSantosh Puranik "xyz.openbmc_project.Control.Boot.Source", "BootSource", 1701491d8ee7SSantosh Puranik std::variant<std::string>(bootSourceStr)); 1702944ffaf9SJohnathan Mantey 1703491d8ee7SSantosh Puranik crow::connections::systemBus->async_method_call( 1704491d8ee7SSantosh Puranik [aResp](const boost::system::error_code ec) { 1705491d8ee7SSantosh Puranik if (ec) 1706491d8ee7SSantosh Puranik { 1707491d8ee7SSantosh Puranik BMCWEB_LOG_DEBUG << "DBUS response error " << ec; 1708491d8ee7SSantosh Puranik messages::internalError(aResp->res); 1709491d8ee7SSantosh Puranik return; 1710491d8ee7SSantosh Puranik } 1711491d8ee7SSantosh Puranik BMCWEB_LOG_DEBUG << "Boot mode update done."; 1712491d8ee7SSantosh Puranik }, 1713c21865c4SKonstantin Aladyshev "xyz.openbmc_project.Settings", 1714c21865c4SKonstantin Aladyshev "/xyz/openbmc_project/control/host0/boot", 1715491d8ee7SSantosh Puranik "org.freedesktop.DBus.Properties", "Set", 1716491d8ee7SSantosh Puranik "xyz.openbmc_project.Control.Boot.Mode", "BootMode", 1717491d8ee7SSantosh Puranik std::variant<std::string>(bootModeStr)); 1718cd9a4666SKonstantin Aladyshev } 1719944ffaf9SJohnathan Mantey 1720cd9a4666SKonstantin Aladyshev /** 1721c21865c4SKonstantin Aladyshev * @brief Sets Boot source override properties. 1722491d8ee7SSantosh Puranik * 1723491d8ee7SSantosh Puranik * @param[in] aResp Shared pointer for generating response message. 1724491d8ee7SSantosh Puranik * @param[in] bootSource The boot source from incoming RF request. 1725cd9a4666SKonstantin Aladyshev * @param[in] bootType The boot type from incoming RF request. 1726491d8ee7SSantosh Puranik * @param[in] bootEnable The boot override enable from incoming RF request. 1727491d8ee7SSantosh Puranik * 1728265c1602SJohnathan Mantey * @return Integer error code. 1729491d8ee7SSantosh Puranik */ 1730c21865c4SKonstantin Aladyshev 1731c21865c4SKonstantin Aladyshev inline void setBootProperties(const std::shared_ptr<bmcweb::AsyncResp>& aResp, 1732c21865c4SKonstantin Aladyshev const std::optional<std::string>& bootSource, 1733c21865c4SKonstantin Aladyshev const std::optional<std::string>& bootType, 1734c21865c4SKonstantin Aladyshev const std::optional<std::string>& bootEnable) 1735491d8ee7SSantosh Puranik { 1736491d8ee7SSantosh Puranik BMCWEB_LOG_DEBUG << "Set boot information."; 1737491d8ee7SSantosh Puranik 1738c21865c4SKonstantin Aladyshev setBootModeOrSource(aResp, bootSource); 1739c21865c4SKonstantin Aladyshev setBootType(aResp, bootType); 1740c21865c4SKonstantin Aladyshev setBootEnable(aResp, bootEnable); 1741491d8ee7SSantosh Puranik } 1742491d8ee7SSantosh Puranik 1743c6a620f2SGeorge Liu /** 174498e386ecSGunnar Mills * @brief Sets AssetTag 174598e386ecSGunnar Mills * 174698e386ecSGunnar Mills * @param[in] aResp Shared pointer for generating response message. 174798e386ecSGunnar Mills * @param[in] assetTag "AssetTag" from request. 174898e386ecSGunnar Mills * 174998e386ecSGunnar Mills * @return None. 175098e386ecSGunnar Mills */ 17518d1b46d7Szhanghch05 inline void setAssetTag(const std::shared_ptr<bmcweb::AsyncResp>& aResp, 175298e386ecSGunnar Mills const std::string& assetTag) 175398e386ecSGunnar Mills { 175498e386ecSGunnar Mills crow::connections::systemBus->async_method_call( 175598e386ecSGunnar Mills [aResp, assetTag]( 175698e386ecSGunnar Mills const boost::system::error_code ec, 175798e386ecSGunnar Mills const std::vector<std::pair< 175898e386ecSGunnar Mills std::string, 175998e386ecSGunnar Mills std::vector<std::pair<std::string, std::vector<std::string>>>>>& 176098e386ecSGunnar Mills subtree) { 176198e386ecSGunnar Mills if (ec) 176298e386ecSGunnar Mills { 176398e386ecSGunnar Mills BMCWEB_LOG_DEBUG << "D-Bus response error on GetSubTree " << ec; 176498e386ecSGunnar Mills messages::internalError(aResp->res); 176598e386ecSGunnar Mills return; 176698e386ecSGunnar Mills } 176798e386ecSGunnar Mills if (subtree.size() == 0) 176898e386ecSGunnar Mills { 176998e386ecSGunnar Mills BMCWEB_LOG_DEBUG << "Can't find system D-Bus object!"; 177098e386ecSGunnar Mills messages::internalError(aResp->res); 177198e386ecSGunnar Mills return; 177298e386ecSGunnar Mills } 177398e386ecSGunnar Mills // Assume only 1 system D-Bus object 177498e386ecSGunnar Mills // Throw an error if there is more than 1 177598e386ecSGunnar Mills if (subtree.size() > 1) 177698e386ecSGunnar Mills { 177798e386ecSGunnar Mills BMCWEB_LOG_DEBUG << "Found more than 1 system D-Bus object!"; 177898e386ecSGunnar Mills messages::internalError(aResp->res); 177998e386ecSGunnar Mills return; 178098e386ecSGunnar Mills } 178198e386ecSGunnar Mills if (subtree[0].first.empty() || subtree[0].second.size() != 1) 178298e386ecSGunnar Mills { 178398e386ecSGunnar Mills BMCWEB_LOG_DEBUG << "Asset Tag Set mapper error!"; 178498e386ecSGunnar Mills messages::internalError(aResp->res); 178598e386ecSGunnar Mills return; 178698e386ecSGunnar Mills } 178798e386ecSGunnar Mills 178898e386ecSGunnar Mills const std::string& path = subtree[0].first; 178998e386ecSGunnar Mills const std::string& service = subtree[0].second.begin()->first; 179098e386ecSGunnar Mills 179198e386ecSGunnar Mills if (service.empty()) 179298e386ecSGunnar Mills { 179398e386ecSGunnar Mills BMCWEB_LOG_DEBUG << "Asset Tag Set service mapper error!"; 179498e386ecSGunnar Mills messages::internalError(aResp->res); 179598e386ecSGunnar Mills return; 179698e386ecSGunnar Mills } 179798e386ecSGunnar Mills 179898e386ecSGunnar Mills crow::connections::systemBus->async_method_call( 179998e386ecSGunnar Mills [aResp](const boost::system::error_code ec2) { 180098e386ecSGunnar Mills if (ec2) 180198e386ecSGunnar Mills { 180298e386ecSGunnar Mills BMCWEB_LOG_DEBUG 180398e386ecSGunnar Mills << "D-Bus response error on AssetTag Set " << ec2; 180498e386ecSGunnar Mills messages::internalError(aResp->res); 180598e386ecSGunnar Mills return; 180698e386ecSGunnar Mills } 180798e386ecSGunnar Mills }, 180898e386ecSGunnar Mills service, path, "org.freedesktop.DBus.Properties", "Set", 180998e386ecSGunnar Mills "xyz.openbmc_project.Inventory.Decorator.AssetTag", "AssetTag", 181098e386ecSGunnar Mills std::variant<std::string>(assetTag)); 181198e386ecSGunnar Mills }, 181298e386ecSGunnar Mills "xyz.openbmc_project.ObjectMapper", 181398e386ecSGunnar Mills "/xyz/openbmc_project/object_mapper", 181498e386ecSGunnar Mills "xyz.openbmc_project.ObjectMapper", "GetSubTree", 181598e386ecSGunnar Mills "/xyz/openbmc_project/inventory", int32_t(0), 181698e386ecSGunnar Mills std::array<const char*, 1>{ 181798e386ecSGunnar Mills "xyz.openbmc_project.Inventory.Item.System"}); 181898e386ecSGunnar Mills } 181998e386ecSGunnar Mills 182098e386ecSGunnar Mills /** 182169f35306SGunnar Mills * @brief Sets automaticRetry (Auto Reboot) 182269f35306SGunnar Mills * 182369f35306SGunnar Mills * @param[in] aResp Shared pointer for generating response message. 182469f35306SGunnar Mills * @param[in] automaticRetryConfig "AutomaticRetryConfig" from request. 182569f35306SGunnar Mills * 182669f35306SGunnar Mills * @return None. 182769f35306SGunnar Mills */ 18288d1b46d7Szhanghch05 inline void setAutomaticRetry(const std::shared_ptr<bmcweb::AsyncResp>& aResp, 1829f23b7296SEd Tanous const std::string& automaticRetryConfig) 183069f35306SGunnar Mills { 183169f35306SGunnar Mills BMCWEB_LOG_DEBUG << "Set Automatic Retry."; 183269f35306SGunnar Mills 183369f35306SGunnar Mills // OpenBMC only supports "Disabled" and "RetryAttempts". 183469f35306SGunnar Mills bool autoRebootEnabled; 183569f35306SGunnar Mills 183669f35306SGunnar Mills if (automaticRetryConfig == "Disabled") 183769f35306SGunnar Mills { 183869f35306SGunnar Mills autoRebootEnabled = false; 183969f35306SGunnar Mills } 184069f35306SGunnar Mills else if (automaticRetryConfig == "RetryAttempts") 184169f35306SGunnar Mills { 184269f35306SGunnar Mills autoRebootEnabled = true; 184369f35306SGunnar Mills } 184469f35306SGunnar Mills else 184569f35306SGunnar Mills { 184669f35306SGunnar Mills BMCWEB_LOG_DEBUG << "Invalid property value for " 184769f35306SGunnar Mills "AutomaticRetryConfig: " 184869f35306SGunnar Mills << automaticRetryConfig; 184969f35306SGunnar Mills messages::propertyValueNotInList(aResp->res, automaticRetryConfig, 185069f35306SGunnar Mills "AutomaticRetryConfig"); 185169f35306SGunnar Mills return; 185269f35306SGunnar Mills } 185369f35306SGunnar Mills 185469f35306SGunnar Mills crow::connections::systemBus->async_method_call( 185569f35306SGunnar Mills [aResp](const boost::system::error_code ec) { 185669f35306SGunnar Mills if (ec) 185769f35306SGunnar Mills { 185869f35306SGunnar Mills messages::internalError(aResp->res); 185969f35306SGunnar Mills return; 186069f35306SGunnar Mills } 186169f35306SGunnar Mills }, 186269f35306SGunnar Mills "xyz.openbmc_project.Settings", 186369f35306SGunnar Mills "/xyz/openbmc_project/control/host0/auto_reboot", 186469f35306SGunnar Mills "org.freedesktop.DBus.Properties", "Set", 186569f35306SGunnar Mills "xyz.openbmc_project.Control.Boot.RebootPolicy", "AutoReboot", 186669f35306SGunnar Mills std::variant<bool>(autoRebootEnabled)); 186769f35306SGunnar Mills } 186869f35306SGunnar Mills 186969f35306SGunnar Mills /** 1870c6a620f2SGeorge Liu * @brief Sets power restore policy properties. 1871c6a620f2SGeorge Liu * 1872c6a620f2SGeorge Liu * @param[in] aResp Shared pointer for generating response message. 1873c6a620f2SGeorge Liu * @param[in] policy power restore policy properties from request. 1874c6a620f2SGeorge Liu * 1875c6a620f2SGeorge Liu * @return None. 1876c6a620f2SGeorge Liu */ 18778d1b46d7Szhanghch05 inline void 18788d1b46d7Szhanghch05 setPowerRestorePolicy(const std::shared_ptr<bmcweb::AsyncResp>& aResp, 18794e69c904SGunnar Mills const std::string& policy) 1880c6a620f2SGeorge Liu { 1881c6a620f2SGeorge Liu BMCWEB_LOG_DEBUG << "Set power restore policy."; 1882c6a620f2SGeorge Liu 1883c6a620f2SGeorge Liu const boost::container::flat_map<std::string, std::string> policyMaps = { 1884c6a620f2SGeorge Liu {"AlwaysOn", "xyz.openbmc_project.Control.Power.RestorePolicy.Policy." 1885c6a620f2SGeorge Liu "AlwaysOn"}, 1886c6a620f2SGeorge Liu {"AlwaysOff", "xyz.openbmc_project.Control.Power.RestorePolicy.Policy." 1887c6a620f2SGeorge Liu "AlwaysOff"}, 1888c6a620f2SGeorge Liu {"LastState", "xyz.openbmc_project.Control.Power.RestorePolicy.Policy." 188937ec9072SGunnar Mills "Restore"}}; 1890c6a620f2SGeorge Liu 1891c6a620f2SGeorge Liu std::string powerRestorPolicy; 1892c6a620f2SGeorge Liu 18934e69c904SGunnar Mills auto policyMapsIt = policyMaps.find(policy); 1894c6a620f2SGeorge Liu if (policyMapsIt == policyMaps.end()) 1895c6a620f2SGeorge Liu { 18964e69c904SGunnar Mills messages::propertyValueNotInList(aResp->res, policy, 18974e69c904SGunnar Mills "PowerRestorePolicy"); 1898c6a620f2SGeorge Liu return; 1899c6a620f2SGeorge Liu } 1900c6a620f2SGeorge Liu 1901c6a620f2SGeorge Liu powerRestorPolicy = policyMapsIt->second; 1902c6a620f2SGeorge Liu 1903c6a620f2SGeorge Liu crow::connections::systemBus->async_method_call( 1904c6a620f2SGeorge Liu [aResp](const boost::system::error_code ec) { 1905c6a620f2SGeorge Liu if (ec) 1906c6a620f2SGeorge Liu { 1907c6a620f2SGeorge Liu messages::internalError(aResp->res); 1908c6a620f2SGeorge Liu return; 1909c6a620f2SGeorge Liu } 1910c6a620f2SGeorge Liu }, 1911c6a620f2SGeorge Liu "xyz.openbmc_project.Settings", 1912c6a620f2SGeorge Liu "/xyz/openbmc_project/control/host0/power_restore_policy", 1913c6a620f2SGeorge Liu "org.freedesktop.DBus.Properties", "Set", 1914c6a620f2SGeorge Liu "xyz.openbmc_project.Control.Power.RestorePolicy", "PowerRestorePolicy", 1915c6a620f2SGeorge Liu std::variant<std::string>(powerRestorPolicy)); 1916c6a620f2SGeorge Liu } 1917c6a620f2SGeorge Liu 1918a6349918SAppaRao Puli #ifdef BMCWEB_ENABLE_REDFISH_PROVISIONING_FEATURE 1919a6349918SAppaRao Puli /** 1920a6349918SAppaRao Puli * @brief Retrieves provisioning status 1921a6349918SAppaRao Puli * 1922a6349918SAppaRao Puli * @param[in] aResp Shared pointer for completing asynchronous calls. 1923a6349918SAppaRao Puli * 1924a6349918SAppaRao Puli * @return None. 1925a6349918SAppaRao Puli */ 19268d1b46d7Szhanghch05 inline void getProvisioningStatus(std::shared_ptr<bmcweb::AsyncResp> aResp) 1927a6349918SAppaRao Puli { 1928a6349918SAppaRao Puli BMCWEB_LOG_DEBUG << "Get OEM information."; 1929a6349918SAppaRao Puli crow::connections::systemBus->async_method_call( 1930a6349918SAppaRao Puli [aResp](const boost::system::error_code ec, 19311214b7e7SGunnar Mills const std::vector<std::pair<std::string, VariantType>>& 19321214b7e7SGunnar Mills propertiesList) { 1933b99fb1a9SAppaRao Puli nlohmann::json& oemPFR = 1934b99fb1a9SAppaRao Puli aResp->res.jsonValue["Oem"]["OpenBmc"]["FirmwareProvisioning"]; 193550626f4fSJames Feist aResp->res.jsonValue["Oem"]["OpenBmc"]["@odata.type"] = 193650626f4fSJames Feist "#OemComputerSystem.OpenBmc"; 193750626f4fSJames Feist oemPFR["@odata.type"] = "#OemComputerSystem.FirmwareProvisioning"; 193850626f4fSJames Feist 1939a6349918SAppaRao Puli if (ec) 1940a6349918SAppaRao Puli { 1941a6349918SAppaRao Puli BMCWEB_LOG_DEBUG << "DBUS response error " << ec; 1942b99fb1a9SAppaRao Puli // not an error, don't have to have the interface 1943b99fb1a9SAppaRao Puli oemPFR["ProvisioningStatus"] = "NotProvisioned"; 1944a6349918SAppaRao Puli return; 1945a6349918SAppaRao Puli } 1946a6349918SAppaRao Puli 1947a6349918SAppaRao Puli const bool* provState = nullptr; 1948a6349918SAppaRao Puli const bool* lockState = nullptr; 1949a6349918SAppaRao Puli for (const std::pair<std::string, VariantType>& property : 1950a6349918SAppaRao Puli propertiesList) 1951a6349918SAppaRao Puli { 1952a6349918SAppaRao Puli if (property.first == "UfmProvisioned") 1953a6349918SAppaRao Puli { 1954a6349918SAppaRao Puli provState = std::get_if<bool>(&property.second); 1955a6349918SAppaRao Puli } 1956a6349918SAppaRao Puli else if (property.first == "UfmLocked") 1957a6349918SAppaRao Puli { 1958a6349918SAppaRao Puli lockState = std::get_if<bool>(&property.second); 1959a6349918SAppaRao Puli } 1960a6349918SAppaRao Puli } 1961a6349918SAppaRao Puli 1962a6349918SAppaRao Puli if ((provState == nullptr) || (lockState == nullptr)) 1963a6349918SAppaRao Puli { 1964a6349918SAppaRao Puli BMCWEB_LOG_DEBUG << "Unable to get PFR attributes."; 1965a6349918SAppaRao Puli messages::internalError(aResp->res); 1966a6349918SAppaRao Puli return; 1967a6349918SAppaRao Puli } 1968a6349918SAppaRao Puli 1969a6349918SAppaRao Puli if (*provState == true) 1970a6349918SAppaRao Puli { 1971a6349918SAppaRao Puli if (*lockState == true) 1972a6349918SAppaRao Puli { 1973a6349918SAppaRao Puli oemPFR["ProvisioningStatus"] = "ProvisionedAndLocked"; 1974a6349918SAppaRao Puli } 1975a6349918SAppaRao Puli else 1976a6349918SAppaRao Puli { 1977a6349918SAppaRao Puli oemPFR["ProvisioningStatus"] = "ProvisionedButNotLocked"; 1978a6349918SAppaRao Puli } 1979a6349918SAppaRao Puli } 1980a6349918SAppaRao Puli else 1981a6349918SAppaRao Puli { 1982a6349918SAppaRao Puli oemPFR["ProvisioningStatus"] = "NotProvisioned"; 1983a6349918SAppaRao Puli } 1984a6349918SAppaRao Puli }, 1985a6349918SAppaRao Puli "xyz.openbmc_project.PFR.Manager", "/xyz/openbmc_project/pfr", 1986a6349918SAppaRao Puli "org.freedesktop.DBus.Properties", "GetAll", 1987a6349918SAppaRao Puli "xyz.openbmc_project.PFR.Attributes"); 1988a6349918SAppaRao Puli } 1989a6349918SAppaRao Puli #endif 1990a6349918SAppaRao Puli 1991491d8ee7SSantosh Puranik /** 19923a2d0424SChris Cain * @brief Translate the PowerMode to a response message. 19933a2d0424SChris Cain * 19943a2d0424SChris Cain * @param[in] aResp Shared pointer for generating response message. 19953a2d0424SChris Cain * @param[in] modeValue PowerMode value to be translated 19963a2d0424SChris Cain * 19973a2d0424SChris Cain * @return None. 19983a2d0424SChris Cain */ 19993a2d0424SChris Cain inline void translatePowerMode(const std::shared_ptr<bmcweb::AsyncResp>& aResp, 20003a2d0424SChris Cain const std::string& modeValue) 20013a2d0424SChris Cain { 20023a2d0424SChris Cain std::string modeString; 20033a2d0424SChris Cain 20043a2d0424SChris Cain if (modeValue == "xyz.openbmc_project.Control.Power.Mode." 20053a2d0424SChris Cain "PowerMode.Static") 20063a2d0424SChris Cain { 20073a2d0424SChris Cain aResp->res.jsonValue["PowerMode"] = "Static"; 20083a2d0424SChris Cain } 20093a2d0424SChris Cain else if (modeValue == "xyz.openbmc_project.Control.Power.Mode." 20103a2d0424SChris Cain "PowerMode.MaximumPerformance") 20113a2d0424SChris Cain { 20123a2d0424SChris Cain aResp->res.jsonValue["PowerMode"] = "MaximumPerformance"; 20133a2d0424SChris Cain } 20143a2d0424SChris Cain else if (modeValue == "xyz.openbmc_project.Control.Power.Mode." 20153a2d0424SChris Cain "PowerMode.PowerSaving") 20163a2d0424SChris Cain { 20173a2d0424SChris Cain aResp->res.jsonValue["PowerMode"] = "PowerSaving"; 20183a2d0424SChris Cain } 20193a2d0424SChris Cain else if (modeValue == "xyz.openbmc_project.Control.Power.Mode." 20203a2d0424SChris Cain "PowerMode.OEM") 20213a2d0424SChris Cain { 20223a2d0424SChris Cain aResp->res.jsonValue["PowerMode"] = "OEM"; 20233a2d0424SChris Cain } 20243a2d0424SChris Cain else 20253a2d0424SChris Cain { 20263a2d0424SChris Cain // Any other values would be invalid 20273a2d0424SChris Cain BMCWEB_LOG_DEBUG << "PowerMode value was not valid: " << modeValue; 20283a2d0424SChris Cain messages::internalError(aResp->res); 20293a2d0424SChris Cain } 20303a2d0424SChris Cain } 20313a2d0424SChris Cain 20323a2d0424SChris Cain /** 20333a2d0424SChris Cain * @brief Retrieves system power mode 20343a2d0424SChris Cain * 20353a2d0424SChris Cain * @param[in] aResp Shared pointer for generating response message. 20363a2d0424SChris Cain * 20373a2d0424SChris Cain * @return None. 20383a2d0424SChris Cain */ 20393a2d0424SChris Cain inline void getPowerMode(const std::shared_ptr<bmcweb::AsyncResp>& aResp) 20403a2d0424SChris Cain { 20413a2d0424SChris Cain BMCWEB_LOG_DEBUG << "Get power mode."; 20423a2d0424SChris Cain 20433a2d0424SChris Cain // Get Power Mode object path: 20443a2d0424SChris Cain crow::connections::systemBus->async_method_call( 20453a2d0424SChris Cain [aResp]( 20463a2d0424SChris Cain const boost::system::error_code ec, 20473a2d0424SChris Cain const std::vector<std::pair< 20483a2d0424SChris Cain std::string, 20493a2d0424SChris Cain std::vector<std::pair<std::string, std::vector<std::string>>>>>& 20503a2d0424SChris Cain subtree) { 20513a2d0424SChris Cain if (ec) 20523a2d0424SChris Cain { 20533a2d0424SChris Cain BMCWEB_LOG_DEBUG 20543a2d0424SChris Cain << "DBUS response error on Power.Mode GetSubTree " << ec; 20553a2d0424SChris Cain // This is an optional D-Bus object so just return if 20563a2d0424SChris Cain // error occurs 20573a2d0424SChris Cain return; 20583a2d0424SChris Cain } 20593a2d0424SChris Cain if (subtree.empty()) 20603a2d0424SChris Cain { 20613a2d0424SChris Cain // As noted above, this is an optional interface so just return 20623a2d0424SChris Cain // if there is no instance found 20633a2d0424SChris Cain return; 20643a2d0424SChris Cain } 20653a2d0424SChris Cain if (subtree.size() > 1) 20663a2d0424SChris Cain { 20673a2d0424SChris Cain // More then one PowerMode object is not supported and is an 20683a2d0424SChris Cain // error 20693a2d0424SChris Cain BMCWEB_LOG_DEBUG 20703a2d0424SChris Cain << "Found more than 1 system D-Bus Power.Mode objects: " 20713a2d0424SChris Cain << subtree.size(); 20723a2d0424SChris Cain messages::internalError(aResp->res); 20733a2d0424SChris Cain return; 20743a2d0424SChris Cain } 20753a2d0424SChris Cain if ((subtree[0].first.empty()) || (subtree[0].second.size() != 1)) 20763a2d0424SChris Cain { 20773a2d0424SChris Cain BMCWEB_LOG_DEBUG << "Power.Mode mapper error!"; 20783a2d0424SChris Cain messages::internalError(aResp->res); 20793a2d0424SChris Cain return; 20803a2d0424SChris Cain } 20813a2d0424SChris Cain const std::string& path = subtree[0].first; 20823a2d0424SChris Cain const std::string& service = subtree[0].second.begin()->first; 20833a2d0424SChris Cain if (service.empty()) 20843a2d0424SChris Cain { 20853a2d0424SChris Cain BMCWEB_LOG_DEBUG << "Power.Mode service mapper error!"; 20863a2d0424SChris Cain messages::internalError(aResp->res); 20873a2d0424SChris Cain return; 20883a2d0424SChris Cain } 20893a2d0424SChris Cain // Valid Power Mode object found, now read the current value 20903a2d0424SChris Cain crow::connections::systemBus->async_method_call( 20913a2d0424SChris Cain [aResp](const boost::system::error_code ec, 20923a2d0424SChris Cain const std::variant<std::string>& pmode) { 20933a2d0424SChris Cain if (ec) 20943a2d0424SChris Cain { 20953a2d0424SChris Cain BMCWEB_LOG_DEBUG 20963a2d0424SChris Cain << "DBUS response error on PowerMode Get: " << ec; 20973a2d0424SChris Cain messages::internalError(aResp->res); 20983a2d0424SChris Cain return; 20993a2d0424SChris Cain } 21003a2d0424SChris Cain 21013a2d0424SChris Cain const std::string* s = std::get_if<std::string>(&pmode); 21023a2d0424SChris Cain if (s == nullptr) 21033a2d0424SChris Cain { 21043a2d0424SChris Cain BMCWEB_LOG_DEBUG << "Unable to get PowerMode value"; 21053a2d0424SChris Cain messages::internalError(aResp->res); 21063a2d0424SChris Cain return; 21073a2d0424SChris Cain } 21083a2d0424SChris Cain 21093a2d0424SChris Cain aResp->res.jsonValue["PowerMode@Redfish.AllowableValues"] = 21103a2d0424SChris Cain {"Static", "MaximumPerformance", "PowerSaving"}; 21113a2d0424SChris Cain 21123a2d0424SChris Cain BMCWEB_LOG_DEBUG << "Current power mode: " << *s; 21133a2d0424SChris Cain translatePowerMode(aResp, *s); 21143a2d0424SChris Cain }, 21153a2d0424SChris Cain service, path, "org.freedesktop.DBus.Properties", "Get", 21163a2d0424SChris Cain "xyz.openbmc_project.Control.Power.Mode", "PowerMode"); 21173a2d0424SChris Cain }, 21183a2d0424SChris Cain "xyz.openbmc_project.ObjectMapper", 21193a2d0424SChris Cain "/xyz/openbmc_project/object_mapper", 21203a2d0424SChris Cain "xyz.openbmc_project.ObjectMapper", "GetSubTree", "/", int32_t(0), 21213a2d0424SChris Cain std::array<const char*, 1>{"xyz.openbmc_project.Control.Power.Mode"}); 21223a2d0424SChris Cain } 21233a2d0424SChris Cain 21243a2d0424SChris Cain /** 21253a2d0424SChris Cain * @brief Validate the specified mode is valid and return the PowerMode 21263a2d0424SChris Cain * name associated with that string 21273a2d0424SChris Cain * 21283a2d0424SChris Cain * @param[in] aResp Shared pointer for generating response message. 21293a2d0424SChris Cain * @param[in] modeString String representing the desired PowerMode 21303a2d0424SChris Cain * 21313a2d0424SChris Cain * @return PowerMode value or empty string if mode is not valid 21323a2d0424SChris Cain */ 21333a2d0424SChris Cain inline std::string 21343a2d0424SChris Cain validatePowerMode(const std::shared_ptr<bmcweb::AsyncResp>& aResp, 21353a2d0424SChris Cain const std::string& modeString) 21363a2d0424SChris Cain { 21373a2d0424SChris Cain std::string mode; 21383a2d0424SChris Cain 21393a2d0424SChris Cain if (modeString == "Static") 21403a2d0424SChris Cain { 21413a2d0424SChris Cain mode = "xyz.openbmc_project.Control.Power.Mode.PowerMode.Static"; 21423a2d0424SChris Cain } 21433a2d0424SChris Cain else if (modeString == "MaximumPerformance") 21443a2d0424SChris Cain { 21453a2d0424SChris Cain mode = "xyz.openbmc_project.Control.Power.Mode.PowerMode." 21463a2d0424SChris Cain "MaximumPerformance"; 21473a2d0424SChris Cain } 21483a2d0424SChris Cain else if (modeString == "PowerSaving") 21493a2d0424SChris Cain { 21503a2d0424SChris Cain mode = "xyz.openbmc_project.Control.Power.Mode.PowerMode.PowerSaving"; 21513a2d0424SChris Cain } 21523a2d0424SChris Cain else 21533a2d0424SChris Cain { 21543a2d0424SChris Cain messages::propertyValueNotInList(aResp->res, modeString, "PowerMode"); 21553a2d0424SChris Cain } 21563a2d0424SChris Cain return mode; 21573a2d0424SChris Cain } 21583a2d0424SChris Cain 21593a2d0424SChris Cain /** 21603a2d0424SChris Cain * @brief Sets system power mode. 21613a2d0424SChris Cain * 21623a2d0424SChris Cain * @param[in] aResp Shared pointer for generating response message. 21633a2d0424SChris Cain * @param[in] pmode System power mode from request. 21643a2d0424SChris Cain * 21653a2d0424SChris Cain * @return None. 21663a2d0424SChris Cain */ 21673a2d0424SChris Cain inline void setPowerMode(const std::shared_ptr<bmcweb::AsyncResp>& aResp, 21683a2d0424SChris Cain const std::string& pmode) 21693a2d0424SChris Cain { 21703a2d0424SChris Cain BMCWEB_LOG_DEBUG << "Set power mode."; 21713a2d0424SChris Cain 21723a2d0424SChris Cain std::string powerMode = validatePowerMode(aResp, pmode); 21733a2d0424SChris Cain if (powerMode.empty()) 21743a2d0424SChris Cain { 21753a2d0424SChris Cain return; 21763a2d0424SChris Cain } 21773a2d0424SChris Cain 21783a2d0424SChris Cain // Get Power Mode object path: 21793a2d0424SChris Cain crow::connections::systemBus->async_method_call( 21803a2d0424SChris Cain [aResp, powerMode]( 21813a2d0424SChris Cain const boost::system::error_code ec, 21823a2d0424SChris Cain const std::vector<std::pair< 21833a2d0424SChris Cain std::string, 21843a2d0424SChris Cain std::vector<std::pair<std::string, std::vector<std::string>>>>>& 21853a2d0424SChris Cain subtree) { 21863a2d0424SChris Cain if (ec) 21873a2d0424SChris Cain { 21883a2d0424SChris Cain BMCWEB_LOG_DEBUG 21893a2d0424SChris Cain << "DBUS response error on Power.Mode GetSubTree " << ec; 21903a2d0424SChris Cain // This is an optional D-Bus object, but user attempted to patch 21913a2d0424SChris Cain messages::internalError(aResp->res); 21923a2d0424SChris Cain return; 21933a2d0424SChris Cain } 21943a2d0424SChris Cain if (subtree.empty()) 21953a2d0424SChris Cain { 21963a2d0424SChris Cain // This is an optional D-Bus object, but user attempted to patch 21973a2d0424SChris Cain messages::resourceNotFound(aResp->res, "ComputerSystem", 21983a2d0424SChris Cain "PowerMode"); 21993a2d0424SChris Cain return; 22003a2d0424SChris Cain } 22013a2d0424SChris Cain if (subtree.size() > 1) 22023a2d0424SChris Cain { 22033a2d0424SChris Cain // More then one PowerMode object is not supported and is an 22043a2d0424SChris Cain // error 22053a2d0424SChris Cain BMCWEB_LOG_DEBUG 22063a2d0424SChris Cain << "Found more than 1 system D-Bus Power.Mode objects: " 22073a2d0424SChris Cain << subtree.size(); 22083a2d0424SChris Cain messages::internalError(aResp->res); 22093a2d0424SChris Cain return; 22103a2d0424SChris Cain } 22113a2d0424SChris Cain if ((subtree[0].first.empty()) || (subtree[0].second.size() != 1)) 22123a2d0424SChris Cain { 22133a2d0424SChris Cain BMCWEB_LOG_DEBUG << "Power.Mode mapper error!"; 22143a2d0424SChris Cain messages::internalError(aResp->res); 22153a2d0424SChris Cain return; 22163a2d0424SChris Cain } 22173a2d0424SChris Cain const std::string& path = subtree[0].first; 22183a2d0424SChris Cain const std::string& service = subtree[0].second.begin()->first; 22193a2d0424SChris Cain if (service.empty()) 22203a2d0424SChris Cain { 22213a2d0424SChris Cain BMCWEB_LOG_DEBUG << "Power.Mode service mapper error!"; 22223a2d0424SChris Cain messages::internalError(aResp->res); 22233a2d0424SChris Cain return; 22243a2d0424SChris Cain } 22253a2d0424SChris Cain 22263a2d0424SChris Cain BMCWEB_LOG_DEBUG << "Setting power mode(" << powerMode << ") -> " 22273a2d0424SChris Cain << path; 22283a2d0424SChris Cain 22293a2d0424SChris Cain // Set the Power Mode property 22303a2d0424SChris Cain crow::connections::systemBus->async_method_call( 22313a2d0424SChris Cain [aResp](const boost::system::error_code ec) { 22323a2d0424SChris Cain if (ec) 22333a2d0424SChris Cain { 22343a2d0424SChris Cain messages::internalError(aResp->res); 22353a2d0424SChris Cain return; 22363a2d0424SChris Cain } 22373a2d0424SChris Cain }, 22383a2d0424SChris Cain service, path, "org.freedesktop.DBus.Properties", "Set", 22393a2d0424SChris Cain "xyz.openbmc_project.Control.Power.Mode", "PowerMode", 22403a2d0424SChris Cain std::variant<std::string>(powerMode)); 22413a2d0424SChris Cain }, 22423a2d0424SChris Cain "xyz.openbmc_project.ObjectMapper", 22433a2d0424SChris Cain "/xyz/openbmc_project/object_mapper", 22443a2d0424SChris Cain "xyz.openbmc_project.ObjectMapper", "GetSubTree", "/", int32_t(0), 22453a2d0424SChris Cain std::array<const char*, 1>{"xyz.openbmc_project.Control.Power.Mode"}); 22463a2d0424SChris Cain } 22473a2d0424SChris Cain 22483a2d0424SChris Cain /** 224951709ffdSYong Li * @brief Translates watchdog timeout action DBUS property value to redfish. 225051709ffdSYong Li * 225151709ffdSYong Li * @param[in] dbusAction The watchdog timeout action in D-BUS. 225251709ffdSYong Li * 225351709ffdSYong Li * @return Returns as a string, the timeout action in Redfish terms. If 225451709ffdSYong Li * translation cannot be done, returns an empty string. 225551709ffdSYong Li */ 225623a21a1cSEd Tanous inline std::string dbusToRfWatchdogAction(const std::string& dbusAction) 225751709ffdSYong Li { 225851709ffdSYong Li if (dbusAction == "xyz.openbmc_project.State.Watchdog.Action.None") 225951709ffdSYong Li { 226051709ffdSYong Li return "None"; 226151709ffdSYong Li } 22623174e4dfSEd Tanous if (dbusAction == "xyz.openbmc_project.State.Watchdog.Action.HardReset") 226351709ffdSYong Li { 226451709ffdSYong Li return "ResetSystem"; 226551709ffdSYong Li } 22663174e4dfSEd Tanous if (dbusAction == "xyz.openbmc_project.State.Watchdog.Action.PowerOff") 226751709ffdSYong Li { 226851709ffdSYong Li return "PowerDown"; 226951709ffdSYong Li } 22703174e4dfSEd Tanous if (dbusAction == "xyz.openbmc_project.State.Watchdog.Action.PowerCycle") 227151709ffdSYong Li { 227251709ffdSYong Li return "PowerCycle"; 227351709ffdSYong Li } 227451709ffdSYong Li 227551709ffdSYong Li return ""; 227651709ffdSYong Li } 227751709ffdSYong Li 227851709ffdSYong Li /** 2279c45f0082SYong Li *@brief Translates timeout action from Redfish to DBUS property value. 2280c45f0082SYong Li * 2281c45f0082SYong Li *@param[in] rfAction The timeout action in Redfish. 2282c45f0082SYong Li * 2283c45f0082SYong Li *@return Returns as a string, the time_out action as expected by DBUS. 2284c45f0082SYong Li *If translation cannot be done, returns an empty string. 2285c45f0082SYong Li */ 2286c45f0082SYong Li 228723a21a1cSEd Tanous inline std::string rfToDbusWDTTimeOutAct(const std::string& rfAction) 2288c45f0082SYong Li { 2289c45f0082SYong Li if (rfAction == "None") 2290c45f0082SYong Li { 2291c45f0082SYong Li return "xyz.openbmc_project.State.Watchdog.Action.None"; 2292c45f0082SYong Li } 22933174e4dfSEd Tanous if (rfAction == "PowerCycle") 2294c45f0082SYong Li { 2295c45f0082SYong Li return "xyz.openbmc_project.State.Watchdog.Action.PowerCycle"; 2296c45f0082SYong Li } 22973174e4dfSEd Tanous if (rfAction == "PowerDown") 2298c45f0082SYong Li { 2299c45f0082SYong Li return "xyz.openbmc_project.State.Watchdog.Action.PowerOff"; 2300c45f0082SYong Li } 23013174e4dfSEd Tanous if (rfAction == "ResetSystem") 2302c45f0082SYong Li { 2303c45f0082SYong Li return "xyz.openbmc_project.State.Watchdog.Action.HardReset"; 2304c45f0082SYong Li } 2305c45f0082SYong Li 2306c45f0082SYong Li return ""; 2307c45f0082SYong Li } 2308c45f0082SYong Li 2309c45f0082SYong Li /** 231051709ffdSYong Li * @brief Retrieves host watchdog timer properties over DBUS 231151709ffdSYong Li * 231251709ffdSYong Li * @param[in] aResp Shared pointer for completing asynchronous calls. 231351709ffdSYong Li * 231451709ffdSYong Li * @return None. 231551709ffdSYong Li */ 23168d1b46d7Szhanghch05 inline void 23178d1b46d7Szhanghch05 getHostWatchdogTimer(const std::shared_ptr<bmcweb::AsyncResp>& aResp) 231851709ffdSYong Li { 231951709ffdSYong Li BMCWEB_LOG_DEBUG << "Get host watchodg"; 232051709ffdSYong Li crow::connections::systemBus->async_method_call( 232151709ffdSYong Li [aResp](const boost::system::error_code ec, 232251709ffdSYong Li PropertiesType& properties) { 232351709ffdSYong Li if (ec) 232451709ffdSYong Li { 232551709ffdSYong Li // watchdog service is stopped 232651709ffdSYong Li BMCWEB_LOG_DEBUG << "DBUS response error " << ec; 232751709ffdSYong Li return; 232851709ffdSYong Li } 232951709ffdSYong Li 233051709ffdSYong Li BMCWEB_LOG_DEBUG << "Got " << properties.size() << " wdt prop."; 233151709ffdSYong Li 233251709ffdSYong Li nlohmann::json& hostWatchdogTimer = 233351709ffdSYong Li aResp->res.jsonValue["HostWatchdogTimer"]; 233451709ffdSYong Li 233551709ffdSYong Li // watchdog service is running/enabled 233651709ffdSYong Li hostWatchdogTimer["Status"]["State"] = "Enabled"; 233751709ffdSYong Li 233851709ffdSYong Li for (const auto& property : properties) 233951709ffdSYong Li { 234051709ffdSYong Li BMCWEB_LOG_DEBUG << "prop=" << property.first; 234151709ffdSYong Li if (property.first == "Enabled") 234251709ffdSYong Li { 234351709ffdSYong Li const bool* state = std::get_if<bool>(&property.second); 234451709ffdSYong Li 234551709ffdSYong Li if (!state) 234651709ffdSYong Li { 234751709ffdSYong Li messages::internalError(aResp->res); 2348601af5edSChicago Duan return; 234951709ffdSYong Li } 235051709ffdSYong Li 235151709ffdSYong Li hostWatchdogTimer["FunctionEnabled"] = *state; 235251709ffdSYong Li } 235351709ffdSYong Li else if (property.first == "ExpireAction") 235451709ffdSYong Li { 235551709ffdSYong Li const std::string* s = 235651709ffdSYong Li std::get_if<std::string>(&property.second); 235751709ffdSYong Li if (!s) 235851709ffdSYong Li { 235951709ffdSYong Li messages::internalError(aResp->res); 2360601af5edSChicago Duan return; 236151709ffdSYong Li } 236251709ffdSYong Li 236351709ffdSYong Li std::string action = dbusToRfWatchdogAction(*s); 236451709ffdSYong Li if (action.empty()) 236551709ffdSYong Li { 236651709ffdSYong Li messages::internalError(aResp->res); 2367601af5edSChicago Duan return; 236851709ffdSYong Li } 236951709ffdSYong Li hostWatchdogTimer["TimeoutAction"] = action; 237051709ffdSYong Li } 237151709ffdSYong Li } 237251709ffdSYong Li }, 237351709ffdSYong Li "xyz.openbmc_project.Watchdog", "/xyz/openbmc_project/watchdog/host0", 237451709ffdSYong Li "org.freedesktop.DBus.Properties", "GetAll", 237551709ffdSYong Li "xyz.openbmc_project.State.Watchdog"); 237651709ffdSYong Li } 237751709ffdSYong Li 237851709ffdSYong Li /** 2379c45f0082SYong Li * @brief Sets Host WatchDog Timer properties. 2380c45f0082SYong Li * 2381c45f0082SYong Li * @param[in] aResp Shared pointer for generating response message. 2382c45f0082SYong Li * @param[in] wdtEnable The WDTimer Enable value (true/false) from incoming 2383c45f0082SYong Li * RF request. 2384c45f0082SYong Li * @param[in] wdtTimeOutAction The WDT Timeout action, from incoming RF request. 2385c45f0082SYong Li * 2386c45f0082SYong Li * @return None. 2387c45f0082SYong Li */ 23888d1b46d7Szhanghch05 inline void setWDTProperties(const std::shared_ptr<bmcweb::AsyncResp>& aResp, 2389c45f0082SYong Li const std::optional<bool> wdtEnable, 2390c45f0082SYong Li const std::optional<std::string>& wdtTimeOutAction) 2391c45f0082SYong Li { 2392c45f0082SYong Li BMCWEB_LOG_DEBUG << "Set host watchdog"; 2393c45f0082SYong Li 2394c45f0082SYong Li if (wdtTimeOutAction) 2395c45f0082SYong Li { 2396c45f0082SYong Li std::string wdtTimeOutActStr = rfToDbusWDTTimeOutAct(*wdtTimeOutAction); 2397c45f0082SYong Li // check if TimeOut Action is Valid 2398c45f0082SYong Li if (wdtTimeOutActStr.empty()) 2399c45f0082SYong Li { 2400c45f0082SYong Li BMCWEB_LOG_DEBUG << "Unsupported value for TimeoutAction: " 2401c45f0082SYong Li << *wdtTimeOutAction; 2402c45f0082SYong Li messages::propertyValueNotInList(aResp->res, *wdtTimeOutAction, 2403c45f0082SYong Li "TimeoutAction"); 2404c45f0082SYong Li return; 2405c45f0082SYong Li } 2406c45f0082SYong Li 2407c45f0082SYong Li crow::connections::systemBus->async_method_call( 2408c45f0082SYong Li [aResp](const boost::system::error_code ec) { 2409c45f0082SYong Li if (ec) 2410c45f0082SYong Li { 2411c45f0082SYong Li BMCWEB_LOG_DEBUG << "DBUS response error " << ec; 2412c45f0082SYong Li messages::internalError(aResp->res); 2413c45f0082SYong Li return; 2414c45f0082SYong Li } 2415c45f0082SYong Li }, 2416c45f0082SYong Li "xyz.openbmc_project.Watchdog", 2417c45f0082SYong Li "/xyz/openbmc_project/watchdog/host0", 2418c45f0082SYong Li "org.freedesktop.DBus.Properties", "Set", 2419c45f0082SYong Li "xyz.openbmc_project.State.Watchdog", "ExpireAction", 2420c45f0082SYong Li std::variant<std::string>(wdtTimeOutActStr)); 2421c45f0082SYong Li } 2422c45f0082SYong Li 2423c45f0082SYong Li if (wdtEnable) 2424c45f0082SYong Li { 2425c45f0082SYong Li crow::connections::systemBus->async_method_call( 2426c45f0082SYong Li [aResp](const boost::system::error_code ec) { 2427c45f0082SYong Li if (ec) 2428c45f0082SYong Li { 2429c45f0082SYong Li BMCWEB_LOG_DEBUG << "DBUS response error " << ec; 2430c45f0082SYong Li messages::internalError(aResp->res); 2431c45f0082SYong Li return; 2432c45f0082SYong Li } 2433c45f0082SYong Li }, 2434c45f0082SYong Li "xyz.openbmc_project.Watchdog", 2435c45f0082SYong Li "/xyz/openbmc_project/watchdog/host0", 2436c45f0082SYong Li "org.freedesktop.DBus.Properties", "Set", 2437c45f0082SYong Li "xyz.openbmc_project.State.Watchdog", "Enabled", 2438c45f0082SYong Li std::variant<bool>(*wdtEnable)); 2439c45f0082SYong Li } 2440c45f0082SYong Li } 2441c45f0082SYong Li 2442c45f0082SYong Li /** 2443c5b2abe0SLewanczyk, Dawid * SystemsCollection derived class for delivering ComputerSystems Collection 2444c5b2abe0SLewanczyk, Dawid * Schema 2445c5b2abe0SLewanczyk, Dawid */ 24467e860f15SJohn Edward Broadbent inline void requestRoutesSystemsCollection(App& app) 24471abe55efSEd Tanous { 24487e860f15SJohn Edward Broadbent BMCWEB_ROUTE(app, "/redfish/v1/Systems/") 2449ed398213SEd Tanous .privileges(redfish::privileges::getComputerSystemCollection) 24507e860f15SJohn Edward Broadbent .methods(boost::beast::http::verb::get)( 24514f48d5f6SEd Tanous [](const crow::Request& /*req*/, 24527e860f15SJohn Edward Broadbent const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) { 24538d1b46d7Szhanghch05 asyncResp->res.jsonValue["@odata.type"] = 24540f74e643SEd Tanous "#ComputerSystemCollection.ComputerSystemCollection"; 24558d1b46d7Szhanghch05 asyncResp->res.jsonValue["@odata.id"] = "/redfish/v1/Systems"; 24568d1b46d7Szhanghch05 asyncResp->res.jsonValue["Name"] = "Computer System Collection"; 2457462023adSSunitha Harish 2458462023adSSunitha Harish crow::connections::systemBus->async_method_call( 24594f48d5f6SEd Tanous [asyncResp](const boost::system::error_code ec, 2460cb13a392SEd Tanous const std::variant<std::string>& /*hostName*/) { 24612c70f800SEd Tanous nlohmann::json& ifaceArray = 2462462023adSSunitha Harish asyncResp->res.jsonValue["Members"]; 24632c70f800SEd Tanous ifaceArray = nlohmann::json::array(); 24647e860f15SJohn Edward Broadbent auto& count = 24657e860f15SJohn Edward Broadbent asyncResp->res.jsonValue["Members@odata.count"]; 24662c70f800SEd Tanous ifaceArray.push_back( 2467cb13a392SEd Tanous {{"@odata.id", "/redfish/v1/Systems/system"}}); 246894bda602STim Lee count = ifaceArray.size(); 2469cb13a392SEd Tanous if (!ec) 2470462023adSSunitha Harish { 2471462023adSSunitha Harish BMCWEB_LOG_DEBUG << "Hypervisor is available"; 24722c70f800SEd Tanous ifaceArray.push_back( 24737e860f15SJohn Edward Broadbent {{"@odata.id", 24747e860f15SJohn Edward Broadbent "/redfish/v1/Systems/hypervisor"}}); 24752c70f800SEd Tanous count = ifaceArray.size(); 2476cb13a392SEd Tanous } 2477462023adSSunitha Harish }, 24788e651fbfSSunitha Harish "xyz.openbmc_project.Settings", 24798e651fbfSSunitha Harish "/xyz/openbmc_project/network/hypervisor", 2480462023adSSunitha Harish "org.freedesktop.DBus.Properties", "Get", 24817e860f15SJohn Edward Broadbent "xyz.openbmc_project.Network.SystemConfiguration", 24827e860f15SJohn Edward Broadbent "HostName"); 24837e860f15SJohn Edward Broadbent }); 2484c5b2abe0SLewanczyk, Dawid } 24857e860f15SJohn Edward Broadbent 24867e860f15SJohn Edward Broadbent /** 24877e860f15SJohn Edward Broadbent * Function transceives data with dbus directly. 24887e860f15SJohn Edward Broadbent */ 24894f48d5f6SEd Tanous inline void doNMI(const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) 24907e860f15SJohn Edward Broadbent { 24917e860f15SJohn Edward Broadbent constexpr char const* serviceName = "xyz.openbmc_project.Control.Host.NMI"; 24927e860f15SJohn Edward Broadbent constexpr char const* objectPath = "/xyz/openbmc_project/control/host0/nmi"; 24937e860f15SJohn Edward Broadbent constexpr char const* interfaceName = 24947e860f15SJohn Edward Broadbent "xyz.openbmc_project.Control.Host.NMI"; 24957e860f15SJohn Edward Broadbent constexpr char const* method = "NMI"; 24967e860f15SJohn Edward Broadbent 24977e860f15SJohn Edward Broadbent crow::connections::systemBus->async_method_call( 24987e860f15SJohn Edward Broadbent [asyncResp](const boost::system::error_code ec) { 24997e860f15SJohn Edward Broadbent if (ec) 25007e860f15SJohn Edward Broadbent { 25017e860f15SJohn Edward Broadbent BMCWEB_LOG_ERROR << " Bad D-Bus request error: " << ec; 25027e860f15SJohn Edward Broadbent messages::internalError(asyncResp->res); 25037e860f15SJohn Edward Broadbent return; 25047e860f15SJohn Edward Broadbent } 25057e860f15SJohn Edward Broadbent messages::success(asyncResp->res); 25067e860f15SJohn Edward Broadbent }, 25077e860f15SJohn Edward Broadbent serviceName, objectPath, interfaceName, method); 25087e860f15SJohn Edward Broadbent } 2509c5b2abe0SLewanczyk, Dawid 2510c5b2abe0SLewanczyk, Dawid /** 2511cc340dd9SEd Tanous * SystemActionsReset class supports handle POST method for Reset action. 2512cc340dd9SEd Tanous * The class retrieves and sends data directly to D-Bus. 2513cc340dd9SEd Tanous */ 25147e860f15SJohn Edward Broadbent inline void requestRoutesSystemActionsReset(App& app) 2515cc340dd9SEd Tanous { 2516cc340dd9SEd Tanous /** 2517cc340dd9SEd Tanous * Function handles POST method request. 2518cc340dd9SEd Tanous * Analyzes POST body message before sends Reset request data to D-Bus. 2519cc340dd9SEd Tanous */ 25207e860f15SJohn Edward Broadbent BMCWEB_ROUTE(app, 25217e860f15SJohn Edward Broadbent "/redfish/v1/Systems/system/Actions/ComputerSystem.Reset/") 2522ed398213SEd Tanous .privileges(redfish::privileges::postComputerSystem) 25237e860f15SJohn Edward Broadbent .methods( 25247e860f15SJohn Edward Broadbent boost::beast::http::verb:: 25257e860f15SJohn Edward Broadbent post)([](const crow::Request& req, 25267e860f15SJohn Edward Broadbent const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) { 25279712f8acSEd Tanous std::string resetType; 25287e860f15SJohn Edward Broadbent if (!json_util::readJson(req, asyncResp->res, "ResetType", 25297e860f15SJohn Edward Broadbent resetType)) 2530cc340dd9SEd Tanous { 2531cc340dd9SEd Tanous return; 2532cc340dd9SEd Tanous } 2533cc340dd9SEd Tanous 2534d22c8396SJason M. Bills // Get the command and host vs. chassis 2535cc340dd9SEd Tanous std::string command; 2536d22c8396SJason M. Bills bool hostCommand; 2537d4d25793SEd Tanous if ((resetType == "On") || (resetType == "ForceOn")) 2538cc340dd9SEd Tanous { 2539cc340dd9SEd Tanous command = "xyz.openbmc_project.State.Host.Transition.On"; 2540d22c8396SJason M. Bills hostCommand = true; 2541d22c8396SJason M. Bills } 2542d22c8396SJason M. Bills else if (resetType == "ForceOff") 2543d22c8396SJason M. Bills { 2544d22c8396SJason M. Bills command = "xyz.openbmc_project.State.Chassis.Transition.Off"; 2545d22c8396SJason M. Bills hostCommand = false; 2546d22c8396SJason M. Bills } 2547d22c8396SJason M. Bills else if (resetType == "ForceRestart") 2548d22c8396SJason M. Bills { 254986a0851aSJason M. Bills command = 255086a0851aSJason M. Bills "xyz.openbmc_project.State.Host.Transition.ForceWarmReboot"; 255186a0851aSJason M. Bills hostCommand = true; 2552cc340dd9SEd Tanous } 25539712f8acSEd Tanous else if (resetType == "GracefulShutdown") 2554cc340dd9SEd Tanous { 2555cc340dd9SEd Tanous command = "xyz.openbmc_project.State.Host.Transition.Off"; 2556d22c8396SJason M. Bills hostCommand = true; 2557cc340dd9SEd Tanous } 25589712f8acSEd Tanous else if (resetType == "GracefulRestart") 2559cc340dd9SEd Tanous { 25607e860f15SJohn Edward Broadbent command = "xyz.openbmc_project.State.Host.Transition." 25617e860f15SJohn Edward Broadbent "GracefulWarmReboot"; 2562d22c8396SJason M. Bills hostCommand = true; 2563d22c8396SJason M. Bills } 2564d22c8396SJason M. Bills else if (resetType == "PowerCycle") 2565d22c8396SJason M. Bills { 256686a0851aSJason M. Bills command = "xyz.openbmc_project.State.Host.Transition.Reboot"; 256786a0851aSJason M. Bills hostCommand = true; 2568cc340dd9SEd Tanous } 2569bfd5b826SLakshminarayana R. Kammath else if (resetType == "Nmi") 2570bfd5b826SLakshminarayana R. Kammath { 2571bfd5b826SLakshminarayana R. Kammath doNMI(asyncResp); 2572bfd5b826SLakshminarayana R. Kammath return; 2573bfd5b826SLakshminarayana R. Kammath } 2574cc340dd9SEd Tanous else 2575cc340dd9SEd Tanous { 25768d1b46d7Szhanghch05 messages::actionParameterUnknown(asyncResp->res, "Reset", 25778d1b46d7Szhanghch05 resetType); 2578cc340dd9SEd Tanous return; 2579cc340dd9SEd Tanous } 2580cc340dd9SEd Tanous 2581d22c8396SJason M. Bills if (hostCommand) 2582d22c8396SJason M. Bills { 2583cc340dd9SEd Tanous crow::connections::systemBus->async_method_call( 2584d22c8396SJason M. Bills [asyncResp, resetType](const boost::system::error_code ec) { 2585cc340dd9SEd Tanous if (ec) 2586cc340dd9SEd Tanous { 2587cc340dd9SEd Tanous BMCWEB_LOG_ERROR << "D-Bus responses error: " << ec; 25887e860f15SJohn Edward Broadbent if (ec.value() == 25897e860f15SJohn Edward Broadbent boost::asio::error::invalid_argument) 2590d22c8396SJason M. Bills { 2591d22c8396SJason M. Bills messages::actionParameterNotSupported( 2592d22c8396SJason M. Bills asyncResp->res, resetType, "Reset"); 2593d22c8396SJason M. Bills } 2594d22c8396SJason M. Bills else 2595d22c8396SJason M. Bills { 2596f12894f8SJason M. Bills messages::internalError(asyncResp->res); 2597d22c8396SJason M. Bills } 2598cc340dd9SEd Tanous return; 2599cc340dd9SEd Tanous } 2600f12894f8SJason M. Bills messages::success(asyncResp->res); 2601cc340dd9SEd Tanous }, 2602cc340dd9SEd Tanous "xyz.openbmc_project.State.Host", 2603cc340dd9SEd Tanous "/xyz/openbmc_project/state/host0", 2604cc340dd9SEd Tanous "org.freedesktop.DBus.Properties", "Set", 26059712f8acSEd Tanous "xyz.openbmc_project.State.Host", "RequestedHostTransition", 2606abf2add6SEd Tanous std::variant<std::string>{command}); 2607cc340dd9SEd Tanous } 2608d22c8396SJason M. Bills else 2609d22c8396SJason M. Bills { 2610d22c8396SJason M. Bills crow::connections::systemBus->async_method_call( 2611d22c8396SJason M. Bills [asyncResp, resetType](const boost::system::error_code ec) { 2612d22c8396SJason M. Bills if (ec) 2613d22c8396SJason M. Bills { 2614d22c8396SJason M. Bills BMCWEB_LOG_ERROR << "D-Bus responses error: " << ec; 26157e860f15SJohn Edward Broadbent if (ec.value() == 26167e860f15SJohn Edward Broadbent boost::asio::error::invalid_argument) 2617d22c8396SJason M. Bills { 2618d22c8396SJason M. Bills messages::actionParameterNotSupported( 2619d22c8396SJason M. Bills asyncResp->res, resetType, "Reset"); 2620d22c8396SJason M. Bills } 2621d22c8396SJason M. Bills else 2622d22c8396SJason M. Bills { 2623d22c8396SJason M. Bills messages::internalError(asyncResp->res); 2624d22c8396SJason M. Bills } 2625d22c8396SJason M. Bills return; 2626d22c8396SJason M. Bills } 2627d22c8396SJason M. Bills messages::success(asyncResp->res); 2628d22c8396SJason M. Bills }, 2629d22c8396SJason M. Bills "xyz.openbmc_project.State.Chassis", 2630d22c8396SJason M. Bills "/xyz/openbmc_project/state/chassis0", 2631d22c8396SJason M. Bills "org.freedesktop.DBus.Properties", "Set", 26327e860f15SJohn Edward Broadbent "xyz.openbmc_project.State.Chassis", 26337e860f15SJohn Edward Broadbent "RequestedPowerTransition", 2634d22c8396SJason M. Bills std::variant<std::string>{command}); 2635d22c8396SJason M. Bills } 26367e860f15SJohn Edward Broadbent }); 2637d22c8396SJason M. Bills } 2638cc340dd9SEd Tanous 2639cc340dd9SEd Tanous /** 26406617338dSEd Tanous * Systems derived class for delivering Computer Systems Schema. 2641c5b2abe0SLewanczyk, Dawid */ 26427e860f15SJohn Edward Broadbent inline void requestRoutesSystems(App& app) 26431abe55efSEd Tanous { 2644c5b2abe0SLewanczyk, Dawid 2645c5b2abe0SLewanczyk, Dawid /** 2646c5b2abe0SLewanczyk, Dawid * Functions triggers appropriate requests on DBus 2647c5b2abe0SLewanczyk, Dawid */ 26487e860f15SJohn Edward Broadbent BMCWEB_ROUTE(app, "/redfish/v1/Systems/system/") 2649ed398213SEd Tanous .privileges(redfish::privileges::getComputerSystem) 26507e860f15SJohn Edward Broadbent .methods( 26517e860f15SJohn Edward Broadbent boost::beast::http::verb:: 26527e860f15SJohn Edward Broadbent get)([](const crow::Request&, 26537e860f15SJohn Edward Broadbent const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) { 26548d1b46d7Szhanghch05 asyncResp->res.jsonValue["@odata.type"] = 26553a2d0424SChris Cain "#ComputerSystem.v1_15_0.ComputerSystem"; 26568d1b46d7Szhanghch05 asyncResp->res.jsonValue["Name"] = "system"; 26578d1b46d7Szhanghch05 asyncResp->res.jsonValue["Id"] = "system"; 26588d1b46d7Szhanghch05 asyncResp->res.jsonValue["SystemType"] = "Physical"; 26598d1b46d7Szhanghch05 asyncResp->res.jsonValue["Description"] = "Computer System"; 26608d1b46d7Szhanghch05 asyncResp->res.jsonValue["ProcessorSummary"]["Count"] = 0; 26618d1b46d7Szhanghch05 asyncResp->res.jsonValue["ProcessorSummary"]["Status"]["State"] = 26628d1b46d7Szhanghch05 "Disabled"; 26638d1b46d7Szhanghch05 asyncResp->res.jsonValue["MemorySummary"]["TotalSystemMemoryGiB"] = 26648d1b46d7Szhanghch05 uint64_t(0); 26658d1b46d7Szhanghch05 asyncResp->res.jsonValue["MemorySummary"]["Status"]["State"] = 26668d1b46d7Szhanghch05 "Disabled"; 26677e860f15SJohn Edward Broadbent asyncResp->res.jsonValue["@odata.id"] = 26687e860f15SJohn Edward Broadbent "/redfish/v1/Systems/system"; 266904a258f4SEd Tanous 26708d1b46d7Szhanghch05 asyncResp->res.jsonValue["Processors"] = { 2671029573d4SEd Tanous {"@odata.id", "/redfish/v1/Systems/system/Processors"}}; 26728d1b46d7Szhanghch05 asyncResp->res.jsonValue["Memory"] = { 2673029573d4SEd Tanous {"@odata.id", "/redfish/v1/Systems/system/Memory"}}; 26748d1b46d7Szhanghch05 asyncResp->res.jsonValue["Storage"] = { 2675a25aeccfSNikhil Potade {"@odata.id", "/redfish/v1/Systems/system/Storage"}}; 2676029573d4SEd Tanous 26778d1b46d7Szhanghch05 asyncResp->res.jsonValue["Actions"]["#ComputerSystem.Reset"] = { 2678cc340dd9SEd Tanous {"target", 2679029573d4SEd Tanous "/redfish/v1/Systems/system/Actions/ComputerSystem.Reset"}, 26801cb1a9e6SAppaRao Puli {"@Redfish.ActionInfo", 26811cb1a9e6SAppaRao Puli "/redfish/v1/Systems/system/ResetActionInfo"}}; 2682c5b2abe0SLewanczyk, Dawid 26838d1b46d7Szhanghch05 asyncResp->res.jsonValue["LogServices"] = { 2684029573d4SEd Tanous {"@odata.id", "/redfish/v1/Systems/system/LogServices"}}; 2685c4bf6374SJason M. Bills 26868d1b46d7Szhanghch05 asyncResp->res.jsonValue["Bios"] = { 2687d82a3acdSCarol Wang {"@odata.id", "/redfish/v1/Systems/system/Bios"}}; 2688d82a3acdSCarol Wang 26898d1b46d7Szhanghch05 asyncResp->res.jsonValue["Links"]["ManagedBy"] = { 2690c5d03ff4SJennifer Lee {{"@odata.id", "/redfish/v1/Managers/bmc"}}}; 2691c5d03ff4SJennifer Lee 26928d1b46d7Szhanghch05 asyncResp->res.jsonValue["Status"] = { 2693c5d03ff4SJennifer Lee {"Health", "OK"}, 2694c5d03ff4SJennifer Lee {"State", "Enabled"}, 2695c5d03ff4SJennifer Lee }; 26960e8ac5e7SGunnar Mills 26970e8ac5e7SGunnar Mills // Fill in SerialConsole info 26980e8ac5e7SGunnar Mills asyncResp->res.jsonValue["SerialConsole"]["MaxConcurrentSessions"] = 26990e8ac5e7SGunnar Mills 15; 27000e8ac5e7SGunnar Mills asyncResp->res.jsonValue["SerialConsole"]["IPMI"] = { 27010e8ac5e7SGunnar Mills {"ServiceEnabled", true}, 27020e8ac5e7SGunnar Mills }; 27030e8ac5e7SGunnar Mills // TODO (Gunnar): Should look for obmc-console-ssh@2200.service 27040e8ac5e7SGunnar Mills asyncResp->res.jsonValue["SerialConsole"]["SSH"] = { 27050e8ac5e7SGunnar Mills {"ServiceEnabled", true}, 27060e8ac5e7SGunnar Mills {"Port", 2200}, 27070e8ac5e7SGunnar Mills // https://github.com/openbmc/docs/blob/master/console.md 27080e8ac5e7SGunnar Mills {"HotKeySequenceDisplay", "Press ~. to exit console"}, 27090e8ac5e7SGunnar Mills }; 27100e8ac5e7SGunnar Mills 27110e8ac5e7SGunnar Mills #ifdef BMCWEB_ENABLE_KVM 27120e8ac5e7SGunnar Mills // Fill in GraphicalConsole info 27130e8ac5e7SGunnar Mills asyncResp->res.jsonValue["GraphicalConsole"] = { 27140e8ac5e7SGunnar Mills {"ServiceEnabled", true}, 27150e8ac5e7SGunnar Mills {"MaxConcurrentSessions", 4}, 27160e8ac5e7SGunnar Mills {"ConnectTypesSupported", {"KVMIP"}}, 27170e8ac5e7SGunnar Mills }; 27180e8ac5e7SGunnar Mills #endif // BMCWEB_ENABLE_KVM 2719e284a7c1SJames Feist constexpr const std::array<const char*, 4> inventoryForSystems = { 2720b49ac873SJames Feist "xyz.openbmc_project.Inventory.Item.Dimm", 27212ad9c2f6SJames Feist "xyz.openbmc_project.Inventory.Item.Cpu", 2722e284a7c1SJames Feist "xyz.openbmc_project.Inventory.Item.Drive", 2723e284a7c1SJames Feist "xyz.openbmc_project.Inventory.Item.StorageController"}; 2724b49ac873SJames Feist 2725b49ac873SJames Feist auto health = std::make_shared<HealthPopulate>(asyncResp); 2726b49ac873SJames Feist crow::connections::systemBus->async_method_call( 2727b49ac873SJames Feist [health](const boost::system::error_code ec, 2728b49ac873SJames Feist std::vector<std::string>& resp) { 2729b49ac873SJames Feist if (ec) 2730b49ac873SJames Feist { 2731b49ac873SJames Feist // no inventory 2732b49ac873SJames Feist return; 2733b49ac873SJames Feist } 2734b49ac873SJames Feist 2735b49ac873SJames Feist health->inventory = std::move(resp); 2736b49ac873SJames Feist }, 2737b49ac873SJames Feist "xyz.openbmc_project.ObjectMapper", 2738b49ac873SJames Feist "/xyz/openbmc_project/object_mapper", 2739b49ac873SJames Feist "xyz.openbmc_project.ObjectMapper", "GetSubTreePaths", "/", 2740b49ac873SJames Feist int32_t(0), inventoryForSystems); 2741b49ac873SJames Feist 2742b49ac873SJames Feist health->populate(); 2743b49ac873SJames Feist 27448d1b46d7Szhanghch05 getMainChassisId( 27458d1b46d7Szhanghch05 asyncResp, [](const std::string& chassisId, 27468d1b46d7Szhanghch05 const std::shared_ptr<bmcweb::AsyncResp>& aRsp) { 2747c5d03ff4SJennifer Lee aRsp->res.jsonValue["Links"]["Chassis"] = { 2748c5d03ff4SJennifer Lee {{"@odata.id", "/redfish/v1/Chassis/" + chassisId}}}; 2749c5d03ff4SJennifer Lee }); 2750a3002228SAppaRao Puli 27519f8bfa7cSGunnar Mills getLocationIndicatorActive(asyncResp); 27529f8bfa7cSGunnar Mills // TODO (Gunnar): Remove IndicatorLED after enough time has passed 2753a3002228SAppaRao Puli getIndicatorLedState(asyncResp); 27545bc2dc8eSJames Feist getComputerSystem(asyncResp, health); 27556c34de48SEd Tanous getHostState(asyncResp); 2756491d8ee7SSantosh Puranik getBootProperties(asyncResp); 2757978b8803SAndrew Geissler getBootProgress(asyncResp); 2758adbe192aSJason M. Bills getPCIeDeviceList(asyncResp, "PCIeDevices"); 275951709ffdSYong Li getHostWatchdogTimer(asyncResp); 2760c6a620f2SGeorge Liu getPowerRestorePolicy(asyncResp); 27616bd5a8d2SGunnar Mills getAutomaticRetry(asyncResp); 2762c0557e1aSGunnar Mills getLastResetTime(asyncResp); 2763a6349918SAppaRao Puli #ifdef BMCWEB_ENABLE_REDFISH_PROVISIONING_FEATURE 2764a6349918SAppaRao Puli getProvisioningStatus(asyncResp); 2765a6349918SAppaRao Puli #endif 27661981771bSAli Ahmed getTrustedModuleRequiredToBoot(asyncResp); 27673a2d0424SChris Cain getPowerMode(asyncResp); 27687e860f15SJohn Edward Broadbent }); 27697e860f15SJohn Edward Broadbent BMCWEB_ROUTE(app, "/redfish/v1/Systems/system/") 2770ed398213SEd Tanous .privileges(redfish::privileges::patchComputerSystem) 27717e860f15SJohn Edward Broadbent .methods(boost::beast::http::verb::patch)( 27727e860f15SJohn Edward Broadbent [](const crow::Request& req, 27737e860f15SJohn Edward Broadbent const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) { 27749f8bfa7cSGunnar Mills std::optional<bool> locationIndicatorActive; 2775cde19e5fSSantosh Puranik std::optional<std::string> indicatorLed; 2776491d8ee7SSantosh Puranik std::optional<nlohmann::json> bootProps; 2777c45f0082SYong Li std::optional<nlohmann::json> wdtTimerProps; 277898e386ecSGunnar Mills std::optional<std::string> assetTag; 2779c6a620f2SGeorge Liu std::optional<std::string> powerRestorePolicy; 27803a2d0424SChris Cain std::optional<std::string> powerMode; 27811c05dae3SAli Ahmed std::optional<bool> trustedModuleRequiredToBoot; 27829f8bfa7cSGunnar Mills if (!json_util::readJson( 27838d1b46d7Szhanghch05 req, asyncResp->res, "IndicatorLED", indicatorLed, 27847e860f15SJohn Edward Broadbent "LocationIndicatorActive", locationIndicatorActive, 27857e860f15SJohn Edward Broadbent "Boot", bootProps, "WatchdogTimer", wdtTimerProps, 27867e860f15SJohn Edward Broadbent "PowerRestorePolicy", powerRestorePolicy, "AssetTag", 27871c05dae3SAli Ahmed assetTag, "PowerMode", powerMode, 27881c05dae3SAli Ahmed "TrustedModuleRequiredToBoot", 27891c05dae3SAli Ahmed trustedModuleRequiredToBoot)) 27906617338dSEd Tanous { 27916617338dSEd Tanous return; 27926617338dSEd Tanous } 2793491d8ee7SSantosh Puranik 27948d1b46d7Szhanghch05 asyncResp->res.result(boost::beast::http::status::no_content); 2795c45f0082SYong Li 279698e386ecSGunnar Mills if (assetTag) 279798e386ecSGunnar Mills { 279898e386ecSGunnar Mills setAssetTag(asyncResp, *assetTag); 279998e386ecSGunnar Mills } 280098e386ecSGunnar Mills 2801c45f0082SYong Li if (wdtTimerProps) 2802c45f0082SYong Li { 2803c45f0082SYong Li std::optional<bool> wdtEnable; 2804c45f0082SYong Li std::optional<std::string> wdtTimeOutAction; 2805c45f0082SYong Li 2806c45f0082SYong Li if (!json_util::readJson(*wdtTimerProps, asyncResp->res, 2807c45f0082SYong Li "FunctionEnabled", wdtEnable, 2808c45f0082SYong Li "TimeoutAction", wdtTimeOutAction)) 2809c45f0082SYong Li { 2810c45f0082SYong Li return; 2811c45f0082SYong Li } 2812f23b7296SEd Tanous setWDTProperties(asyncResp, wdtEnable, wdtTimeOutAction); 2813c45f0082SYong Li } 2814c45f0082SYong Li 2815491d8ee7SSantosh Puranik if (bootProps) 2816491d8ee7SSantosh Puranik { 2817491d8ee7SSantosh Puranik std::optional<std::string> bootSource; 2818cd9a4666SKonstantin Aladyshev std::optional<std::string> bootType; 2819491d8ee7SSantosh Puranik std::optional<std::string> bootEnable; 282069f35306SGunnar Mills std::optional<std::string> automaticRetryConfig; 2821491d8ee7SSantosh Puranik 282269f35306SGunnar Mills if (!json_util::readJson( 28237e860f15SJohn Edward Broadbent *bootProps, asyncResp->res, 28247e860f15SJohn Edward Broadbent "BootSourceOverrideTarget", bootSource, 2825cd9a4666SKonstantin Aladyshev "BootSourceOverrideMode", bootType, 28267e860f15SJohn Edward Broadbent "BootSourceOverrideEnabled", bootEnable, 282769f35306SGunnar Mills "AutomaticRetryConfig", automaticRetryConfig)) 2828491d8ee7SSantosh Puranik { 2829491d8ee7SSantosh Puranik return; 2830491d8ee7SSantosh Puranik } 2831c21865c4SKonstantin Aladyshev 2832cd9a4666SKonstantin Aladyshev if (bootSource || bootType || bootEnable) 283369f35306SGunnar Mills { 2834c21865c4SKonstantin Aladyshev setBootProperties(asyncResp, bootSource, bootType, 2835c21865c4SKonstantin Aladyshev bootEnable); 2836491d8ee7SSantosh Puranik } 283769f35306SGunnar Mills if (automaticRetryConfig) 283869f35306SGunnar Mills { 2839f23b7296SEd Tanous setAutomaticRetry(asyncResp, *automaticRetryConfig); 284069f35306SGunnar Mills } 284169f35306SGunnar Mills } 2842265c1602SJohnathan Mantey 28439f8bfa7cSGunnar Mills if (locationIndicatorActive) 28449f8bfa7cSGunnar Mills { 28457e860f15SJohn Edward Broadbent setLocationIndicatorActive(asyncResp, 28467e860f15SJohn Edward Broadbent *locationIndicatorActive); 28479f8bfa7cSGunnar Mills } 28489f8bfa7cSGunnar Mills 28497e860f15SJohn Edward Broadbent // TODO (Gunnar): Remove IndicatorLED after enough time has 28507e860f15SJohn Edward Broadbent // passed 28519712f8acSEd Tanous if (indicatorLed) 28526617338dSEd Tanous { 2853f23b7296SEd Tanous setIndicatorLedState(asyncResp, *indicatorLed); 28547e860f15SJohn Edward Broadbent asyncResp->res.addHeader( 28557e860f15SJohn Edward Broadbent boost::beast::http::field::warning, 2856d6aa0093SGunnar Mills "299 - \"IndicatorLED is deprecated. Use " 2857d6aa0093SGunnar Mills "LocationIndicatorActive instead.\""); 28586617338dSEd Tanous } 2859c6a620f2SGeorge Liu 2860c6a620f2SGeorge Liu if (powerRestorePolicy) 2861c6a620f2SGeorge Liu { 28624e69c904SGunnar Mills setPowerRestorePolicy(asyncResp, *powerRestorePolicy); 2863c6a620f2SGeorge Liu } 28643a2d0424SChris Cain 28653a2d0424SChris Cain if (powerMode) 28663a2d0424SChris Cain { 28673a2d0424SChris Cain setPowerMode(asyncResp, *powerMode); 28683a2d0424SChris Cain } 28691c05dae3SAli Ahmed 28701c05dae3SAli Ahmed if (trustedModuleRequiredToBoot) 28711c05dae3SAli Ahmed { 28721c05dae3SAli Ahmed setTrustedModuleRequiredToBoot( 28731c05dae3SAli Ahmed asyncResp, *trustedModuleRequiredToBoot); 28741c05dae3SAli Ahmed } 28757e860f15SJohn Edward Broadbent }); 2876c5b2abe0SLewanczyk, Dawid } 28771cb1a9e6SAppaRao Puli 28781cb1a9e6SAppaRao Puli /** 28791cb1a9e6SAppaRao Puli * SystemResetActionInfo derived class for delivering Computer Systems 28801cb1a9e6SAppaRao Puli * ResetType AllowableValues using ResetInfo schema. 28811cb1a9e6SAppaRao Puli */ 28827e860f15SJohn Edward Broadbent inline void requestRoutesSystemResetActionInfo(App& app) 28831cb1a9e6SAppaRao Puli { 28841cb1a9e6SAppaRao Puli 28851cb1a9e6SAppaRao Puli /** 28861cb1a9e6SAppaRao Puli * Functions triggers appropriate requests on DBus 28871cb1a9e6SAppaRao Puli */ 28887e860f15SJohn Edward Broadbent BMCWEB_ROUTE(app, "/redfish/v1/Systems/system/ResetActionInfo/") 2889ed398213SEd Tanous .privileges(redfish::privileges::getActionInfo) 28907e860f15SJohn Edward Broadbent .methods(boost::beast::http::verb::get)( 28917e860f15SJohn Edward Broadbent [](const crow::Request&, 28927e860f15SJohn Edward Broadbent const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) { 28938d1b46d7Szhanghch05 asyncResp->res.jsonValue = { 28941cb1a9e6SAppaRao Puli {"@odata.type", "#ActionInfo.v1_1_2.ActionInfo"}, 28951cb1a9e6SAppaRao Puli {"@odata.id", "/redfish/v1/Systems/system/ResetActionInfo"}, 28961cb1a9e6SAppaRao Puli {"Name", "Reset Action Info"}, 28971cb1a9e6SAppaRao Puli {"Id", "ResetActionInfo"}, 28981cb1a9e6SAppaRao Puli {"Parameters", 28991cb1a9e6SAppaRao Puli {{{"Name", "ResetType"}, 29001cb1a9e6SAppaRao Puli {"Required", true}, 29011cb1a9e6SAppaRao Puli {"DataType", "String"}, 29021cb1a9e6SAppaRao Puli {"AllowableValues", 29037e860f15SJohn Edward Broadbent {"On", "ForceOff", "ForceOn", "ForceRestart", 29047e860f15SJohn Edward Broadbent "GracefulRestart", "GracefulShutdown", "PowerCycle", 29057e860f15SJohn Edward Broadbent "Nmi"}}}}}}; 29067e860f15SJohn Edward Broadbent }); 29071cb1a9e6SAppaRao Puli } 2908c5b2abe0SLewanczyk, Dawid } // namespace redfish 2909