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 181e1e598dSJonathan Doman #include "dbus_singleton.hpp" 19b49ac873SJames Feist #include "health.hpp" 201c8fba97SJames Feist #include "led.hpp" 21f5c9f8bdSJason M. Bills #include "pcie.hpp" 22c5d03ff4SJennifer Lee #include "redfish_util.hpp" 23c5d03ff4SJennifer Lee 247e860f15SJohn Edward Broadbent #include <app.hpp> 259712f8acSEd Tanous #include <boost/container/flat_map.hpp> 26168e20c1SEd Tanous #include <dbus_utility.hpp> 27ed398213SEd Tanous #include <registries/privilege_registry.hpp> 281e1e598dSJonathan Doman #include <sdbusplus/asio/property.hpp> 29cb7e1e7bSAndrew Geissler #include <utils/fw_utils.hpp> 30c5b2abe0SLewanczyk, Dawid #include <utils/json_utils.hpp> 311214b7e7SGunnar Mills 32abf2add6SEd Tanous #include <variant> 33c5b2abe0SLewanczyk, Dawid 341abe55efSEd Tanous namespace redfish 351abe55efSEd Tanous { 36c5b2abe0SLewanczyk, Dawid 379d3ae10eSAlpana Kumari /** 389d3ae10eSAlpana Kumari * @brief Updates the Functional State of DIMMs 399d3ae10eSAlpana Kumari * 409d3ae10eSAlpana Kumari * @param[in] aResp Shared pointer for completing asynchronous calls 419d3ae10eSAlpana Kumari * @param[in] dimmState Dimm's Functional state, true/false 429d3ae10eSAlpana Kumari * 439d3ae10eSAlpana Kumari * @return None. 449d3ae10eSAlpana Kumari */ 458d1b46d7Szhanghch05 inline void 468d1b46d7Szhanghch05 updateDimmProperties(const std::shared_ptr<bmcweb::AsyncResp>& aResp, 471e1e598dSJonathan Doman bool isDimmFunctional) 489d3ae10eSAlpana Kumari { 491e1e598dSJonathan Doman BMCWEB_LOG_DEBUG << "Dimm Functional: " << isDimmFunctional; 509d3ae10eSAlpana Kumari 519d3ae10eSAlpana Kumari // Set it as Enabled if at least one DIMM is functional 529d3ae10eSAlpana Kumari // Update STATE only if previous State was DISABLED and current Dimm is 539d3ae10eSAlpana Kumari // ENABLED. 549d3ae10eSAlpana Kumari nlohmann::json& prevMemSummary = 559d3ae10eSAlpana Kumari aResp->res.jsonValue["MemorySummary"]["Status"]["State"]; 569d3ae10eSAlpana Kumari if (prevMemSummary == "Disabled") 579d3ae10eSAlpana Kumari { 58e05aec50SEd Tanous if (isDimmFunctional) 599d3ae10eSAlpana Kumari { 609d3ae10eSAlpana Kumari aResp->res.jsonValue["MemorySummary"]["Status"]["State"] = 619d3ae10eSAlpana Kumari "Enabled"; 629d3ae10eSAlpana Kumari } 639d3ae10eSAlpana Kumari } 649d3ae10eSAlpana Kumari } 659d3ae10eSAlpana Kumari 6657e8c9beSAlpana Kumari /* 6757e8c9beSAlpana Kumari * @brief Update "ProcessorSummary" "Count" based on Cpu PresenceState 6857e8c9beSAlpana Kumari * 6957e8c9beSAlpana Kumari * @param[in] aResp Shared pointer for completing asynchronous calls 7057e8c9beSAlpana Kumari * @param[in] cpuPresenceState CPU present or not 7157e8c9beSAlpana Kumari * 7257e8c9beSAlpana Kumari * @return None. 7357e8c9beSAlpana Kumari */ 741e1e598dSJonathan Doman inline void 751e1e598dSJonathan Doman modifyCpuPresenceState(const std::shared_ptr<bmcweb::AsyncResp>& aResp, 761e1e598dSJonathan Doman bool isCpuPresent) 7757e8c9beSAlpana Kumari { 781e1e598dSJonathan Doman BMCWEB_LOG_DEBUG << "Cpu Present: " << isCpuPresent; 7957e8c9beSAlpana Kumari 8055f79e6fSEd Tanous if (isCpuPresent) 8157e8c9beSAlpana Kumari { 82b4b9595aSJames Feist nlohmann::json& procCount = 83b4b9595aSJames Feist aResp->res.jsonValue["ProcessorSummary"]["Count"]; 8455f79e6fSEd Tanous auto* procCountPtr = 85b4b9595aSJames Feist procCount.get_ptr<nlohmann::json::number_integer_t*>(); 86b4b9595aSJames Feist if (procCountPtr != nullptr) 87b4b9595aSJames Feist { 88b4b9595aSJames Feist // shouldn't be possible to be nullptr 89b4b9595aSJames Feist *procCountPtr += 1; 9057e8c9beSAlpana Kumari } 91b4b9595aSJames Feist } 9257e8c9beSAlpana Kumari } 9357e8c9beSAlpana Kumari 9457e8c9beSAlpana Kumari /* 9557e8c9beSAlpana Kumari * @brief Update "ProcessorSummary" "Status" "State" based on 9657e8c9beSAlpana Kumari * CPU Functional State 9757e8c9beSAlpana Kumari * 9857e8c9beSAlpana Kumari * @param[in] aResp Shared pointer for completing asynchronous calls 9957e8c9beSAlpana Kumari * @param[in] cpuFunctionalState is CPU functional true/false 10057e8c9beSAlpana Kumari * 10157e8c9beSAlpana Kumari * @return None. 10257e8c9beSAlpana Kumari */ 1031e1e598dSJonathan Doman inline void 1041e1e598dSJonathan Doman modifyCpuFunctionalState(const std::shared_ptr<bmcweb::AsyncResp>& aResp, 1051e1e598dSJonathan Doman bool isCpuFunctional) 10657e8c9beSAlpana Kumari { 1071e1e598dSJonathan Doman BMCWEB_LOG_DEBUG << "Cpu Functional: " << isCpuFunctional; 10857e8c9beSAlpana Kumari 10957e8c9beSAlpana Kumari nlohmann::json& prevProcState = 11057e8c9beSAlpana Kumari aResp->res.jsonValue["ProcessorSummary"]["Status"]["State"]; 11157e8c9beSAlpana Kumari 11257e8c9beSAlpana Kumari // Set it as Enabled if at least one CPU is functional 11357e8c9beSAlpana Kumari // Update STATE only if previous State was Non_Functional and current CPU is 11457e8c9beSAlpana Kumari // Functional. 11557e8c9beSAlpana Kumari if (prevProcState == "Disabled") 11657e8c9beSAlpana Kumari { 117e05aec50SEd Tanous if (isCpuFunctional) 11857e8c9beSAlpana Kumari { 11957e8c9beSAlpana Kumari aResp->res.jsonValue["ProcessorSummary"]["Status"]["State"] = 12057e8c9beSAlpana Kumari "Enabled"; 12157e8c9beSAlpana Kumari } 12257e8c9beSAlpana Kumari } 12357e8c9beSAlpana Kumari } 12457e8c9beSAlpana Kumari 125*b9d36b47SEd Tanous inline void 126*b9d36b47SEd Tanous getProcessorProperties(const std::shared_ptr<bmcweb::AsyncResp>& aResp, 127*b9d36b47SEd Tanous const std::string& service, const std::string& path, 128*b9d36b47SEd Tanous const dbus::utility::DBusPropertiesMap& properties) 12903fbed92SAli Ahmed { 13003fbed92SAli Ahmed 13103fbed92SAli Ahmed BMCWEB_LOG_DEBUG << "Got " << properties.size() << " Cpu properties."; 13203fbed92SAli Ahmed 1331e1e598dSJonathan Doman auto getCpuPresenceState = [aResp](const boost::system::error_code ec3, 1341e1e598dSJonathan Doman const bool cpuPresenceCheck) { 13503fbed92SAli Ahmed if (ec3) 13603fbed92SAli Ahmed { 13703fbed92SAli Ahmed BMCWEB_LOG_ERROR << "DBUS response error " << ec3; 13803fbed92SAli Ahmed return; 13903fbed92SAli Ahmed } 14003fbed92SAli Ahmed modifyCpuPresenceState(aResp, cpuPresenceCheck); 14103fbed92SAli Ahmed }; 14203fbed92SAli Ahmed 1431e1e598dSJonathan Doman auto getCpuFunctionalState = [aResp](const boost::system::error_code ec3, 1441e1e598dSJonathan Doman const bool cpuFunctionalCheck) { 14503fbed92SAli Ahmed if (ec3) 14603fbed92SAli Ahmed { 14703fbed92SAli Ahmed BMCWEB_LOG_ERROR << "DBUS response error " << ec3; 14803fbed92SAli Ahmed return; 14903fbed92SAli Ahmed } 15003fbed92SAli Ahmed modifyCpuFunctionalState(aResp, cpuFunctionalCheck); 15103fbed92SAli Ahmed }; 15203fbed92SAli Ahmed 15303fbed92SAli Ahmed // Get the Presence of CPU 1541e1e598dSJonathan Doman sdbusplus::asio::getProperty<bool>( 1551e1e598dSJonathan Doman *crow::connections::systemBus, service, path, 1561e1e598dSJonathan Doman "xyz.openbmc_project.Inventory.Item", "Present", 1571e1e598dSJonathan Doman std::move(getCpuPresenceState)); 15803fbed92SAli Ahmed 15903fbed92SAli Ahmed // Get the Functional State 1601e1e598dSJonathan Doman sdbusplus::asio::getProperty<bool>( 1611e1e598dSJonathan Doman *crow::connections::systemBus, service, path, 1621e1e598dSJonathan Doman "xyz.openbmc_project.State.Decorator.OperationalStatus", "Functional", 1631e1e598dSJonathan Doman std::move(getCpuFunctionalState)); 16403fbed92SAli Ahmed 16503fbed92SAli Ahmed for (const auto& property : properties) 16603fbed92SAli Ahmed { 16703fbed92SAli Ahmed 16803fbed92SAli Ahmed // TODO: Get Model 16903fbed92SAli Ahmed 17003fbed92SAli Ahmed // Get CoreCount 17103fbed92SAli Ahmed if (property.first == "CoreCount") 17203fbed92SAli Ahmed { 17303fbed92SAli Ahmed 17403fbed92SAli Ahmed // Get CPU CoreCount and add it to the total 17503fbed92SAli Ahmed const uint16_t* coreCountVal = 17603fbed92SAli Ahmed std::get_if<uint16_t>(&property.second); 17703fbed92SAli Ahmed 178e662eae8SEd Tanous if (coreCountVal == nullptr) 17903fbed92SAli Ahmed { 18003fbed92SAli Ahmed messages::internalError(aResp->res); 18103fbed92SAli Ahmed return; 18203fbed92SAli Ahmed } 18303fbed92SAli Ahmed 18403fbed92SAli Ahmed nlohmann::json& coreCount = 18503fbed92SAli Ahmed aResp->res.jsonValue["ProcessorSummary"]["CoreCount"]; 18603fbed92SAli Ahmed uint64_t* coreCountPtr = coreCount.get_ptr<uint64_t*>(); 18703fbed92SAli Ahmed 18803fbed92SAli Ahmed if (coreCountPtr == nullptr) 18903fbed92SAli Ahmed { 19003fbed92SAli Ahmed coreCount = 0; 19103fbed92SAli Ahmed } 19203fbed92SAli Ahmed else 19303fbed92SAli Ahmed { 19403fbed92SAli Ahmed *coreCountPtr += *coreCountVal; 19503fbed92SAli Ahmed } 19603fbed92SAli Ahmed } 19703fbed92SAli Ahmed } 19803fbed92SAli Ahmed } 19903fbed92SAli Ahmed 20003fbed92SAli Ahmed /* 20103fbed92SAli Ahmed * @brief Get ProcessorSummary fields 20203fbed92SAli Ahmed * 20303fbed92SAli Ahmed * @param[in] aResp Shared pointer for completing asynchronous calls 20403fbed92SAli Ahmed * @param[in] service dbus service for Cpu Information 20503fbed92SAli Ahmed * @param[in] path dbus path for Cpu 20603fbed92SAli Ahmed * 20703fbed92SAli Ahmed * @return None. 20803fbed92SAli Ahmed */ 20903fbed92SAli Ahmed inline void getProcessorSummary(const std::shared_ptr<bmcweb::AsyncResp>& aResp, 21003fbed92SAli Ahmed const std::string& service, 21103fbed92SAli Ahmed const std::string& path) 21203fbed92SAli Ahmed { 21303fbed92SAli Ahmed 21403fbed92SAli Ahmed crow::connections::systemBus->async_method_call( 21503fbed92SAli Ahmed [aResp, service, 21603fbed92SAli Ahmed path](const boost::system::error_code ec2, 217*b9d36b47SEd Tanous const dbus::utility::DBusPropertiesMap& properties) { 21803fbed92SAli Ahmed if (ec2) 21903fbed92SAli Ahmed { 22003fbed92SAli Ahmed BMCWEB_LOG_ERROR << "DBUS response error " << ec2; 22103fbed92SAli Ahmed messages::internalError(aResp->res); 22203fbed92SAli Ahmed return; 22303fbed92SAli Ahmed } 22403fbed92SAli Ahmed getProcessorProperties(aResp, service, path, properties); 22503fbed92SAli Ahmed }, 22603fbed92SAli Ahmed service, path, "org.freedesktop.DBus.Properties", "GetAll", 22703fbed92SAli Ahmed "xyz.openbmc_project.Inventory.Item.Cpu"); 22803fbed92SAli Ahmed } 22903fbed92SAli Ahmed 23057e8c9beSAlpana Kumari /* 231c5b2abe0SLewanczyk, Dawid * @brief Retrieves computer system properties over dbus 232c5b2abe0SLewanczyk, Dawid * 233c5b2abe0SLewanczyk, Dawid * @param[in] aResp Shared pointer for completing asynchronous calls 2348f9ee3cdSGunnar Mills * @param[in] systemHealth Shared HealthPopulate pointer 235c5b2abe0SLewanczyk, Dawid * 236c5b2abe0SLewanczyk, Dawid * @return None. 237c5b2abe0SLewanczyk, Dawid */ 238b5a76932SEd Tanous inline void 2398d1b46d7Szhanghch05 getComputerSystem(const std::shared_ptr<bmcweb::AsyncResp>& aResp, 240b5a76932SEd Tanous const std::shared_ptr<HealthPopulate>& systemHealth) 2411abe55efSEd Tanous { 24255c7b7a2SEd Tanous BMCWEB_LOG_DEBUG << "Get available system components."; 2439d3ae10eSAlpana Kumari 24455c7b7a2SEd Tanous crow::connections::systemBus->async_method_call( 245*b9d36b47SEd Tanous [aResp, 246*b9d36b47SEd Tanous systemHealth](const boost::system::error_code ec, 247*b9d36b47SEd Tanous const dbus::utility::MapperGetSubTreeResponse& subtree) { 2481abe55efSEd Tanous if (ec) 2491abe55efSEd Tanous { 25055c7b7a2SEd Tanous BMCWEB_LOG_DEBUG << "DBUS response error"; 251f12894f8SJason M. Bills messages::internalError(aResp->res); 252c5b2abe0SLewanczyk, Dawid return; 253c5b2abe0SLewanczyk, Dawid } 254c5b2abe0SLewanczyk, Dawid // Iterate over all retrieved ObjectPaths. 2556c34de48SEd Tanous for (const std::pair<std::string, 2566c34de48SEd Tanous std::vector<std::pair< 2571214b7e7SGunnar Mills std::string, std::vector<std::string>>>>& 2581214b7e7SGunnar Mills object : subtree) 2591abe55efSEd Tanous { 260c5b2abe0SLewanczyk, Dawid const std::string& path = object.first; 26155c7b7a2SEd Tanous BMCWEB_LOG_DEBUG << "Got path: " << path; 2621abe55efSEd Tanous const std::vector< 2631214b7e7SGunnar Mills std::pair<std::string, std::vector<std::string>>>& 2641214b7e7SGunnar Mills connectionNames = object.second; 26526f6976fSEd Tanous if (connectionNames.empty()) 2661abe55efSEd Tanous { 267c5b2abe0SLewanczyk, Dawid continue; 268c5b2abe0SLewanczyk, Dawid } 269029573d4SEd Tanous 2705bc2dc8eSJames Feist auto memoryHealth = std::make_shared<HealthPopulate>( 2715bc2dc8eSJames Feist aResp, aResp->res.jsonValue["MemorySummary"]["Status"]); 2725bc2dc8eSJames Feist 2735bc2dc8eSJames Feist auto cpuHealth = std::make_shared<HealthPopulate>( 2745bc2dc8eSJames Feist aResp, aResp->res.jsonValue["ProcessorSummary"]["Status"]); 2755bc2dc8eSJames Feist 2765bc2dc8eSJames Feist systemHealth->children.emplace_back(memoryHealth); 2775bc2dc8eSJames Feist systemHealth->children.emplace_back(cpuHealth); 2785bc2dc8eSJames Feist 2796c34de48SEd Tanous // This is not system, so check if it's cpu, dimm, UUID or 2806c34de48SEd Tanous // BiosVer 28104a258f4SEd Tanous for (const auto& connection : connectionNames) 2821abe55efSEd Tanous { 28304a258f4SEd Tanous for (const auto& interfaceName : connection.second) 2841abe55efSEd Tanous { 28504a258f4SEd Tanous if (interfaceName == 28604a258f4SEd Tanous "xyz.openbmc_project.Inventory.Item.Dimm") 2871abe55efSEd Tanous { 2881abe55efSEd Tanous BMCWEB_LOG_DEBUG 28904a258f4SEd Tanous << "Found Dimm, now get its properties."; 2909d3ae10eSAlpana Kumari 29155c7b7a2SEd Tanous crow::connections::systemBus->async_method_call( 2929d3ae10eSAlpana Kumari [aResp, service{connection.first}, 293f23b7296SEd Tanous path](const boost::system::error_code ec2, 294*b9d36b47SEd Tanous const dbus::utility::DBusPropertiesMap& 2951214b7e7SGunnar Mills properties) { 296cb13a392SEd Tanous if (ec2) 2971abe55efSEd Tanous { 2981abe55efSEd Tanous BMCWEB_LOG_ERROR 299cb13a392SEd Tanous << "DBUS response error " << ec2; 300f12894f8SJason M. Bills messages::internalError(aResp->res); 301c5b2abe0SLewanczyk, Dawid return; 302c5b2abe0SLewanczyk, Dawid } 3036c34de48SEd Tanous BMCWEB_LOG_DEBUG << "Got " 3046c34de48SEd Tanous << properties.size() 305c5b2abe0SLewanczyk, Dawid << " Dimm properties."; 3069d3ae10eSAlpana Kumari 30726f6976fSEd Tanous if (!properties.empty()) 3089d3ae10eSAlpana Kumari { 309168e20c1SEd Tanous for (const std::pair< 310168e20c1SEd Tanous std::string, 311168e20c1SEd Tanous dbus::utility:: 312168e20c1SEd Tanous DbusVariantType>& 3131214b7e7SGunnar Mills property : properties) 3141abe55efSEd Tanous { 3155fd7ba65SCheng C Yang if (property.first != 3165fd7ba65SCheng C Yang "MemorySizeInKB") 3171abe55efSEd Tanous { 3185fd7ba65SCheng C Yang continue; 3195fd7ba65SCheng C Yang } 3205fd7ba65SCheng C Yang const uint32_t* value = 3218d78b7a9SPatrick Williams std::get_if<uint32_t>( 3221b6b96c5SEd Tanous &property.second); 3235fd7ba65SCheng C Yang if (value == nullptr) 3241abe55efSEd Tanous { 3255fd7ba65SCheng C Yang BMCWEB_LOG_DEBUG 3260fda0f12SGeorge Liu << "Find incorrect type of MemorySize"; 3275fd7ba65SCheng C Yang continue; 3285fd7ba65SCheng C Yang } 3295fd7ba65SCheng C Yang nlohmann::json& totalMemory = 3300fda0f12SGeorge Liu aResp->res.jsonValue 3310fda0f12SGeorge Liu ["MemorySummary"] 3320fda0f12SGeorge Liu ["TotalSystemMemoryGiB"]; 3335fd7ba65SCheng C Yang uint64_t* preValue = 3345fd7ba65SCheng C Yang totalMemory 3355fd7ba65SCheng C Yang .get_ptr<uint64_t*>(); 3365fd7ba65SCheng C Yang if (preValue == nullptr) 3375fd7ba65SCheng C Yang { 3385fd7ba65SCheng C Yang continue; 3395fd7ba65SCheng C Yang } 3400fda0f12SGeorge Liu aResp->res.jsonValue 3410fda0f12SGeorge Liu ["MemorySummary"] 3420fda0f12SGeorge Liu ["TotalSystemMemoryGiB"] = 3435fd7ba65SCheng C Yang *value / (1024 * 1024) + 3445fd7ba65SCheng C Yang *preValue; 3455fd7ba65SCheng C Yang aResp->res 3465fd7ba65SCheng C Yang .jsonValue["MemorySummary"] 3479d3ae10eSAlpana Kumari ["Status"]["State"] = 3481abe55efSEd Tanous "Enabled"; 349c5b2abe0SLewanczyk, Dawid } 350c5b2abe0SLewanczyk, Dawid } 3519d3ae10eSAlpana Kumari else 3529d3ae10eSAlpana Kumari { 3531e1e598dSJonathan Doman sdbusplus::asio::getProperty<bool>( 3541e1e598dSJonathan Doman *crow::connections::systemBus, 3551e1e598dSJonathan Doman service, path, 3561e1e598dSJonathan Doman "xyz.openbmc_project.State." 3571e1e598dSJonathan Doman "Decorator.OperationalStatus", 3581e1e598dSJonathan Doman "Functional", 3599d3ae10eSAlpana Kumari [aResp]( 3609d3ae10eSAlpana Kumari const boost::system::error_code 361cb13a392SEd Tanous ec3, 3621e1e598dSJonathan Doman bool dimmState) { 363cb13a392SEd Tanous if (ec3) 3649d3ae10eSAlpana Kumari { 3659d3ae10eSAlpana Kumari BMCWEB_LOG_ERROR 3660fda0f12SGeorge Liu << "DBUS response error " 367cb13a392SEd Tanous << ec3; 3689d3ae10eSAlpana Kumari return; 3699d3ae10eSAlpana Kumari } 3709d3ae10eSAlpana Kumari updateDimmProperties(aResp, 3719d3ae10eSAlpana Kumari dimmState); 3721e1e598dSJonathan Doman }); 3739d3ae10eSAlpana Kumari } 374c5b2abe0SLewanczyk, Dawid }, 37504a258f4SEd Tanous connection.first, path, 3766c34de48SEd Tanous "org.freedesktop.DBus.Properties", "GetAll", 3776c34de48SEd Tanous "xyz.openbmc_project.Inventory.Item.Dimm"); 3785bc2dc8eSJames Feist 3795bc2dc8eSJames Feist memoryHealth->inventory.emplace_back(path); 3801abe55efSEd Tanous } 38104a258f4SEd Tanous else if (interfaceName == 38204a258f4SEd Tanous "xyz.openbmc_project.Inventory.Item.Cpu") 3831abe55efSEd Tanous { 3841abe55efSEd Tanous BMCWEB_LOG_DEBUG 38504a258f4SEd Tanous << "Found Cpu, now get its properties."; 38657e8c9beSAlpana Kumari 38703fbed92SAli Ahmed getProcessorSummary(aResp, connection.first, path); 3885bc2dc8eSJames Feist 3895bc2dc8eSJames Feist cpuHealth->inventory.emplace_back(path); 3901abe55efSEd Tanous } 39104a258f4SEd Tanous else if (interfaceName == 39204a258f4SEd Tanous "xyz.openbmc_project.Common.UUID") 3931abe55efSEd Tanous { 3941abe55efSEd Tanous BMCWEB_LOG_DEBUG 39504a258f4SEd Tanous << "Found UUID, now get its properties."; 39655c7b7a2SEd Tanous crow::connections::systemBus->async_method_call( 397168e20c1SEd Tanous [aResp](const boost::system::error_code ec3, 398*b9d36b47SEd Tanous const dbus::utility::DBusPropertiesMap& 3991214b7e7SGunnar Mills properties) { 400cb13a392SEd Tanous if (ec3) 4011abe55efSEd Tanous { 4021abe55efSEd Tanous BMCWEB_LOG_DEBUG 403cb13a392SEd Tanous << "DBUS response error " << ec3; 404f12894f8SJason M. Bills messages::internalError(aResp->res); 405c5b2abe0SLewanczyk, Dawid return; 406c5b2abe0SLewanczyk, Dawid } 4076c34de48SEd Tanous BMCWEB_LOG_DEBUG << "Got " 4086c34de48SEd Tanous << properties.size() 409c5b2abe0SLewanczyk, Dawid << " UUID properties."; 410168e20c1SEd Tanous for (const std::pair< 411168e20c1SEd Tanous std::string, 412168e20c1SEd Tanous dbus::utility::DbusVariantType>& 4131214b7e7SGunnar Mills property : properties) 4141abe55efSEd Tanous { 41504a258f4SEd Tanous if (property.first == "UUID") 4161abe55efSEd Tanous { 417c5b2abe0SLewanczyk, Dawid const std::string* value = 4188d78b7a9SPatrick Williams std::get_if<std::string>( 4191b6b96c5SEd Tanous &property.second); 42004a258f4SEd Tanous 4211abe55efSEd Tanous if (value != nullptr) 4221abe55efSEd Tanous { 423029573d4SEd Tanous std::string valueStr = *value; 42404a258f4SEd Tanous if (valueStr.size() == 32) 4251abe55efSEd Tanous { 426029573d4SEd Tanous valueStr.insert(8, 1, '-'); 427029573d4SEd Tanous valueStr.insert(13, 1, '-'); 428029573d4SEd Tanous valueStr.insert(18, 1, '-'); 429029573d4SEd Tanous valueStr.insert(23, 1, '-'); 43004a258f4SEd Tanous } 431029573d4SEd Tanous BMCWEB_LOG_DEBUG << "UUID = " 43204a258f4SEd Tanous << valueStr; 433029573d4SEd Tanous aResp->res.jsonValue["UUID"] = 43404a258f4SEd Tanous valueStr; 435c5b2abe0SLewanczyk, Dawid } 436c5b2abe0SLewanczyk, Dawid } 437c5b2abe0SLewanczyk, Dawid } 438c5b2abe0SLewanczyk, Dawid }, 43904a258f4SEd Tanous connection.first, path, 4406c34de48SEd Tanous "org.freedesktop.DBus.Properties", "GetAll", 4411abe55efSEd Tanous "xyz.openbmc_project.Common.UUID"); 442c5b2abe0SLewanczyk, Dawid } 443029573d4SEd Tanous else if (interfaceName == 444029573d4SEd Tanous "xyz.openbmc_project.Inventory.Item.System") 4451abe55efSEd Tanous { 446029573d4SEd Tanous crow::connections::systemBus->async_method_call( 447168e20c1SEd Tanous [aResp](const boost::system::error_code ec2, 448*b9d36b47SEd Tanous const dbus::utility::DBusPropertiesMap& 4491214b7e7SGunnar Mills propertiesList) { 450cb13a392SEd Tanous if (ec2) 451029573d4SEd Tanous { 452e4a4b9a9SJames Feist // doesn't have to include this 453e4a4b9a9SJames Feist // interface 454029573d4SEd Tanous return; 455029573d4SEd Tanous } 456698654b6SGunnar Mills BMCWEB_LOG_DEBUG 457698654b6SGunnar Mills << "Got " << propertiesList.size() 458029573d4SEd Tanous << " properties for system"; 459168e20c1SEd Tanous for (const std::pair< 460168e20c1SEd Tanous std::string, 461168e20c1SEd Tanous dbus::utility::DbusVariantType>& 4621214b7e7SGunnar Mills property : propertiesList) 463029573d4SEd Tanous { 464fc5afcf9Sbeccabroek const std::string& propertyName = 465fc5afcf9Sbeccabroek property.first; 466fc5afcf9Sbeccabroek if ((propertyName == "PartNumber") || 467fc5afcf9Sbeccabroek (propertyName == "SerialNumber") || 468fc5afcf9Sbeccabroek (propertyName == "Manufacturer") || 4695235d964SSunnySrivastava1984 (propertyName == "Model") || 4705235d964SSunnySrivastava1984 (propertyName == "SubModel")) 471fc5afcf9Sbeccabroek { 472029573d4SEd Tanous const std::string* value = 473fc5afcf9Sbeccabroek std::get_if<std::string>( 474029573d4SEd Tanous &property.second); 475029573d4SEd Tanous if (value != nullptr) 476029573d4SEd Tanous { 477029573d4SEd Tanous aResp->res 478fc5afcf9Sbeccabroek .jsonValue[propertyName] = 479029573d4SEd Tanous *value; 480029573d4SEd Tanous } 481029573d4SEd Tanous } 482fc5afcf9Sbeccabroek } 483c1e236a6SGunnar Mills 484cb7e1e7bSAndrew Geissler // Grab the bios version 485f97ddba7SGunnar Mills fw_util::populateFirmwareInformation( 486cb7e1e7bSAndrew Geissler aResp, fw_util::biosPurpose, 48772d566d9SGunnar Mills "BiosVersion", false); 488029573d4SEd Tanous }, 489029573d4SEd Tanous connection.first, path, 490029573d4SEd Tanous "org.freedesktop.DBus.Properties", "GetAll", 4910fda0f12SGeorge Liu "xyz.openbmc_project.Inventory.Decorator.Asset"); 492e4a4b9a9SJames Feist 4931e1e598dSJonathan Doman sdbusplus::asio::getProperty<std::string>( 4941e1e598dSJonathan Doman *crow::connections::systemBus, connection.first, 4951e1e598dSJonathan Doman path, 4961e1e598dSJonathan Doman "xyz.openbmc_project.Inventory.Decorator." 4971e1e598dSJonathan Doman "AssetTag", 4981e1e598dSJonathan Doman "AssetTag", 499168e20c1SEd Tanous [aResp](const boost::system::error_code ec2, 5001e1e598dSJonathan Doman const std::string& value) { 501cb13a392SEd Tanous if (ec2) 502e4a4b9a9SJames Feist { 503e4a4b9a9SJames Feist // doesn't have to include this 504e4a4b9a9SJames Feist // interface 505e4a4b9a9SJames Feist return; 506e4a4b9a9SJames Feist } 507e4a4b9a9SJames Feist 5081e1e598dSJonathan Doman aResp->res.jsonValue["AssetTag"] = value; 5091e1e598dSJonathan Doman }); 510029573d4SEd Tanous } 511029573d4SEd Tanous } 512029573d4SEd Tanous } 513c5b2abe0SLewanczyk, Dawid } 514c5b2abe0SLewanczyk, Dawid }, 515c5b2abe0SLewanczyk, Dawid "xyz.openbmc_project.ObjectMapper", 516c5b2abe0SLewanczyk, Dawid "/xyz/openbmc_project/object_mapper", 517c5b2abe0SLewanczyk, Dawid "xyz.openbmc_project.ObjectMapper", "GetSubTree", 5186617338dSEd Tanous "/xyz/openbmc_project/inventory", int32_t(0), 5196617338dSEd Tanous std::array<const char*, 5>{ 5206617338dSEd Tanous "xyz.openbmc_project.Inventory.Decorator.Asset", 5216617338dSEd Tanous "xyz.openbmc_project.Inventory.Item.Cpu", 5226617338dSEd Tanous "xyz.openbmc_project.Inventory.Item.Dimm", 5236617338dSEd Tanous "xyz.openbmc_project.Inventory.Item.System", 5246617338dSEd Tanous "xyz.openbmc_project.Common.UUID", 5256617338dSEd Tanous }); 526c5b2abe0SLewanczyk, Dawid } 527c5b2abe0SLewanczyk, Dawid 528c5b2abe0SLewanczyk, Dawid /** 529c5b2abe0SLewanczyk, Dawid * @brief Retrieves host state properties over dbus 530c5b2abe0SLewanczyk, Dawid * 531c5b2abe0SLewanczyk, Dawid * @param[in] aResp Shared pointer for completing asynchronous calls. 532c5b2abe0SLewanczyk, Dawid * 533c5b2abe0SLewanczyk, Dawid * @return None. 534c5b2abe0SLewanczyk, Dawid */ 5358d1b46d7Szhanghch05 inline void getHostState(const std::shared_ptr<bmcweb::AsyncResp>& aResp) 5361abe55efSEd Tanous { 53755c7b7a2SEd Tanous BMCWEB_LOG_DEBUG << "Get host information."; 5381e1e598dSJonathan Doman sdbusplus::asio::getProperty<std::string>( 5391e1e598dSJonathan Doman *crow::connections::systemBus, "xyz.openbmc_project.State.Host", 5401e1e598dSJonathan Doman "/xyz/openbmc_project/state/host0", "xyz.openbmc_project.State.Host", 5411e1e598dSJonathan Doman "CurrentHostState", 542c5d03ff4SJennifer Lee [aResp](const boost::system::error_code ec, 5431e1e598dSJonathan Doman const std::string& hostState) { 5441abe55efSEd Tanous if (ec) 5451abe55efSEd Tanous { 54622228c28SAndrew Geissler if (ec == boost::system::errc::host_unreachable) 54722228c28SAndrew Geissler { 54822228c28SAndrew Geissler // Service not available, no error, just don't return 54922228c28SAndrew Geissler // host state info 55022228c28SAndrew Geissler BMCWEB_LOG_DEBUG << "Service not available " << ec; 55122228c28SAndrew Geissler return; 55222228c28SAndrew Geissler } 55322228c28SAndrew Geissler BMCWEB_LOG_ERROR << "DBUS response error " << ec; 554f12894f8SJason M. Bills messages::internalError(aResp->res); 555c5b2abe0SLewanczyk, Dawid return; 556c5b2abe0SLewanczyk, Dawid } 5576617338dSEd Tanous 5581e1e598dSJonathan Doman BMCWEB_LOG_DEBUG << "Host state: " << hostState; 559c5b2abe0SLewanczyk, Dawid // Verify Host State 5601e1e598dSJonathan Doman if (hostState == "xyz.openbmc_project.State.Host.HostState.Running") 5611abe55efSEd Tanous { 56255c7b7a2SEd Tanous aResp->res.jsonValue["PowerState"] = "On"; 5636617338dSEd Tanous aResp->res.jsonValue["Status"]["State"] = "Enabled"; 5641abe55efSEd Tanous } 5651e1e598dSJonathan Doman else if (hostState == 5660fda0f12SGeorge Liu "xyz.openbmc_project.State.Host.HostState.Quiesced") 5678c888608SGunnar Mills { 5688c888608SGunnar Mills aResp->res.jsonValue["PowerState"] = "On"; 5698c888608SGunnar Mills aResp->res.jsonValue["Status"]["State"] = "Quiesced"; 5708c888608SGunnar Mills } 5711e1e598dSJonathan Doman else if (hostState == 5720fda0f12SGeorge Liu "xyz.openbmc_project.State.Host.HostState.DiagnosticMode") 57383935af9SAndrew Geissler { 57483935af9SAndrew Geissler aResp->res.jsonValue["PowerState"] = "On"; 57583935af9SAndrew Geissler aResp->res.jsonValue["Status"]["State"] = "InTest"; 57683935af9SAndrew Geissler } 5770fda0f12SGeorge Liu else if ( 5781e1e598dSJonathan Doman hostState == 5790fda0f12SGeorge Liu "xyz.openbmc_project.State.Host.HostState.TransitioningToRunning") 5801a2a1437SAndrew Geissler { 5811a2a1437SAndrew Geissler aResp->res.jsonValue["PowerState"] = "PoweringOn"; 58215c27bf8SNoah Brewer aResp->res.jsonValue["Status"]["State"] = "Starting"; 5831a2a1437SAndrew Geissler } 5840fda0f12SGeorge Liu else if ( 5851e1e598dSJonathan Doman hostState == 5860fda0f12SGeorge Liu "xyz.openbmc_project.State.Host.HostState.TransitioningToOff") 5871a2a1437SAndrew Geissler { 5881a2a1437SAndrew Geissler aResp->res.jsonValue["PowerState"] = "PoweringOff"; 5891a2a1437SAndrew Geissler aResp->res.jsonValue["Status"]["State"] = "Disabled"; 5901a2a1437SAndrew Geissler } 5911abe55efSEd Tanous else 5921abe55efSEd Tanous { 59355c7b7a2SEd Tanous aResp->res.jsonValue["PowerState"] = "Off"; 5946617338dSEd Tanous aResp->res.jsonValue["Status"]["State"] = "Disabled"; 595c5b2abe0SLewanczyk, Dawid } 5961e1e598dSJonathan Doman }); 597c5b2abe0SLewanczyk, Dawid } 598c5b2abe0SLewanczyk, Dawid 599c5b2abe0SLewanczyk, Dawid /** 600786d0f60SGunnar Mills * @brief Translates boot source DBUS property value to redfish. 601491d8ee7SSantosh Puranik * 602491d8ee7SSantosh Puranik * @param[in] dbusSource The boot source in DBUS speak. 603491d8ee7SSantosh Puranik * 604491d8ee7SSantosh Puranik * @return Returns as a string, the boot source in Redfish terms. If translation 605491d8ee7SSantosh Puranik * cannot be done, returns an empty string. 606491d8ee7SSantosh Puranik */ 60723a21a1cSEd Tanous inline std::string dbusToRfBootSource(const std::string& dbusSource) 608491d8ee7SSantosh Puranik { 609491d8ee7SSantosh Puranik if (dbusSource == "xyz.openbmc_project.Control.Boot.Source.Sources.Default") 610491d8ee7SSantosh Puranik { 611491d8ee7SSantosh Puranik return "None"; 612491d8ee7SSantosh Puranik } 6133174e4dfSEd Tanous if (dbusSource == "xyz.openbmc_project.Control.Boot.Source.Sources.Disk") 614491d8ee7SSantosh Puranik { 615491d8ee7SSantosh Puranik return "Hdd"; 616491d8ee7SSantosh Puranik } 6173174e4dfSEd Tanous if (dbusSource == 618a71dc0b7SSantosh Puranik "xyz.openbmc_project.Control.Boot.Source.Sources.ExternalMedia") 619491d8ee7SSantosh Puranik { 620491d8ee7SSantosh Puranik return "Cd"; 621491d8ee7SSantosh Puranik } 6223174e4dfSEd Tanous if (dbusSource == "xyz.openbmc_project.Control.Boot.Source.Sources.Network") 623491d8ee7SSantosh Puranik { 624491d8ee7SSantosh Puranik return "Pxe"; 625491d8ee7SSantosh Puranik } 6263174e4dfSEd Tanous if (dbusSource == 627944ffaf9SJohnathan Mantey "xyz.openbmc_project.Control.Boot.Source.Sources.RemovableMedia") 6289f16b2c1SJennifer Lee { 6299f16b2c1SJennifer Lee return "Usb"; 6309f16b2c1SJennifer Lee } 631491d8ee7SSantosh Puranik return ""; 632491d8ee7SSantosh Puranik } 633491d8ee7SSantosh Puranik 634491d8ee7SSantosh Puranik /** 635cd9a4666SKonstantin Aladyshev * @brief Translates boot type DBUS property value to redfish. 636cd9a4666SKonstantin Aladyshev * 637cd9a4666SKonstantin Aladyshev * @param[in] dbusType The boot type in DBUS speak. 638cd9a4666SKonstantin Aladyshev * 639cd9a4666SKonstantin Aladyshev * @return Returns as a string, the boot type in Redfish terms. If translation 640cd9a4666SKonstantin Aladyshev * cannot be done, returns an empty string. 641cd9a4666SKonstantin Aladyshev */ 642cd9a4666SKonstantin Aladyshev inline std::string dbusToRfBootType(const std::string& dbusType) 643cd9a4666SKonstantin Aladyshev { 644cd9a4666SKonstantin Aladyshev if (dbusType == "xyz.openbmc_project.Control.Boot.Type.Types.Legacy") 645cd9a4666SKonstantin Aladyshev { 646cd9a4666SKonstantin Aladyshev return "Legacy"; 647cd9a4666SKonstantin Aladyshev } 648cd9a4666SKonstantin Aladyshev if (dbusType == "xyz.openbmc_project.Control.Boot.Type.Types.EFI") 649cd9a4666SKonstantin Aladyshev { 650cd9a4666SKonstantin Aladyshev return "UEFI"; 651cd9a4666SKonstantin Aladyshev } 652cd9a4666SKonstantin Aladyshev return ""; 653cd9a4666SKonstantin Aladyshev } 654cd9a4666SKonstantin Aladyshev 655cd9a4666SKonstantin Aladyshev /** 656786d0f60SGunnar Mills * @brief Translates boot mode DBUS property value to redfish. 657491d8ee7SSantosh Puranik * 658491d8ee7SSantosh Puranik * @param[in] dbusMode The boot mode in DBUS speak. 659491d8ee7SSantosh Puranik * 660491d8ee7SSantosh Puranik * @return Returns as a string, the boot mode in Redfish terms. If translation 661491d8ee7SSantosh Puranik * cannot be done, returns an empty string. 662491d8ee7SSantosh Puranik */ 66323a21a1cSEd Tanous inline std::string dbusToRfBootMode(const std::string& dbusMode) 664491d8ee7SSantosh Puranik { 665491d8ee7SSantosh Puranik if (dbusMode == "xyz.openbmc_project.Control.Boot.Mode.Modes.Regular") 666491d8ee7SSantosh Puranik { 667491d8ee7SSantosh Puranik return "None"; 668491d8ee7SSantosh Puranik } 6693174e4dfSEd Tanous if (dbusMode == "xyz.openbmc_project.Control.Boot.Mode.Modes.Safe") 670491d8ee7SSantosh Puranik { 671491d8ee7SSantosh Puranik return "Diags"; 672491d8ee7SSantosh Puranik } 6733174e4dfSEd Tanous if (dbusMode == "xyz.openbmc_project.Control.Boot.Mode.Modes.Setup") 674491d8ee7SSantosh Puranik { 675491d8ee7SSantosh Puranik return "BiosSetup"; 676491d8ee7SSantosh Puranik } 677491d8ee7SSantosh Puranik return ""; 678491d8ee7SSantosh Puranik } 679491d8ee7SSantosh Puranik 680491d8ee7SSantosh Puranik /** 681e43914b3SAndrew Geissler * @brief Translates boot progress DBUS property value to redfish. 682e43914b3SAndrew Geissler * 683e43914b3SAndrew Geissler * @param[in] dbusBootProgress The boot progress in DBUS speak. 684e43914b3SAndrew Geissler * 685e43914b3SAndrew Geissler * @return Returns as a string, the boot progress in Redfish terms. If 686e43914b3SAndrew Geissler * translation cannot be done, returns "None". 687e43914b3SAndrew Geissler */ 688e43914b3SAndrew Geissler inline std::string dbusToRfBootProgress(const std::string& dbusBootProgress) 689e43914b3SAndrew Geissler { 690e43914b3SAndrew Geissler // Now convert the D-Bus BootProgress to the appropriate Redfish 691e43914b3SAndrew Geissler // enum 692e43914b3SAndrew Geissler std::string rfBpLastState = "None"; 693e43914b3SAndrew Geissler if (dbusBootProgress == "xyz.openbmc_project.State.Boot.Progress." 694e43914b3SAndrew Geissler "ProgressStages.Unspecified") 695e43914b3SAndrew Geissler { 696e43914b3SAndrew Geissler rfBpLastState = "None"; 697e43914b3SAndrew Geissler } 698e43914b3SAndrew Geissler else if (dbusBootProgress == 699e43914b3SAndrew Geissler "xyz.openbmc_project.State.Boot.Progress.ProgressStages." 700e43914b3SAndrew Geissler "PrimaryProcInit") 701e43914b3SAndrew Geissler { 702e43914b3SAndrew Geissler rfBpLastState = "PrimaryProcessorInitializationStarted"; 703e43914b3SAndrew Geissler } 704e43914b3SAndrew Geissler else if (dbusBootProgress == 705e43914b3SAndrew Geissler "xyz.openbmc_project.State.Boot.Progress.ProgressStages." 706e43914b3SAndrew Geissler "BusInit") 707e43914b3SAndrew Geissler { 708e43914b3SAndrew Geissler rfBpLastState = "BusInitializationStarted"; 709e43914b3SAndrew Geissler } 710e43914b3SAndrew Geissler else if (dbusBootProgress == 711e43914b3SAndrew Geissler "xyz.openbmc_project.State.Boot.Progress.ProgressStages." 712e43914b3SAndrew Geissler "MemoryInit") 713e43914b3SAndrew Geissler { 714e43914b3SAndrew Geissler rfBpLastState = "MemoryInitializationStarted"; 715e43914b3SAndrew Geissler } 716e43914b3SAndrew Geissler else if (dbusBootProgress == 717e43914b3SAndrew Geissler "xyz.openbmc_project.State.Boot.Progress.ProgressStages." 718e43914b3SAndrew Geissler "SecondaryProcInit") 719e43914b3SAndrew Geissler { 720e43914b3SAndrew Geissler rfBpLastState = "SecondaryProcessorInitializationStarted"; 721e43914b3SAndrew Geissler } 722e43914b3SAndrew Geissler else if (dbusBootProgress == 723e43914b3SAndrew Geissler "xyz.openbmc_project.State.Boot.Progress.ProgressStages." 724e43914b3SAndrew Geissler "PCIInit") 725e43914b3SAndrew Geissler { 726e43914b3SAndrew Geissler rfBpLastState = "PCIResourceConfigStarted"; 727e43914b3SAndrew Geissler } 728e43914b3SAndrew Geissler else if (dbusBootProgress == 729e43914b3SAndrew Geissler "xyz.openbmc_project.State.Boot.Progress.ProgressStages." 730e43914b3SAndrew Geissler "SystemSetup") 731e43914b3SAndrew Geissler { 732e43914b3SAndrew Geissler rfBpLastState = "SetupEntered"; 733e43914b3SAndrew Geissler } 734e43914b3SAndrew Geissler else if (dbusBootProgress == 735e43914b3SAndrew Geissler "xyz.openbmc_project.State.Boot.Progress.ProgressStages." 736e43914b3SAndrew Geissler "SystemInitComplete") 737e43914b3SAndrew Geissler { 738e43914b3SAndrew Geissler rfBpLastState = "SystemHardwareInitializationComplete"; 739e43914b3SAndrew Geissler } 740e43914b3SAndrew Geissler else if (dbusBootProgress == 741e43914b3SAndrew Geissler "xyz.openbmc_project.State.Boot.Progress.ProgressStages." 742e43914b3SAndrew Geissler "OSStart") 743e43914b3SAndrew Geissler { 744e43914b3SAndrew Geissler rfBpLastState = "OSBootStarted"; 745e43914b3SAndrew Geissler } 746e43914b3SAndrew Geissler else if (dbusBootProgress == 747e43914b3SAndrew Geissler "xyz.openbmc_project.State.Boot.Progress.ProgressStages." 748e43914b3SAndrew Geissler "OSRunning") 749e43914b3SAndrew Geissler { 750e43914b3SAndrew Geissler rfBpLastState = "OSRunning"; 751e43914b3SAndrew Geissler } 752e43914b3SAndrew Geissler else 753e43914b3SAndrew Geissler { 754e43914b3SAndrew Geissler BMCWEB_LOG_DEBUG << "Unsupported D-Bus BootProgress " 755e43914b3SAndrew Geissler << dbusBootProgress; 756e43914b3SAndrew Geissler // Just return the default 757e43914b3SAndrew Geissler } 758e43914b3SAndrew Geissler return rfBpLastState; 759e43914b3SAndrew Geissler } 760e43914b3SAndrew Geissler 761e43914b3SAndrew Geissler /** 762786d0f60SGunnar Mills * @brief Translates boot source from Redfish to the DBus boot paths. 763491d8ee7SSantosh Puranik * 764491d8ee7SSantosh Puranik * @param[in] rfSource The boot source in Redfish. 765944ffaf9SJohnathan Mantey * @param[out] bootSource The DBus source 766944ffaf9SJohnathan Mantey * @param[out] bootMode the DBus boot mode 767491d8ee7SSantosh Puranik * 768944ffaf9SJohnathan Mantey * @return Integer error code. 769491d8ee7SSantosh Puranik */ 7708d1b46d7Szhanghch05 inline int assignBootParameters(const std::shared_ptr<bmcweb::AsyncResp>& aResp, 771944ffaf9SJohnathan Mantey const std::string& rfSource, 772944ffaf9SJohnathan Mantey std::string& bootSource, std::string& bootMode) 773491d8ee7SSantosh Puranik { 774c21865c4SKonstantin Aladyshev bootSource = "xyz.openbmc_project.Control.Boot.Source.Sources.Default"; 775c21865c4SKonstantin Aladyshev bootMode = "xyz.openbmc_project.Control.Boot.Mode.Modes.Regular"; 776944ffaf9SJohnathan Mantey 777491d8ee7SSantosh Puranik if (rfSource == "None") 778491d8ee7SSantosh Puranik { 779944ffaf9SJohnathan Mantey return 0; 780491d8ee7SSantosh Puranik } 7813174e4dfSEd Tanous if (rfSource == "Pxe") 782491d8ee7SSantosh Puranik { 783944ffaf9SJohnathan Mantey bootSource = "xyz.openbmc_project.Control.Boot.Source.Sources.Network"; 784944ffaf9SJohnathan Mantey } 785944ffaf9SJohnathan Mantey else if (rfSource == "Hdd") 786944ffaf9SJohnathan Mantey { 787944ffaf9SJohnathan Mantey bootSource = "xyz.openbmc_project.Control.Boot.Source.Sources.Disk"; 788944ffaf9SJohnathan Mantey } 789944ffaf9SJohnathan Mantey else if (rfSource == "Diags") 790944ffaf9SJohnathan Mantey { 791944ffaf9SJohnathan Mantey bootMode = "xyz.openbmc_project.Control.Boot.Mode.Modes.Safe"; 792944ffaf9SJohnathan Mantey } 793944ffaf9SJohnathan Mantey else if (rfSource == "Cd") 794944ffaf9SJohnathan Mantey { 795944ffaf9SJohnathan Mantey bootSource = 796944ffaf9SJohnathan Mantey "xyz.openbmc_project.Control.Boot.Source.Sources.ExternalMedia"; 797944ffaf9SJohnathan Mantey } 798944ffaf9SJohnathan Mantey else if (rfSource == "BiosSetup") 799944ffaf9SJohnathan Mantey { 800944ffaf9SJohnathan Mantey bootMode = "xyz.openbmc_project.Control.Boot.Mode.Modes.Setup"; 801491d8ee7SSantosh Puranik } 8029f16b2c1SJennifer Lee else if (rfSource == "Usb") 8039f16b2c1SJennifer Lee { 804944ffaf9SJohnathan Mantey bootSource = 805944ffaf9SJohnathan Mantey "xyz.openbmc_project.Control.Boot.Source.Sources.RemovableMedia"; 8069f16b2c1SJennifer Lee } 807491d8ee7SSantosh Puranik else 808491d8ee7SSantosh Puranik { 8090fda0f12SGeorge Liu BMCWEB_LOG_DEBUG 8100fda0f12SGeorge Liu << "Invalid property value for BootSourceOverrideTarget: " 811944ffaf9SJohnathan Mantey << bootSource; 812944ffaf9SJohnathan Mantey messages::propertyValueNotInList(aResp->res, rfSource, 813944ffaf9SJohnathan Mantey "BootSourceTargetOverride"); 814944ffaf9SJohnathan Mantey return -1; 815491d8ee7SSantosh Puranik } 816944ffaf9SJohnathan Mantey return 0; 817491d8ee7SSantosh Puranik } 8181981771bSAli Ahmed 819978b8803SAndrew Geissler /** 820978b8803SAndrew Geissler * @brief Retrieves boot progress of the system 821978b8803SAndrew Geissler * 822978b8803SAndrew Geissler * @param[in] aResp Shared pointer for generating response message. 823978b8803SAndrew Geissler * 824978b8803SAndrew Geissler * @return None. 825978b8803SAndrew Geissler */ 8268d1b46d7Szhanghch05 inline void getBootProgress(const std::shared_ptr<bmcweb::AsyncResp>& aResp) 827978b8803SAndrew Geissler { 8281e1e598dSJonathan Doman sdbusplus::asio::getProperty<std::string>( 8291e1e598dSJonathan Doman *crow::connections::systemBus, "xyz.openbmc_project.State.Host", 8301e1e598dSJonathan Doman "/xyz/openbmc_project/state/host0", 8311e1e598dSJonathan Doman "xyz.openbmc_project.State.Boot.Progress", "BootProgress", 832978b8803SAndrew Geissler [aResp](const boost::system::error_code ec, 8331e1e598dSJonathan Doman const std::string& bootProgressStr) { 834978b8803SAndrew Geissler if (ec) 835978b8803SAndrew Geissler { 836978b8803SAndrew Geissler // BootProgress is an optional object so just do nothing if 837978b8803SAndrew Geissler // not found 838978b8803SAndrew Geissler return; 839978b8803SAndrew Geissler } 840978b8803SAndrew Geissler 8411e1e598dSJonathan Doman BMCWEB_LOG_DEBUG << "Boot Progress: " << bootProgressStr; 842978b8803SAndrew Geissler 843e43914b3SAndrew Geissler aResp->res.jsonValue["BootProgress"]["LastState"] = 844e43914b3SAndrew Geissler dbusToRfBootProgress(bootProgressStr); 8451e1e598dSJonathan Doman }); 846978b8803SAndrew Geissler } 847491d8ee7SSantosh Puranik 848491d8ee7SSantosh Puranik /** 849c21865c4SKonstantin Aladyshev * @brief Retrieves boot override type over DBUS and fills out the response 850cd9a4666SKonstantin Aladyshev * 851cd9a4666SKonstantin Aladyshev * @param[in] aResp Shared pointer for generating response message. 852cd9a4666SKonstantin Aladyshev * 853cd9a4666SKonstantin Aladyshev * @return None. 854cd9a4666SKonstantin Aladyshev */ 855cd9a4666SKonstantin Aladyshev 856c21865c4SKonstantin Aladyshev inline void getBootOverrideType(const std::shared_ptr<bmcweb::AsyncResp>& aResp) 857cd9a4666SKonstantin Aladyshev { 8581e1e598dSJonathan Doman sdbusplus::asio::getProperty<std::string>( 8591e1e598dSJonathan Doman *crow::connections::systemBus, "xyz.openbmc_project.Settings", 8601e1e598dSJonathan Doman "/xyz/openbmc_project/control/host0/boot", 8611e1e598dSJonathan Doman "xyz.openbmc_project.Control.Boot.Type", "BootType", 862cd9a4666SKonstantin Aladyshev [aResp](const boost::system::error_code ec, 8631e1e598dSJonathan Doman const 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 8701e1e598dSJonathan Doman BMCWEB_LOG_DEBUG << "Boot type: " << bootType; 871cd9a4666SKonstantin Aladyshev 8720fda0f12SGeorge Liu aResp->res 8730fda0f12SGeorge Liu .jsonValue["Boot"] 8740fda0f12SGeorge Liu ["BootSourceOverrideMode@Redfish.AllowableValues"] = { 8750fda0f12SGeorge Liu "Legacy", "UEFI"}; 876cd9a4666SKonstantin Aladyshev 8771e1e598dSJonathan Doman auto rfType = dbusToRfBootType(bootType); 878cd9a4666SKonstantin Aladyshev if (rfType.empty()) 879cd9a4666SKonstantin Aladyshev { 880cd9a4666SKonstantin Aladyshev messages::internalError(aResp->res); 881cd9a4666SKonstantin Aladyshev return; 882cd9a4666SKonstantin Aladyshev } 883cd9a4666SKonstantin Aladyshev 884cd9a4666SKonstantin Aladyshev aResp->res.jsonValue["Boot"]["BootSourceOverrideMode"] = rfType; 8851e1e598dSJonathan Doman }); 886cd9a4666SKonstantin Aladyshev } 887cd9a4666SKonstantin Aladyshev 888cd9a4666SKonstantin Aladyshev /** 889c21865c4SKonstantin Aladyshev * @brief Retrieves boot override mode over DBUS and fills out the response 890491d8ee7SSantosh Puranik * 891491d8ee7SSantosh Puranik * @param[in] aResp Shared pointer for generating response message. 892491d8ee7SSantosh Puranik * 893491d8ee7SSantosh Puranik * @return None. 894491d8ee7SSantosh Puranik */ 895c21865c4SKonstantin Aladyshev 896c21865c4SKonstantin Aladyshev inline void getBootOverrideMode(const std::shared_ptr<bmcweb::AsyncResp>& aResp) 897491d8ee7SSantosh Puranik { 8981e1e598dSJonathan Doman sdbusplus::asio::getProperty<std::string>( 8991e1e598dSJonathan Doman *crow::connections::systemBus, "xyz.openbmc_project.Settings", 9001e1e598dSJonathan Doman "/xyz/openbmc_project/control/host0/boot", 9011e1e598dSJonathan Doman "xyz.openbmc_project.Control.Boot.Mode", "BootMode", 902c21865c4SKonstantin Aladyshev [aResp](const boost::system::error_code ec, 9031e1e598dSJonathan Doman const std::string& bootModeStr) { 904491d8ee7SSantosh Puranik if (ec) 905491d8ee7SSantosh Puranik { 906491d8ee7SSantosh Puranik BMCWEB_LOG_DEBUG << "DBUS response error " << ec; 907491d8ee7SSantosh Puranik messages::internalError(aResp->res); 908491d8ee7SSantosh Puranik return; 909491d8ee7SSantosh Puranik } 910491d8ee7SSantosh Puranik 9111e1e598dSJonathan Doman BMCWEB_LOG_DEBUG << "Boot mode: " << bootModeStr; 912491d8ee7SSantosh Puranik 9130fda0f12SGeorge Liu aResp->res 9140fda0f12SGeorge Liu .jsonValue["Boot"] 9150fda0f12SGeorge Liu ["BootSourceOverrideTarget@Redfish.AllowableValues"] = 9160fda0f12SGeorge Liu {"None", "Pxe", "Hdd", "Cd", "Diags", "BiosSetup", "Usb"}; 917491d8ee7SSantosh Puranik 9181e1e598dSJonathan Doman if (bootModeStr != 919491d8ee7SSantosh Puranik "xyz.openbmc_project.Control.Boot.Mode.Modes.Regular") 920491d8ee7SSantosh Puranik { 9211e1e598dSJonathan Doman auto rfMode = dbusToRfBootMode(bootModeStr); 922491d8ee7SSantosh Puranik if (!rfMode.empty()) 923491d8ee7SSantosh Puranik { 924491d8ee7SSantosh Puranik aResp->res.jsonValue["Boot"]["BootSourceOverrideTarget"] = 925491d8ee7SSantosh Puranik rfMode; 926491d8ee7SSantosh Puranik } 927491d8ee7SSantosh Puranik } 9281e1e598dSJonathan Doman }); 929491d8ee7SSantosh Puranik } 930491d8ee7SSantosh Puranik 931491d8ee7SSantosh Puranik /** 932c21865c4SKonstantin Aladyshev * @brief Retrieves boot override source over DBUS 933491d8ee7SSantosh Puranik * 934491d8ee7SSantosh Puranik * @param[in] aResp Shared pointer for generating response message. 935491d8ee7SSantosh Puranik * 936491d8ee7SSantosh Puranik * @return None. 937491d8ee7SSantosh Puranik */ 938c21865c4SKonstantin Aladyshev 939c21865c4SKonstantin Aladyshev inline void 940c21865c4SKonstantin Aladyshev getBootOverrideSource(const std::shared_ptr<bmcweb::AsyncResp>& aResp) 941491d8ee7SSantosh Puranik { 9421e1e598dSJonathan Doman sdbusplus::asio::getProperty<std::string>( 9431e1e598dSJonathan Doman *crow::connections::systemBus, "xyz.openbmc_project.Settings", 9441e1e598dSJonathan Doman "/xyz/openbmc_project/control/host0/boot", 9451e1e598dSJonathan Doman "xyz.openbmc_project.Control.Boot.Source", "BootSource", 946c21865c4SKonstantin Aladyshev [aResp](const boost::system::error_code ec, 9471e1e598dSJonathan Doman const std::string& bootSourceStr) { 948491d8ee7SSantosh Puranik if (ec) 949491d8ee7SSantosh Puranik { 950491d8ee7SSantosh Puranik BMCWEB_LOG_DEBUG << "DBUS response error " << ec; 951491d8ee7SSantosh Puranik messages::internalError(aResp->res); 952491d8ee7SSantosh Puranik return; 953491d8ee7SSantosh Puranik } 954491d8ee7SSantosh Puranik 9551e1e598dSJonathan Doman BMCWEB_LOG_DEBUG << "Boot source: " << bootSourceStr; 956491d8ee7SSantosh Puranik 9571e1e598dSJonathan Doman auto rfSource = dbusToRfBootSource(bootSourceStr); 958491d8ee7SSantosh Puranik if (!rfSource.empty()) 959491d8ee7SSantosh Puranik { 960491d8ee7SSantosh Puranik aResp->res.jsonValue["Boot"]["BootSourceOverrideTarget"] = 961491d8ee7SSantosh Puranik rfSource; 962491d8ee7SSantosh Puranik } 963cd9a4666SKonstantin Aladyshev 964cd9a4666SKonstantin Aladyshev // Get BootMode as BootSourceOverrideTarget is constructed 965cd9a4666SKonstantin Aladyshev // from both BootSource and BootMode 966c21865c4SKonstantin Aladyshev getBootOverrideMode(aResp); 9671e1e598dSJonathan Doman }); 968491d8ee7SSantosh Puranik } 969491d8ee7SSantosh Puranik 970491d8ee7SSantosh Puranik /** 971c21865c4SKonstantin Aladyshev * @brief This functions abstracts all the logic behind getting a 972c21865c4SKonstantin Aladyshev * "BootSourceOverrideEnabled" property from an overall boot override enable 973c21865c4SKonstantin Aladyshev * state 974491d8ee7SSantosh Puranik * 975491d8ee7SSantosh Puranik * @param[in] aResp Shared pointer for generating response message. 976491d8ee7SSantosh Puranik * 977491d8ee7SSantosh Puranik * @return None. 978491d8ee7SSantosh Puranik */ 979491d8ee7SSantosh Puranik 980c21865c4SKonstantin Aladyshev inline void 981c21865c4SKonstantin Aladyshev processBootOverrideEnable(const std::shared_ptr<bmcweb::AsyncResp>& aResp, 982c21865c4SKonstantin Aladyshev const bool bootOverrideEnableSetting) 983c21865c4SKonstantin Aladyshev { 984c21865c4SKonstantin Aladyshev if (!bootOverrideEnableSetting) 985c21865c4SKonstantin Aladyshev { 986c21865c4SKonstantin Aladyshev aResp->res.jsonValue["Boot"]["BootSourceOverrideEnabled"] = "Disabled"; 987c21865c4SKonstantin Aladyshev return; 988c21865c4SKonstantin Aladyshev } 989c21865c4SKonstantin Aladyshev 990c21865c4SKonstantin Aladyshev // If boot source override is enabled, we need to check 'one_time' 991c21865c4SKonstantin Aladyshev // property to set a correct value for the "BootSourceOverrideEnabled" 9921e1e598dSJonathan Doman sdbusplus::asio::getProperty<bool>( 9931e1e598dSJonathan Doman *crow::connections::systemBus, "xyz.openbmc_project.Settings", 9941e1e598dSJonathan Doman "/xyz/openbmc_project/control/host0/boot/one_time", 9951e1e598dSJonathan Doman "xyz.openbmc_project.Object.Enable", "Enabled", 9961e1e598dSJonathan Doman [aResp](const boost::system::error_code ec, bool oneTimeSetting) { 997491d8ee7SSantosh Puranik if (ec) 998491d8ee7SSantosh Puranik { 999491d8ee7SSantosh Puranik BMCWEB_LOG_DEBUG << "DBUS response error " << ec; 1000c21865c4SKonstantin Aladyshev messages::internalError(aResp->res); 1001491d8ee7SSantosh Puranik return; 1002491d8ee7SSantosh Puranik } 1003491d8ee7SSantosh Puranik 1004c21865c4SKonstantin Aladyshev if (oneTimeSetting) 1005c21865c4SKonstantin Aladyshev { 1006c21865c4SKonstantin Aladyshev aResp->res.jsonValue["Boot"]["BootSourceOverrideEnabled"] = 1007c21865c4SKonstantin Aladyshev "Once"; 1008c21865c4SKonstantin Aladyshev } 1009c21865c4SKonstantin Aladyshev else 1010c21865c4SKonstantin Aladyshev { 1011c21865c4SKonstantin Aladyshev aResp->res.jsonValue["Boot"]["BootSourceOverrideEnabled"] = 1012c21865c4SKonstantin Aladyshev "Continuous"; 1013c21865c4SKonstantin Aladyshev } 10141e1e598dSJonathan Doman }); 1015491d8ee7SSantosh Puranik } 1016491d8ee7SSantosh Puranik 1017491d8ee7SSantosh Puranik /** 1018c21865c4SKonstantin Aladyshev * @brief Retrieves boot override enable over DBUS 1019c21865c4SKonstantin Aladyshev * 1020c21865c4SKonstantin Aladyshev * @param[in] aResp Shared pointer for generating response message. 1021c21865c4SKonstantin Aladyshev * 1022c21865c4SKonstantin Aladyshev * @return None. 1023c21865c4SKonstantin Aladyshev */ 1024c21865c4SKonstantin Aladyshev 1025c21865c4SKonstantin Aladyshev inline void 1026c21865c4SKonstantin Aladyshev getBootOverrideEnable(const std::shared_ptr<bmcweb::AsyncResp>& aResp) 1027c21865c4SKonstantin Aladyshev { 10281e1e598dSJonathan Doman sdbusplus::asio::getProperty<bool>( 10291e1e598dSJonathan Doman *crow::connections::systemBus, "xyz.openbmc_project.Settings", 10301e1e598dSJonathan Doman "/xyz/openbmc_project/control/host0/boot", 10311e1e598dSJonathan Doman "xyz.openbmc_project.Object.Enable", "Enabled", 1032c21865c4SKonstantin Aladyshev [aResp](const boost::system::error_code ec, 10331e1e598dSJonathan Doman const bool bootOverrideEnable) { 1034c21865c4SKonstantin Aladyshev if (ec) 1035c21865c4SKonstantin Aladyshev { 1036c21865c4SKonstantin Aladyshev BMCWEB_LOG_DEBUG << "DBUS response error " << ec; 1037c21865c4SKonstantin Aladyshev messages::internalError(aResp->res); 1038c21865c4SKonstantin Aladyshev return; 1039c21865c4SKonstantin Aladyshev } 1040c21865c4SKonstantin Aladyshev 10411e1e598dSJonathan Doman processBootOverrideEnable(aResp, bootOverrideEnable); 10421e1e598dSJonathan Doman }); 1043c21865c4SKonstantin Aladyshev } 1044c21865c4SKonstantin Aladyshev 1045c21865c4SKonstantin Aladyshev /** 1046c21865c4SKonstantin Aladyshev * @brief Retrieves boot source override properties 1047c21865c4SKonstantin Aladyshev * 1048c21865c4SKonstantin Aladyshev * @param[in] aResp Shared pointer for generating response message. 1049c21865c4SKonstantin Aladyshev * 1050c21865c4SKonstantin Aladyshev * @return None. 1051c21865c4SKonstantin Aladyshev */ 1052c21865c4SKonstantin Aladyshev inline void getBootProperties(const std::shared_ptr<bmcweb::AsyncResp>& aResp) 1053c21865c4SKonstantin Aladyshev { 1054c21865c4SKonstantin Aladyshev BMCWEB_LOG_DEBUG << "Get boot information."; 1055c21865c4SKonstantin Aladyshev 1056c21865c4SKonstantin Aladyshev getBootOverrideSource(aResp); 1057c21865c4SKonstantin Aladyshev getBootOverrideType(aResp); 1058c21865c4SKonstantin Aladyshev getBootOverrideEnable(aResp); 1059c21865c4SKonstantin Aladyshev } 1060c21865c4SKonstantin Aladyshev 1061c21865c4SKonstantin Aladyshev /** 1062c0557e1aSGunnar Mills * @brief Retrieves the Last Reset Time 1063c0557e1aSGunnar Mills * 1064c0557e1aSGunnar Mills * "Reset" is an overloaded term in Redfish, "Reset" includes power on 1065c0557e1aSGunnar Mills * and power off. Even though this is the "system" Redfish object look at the 1066c0557e1aSGunnar Mills * chassis D-Bus interface for the LastStateChangeTime since this has the 1067c0557e1aSGunnar Mills * last power operation time. 1068c0557e1aSGunnar Mills * 1069c0557e1aSGunnar Mills * @param[in] aResp Shared pointer for generating response message. 1070c0557e1aSGunnar Mills * 1071c0557e1aSGunnar Mills * @return None. 1072c0557e1aSGunnar Mills */ 10738d1b46d7Szhanghch05 inline void getLastResetTime(const std::shared_ptr<bmcweb::AsyncResp>& aResp) 1074c0557e1aSGunnar Mills { 1075c0557e1aSGunnar Mills BMCWEB_LOG_DEBUG << "Getting System Last Reset Time"; 1076c0557e1aSGunnar Mills 10771e1e598dSJonathan Doman sdbusplus::asio::getProperty<uint64_t>( 10781e1e598dSJonathan Doman *crow::connections::systemBus, "xyz.openbmc_project.State.Chassis", 10791e1e598dSJonathan Doman "/xyz/openbmc_project/state/chassis0", 10801e1e598dSJonathan Doman "xyz.openbmc_project.State.Chassis", "LastStateChangeTime", 10811e1e598dSJonathan Doman [aResp](const boost::system::error_code ec, uint64_t lastResetTime) { 1082c0557e1aSGunnar Mills if (ec) 1083c0557e1aSGunnar Mills { 1084c0557e1aSGunnar Mills BMCWEB_LOG_DEBUG << "D-BUS response error " << ec; 1085c0557e1aSGunnar Mills return; 1086c0557e1aSGunnar Mills } 1087c0557e1aSGunnar Mills 1088c0557e1aSGunnar Mills // LastStateChangeTime is epoch time, in milliseconds 1089c0557e1aSGunnar Mills // https://github.com/openbmc/phosphor-dbus-interfaces/blob/33e8e1dd64da53a66e888d33dc82001305cd0bf9/xyz/openbmc_project/State/Chassis.interface.yaml#L19 10901e1e598dSJonathan Doman uint64_t lastResetTimeStamp = lastResetTime / 1000; 1091c0557e1aSGunnar Mills 1092c0557e1aSGunnar Mills // Convert to ISO 8601 standard 1093c0557e1aSGunnar Mills aResp->res.jsonValue["LastResetTime"] = 10941d8782e7SNan Zhou crow::utility::getDateTimeUint(lastResetTimeStamp); 10951e1e598dSJonathan Doman }); 1096c0557e1aSGunnar Mills } 1097c0557e1aSGunnar Mills 1098c0557e1aSGunnar Mills /** 10996bd5a8d2SGunnar Mills * @brief Retrieves Automatic Retry properties. Known on D-Bus as AutoReboot. 11006bd5a8d2SGunnar Mills * 11016bd5a8d2SGunnar Mills * @param[in] aResp Shared pointer for generating response message. 11026bd5a8d2SGunnar Mills * 11036bd5a8d2SGunnar Mills * @return None. 11046bd5a8d2SGunnar Mills */ 11058d1b46d7Szhanghch05 inline void getAutomaticRetry(const std::shared_ptr<bmcweb::AsyncResp>& aResp) 11066bd5a8d2SGunnar Mills { 11076bd5a8d2SGunnar Mills BMCWEB_LOG_DEBUG << "Get Automatic Retry policy"; 11086bd5a8d2SGunnar Mills 11091e1e598dSJonathan Doman sdbusplus::asio::getProperty<bool>( 11101e1e598dSJonathan Doman *crow::connections::systemBus, "xyz.openbmc_project.Settings", 11111e1e598dSJonathan Doman "/xyz/openbmc_project/control/host0/auto_reboot", 11121e1e598dSJonathan Doman "xyz.openbmc_project.Control.Boot.RebootPolicy", "AutoReboot", 11131e1e598dSJonathan Doman [aResp](const boost::system::error_code ec, bool autoRebootEnabled) { 11146bd5a8d2SGunnar Mills if (ec) 11156bd5a8d2SGunnar Mills { 11166bd5a8d2SGunnar Mills BMCWEB_LOG_DEBUG << "D-BUS response error " << ec; 11176bd5a8d2SGunnar Mills return; 11186bd5a8d2SGunnar Mills } 11196bd5a8d2SGunnar Mills 11201e1e598dSJonathan Doman BMCWEB_LOG_DEBUG << "Auto Reboot: " << autoRebootEnabled; 1121e05aec50SEd Tanous if (autoRebootEnabled) 11226bd5a8d2SGunnar Mills { 11236bd5a8d2SGunnar Mills aResp->res.jsonValue["Boot"]["AutomaticRetryConfig"] = 11246bd5a8d2SGunnar Mills "RetryAttempts"; 11256bd5a8d2SGunnar Mills // If AutomaticRetry (AutoReboot) is enabled see how many 11266bd5a8d2SGunnar Mills // attempts are left 11271e1e598dSJonathan Doman sdbusplus::asio::getProperty<uint32_t>( 11281e1e598dSJonathan Doman *crow::connections::systemBus, 11291e1e598dSJonathan Doman "xyz.openbmc_project.State.Host", 11301e1e598dSJonathan Doman "/xyz/openbmc_project/state/host0", 11311e1e598dSJonathan Doman "xyz.openbmc_project.Control.Boot.RebootAttempts", 11321e1e598dSJonathan Doman "AttemptsLeft", 1133cb13a392SEd Tanous [aResp](const boost::system::error_code ec2, 1134914e2d5dSEd Tanous const uint32_t autoRebootAttemptsLeft) { 1135cb13a392SEd Tanous if (ec2) 11366bd5a8d2SGunnar Mills { 1137cb13a392SEd Tanous BMCWEB_LOG_DEBUG << "D-BUS response error " << ec2; 11386bd5a8d2SGunnar Mills return; 11396bd5a8d2SGunnar Mills } 11406bd5a8d2SGunnar Mills 11416bd5a8d2SGunnar Mills BMCWEB_LOG_DEBUG << "Auto Reboot Attempts Left: " 11421e1e598dSJonathan Doman << autoRebootAttemptsLeft; 11436bd5a8d2SGunnar Mills 11446bd5a8d2SGunnar Mills aResp->res 11456bd5a8d2SGunnar Mills .jsonValue["Boot"] 11466bd5a8d2SGunnar Mills ["RemainingAutomaticRetryAttempts"] = 11471e1e598dSJonathan Doman autoRebootAttemptsLeft; 11481e1e598dSJonathan Doman }); 11496bd5a8d2SGunnar Mills } 11506bd5a8d2SGunnar Mills else 11516bd5a8d2SGunnar Mills { 11526bd5a8d2SGunnar Mills aResp->res.jsonValue["Boot"]["AutomaticRetryConfig"] = 11536bd5a8d2SGunnar Mills "Disabled"; 11546bd5a8d2SGunnar Mills } 11556bd5a8d2SGunnar Mills 11566bd5a8d2SGunnar Mills // Not on D-Bus. Hardcoded here: 11576bd5a8d2SGunnar Mills // https://github.com/openbmc/phosphor-state-manager/blob/1dbbef42675e94fb1f78edb87d6b11380260535a/meson_options.txt#L71 11586bd5a8d2SGunnar Mills aResp->res.jsonValue["Boot"]["AutomaticRetryAttempts"] = 3; 115969f35306SGunnar Mills 116069f35306SGunnar Mills // "AutomaticRetryConfig" can be 3 values, Disabled, RetryAlways, 116169f35306SGunnar Mills // and RetryAttempts. OpenBMC only supports Disabled and 116269f35306SGunnar Mills // RetryAttempts. 11630fda0f12SGeorge Liu aResp->res 11640fda0f12SGeorge Liu .jsonValue["Boot"] 11650fda0f12SGeorge Liu ["AutomaticRetryConfig@Redfish.AllowableValues"] = { 11660fda0f12SGeorge Liu "Disabled", "RetryAttempts"}; 11671e1e598dSJonathan Doman }); 11686bd5a8d2SGunnar Mills } 11696bd5a8d2SGunnar Mills 11706bd5a8d2SGunnar Mills /** 1171c6a620f2SGeorge Liu * @brief Retrieves power restore policy over DBUS. 1172c6a620f2SGeorge Liu * 1173c6a620f2SGeorge Liu * @param[in] aResp Shared pointer for generating response message. 1174c6a620f2SGeorge Liu * 1175c6a620f2SGeorge Liu * @return None. 1176c6a620f2SGeorge Liu */ 11778d1b46d7Szhanghch05 inline void 11788d1b46d7Szhanghch05 getPowerRestorePolicy(const std::shared_ptr<bmcweb::AsyncResp>& aResp) 1179c6a620f2SGeorge Liu { 1180c6a620f2SGeorge Liu BMCWEB_LOG_DEBUG << "Get power restore policy"; 1181c6a620f2SGeorge Liu 11821e1e598dSJonathan Doman sdbusplus::asio::getProperty<std::string>( 11831e1e598dSJonathan Doman *crow::connections::systemBus, "xyz.openbmc_project.Settings", 11841e1e598dSJonathan Doman "/xyz/openbmc_project/control/host0/power_restore_policy", 11851e1e598dSJonathan Doman "xyz.openbmc_project.Control.Power.RestorePolicy", "PowerRestorePolicy", 11861e1e598dSJonathan Doman [aResp](const boost::system::error_code ec, const std::string& policy) { 1187c6a620f2SGeorge Liu if (ec) 1188c6a620f2SGeorge Liu { 1189c6a620f2SGeorge Liu BMCWEB_LOG_DEBUG << "DBUS response error " << ec; 1190c6a620f2SGeorge Liu return; 1191c6a620f2SGeorge Liu } 1192c6a620f2SGeorge Liu 11930fda0f12SGeorge Liu const boost::container::flat_map<std::string, std::string> policyMaps = { 11940fda0f12SGeorge Liu {"xyz.openbmc_project.Control.Power.RestorePolicy.Policy.AlwaysOn", 1195c6a620f2SGeorge Liu "AlwaysOn"}, 11960fda0f12SGeorge Liu {"xyz.openbmc_project.Control.Power.RestorePolicy.Policy.AlwaysOff", 1197c6a620f2SGeorge Liu "AlwaysOff"}, 11980fda0f12SGeorge Liu {"xyz.openbmc_project.Control.Power.RestorePolicy.Policy.Restore", 11994ed47cb8SMatthew Barth "LastState"}, 12004ed47cb8SMatthew Barth // Return `AlwaysOff` when power restore policy set to "None" 12014ed47cb8SMatthew Barth {"xyz.openbmc_project.Control.Power.RestorePolicy.Policy.None", 12024ed47cb8SMatthew Barth "AlwaysOff"}}; 1203c6a620f2SGeorge Liu 12041e1e598dSJonathan Doman auto policyMapsIt = policyMaps.find(policy); 1205c6a620f2SGeorge Liu if (policyMapsIt == policyMaps.end()) 1206c6a620f2SGeorge Liu { 1207c6a620f2SGeorge Liu messages::internalError(aResp->res); 1208c6a620f2SGeorge Liu return; 1209c6a620f2SGeorge Liu } 1210c6a620f2SGeorge Liu 1211c6a620f2SGeorge Liu aResp->res.jsonValue["PowerRestorePolicy"] = policyMapsIt->second; 12121e1e598dSJonathan Doman }); 1213c6a620f2SGeorge Liu } 1214c6a620f2SGeorge Liu 1215c6a620f2SGeorge Liu /** 12161981771bSAli Ahmed * @brief Get TrustedModuleRequiredToBoot property. Determines whether or not 12171981771bSAli Ahmed * TPM is required for booting the host. 12181981771bSAli Ahmed * 12191981771bSAli Ahmed * @param[in] aResp Shared pointer for generating response message. 12201981771bSAli Ahmed * 12211981771bSAli Ahmed * @return None. 12221981771bSAli Ahmed */ 12231981771bSAli Ahmed inline void getTrustedModuleRequiredToBoot( 12241981771bSAli Ahmed const std::shared_ptr<bmcweb::AsyncResp>& aResp) 12251981771bSAli Ahmed { 12261981771bSAli Ahmed BMCWEB_LOG_DEBUG << "Get TPM required to boot."; 12271981771bSAli Ahmed 12281981771bSAli Ahmed crow::connections::systemBus->async_method_call( 1229*b9d36b47SEd Tanous [aResp](const boost::system::error_code ec, 1230*b9d36b47SEd Tanous const dbus::utility::MapperGetSubTreeResponse& subtree) { 12311981771bSAli Ahmed if (ec) 12321981771bSAli Ahmed { 12331981771bSAli Ahmed BMCWEB_LOG_DEBUG 12341981771bSAli Ahmed << "DBUS response error on TPM.Policy GetSubTree" << ec; 12351981771bSAli Ahmed // This is an optional D-Bus object so just return if 12361981771bSAli Ahmed // error occurs 12371981771bSAli Ahmed return; 12381981771bSAli Ahmed } 123926f6976fSEd Tanous if (subtree.empty()) 12401981771bSAli Ahmed { 12411981771bSAli Ahmed // As noted above, this is an optional interface so just return 12421981771bSAli Ahmed // if there is no instance found 12431981771bSAli Ahmed return; 12441981771bSAli Ahmed } 12451981771bSAli Ahmed 12461981771bSAli Ahmed /* When there is more than one TPMEnable object... */ 12471981771bSAli Ahmed if (subtree.size() > 1) 12481981771bSAli Ahmed { 12491981771bSAli Ahmed BMCWEB_LOG_DEBUG 12501981771bSAli Ahmed << "DBUS response has more than 1 TPM Enable object:" 12511981771bSAli Ahmed << subtree.size(); 12521981771bSAli Ahmed // Throw an internal Error and return 12531981771bSAli Ahmed messages::internalError(aResp->res); 12541981771bSAli Ahmed return; 12551981771bSAli Ahmed } 12561981771bSAli Ahmed 12571981771bSAli Ahmed // Make sure the Dbus response map has a service and objectPath 12581981771bSAli Ahmed // field 12591981771bSAli Ahmed if (subtree[0].first.empty() || subtree[0].second.size() != 1) 12601981771bSAli Ahmed { 12611981771bSAli Ahmed BMCWEB_LOG_DEBUG << "TPM.Policy mapper error!"; 12621981771bSAli Ahmed messages::internalError(aResp->res); 12631981771bSAli Ahmed return; 12641981771bSAli Ahmed } 12651981771bSAli Ahmed 12661981771bSAli Ahmed const std::string& path = subtree[0].first; 12671981771bSAli Ahmed const std::string& serv = subtree[0].second.begin()->first; 12681981771bSAli Ahmed 12691981771bSAli Ahmed // Valid TPM Enable object found, now reading the current value 12701e1e598dSJonathan Doman sdbusplus::asio::getProperty<bool>( 12711e1e598dSJonathan Doman *crow::connections::systemBus, serv, path, 12721e1e598dSJonathan Doman "xyz.openbmc_project.Control.TPM.Policy", "TPMEnable", 12731e1e598dSJonathan Doman [aResp](const boost::system::error_code ec, bool tpmRequired) { 12741981771bSAli Ahmed if (ec) 12751981771bSAli Ahmed { 12761981771bSAli Ahmed BMCWEB_LOG_DEBUG 12771981771bSAli Ahmed << "D-BUS response error on TPM.Policy Get" << ec; 12781981771bSAli Ahmed messages::internalError(aResp->res); 12791981771bSAli Ahmed return; 12801981771bSAli Ahmed } 12811981771bSAli Ahmed 12821e1e598dSJonathan Doman if (tpmRequired) 12831981771bSAli Ahmed { 12841981771bSAli Ahmed aResp->res 12851981771bSAli Ahmed .jsonValue["Boot"]["TrustedModuleRequiredToBoot"] = 12861981771bSAli Ahmed "Required"; 12871981771bSAli Ahmed } 12881981771bSAli Ahmed else 12891981771bSAli Ahmed { 12901981771bSAli Ahmed aResp->res 12911981771bSAli Ahmed .jsonValue["Boot"]["TrustedModuleRequiredToBoot"] = 12921981771bSAli Ahmed "Disabled"; 12931981771bSAli Ahmed } 12941e1e598dSJonathan Doman }); 12951981771bSAli Ahmed }, 12961981771bSAli Ahmed "xyz.openbmc_project.ObjectMapper", 12971981771bSAli Ahmed "/xyz/openbmc_project/object_mapper", 12981981771bSAli Ahmed "xyz.openbmc_project.ObjectMapper", "GetSubTree", "/", int32_t(0), 12991981771bSAli Ahmed std::array<const char*, 1>{"xyz.openbmc_project.Control.TPM.Policy"}); 13001981771bSAli Ahmed } 13011981771bSAli Ahmed 13021981771bSAli Ahmed /** 13031c05dae3SAli Ahmed * @brief Set TrustedModuleRequiredToBoot property. Determines whether or not 13041c05dae3SAli Ahmed * TPM is required for booting the host. 13051c05dae3SAli Ahmed * 13061c05dae3SAli Ahmed * @param[in] aResp Shared pointer for generating response message. 13071c05dae3SAli Ahmed * @param[in] tpmRequired Value to set TPM Required To Boot property to. 13081c05dae3SAli Ahmed * 13091c05dae3SAli Ahmed * @return None. 13101c05dae3SAli Ahmed */ 13111c05dae3SAli Ahmed inline void setTrustedModuleRequiredToBoot( 13121c05dae3SAli Ahmed const std::shared_ptr<bmcweb::AsyncResp>& aResp, const bool tpmRequired) 13131c05dae3SAli Ahmed { 13141c05dae3SAli Ahmed BMCWEB_LOG_DEBUG << "Set TrustedModuleRequiredToBoot."; 13151c05dae3SAli Ahmed 13161c05dae3SAli Ahmed crow::connections::systemBus->async_method_call( 1317*b9d36b47SEd Tanous [aResp, tpmRequired](const boost::system::error_code ec, 1318*b9d36b47SEd Tanous dbus::utility::MapperGetSubTreeResponse& subtree) { 13191c05dae3SAli Ahmed if (ec) 13201c05dae3SAli Ahmed { 13211c05dae3SAli Ahmed BMCWEB_LOG_DEBUG 13221c05dae3SAli Ahmed << "DBUS response error on TPM.Policy GetSubTree" << ec; 13231c05dae3SAli Ahmed messages::internalError(aResp->res); 13241c05dae3SAli Ahmed return; 13251c05dae3SAli Ahmed } 132626f6976fSEd Tanous if (subtree.empty()) 13271c05dae3SAli Ahmed { 13281c05dae3SAli Ahmed messages::propertyValueNotInList(aResp->res, "ComputerSystem", 13291c05dae3SAli Ahmed "TrustedModuleRequiredToBoot"); 13301c05dae3SAli Ahmed return; 13311c05dae3SAli Ahmed } 13321c05dae3SAli Ahmed 13331c05dae3SAli Ahmed /* When there is more than one TPMEnable object... */ 13341c05dae3SAli Ahmed if (subtree.size() > 1) 13351c05dae3SAli Ahmed { 13361c05dae3SAli Ahmed BMCWEB_LOG_DEBUG 13371c05dae3SAli Ahmed << "DBUS response has more than 1 TPM Enable object:" 13381c05dae3SAli Ahmed << subtree.size(); 13391c05dae3SAli Ahmed // Throw an internal Error and return 13401c05dae3SAli Ahmed messages::internalError(aResp->res); 13411c05dae3SAli Ahmed return; 13421c05dae3SAli Ahmed } 13431c05dae3SAli Ahmed 13441c05dae3SAli Ahmed // Make sure the Dbus response map has a service and objectPath 13451c05dae3SAli Ahmed // field 13461c05dae3SAli Ahmed if (subtree[0].first.empty() || subtree[0].second.size() != 1) 13471c05dae3SAli Ahmed { 13481c05dae3SAli Ahmed BMCWEB_LOG_DEBUG << "TPM.Policy mapper error!"; 13491c05dae3SAli Ahmed messages::internalError(aResp->res); 13501c05dae3SAli Ahmed return; 13511c05dae3SAli Ahmed } 13521c05dae3SAli Ahmed 13531c05dae3SAli Ahmed const std::string& path = subtree[0].first; 13541c05dae3SAli Ahmed const std::string& serv = subtree[0].second.begin()->first; 13551c05dae3SAli Ahmed 13561c05dae3SAli Ahmed if (serv.empty()) 13571c05dae3SAli Ahmed { 13581c05dae3SAli Ahmed BMCWEB_LOG_DEBUG << "TPM.Policy service mapper error!"; 13591c05dae3SAli Ahmed messages::internalError(aResp->res); 13601c05dae3SAli Ahmed return; 13611c05dae3SAli Ahmed } 13621c05dae3SAli Ahmed 13631c05dae3SAli Ahmed // Valid TPM Enable object found, now setting the value 13641c05dae3SAli Ahmed crow::connections::systemBus->async_method_call( 13651c05dae3SAli Ahmed [aResp](const boost::system::error_code ec) { 13661c05dae3SAli Ahmed if (ec) 13671c05dae3SAli Ahmed { 13680fda0f12SGeorge Liu BMCWEB_LOG_DEBUG 13690fda0f12SGeorge Liu << "DBUS response error: Set TrustedModuleRequiredToBoot" 13701c05dae3SAli Ahmed << ec; 13711c05dae3SAli Ahmed messages::internalError(aResp->res); 13721c05dae3SAli Ahmed return; 13731c05dae3SAli Ahmed } 13741c05dae3SAli Ahmed BMCWEB_LOG_DEBUG << "Set TrustedModuleRequiredToBoot done."; 13751c05dae3SAli Ahmed }, 13761c05dae3SAli Ahmed serv, path, "org.freedesktop.DBus.Properties", "Set", 13771c05dae3SAli Ahmed "xyz.openbmc_project.Control.TPM.Policy", "TPMEnable", 1378168e20c1SEd Tanous dbus::utility::DbusVariantType(tpmRequired)); 13791c05dae3SAli Ahmed }, 13801c05dae3SAli Ahmed "xyz.openbmc_project.ObjectMapper", 13811c05dae3SAli Ahmed "/xyz/openbmc_project/object_mapper", 13821c05dae3SAli Ahmed "xyz.openbmc_project.ObjectMapper", "GetSubTree", "/", int32_t(0), 13831c05dae3SAli Ahmed std::array<const char*, 1>{"xyz.openbmc_project.Control.TPM.Policy"}); 13841c05dae3SAli Ahmed } 13851c05dae3SAli Ahmed 13861c05dae3SAli Ahmed /** 1387491d8ee7SSantosh Puranik * @brief Sets boot properties into DBUS object(s). 1388491d8ee7SSantosh Puranik * 1389491d8ee7SSantosh Puranik * @param[in] aResp Shared pointer for generating response message. 1390cd9a4666SKonstantin Aladyshev * @param[in] bootType The boot type to set. 1391cd9a4666SKonstantin Aladyshev * @return Integer error code. 1392cd9a4666SKonstantin Aladyshev */ 1393cd9a4666SKonstantin Aladyshev inline void setBootType(const std::shared_ptr<bmcweb::AsyncResp>& aResp, 1394cd9a4666SKonstantin Aladyshev const std::optional<std::string>& bootType) 1395cd9a4666SKonstantin Aladyshev { 1396c21865c4SKonstantin Aladyshev std::string bootTypeStr; 1397cd9a4666SKonstantin Aladyshev 1398c21865c4SKonstantin Aladyshev if (!bootType) 1399cd9a4666SKonstantin Aladyshev { 1400c21865c4SKonstantin Aladyshev return; 1401c21865c4SKonstantin Aladyshev } 1402c21865c4SKonstantin Aladyshev 1403cd9a4666SKonstantin Aladyshev // Source target specified 1404cd9a4666SKonstantin Aladyshev BMCWEB_LOG_DEBUG << "Boot type: " << *bootType; 1405cd9a4666SKonstantin Aladyshev // Figure out which DBUS interface and property to use 1406cd9a4666SKonstantin Aladyshev if (*bootType == "Legacy") 1407cd9a4666SKonstantin Aladyshev { 1408cd9a4666SKonstantin Aladyshev bootTypeStr = "xyz.openbmc_project.Control.Boot.Type.Types.Legacy"; 1409cd9a4666SKonstantin Aladyshev } 1410cd9a4666SKonstantin Aladyshev else if (*bootType == "UEFI") 1411cd9a4666SKonstantin Aladyshev { 1412cd9a4666SKonstantin Aladyshev bootTypeStr = "xyz.openbmc_project.Control.Boot.Type.Types.EFI"; 1413cd9a4666SKonstantin Aladyshev } 1414cd9a4666SKonstantin Aladyshev else 1415cd9a4666SKonstantin Aladyshev { 1416cd9a4666SKonstantin Aladyshev BMCWEB_LOG_DEBUG << "Invalid property value for " 1417cd9a4666SKonstantin Aladyshev "BootSourceOverrideMode: " 1418cd9a4666SKonstantin Aladyshev << *bootType; 1419cd9a4666SKonstantin Aladyshev messages::propertyValueNotInList(aResp->res, *bootType, 1420cd9a4666SKonstantin Aladyshev "BootSourceOverrideMode"); 1421cd9a4666SKonstantin Aladyshev return; 1422cd9a4666SKonstantin Aladyshev } 1423cd9a4666SKonstantin Aladyshev 1424cd9a4666SKonstantin Aladyshev // Act on validated parameters 1425cd9a4666SKonstantin Aladyshev BMCWEB_LOG_DEBUG << "DBUS boot type: " << bootTypeStr; 1426cd9a4666SKonstantin Aladyshev 1427cd9a4666SKonstantin Aladyshev crow::connections::systemBus->async_method_call( 1428c21865c4SKonstantin Aladyshev [aResp](const boost::system::error_code ec) { 1429cd9a4666SKonstantin Aladyshev if (ec) 1430cd9a4666SKonstantin Aladyshev { 1431cd9a4666SKonstantin Aladyshev BMCWEB_LOG_DEBUG << "DBUS response error " << ec; 1432cd9a4666SKonstantin Aladyshev if (ec.value() == boost::asio::error::host_unreachable) 1433cd9a4666SKonstantin Aladyshev { 1434cd9a4666SKonstantin Aladyshev messages::resourceNotFound(aResp->res, "Set", "BootType"); 1435cd9a4666SKonstantin Aladyshev return; 1436cd9a4666SKonstantin Aladyshev } 1437cd9a4666SKonstantin Aladyshev messages::internalError(aResp->res); 1438cd9a4666SKonstantin Aladyshev return; 1439cd9a4666SKonstantin Aladyshev } 1440cd9a4666SKonstantin Aladyshev BMCWEB_LOG_DEBUG << "Boot type update done."; 1441cd9a4666SKonstantin Aladyshev }, 1442c21865c4SKonstantin Aladyshev "xyz.openbmc_project.Settings", 1443c21865c4SKonstantin Aladyshev "/xyz/openbmc_project/control/host0/boot", 1444cd9a4666SKonstantin Aladyshev "org.freedesktop.DBus.Properties", "Set", 1445cd9a4666SKonstantin Aladyshev "xyz.openbmc_project.Control.Boot.Type", "BootType", 1446168e20c1SEd Tanous dbus::utility::DbusVariantType(bootTypeStr)); 1447cd9a4666SKonstantin Aladyshev } 1448cd9a4666SKonstantin Aladyshev 1449cd9a4666SKonstantin Aladyshev /** 1450cd9a4666SKonstantin Aladyshev * @brief Sets boot properties into DBUS object(s). 1451cd9a4666SKonstantin Aladyshev * 1452cd9a4666SKonstantin Aladyshev * @param[in] aResp Shared pointer for generating response message. 1453c21865c4SKonstantin Aladyshev * @param[in] bootType The boot type to set. 1454c21865c4SKonstantin Aladyshev * @return Integer error code. 1455c21865c4SKonstantin Aladyshev */ 1456c21865c4SKonstantin Aladyshev inline void setBootEnable(const std::shared_ptr<bmcweb::AsyncResp>& aResp, 1457c21865c4SKonstantin Aladyshev const std::optional<std::string>& bootEnable) 1458c21865c4SKonstantin Aladyshev { 1459c21865c4SKonstantin Aladyshev if (!bootEnable) 1460c21865c4SKonstantin Aladyshev { 1461c21865c4SKonstantin Aladyshev return; 1462c21865c4SKonstantin Aladyshev } 1463c21865c4SKonstantin Aladyshev // Source target specified 1464c21865c4SKonstantin Aladyshev BMCWEB_LOG_DEBUG << "Boot enable: " << *bootEnable; 1465c21865c4SKonstantin Aladyshev 1466c21865c4SKonstantin Aladyshev bool bootOverrideEnable = false; 1467c21865c4SKonstantin Aladyshev bool bootOverridePersistent = false; 1468c21865c4SKonstantin Aladyshev // Figure out which DBUS interface and property to use 1469c21865c4SKonstantin Aladyshev if (*bootEnable == "Disabled") 1470c21865c4SKonstantin Aladyshev { 1471c21865c4SKonstantin Aladyshev bootOverrideEnable = false; 1472c21865c4SKonstantin Aladyshev } 1473c21865c4SKonstantin Aladyshev else if (*bootEnable == "Once") 1474c21865c4SKonstantin Aladyshev { 1475c21865c4SKonstantin Aladyshev bootOverrideEnable = true; 1476c21865c4SKonstantin Aladyshev bootOverridePersistent = false; 1477c21865c4SKonstantin Aladyshev } 1478c21865c4SKonstantin Aladyshev else if (*bootEnable == "Continuous") 1479c21865c4SKonstantin Aladyshev { 1480c21865c4SKonstantin Aladyshev bootOverrideEnable = true; 1481c21865c4SKonstantin Aladyshev bootOverridePersistent = true; 1482c21865c4SKonstantin Aladyshev } 1483c21865c4SKonstantin Aladyshev else 1484c21865c4SKonstantin Aladyshev { 14850fda0f12SGeorge Liu BMCWEB_LOG_DEBUG 14860fda0f12SGeorge Liu << "Invalid property value for BootSourceOverrideEnabled: " 1487c21865c4SKonstantin Aladyshev << *bootEnable; 1488c21865c4SKonstantin Aladyshev messages::propertyValueNotInList(aResp->res, *bootEnable, 1489c21865c4SKonstantin Aladyshev "BootSourceOverrideEnabled"); 1490c21865c4SKonstantin Aladyshev return; 1491c21865c4SKonstantin Aladyshev } 1492c21865c4SKonstantin Aladyshev 1493c21865c4SKonstantin Aladyshev // Act on validated parameters 1494c21865c4SKonstantin Aladyshev BMCWEB_LOG_DEBUG << "DBUS boot override enable: " << bootOverrideEnable; 1495c21865c4SKonstantin Aladyshev 1496c21865c4SKonstantin Aladyshev crow::connections::systemBus->async_method_call( 1497c21865c4SKonstantin Aladyshev [aResp](const boost::system::error_code ec) { 1498c21865c4SKonstantin Aladyshev if (ec) 1499c21865c4SKonstantin Aladyshev { 1500c21865c4SKonstantin Aladyshev BMCWEB_LOG_DEBUG << "DBUS response error " << ec; 1501c21865c4SKonstantin Aladyshev messages::internalError(aResp->res); 1502c21865c4SKonstantin Aladyshev return; 1503c21865c4SKonstantin Aladyshev } 1504c21865c4SKonstantin Aladyshev BMCWEB_LOG_DEBUG << "Boot override enable update done."; 1505c21865c4SKonstantin Aladyshev }, 1506c21865c4SKonstantin Aladyshev "xyz.openbmc_project.Settings", 1507c21865c4SKonstantin Aladyshev "/xyz/openbmc_project/control/host0/boot", 1508c21865c4SKonstantin Aladyshev "org.freedesktop.DBus.Properties", "Set", 1509c21865c4SKonstantin Aladyshev "xyz.openbmc_project.Object.Enable", "Enabled", 1510168e20c1SEd Tanous dbus::utility::DbusVariantType(bootOverrideEnable)); 1511c21865c4SKonstantin Aladyshev 1512c21865c4SKonstantin Aladyshev if (!bootOverrideEnable) 1513c21865c4SKonstantin Aladyshev { 1514c21865c4SKonstantin Aladyshev return; 1515c21865c4SKonstantin Aladyshev } 1516c21865c4SKonstantin Aladyshev 1517c21865c4SKonstantin Aladyshev // In case boot override is enabled we need to set correct value for the 1518c21865c4SKonstantin Aladyshev // 'one_time' enable DBus interface 1519c21865c4SKonstantin Aladyshev BMCWEB_LOG_DEBUG << "DBUS boot override persistent: " 1520c21865c4SKonstantin Aladyshev << bootOverridePersistent; 1521c21865c4SKonstantin Aladyshev 1522c21865c4SKonstantin Aladyshev crow::connections::systemBus->async_method_call( 1523c21865c4SKonstantin Aladyshev [aResp](const boost::system::error_code ec) { 1524c21865c4SKonstantin Aladyshev if (ec) 1525c21865c4SKonstantin Aladyshev { 1526c21865c4SKonstantin Aladyshev BMCWEB_LOG_DEBUG << "DBUS response error " << ec; 1527c21865c4SKonstantin Aladyshev messages::internalError(aResp->res); 1528c21865c4SKonstantin Aladyshev return; 1529c21865c4SKonstantin Aladyshev } 1530c21865c4SKonstantin Aladyshev BMCWEB_LOG_DEBUG << "Boot one_time update done."; 1531c21865c4SKonstantin Aladyshev }, 1532c21865c4SKonstantin Aladyshev "xyz.openbmc_project.Settings", 1533c21865c4SKonstantin Aladyshev "/xyz/openbmc_project/control/host0/boot/one_time", 1534c21865c4SKonstantin Aladyshev "org.freedesktop.DBus.Properties", "Set", 1535c21865c4SKonstantin Aladyshev "xyz.openbmc_project.Object.Enable", "Enabled", 1536168e20c1SEd Tanous dbus::utility::DbusVariantType(!bootOverridePersistent)); 1537c21865c4SKonstantin Aladyshev } 1538c21865c4SKonstantin Aladyshev 1539c21865c4SKonstantin Aladyshev /** 1540c21865c4SKonstantin Aladyshev * @brief Sets boot properties into DBUS object(s). 1541c21865c4SKonstantin Aladyshev * 1542c21865c4SKonstantin Aladyshev * @param[in] aResp Shared pointer for generating response message. 1543491d8ee7SSantosh Puranik * @param[in] bootSource The boot source to set. 1544491d8ee7SSantosh Puranik * 1545265c1602SJohnathan Mantey * @return Integer error code. 1546491d8ee7SSantosh Puranik */ 1547cd9a4666SKonstantin Aladyshev inline void setBootModeOrSource(const std::shared_ptr<bmcweb::AsyncResp>& aResp, 1548cd9a4666SKonstantin Aladyshev const std::optional<std::string>& bootSource) 1549491d8ee7SSantosh Puranik { 1550c21865c4SKonstantin Aladyshev std::string bootSourceStr; 1551c21865c4SKonstantin Aladyshev std::string bootModeStr; 1552944ffaf9SJohnathan Mantey 1553c21865c4SKonstantin Aladyshev if (!bootSource) 1554491d8ee7SSantosh Puranik { 1555c21865c4SKonstantin Aladyshev return; 1556c21865c4SKonstantin Aladyshev } 1557c21865c4SKonstantin Aladyshev 1558491d8ee7SSantosh Puranik // Source target specified 1559491d8ee7SSantosh Puranik BMCWEB_LOG_DEBUG << "Boot source: " << *bootSource; 1560491d8ee7SSantosh Puranik // Figure out which DBUS interface and property to use 1561e662eae8SEd Tanous if (assignBootParameters(aResp, *bootSource, bootSourceStr, bootModeStr) != 1562e662eae8SEd Tanous 0) 1563491d8ee7SSantosh Puranik { 1564944ffaf9SJohnathan Mantey BMCWEB_LOG_DEBUG 1565944ffaf9SJohnathan Mantey << "Invalid property value for BootSourceOverrideTarget: " 1566491d8ee7SSantosh Puranik << *bootSource; 1567491d8ee7SSantosh Puranik messages::propertyValueNotInList(aResp->res, *bootSource, 1568491d8ee7SSantosh Puranik "BootSourceTargetOverride"); 1569491d8ee7SSantosh Puranik return; 1570491d8ee7SSantosh Puranik } 1571491d8ee7SSantosh Puranik 1572944ffaf9SJohnathan Mantey // Act on validated parameters 1573944ffaf9SJohnathan Mantey BMCWEB_LOG_DEBUG << "DBUS boot source: " << bootSourceStr; 1574944ffaf9SJohnathan Mantey BMCWEB_LOG_DEBUG << "DBUS boot mode: " << bootModeStr; 1575944ffaf9SJohnathan Mantey 1576491d8ee7SSantosh Puranik crow::connections::systemBus->async_method_call( 1577491d8ee7SSantosh Puranik [aResp](const boost::system::error_code ec) { 1578491d8ee7SSantosh Puranik if (ec) 1579491d8ee7SSantosh Puranik { 1580491d8ee7SSantosh Puranik BMCWEB_LOG_DEBUG << "DBUS response error " << ec; 1581491d8ee7SSantosh Puranik messages::internalError(aResp->res); 1582491d8ee7SSantosh Puranik return; 1583491d8ee7SSantosh Puranik } 1584491d8ee7SSantosh Puranik BMCWEB_LOG_DEBUG << "Boot source update done."; 1585491d8ee7SSantosh Puranik }, 1586c21865c4SKonstantin Aladyshev "xyz.openbmc_project.Settings", 1587c21865c4SKonstantin Aladyshev "/xyz/openbmc_project/control/host0/boot", 1588491d8ee7SSantosh Puranik "org.freedesktop.DBus.Properties", "Set", 1589491d8ee7SSantosh Puranik "xyz.openbmc_project.Control.Boot.Source", "BootSource", 1590168e20c1SEd Tanous dbus::utility::DbusVariantType(bootSourceStr)); 1591944ffaf9SJohnathan Mantey 1592491d8ee7SSantosh Puranik crow::connections::systemBus->async_method_call( 1593491d8ee7SSantosh Puranik [aResp](const boost::system::error_code ec) { 1594491d8ee7SSantosh Puranik if (ec) 1595491d8ee7SSantosh Puranik { 1596491d8ee7SSantosh Puranik BMCWEB_LOG_DEBUG << "DBUS response error " << ec; 1597491d8ee7SSantosh Puranik messages::internalError(aResp->res); 1598491d8ee7SSantosh Puranik return; 1599491d8ee7SSantosh Puranik } 1600491d8ee7SSantosh Puranik BMCWEB_LOG_DEBUG << "Boot mode update done."; 1601491d8ee7SSantosh Puranik }, 1602c21865c4SKonstantin Aladyshev "xyz.openbmc_project.Settings", 1603c21865c4SKonstantin Aladyshev "/xyz/openbmc_project/control/host0/boot", 1604491d8ee7SSantosh Puranik "org.freedesktop.DBus.Properties", "Set", 1605491d8ee7SSantosh Puranik "xyz.openbmc_project.Control.Boot.Mode", "BootMode", 1606168e20c1SEd Tanous dbus::utility::DbusVariantType(bootModeStr)); 1607cd9a4666SKonstantin Aladyshev } 1608944ffaf9SJohnathan Mantey 1609cd9a4666SKonstantin Aladyshev /** 1610c21865c4SKonstantin Aladyshev * @brief Sets Boot source override properties. 1611491d8ee7SSantosh Puranik * 1612491d8ee7SSantosh Puranik * @param[in] aResp Shared pointer for generating response message. 1613491d8ee7SSantosh Puranik * @param[in] bootSource The boot source from incoming RF request. 1614cd9a4666SKonstantin Aladyshev * @param[in] bootType The boot type from incoming RF request. 1615491d8ee7SSantosh Puranik * @param[in] bootEnable The boot override enable from incoming RF request. 1616491d8ee7SSantosh Puranik * 1617265c1602SJohnathan Mantey * @return Integer error code. 1618491d8ee7SSantosh Puranik */ 1619c21865c4SKonstantin Aladyshev 1620c21865c4SKonstantin Aladyshev inline void setBootProperties(const std::shared_ptr<bmcweb::AsyncResp>& aResp, 1621c21865c4SKonstantin Aladyshev const std::optional<std::string>& bootSource, 1622c21865c4SKonstantin Aladyshev const std::optional<std::string>& bootType, 1623c21865c4SKonstantin Aladyshev const std::optional<std::string>& bootEnable) 1624491d8ee7SSantosh Puranik { 1625491d8ee7SSantosh Puranik BMCWEB_LOG_DEBUG << "Set boot information."; 1626491d8ee7SSantosh Puranik 1627c21865c4SKonstantin Aladyshev setBootModeOrSource(aResp, bootSource); 1628c21865c4SKonstantin Aladyshev setBootType(aResp, bootType); 1629c21865c4SKonstantin Aladyshev setBootEnable(aResp, bootEnable); 1630491d8ee7SSantosh Puranik } 1631491d8ee7SSantosh Puranik 1632c6a620f2SGeorge Liu /** 163398e386ecSGunnar Mills * @brief Sets AssetTag 163498e386ecSGunnar Mills * 163598e386ecSGunnar Mills * @param[in] aResp Shared pointer for generating response message. 163698e386ecSGunnar Mills * @param[in] assetTag "AssetTag" from request. 163798e386ecSGunnar Mills * 163898e386ecSGunnar Mills * @return None. 163998e386ecSGunnar Mills */ 16408d1b46d7Szhanghch05 inline void setAssetTag(const std::shared_ptr<bmcweb::AsyncResp>& aResp, 164198e386ecSGunnar Mills const std::string& assetTag) 164298e386ecSGunnar Mills { 164398e386ecSGunnar Mills crow::connections::systemBus->async_method_call( 1644*b9d36b47SEd Tanous [aResp, 1645*b9d36b47SEd Tanous assetTag](const boost::system::error_code ec, 1646*b9d36b47SEd Tanous const dbus::utility::MapperGetSubTreeResponse& subtree) { 164798e386ecSGunnar Mills if (ec) 164898e386ecSGunnar Mills { 164998e386ecSGunnar Mills BMCWEB_LOG_DEBUG << "D-Bus response error on GetSubTree " << ec; 165098e386ecSGunnar Mills messages::internalError(aResp->res); 165198e386ecSGunnar Mills return; 165298e386ecSGunnar Mills } 165326f6976fSEd Tanous if (subtree.empty()) 165498e386ecSGunnar Mills { 165598e386ecSGunnar Mills BMCWEB_LOG_DEBUG << "Can't find system D-Bus object!"; 165698e386ecSGunnar Mills messages::internalError(aResp->res); 165798e386ecSGunnar Mills return; 165898e386ecSGunnar Mills } 165998e386ecSGunnar Mills // Assume only 1 system D-Bus object 166098e386ecSGunnar Mills // Throw an error if there is more than 1 166198e386ecSGunnar Mills if (subtree.size() > 1) 166298e386ecSGunnar Mills { 166398e386ecSGunnar Mills BMCWEB_LOG_DEBUG << "Found more than 1 system D-Bus object!"; 166498e386ecSGunnar Mills messages::internalError(aResp->res); 166598e386ecSGunnar Mills return; 166698e386ecSGunnar Mills } 166798e386ecSGunnar Mills if (subtree[0].first.empty() || subtree[0].second.size() != 1) 166898e386ecSGunnar Mills { 166998e386ecSGunnar Mills BMCWEB_LOG_DEBUG << "Asset Tag Set mapper error!"; 167098e386ecSGunnar Mills messages::internalError(aResp->res); 167198e386ecSGunnar Mills return; 167298e386ecSGunnar Mills } 167398e386ecSGunnar Mills 167498e386ecSGunnar Mills const std::string& path = subtree[0].first; 167598e386ecSGunnar Mills const std::string& service = subtree[0].second.begin()->first; 167698e386ecSGunnar Mills 167798e386ecSGunnar Mills if (service.empty()) 167898e386ecSGunnar Mills { 167998e386ecSGunnar Mills BMCWEB_LOG_DEBUG << "Asset Tag Set service mapper error!"; 168098e386ecSGunnar Mills messages::internalError(aResp->res); 168198e386ecSGunnar Mills return; 168298e386ecSGunnar Mills } 168398e386ecSGunnar Mills 168498e386ecSGunnar Mills crow::connections::systemBus->async_method_call( 168598e386ecSGunnar Mills [aResp](const boost::system::error_code ec2) { 168698e386ecSGunnar Mills if (ec2) 168798e386ecSGunnar Mills { 168898e386ecSGunnar Mills BMCWEB_LOG_DEBUG 168998e386ecSGunnar Mills << "D-Bus response error on AssetTag Set " << ec2; 169098e386ecSGunnar Mills messages::internalError(aResp->res); 169198e386ecSGunnar Mills return; 169298e386ecSGunnar Mills } 169398e386ecSGunnar Mills }, 169498e386ecSGunnar Mills service, path, "org.freedesktop.DBus.Properties", "Set", 169598e386ecSGunnar Mills "xyz.openbmc_project.Inventory.Decorator.AssetTag", "AssetTag", 1696168e20c1SEd Tanous dbus::utility::DbusVariantType(assetTag)); 169798e386ecSGunnar Mills }, 169898e386ecSGunnar Mills "xyz.openbmc_project.ObjectMapper", 169998e386ecSGunnar Mills "/xyz/openbmc_project/object_mapper", 170098e386ecSGunnar Mills "xyz.openbmc_project.ObjectMapper", "GetSubTree", 170198e386ecSGunnar Mills "/xyz/openbmc_project/inventory", int32_t(0), 170298e386ecSGunnar Mills std::array<const char*, 1>{ 170398e386ecSGunnar Mills "xyz.openbmc_project.Inventory.Item.System"}); 170498e386ecSGunnar Mills } 170598e386ecSGunnar Mills 170698e386ecSGunnar Mills /** 170769f35306SGunnar Mills * @brief Sets automaticRetry (Auto Reboot) 170869f35306SGunnar Mills * 170969f35306SGunnar Mills * @param[in] aResp Shared pointer for generating response message. 171069f35306SGunnar Mills * @param[in] automaticRetryConfig "AutomaticRetryConfig" from request. 171169f35306SGunnar Mills * 171269f35306SGunnar Mills * @return None. 171369f35306SGunnar Mills */ 17148d1b46d7Szhanghch05 inline void setAutomaticRetry(const std::shared_ptr<bmcweb::AsyncResp>& aResp, 1715f23b7296SEd Tanous const std::string& automaticRetryConfig) 171669f35306SGunnar Mills { 171769f35306SGunnar Mills BMCWEB_LOG_DEBUG << "Set Automatic Retry."; 171869f35306SGunnar Mills 171969f35306SGunnar Mills // OpenBMC only supports "Disabled" and "RetryAttempts". 1720543f4400SEd Tanous bool autoRebootEnabled = false; 172169f35306SGunnar Mills 172269f35306SGunnar Mills if (automaticRetryConfig == "Disabled") 172369f35306SGunnar Mills { 172469f35306SGunnar Mills autoRebootEnabled = false; 172569f35306SGunnar Mills } 172669f35306SGunnar Mills else if (automaticRetryConfig == "RetryAttempts") 172769f35306SGunnar Mills { 172869f35306SGunnar Mills autoRebootEnabled = true; 172969f35306SGunnar Mills } 173069f35306SGunnar Mills else 173169f35306SGunnar Mills { 17320fda0f12SGeorge Liu BMCWEB_LOG_DEBUG << "Invalid property value for AutomaticRetryConfig: " 173369f35306SGunnar Mills << automaticRetryConfig; 173469f35306SGunnar Mills messages::propertyValueNotInList(aResp->res, automaticRetryConfig, 173569f35306SGunnar Mills "AutomaticRetryConfig"); 173669f35306SGunnar Mills return; 173769f35306SGunnar Mills } 173869f35306SGunnar Mills 173969f35306SGunnar Mills crow::connections::systemBus->async_method_call( 174069f35306SGunnar Mills [aResp](const boost::system::error_code ec) { 174169f35306SGunnar Mills if (ec) 174269f35306SGunnar Mills { 174369f35306SGunnar Mills messages::internalError(aResp->res); 174469f35306SGunnar Mills return; 174569f35306SGunnar Mills } 174669f35306SGunnar Mills }, 174769f35306SGunnar Mills "xyz.openbmc_project.Settings", 174869f35306SGunnar Mills "/xyz/openbmc_project/control/host0/auto_reboot", 174969f35306SGunnar Mills "org.freedesktop.DBus.Properties", "Set", 175069f35306SGunnar Mills "xyz.openbmc_project.Control.Boot.RebootPolicy", "AutoReboot", 1751168e20c1SEd Tanous dbus::utility::DbusVariantType(autoRebootEnabled)); 175269f35306SGunnar Mills } 175369f35306SGunnar Mills 175469f35306SGunnar Mills /** 1755c6a620f2SGeorge Liu * @brief Sets power restore policy properties. 1756c6a620f2SGeorge Liu * 1757c6a620f2SGeorge Liu * @param[in] aResp Shared pointer for generating response message. 1758c6a620f2SGeorge Liu * @param[in] policy power restore policy properties from request. 1759c6a620f2SGeorge Liu * 1760c6a620f2SGeorge Liu * @return None. 1761c6a620f2SGeorge Liu */ 17628d1b46d7Szhanghch05 inline void 17638d1b46d7Szhanghch05 setPowerRestorePolicy(const std::shared_ptr<bmcweb::AsyncResp>& aResp, 17644e69c904SGunnar Mills const std::string& policy) 1765c6a620f2SGeorge Liu { 1766c6a620f2SGeorge Liu BMCWEB_LOG_DEBUG << "Set power restore policy."; 1767c6a620f2SGeorge Liu 1768c6a620f2SGeorge Liu const boost::container::flat_map<std::string, std::string> policyMaps = { 17690fda0f12SGeorge Liu {"AlwaysOn", 17700fda0f12SGeorge Liu "xyz.openbmc_project.Control.Power.RestorePolicy.Policy.AlwaysOn"}, 17710fda0f12SGeorge Liu {"AlwaysOff", 17720fda0f12SGeorge Liu "xyz.openbmc_project.Control.Power.RestorePolicy.Policy.AlwaysOff"}, 17730fda0f12SGeorge Liu {"LastState", 17740fda0f12SGeorge Liu "xyz.openbmc_project.Control.Power.RestorePolicy.Policy.Restore"}}; 1775c6a620f2SGeorge Liu 1776c6a620f2SGeorge Liu std::string powerRestorPolicy; 1777c6a620f2SGeorge Liu 17784e69c904SGunnar Mills auto policyMapsIt = policyMaps.find(policy); 1779c6a620f2SGeorge Liu if (policyMapsIt == policyMaps.end()) 1780c6a620f2SGeorge Liu { 17814e69c904SGunnar Mills messages::propertyValueNotInList(aResp->res, policy, 17824e69c904SGunnar Mills "PowerRestorePolicy"); 1783c6a620f2SGeorge Liu return; 1784c6a620f2SGeorge Liu } 1785c6a620f2SGeorge Liu 1786c6a620f2SGeorge Liu powerRestorPolicy = policyMapsIt->second; 1787c6a620f2SGeorge Liu 1788c6a620f2SGeorge Liu crow::connections::systemBus->async_method_call( 1789c6a620f2SGeorge Liu [aResp](const boost::system::error_code ec) { 1790c6a620f2SGeorge Liu if (ec) 1791c6a620f2SGeorge Liu { 1792c6a620f2SGeorge Liu messages::internalError(aResp->res); 1793c6a620f2SGeorge Liu return; 1794c6a620f2SGeorge Liu } 1795c6a620f2SGeorge Liu }, 1796c6a620f2SGeorge Liu "xyz.openbmc_project.Settings", 1797c6a620f2SGeorge Liu "/xyz/openbmc_project/control/host0/power_restore_policy", 1798c6a620f2SGeorge Liu "org.freedesktop.DBus.Properties", "Set", 1799c6a620f2SGeorge Liu "xyz.openbmc_project.Control.Power.RestorePolicy", "PowerRestorePolicy", 1800168e20c1SEd Tanous dbus::utility::DbusVariantType(powerRestorPolicy)); 1801c6a620f2SGeorge Liu } 1802c6a620f2SGeorge Liu 1803a6349918SAppaRao Puli #ifdef BMCWEB_ENABLE_REDFISH_PROVISIONING_FEATURE 1804a6349918SAppaRao Puli /** 1805a6349918SAppaRao Puli * @brief Retrieves provisioning status 1806a6349918SAppaRao Puli * 1807a6349918SAppaRao Puli * @param[in] aResp Shared pointer for completing asynchronous calls. 1808a6349918SAppaRao Puli * 1809a6349918SAppaRao Puli * @return None. 1810a6349918SAppaRao Puli */ 18118d1b46d7Szhanghch05 inline void getProvisioningStatus(std::shared_ptr<bmcweb::AsyncResp> aResp) 1812a6349918SAppaRao Puli { 1813a6349918SAppaRao Puli BMCWEB_LOG_DEBUG << "Get OEM information."; 1814a6349918SAppaRao Puli crow::connections::systemBus->async_method_call( 1815a6349918SAppaRao Puli [aResp](const boost::system::error_code ec, 1816*b9d36b47SEd Tanous const dbus::utility::DBusPropertiesMap& propertiesList) { 1817b99fb1a9SAppaRao Puli nlohmann::json& oemPFR = 1818b99fb1a9SAppaRao Puli aResp->res.jsonValue["Oem"]["OpenBmc"]["FirmwareProvisioning"]; 181950626f4fSJames Feist aResp->res.jsonValue["Oem"]["OpenBmc"]["@odata.type"] = 182050626f4fSJames Feist "#OemComputerSystem.OpenBmc"; 182150626f4fSJames Feist oemPFR["@odata.type"] = "#OemComputerSystem.FirmwareProvisioning"; 182250626f4fSJames Feist 1823a6349918SAppaRao Puli if (ec) 1824a6349918SAppaRao Puli { 1825a6349918SAppaRao Puli BMCWEB_LOG_DEBUG << "DBUS response error " << ec; 1826b99fb1a9SAppaRao Puli // not an error, don't have to have the interface 1827b99fb1a9SAppaRao Puli oemPFR["ProvisioningStatus"] = "NotProvisioned"; 1828a6349918SAppaRao Puli return; 1829a6349918SAppaRao Puli } 1830a6349918SAppaRao Puli 1831a6349918SAppaRao Puli const bool* provState = nullptr; 1832a6349918SAppaRao Puli const bool* lockState = nullptr; 18336e3b67ecSAppaRao Puli for (const std::pair<std::string, dbus::utility::DbusVariantType>& 18346e3b67ecSAppaRao Puli property : propertiesList) 1835a6349918SAppaRao Puli { 1836a6349918SAppaRao Puli if (property.first == "UfmProvisioned") 1837a6349918SAppaRao Puli { 1838a6349918SAppaRao Puli provState = std::get_if<bool>(&property.second); 1839a6349918SAppaRao Puli } 1840a6349918SAppaRao Puli else if (property.first == "UfmLocked") 1841a6349918SAppaRao Puli { 1842a6349918SAppaRao Puli lockState = std::get_if<bool>(&property.second); 1843a6349918SAppaRao Puli } 1844a6349918SAppaRao Puli } 1845a6349918SAppaRao Puli 1846a6349918SAppaRao Puli if ((provState == nullptr) || (lockState == nullptr)) 1847a6349918SAppaRao Puli { 1848a6349918SAppaRao Puli BMCWEB_LOG_DEBUG << "Unable to get PFR attributes."; 1849a6349918SAppaRao Puli messages::internalError(aResp->res); 1850a6349918SAppaRao Puli return; 1851a6349918SAppaRao Puli } 1852a6349918SAppaRao Puli 1853a6349918SAppaRao Puli if (*provState == true) 1854a6349918SAppaRao Puli { 1855a6349918SAppaRao Puli if (*lockState == true) 1856a6349918SAppaRao Puli { 1857a6349918SAppaRao Puli oemPFR["ProvisioningStatus"] = "ProvisionedAndLocked"; 1858a6349918SAppaRao Puli } 1859a6349918SAppaRao Puli else 1860a6349918SAppaRao Puli { 1861a6349918SAppaRao Puli oemPFR["ProvisioningStatus"] = "ProvisionedButNotLocked"; 1862a6349918SAppaRao Puli } 1863a6349918SAppaRao Puli } 1864a6349918SAppaRao Puli else 1865a6349918SAppaRao Puli { 1866a6349918SAppaRao Puli oemPFR["ProvisioningStatus"] = "NotProvisioned"; 1867a6349918SAppaRao Puli } 1868a6349918SAppaRao Puli }, 1869a6349918SAppaRao Puli "xyz.openbmc_project.PFR.Manager", "/xyz/openbmc_project/pfr", 1870a6349918SAppaRao Puli "org.freedesktop.DBus.Properties", "GetAll", 1871a6349918SAppaRao Puli "xyz.openbmc_project.PFR.Attributes"); 1872a6349918SAppaRao Puli } 1873a6349918SAppaRao Puli #endif 1874a6349918SAppaRao Puli 1875491d8ee7SSantosh Puranik /** 18763a2d0424SChris Cain * @brief Translate the PowerMode to a response message. 18773a2d0424SChris Cain * 18783a2d0424SChris Cain * @param[in] aResp Shared pointer for generating response message. 18793a2d0424SChris Cain * @param[in] modeValue PowerMode value to be translated 18803a2d0424SChris Cain * 18813a2d0424SChris Cain * @return None. 18823a2d0424SChris Cain */ 18833a2d0424SChris Cain inline void translatePowerMode(const std::shared_ptr<bmcweb::AsyncResp>& aResp, 18843a2d0424SChris Cain const std::string& modeValue) 18853a2d0424SChris Cain { 18863a2d0424SChris Cain std::string modeString; 18873a2d0424SChris Cain 18880fda0f12SGeorge Liu if (modeValue == "xyz.openbmc_project.Control.Power.Mode.PowerMode.Static") 18893a2d0424SChris Cain { 18903a2d0424SChris Cain aResp->res.jsonValue["PowerMode"] = "Static"; 18913a2d0424SChris Cain } 18920fda0f12SGeorge Liu else if ( 18930fda0f12SGeorge Liu modeValue == 18940fda0f12SGeorge Liu "xyz.openbmc_project.Control.Power.Mode.PowerMode.MaximumPerformance") 18953a2d0424SChris Cain { 18963a2d0424SChris Cain aResp->res.jsonValue["PowerMode"] = "MaximumPerformance"; 18973a2d0424SChris Cain } 18980fda0f12SGeorge Liu else if (modeValue == 18990fda0f12SGeorge Liu "xyz.openbmc_project.Control.Power.Mode.PowerMode.PowerSaving") 19003a2d0424SChris Cain { 19013a2d0424SChris Cain aResp->res.jsonValue["PowerMode"] = "PowerSaving"; 19023a2d0424SChris Cain } 19030fda0f12SGeorge Liu else if (modeValue == 19040fda0f12SGeorge Liu "xyz.openbmc_project.Control.Power.Mode.PowerMode.OEM") 19053a2d0424SChris Cain { 19063a2d0424SChris Cain aResp->res.jsonValue["PowerMode"] = "OEM"; 19073a2d0424SChris Cain } 19083a2d0424SChris Cain else 19093a2d0424SChris Cain { 19103a2d0424SChris Cain // Any other values would be invalid 19113a2d0424SChris Cain BMCWEB_LOG_DEBUG << "PowerMode value was not valid: " << modeValue; 19123a2d0424SChris Cain messages::internalError(aResp->res); 19133a2d0424SChris Cain } 19143a2d0424SChris Cain } 19153a2d0424SChris Cain 19163a2d0424SChris Cain /** 19173a2d0424SChris Cain * @brief Retrieves system power mode 19183a2d0424SChris Cain * 19193a2d0424SChris Cain * @param[in] aResp Shared pointer for generating response message. 19203a2d0424SChris Cain * 19213a2d0424SChris Cain * @return None. 19223a2d0424SChris Cain */ 19233a2d0424SChris Cain inline void getPowerMode(const std::shared_ptr<bmcweb::AsyncResp>& aResp) 19243a2d0424SChris Cain { 19253a2d0424SChris Cain BMCWEB_LOG_DEBUG << "Get power mode."; 19263a2d0424SChris Cain 19273a2d0424SChris Cain // Get Power Mode object path: 19283a2d0424SChris Cain crow::connections::systemBus->async_method_call( 1929*b9d36b47SEd Tanous [aResp](const boost::system::error_code ec, 1930*b9d36b47SEd Tanous const dbus::utility::MapperGetSubTreeResponse& subtree) { 19313a2d0424SChris Cain if (ec) 19323a2d0424SChris Cain { 19333a2d0424SChris Cain BMCWEB_LOG_DEBUG 19343a2d0424SChris Cain << "DBUS response error on Power.Mode GetSubTree " << ec; 19353a2d0424SChris Cain // This is an optional D-Bus object so just return if 19363a2d0424SChris Cain // error occurs 19373a2d0424SChris Cain return; 19383a2d0424SChris Cain } 19393a2d0424SChris Cain if (subtree.empty()) 19403a2d0424SChris Cain { 19413a2d0424SChris Cain // As noted above, this is an optional interface so just return 19423a2d0424SChris Cain // if there is no instance found 19433a2d0424SChris Cain return; 19443a2d0424SChris Cain } 19453a2d0424SChris Cain if (subtree.size() > 1) 19463a2d0424SChris Cain { 19473a2d0424SChris Cain // More then one PowerMode object is not supported and is an 19483a2d0424SChris Cain // error 19493a2d0424SChris Cain BMCWEB_LOG_DEBUG 19503a2d0424SChris Cain << "Found more than 1 system D-Bus Power.Mode objects: " 19513a2d0424SChris Cain << subtree.size(); 19523a2d0424SChris Cain messages::internalError(aResp->res); 19533a2d0424SChris Cain return; 19543a2d0424SChris Cain } 19553a2d0424SChris Cain if ((subtree[0].first.empty()) || (subtree[0].second.size() != 1)) 19563a2d0424SChris Cain { 19573a2d0424SChris Cain BMCWEB_LOG_DEBUG << "Power.Mode mapper error!"; 19583a2d0424SChris Cain messages::internalError(aResp->res); 19593a2d0424SChris Cain return; 19603a2d0424SChris Cain } 19613a2d0424SChris Cain const std::string& path = subtree[0].first; 19623a2d0424SChris Cain const std::string& service = subtree[0].second.begin()->first; 19633a2d0424SChris Cain if (service.empty()) 19643a2d0424SChris Cain { 19653a2d0424SChris Cain BMCWEB_LOG_DEBUG << "Power.Mode service mapper error!"; 19663a2d0424SChris Cain messages::internalError(aResp->res); 19673a2d0424SChris Cain return; 19683a2d0424SChris Cain } 19693a2d0424SChris Cain // Valid Power Mode object found, now read the current value 19701e1e598dSJonathan Doman sdbusplus::asio::getProperty<std::string>( 19711e1e598dSJonathan Doman *crow::connections::systemBus, service, path, 19721e1e598dSJonathan Doman "xyz.openbmc_project.Control.Power.Mode", "PowerMode", 19733a2d0424SChris Cain [aResp](const boost::system::error_code ec, 19741e1e598dSJonathan Doman const std::string& pmode) { 19753a2d0424SChris Cain if (ec) 19763a2d0424SChris Cain { 19773a2d0424SChris Cain BMCWEB_LOG_DEBUG 19783a2d0424SChris Cain << "DBUS response error on PowerMode Get: " << ec; 19793a2d0424SChris Cain messages::internalError(aResp->res); 19803a2d0424SChris Cain return; 19813a2d0424SChris Cain } 19823a2d0424SChris Cain 19833a2d0424SChris Cain aResp->res.jsonValue["PowerMode@Redfish.AllowableValues"] = 19843a2d0424SChris Cain {"Static", "MaximumPerformance", "PowerSaving"}; 19853a2d0424SChris Cain 19861e1e598dSJonathan Doman BMCWEB_LOG_DEBUG << "Current power mode: " << pmode; 19871e1e598dSJonathan Doman translatePowerMode(aResp, pmode); 19881e1e598dSJonathan Doman }); 19893a2d0424SChris Cain }, 19903a2d0424SChris Cain "xyz.openbmc_project.ObjectMapper", 19913a2d0424SChris Cain "/xyz/openbmc_project/object_mapper", 19923a2d0424SChris Cain "xyz.openbmc_project.ObjectMapper", "GetSubTree", "/", int32_t(0), 19933a2d0424SChris Cain std::array<const char*, 1>{"xyz.openbmc_project.Control.Power.Mode"}); 19943a2d0424SChris Cain } 19953a2d0424SChris Cain 19963a2d0424SChris Cain /** 19973a2d0424SChris Cain * @brief Validate the specified mode is valid and return the PowerMode 19983a2d0424SChris Cain * name associated with that string 19993a2d0424SChris Cain * 20003a2d0424SChris Cain * @param[in] aResp Shared pointer for generating response message. 20013a2d0424SChris Cain * @param[in] modeString String representing the desired PowerMode 20023a2d0424SChris Cain * 20033a2d0424SChris Cain * @return PowerMode value or empty string if mode is not valid 20043a2d0424SChris Cain */ 20053a2d0424SChris Cain inline std::string 20063a2d0424SChris Cain validatePowerMode(const std::shared_ptr<bmcweb::AsyncResp>& aResp, 20073a2d0424SChris Cain const std::string& modeString) 20083a2d0424SChris Cain { 20093a2d0424SChris Cain std::string mode; 20103a2d0424SChris Cain 20113a2d0424SChris Cain if (modeString == "Static") 20123a2d0424SChris Cain { 20133a2d0424SChris Cain mode = "xyz.openbmc_project.Control.Power.Mode.PowerMode.Static"; 20143a2d0424SChris Cain } 20153a2d0424SChris Cain else if (modeString == "MaximumPerformance") 20163a2d0424SChris Cain { 20170fda0f12SGeorge Liu mode = 20180fda0f12SGeorge Liu "xyz.openbmc_project.Control.Power.Mode.PowerMode.MaximumPerformance"; 20193a2d0424SChris Cain } 20203a2d0424SChris Cain else if (modeString == "PowerSaving") 20213a2d0424SChris Cain { 20223a2d0424SChris Cain mode = "xyz.openbmc_project.Control.Power.Mode.PowerMode.PowerSaving"; 20233a2d0424SChris Cain } 20243a2d0424SChris Cain else 20253a2d0424SChris Cain { 20263a2d0424SChris Cain messages::propertyValueNotInList(aResp->res, modeString, "PowerMode"); 20273a2d0424SChris Cain } 20283a2d0424SChris Cain return mode; 20293a2d0424SChris Cain } 20303a2d0424SChris Cain 20313a2d0424SChris Cain /** 20323a2d0424SChris Cain * @brief Sets system power mode. 20333a2d0424SChris Cain * 20343a2d0424SChris Cain * @param[in] aResp Shared pointer for generating response message. 20353a2d0424SChris Cain * @param[in] pmode System power mode from request. 20363a2d0424SChris Cain * 20373a2d0424SChris Cain * @return None. 20383a2d0424SChris Cain */ 20393a2d0424SChris Cain inline void setPowerMode(const std::shared_ptr<bmcweb::AsyncResp>& aResp, 20403a2d0424SChris Cain const std::string& pmode) 20413a2d0424SChris Cain { 20423a2d0424SChris Cain BMCWEB_LOG_DEBUG << "Set power mode."; 20433a2d0424SChris Cain 20443a2d0424SChris Cain std::string powerMode = validatePowerMode(aResp, pmode); 20453a2d0424SChris Cain if (powerMode.empty()) 20463a2d0424SChris Cain { 20473a2d0424SChris Cain return; 20483a2d0424SChris Cain } 20493a2d0424SChris Cain 20503a2d0424SChris Cain // Get Power Mode object path: 20513a2d0424SChris Cain crow::connections::systemBus->async_method_call( 2052*b9d36b47SEd Tanous [aResp, 2053*b9d36b47SEd Tanous powerMode](const boost::system::error_code ec, 2054*b9d36b47SEd Tanous const dbus::utility::MapperGetSubTreeResponse& subtree) { 20553a2d0424SChris Cain if (ec) 20563a2d0424SChris Cain { 20573a2d0424SChris Cain BMCWEB_LOG_DEBUG 20583a2d0424SChris Cain << "DBUS response error on Power.Mode GetSubTree " << ec; 20593a2d0424SChris Cain // This is an optional D-Bus object, but user attempted to patch 20603a2d0424SChris Cain messages::internalError(aResp->res); 20613a2d0424SChris Cain return; 20623a2d0424SChris Cain } 20633a2d0424SChris Cain if (subtree.empty()) 20643a2d0424SChris Cain { 20653a2d0424SChris Cain // This is an optional D-Bus object, but user attempted to patch 20663a2d0424SChris Cain messages::resourceNotFound(aResp->res, "ComputerSystem", 20673a2d0424SChris Cain "PowerMode"); 20683a2d0424SChris Cain return; 20693a2d0424SChris Cain } 20703a2d0424SChris Cain if (subtree.size() > 1) 20713a2d0424SChris Cain { 20723a2d0424SChris Cain // More then one PowerMode object is not supported and is an 20733a2d0424SChris Cain // error 20743a2d0424SChris Cain BMCWEB_LOG_DEBUG 20753a2d0424SChris Cain << "Found more than 1 system D-Bus Power.Mode objects: " 20763a2d0424SChris Cain << subtree.size(); 20773a2d0424SChris Cain messages::internalError(aResp->res); 20783a2d0424SChris Cain return; 20793a2d0424SChris Cain } 20803a2d0424SChris Cain if ((subtree[0].first.empty()) || (subtree[0].second.size() != 1)) 20813a2d0424SChris Cain { 20823a2d0424SChris Cain BMCWEB_LOG_DEBUG << "Power.Mode mapper error!"; 20833a2d0424SChris Cain messages::internalError(aResp->res); 20843a2d0424SChris Cain return; 20853a2d0424SChris Cain } 20863a2d0424SChris Cain const std::string& path = subtree[0].first; 20873a2d0424SChris Cain const std::string& service = subtree[0].second.begin()->first; 20883a2d0424SChris Cain if (service.empty()) 20893a2d0424SChris Cain { 20903a2d0424SChris Cain BMCWEB_LOG_DEBUG << "Power.Mode service mapper error!"; 20913a2d0424SChris Cain messages::internalError(aResp->res); 20923a2d0424SChris Cain return; 20933a2d0424SChris Cain } 20943a2d0424SChris Cain 20953a2d0424SChris Cain BMCWEB_LOG_DEBUG << "Setting power mode(" << powerMode << ") -> " 20963a2d0424SChris Cain << path; 20973a2d0424SChris Cain 20983a2d0424SChris Cain // Set the Power Mode property 20993a2d0424SChris Cain crow::connections::systemBus->async_method_call( 21003a2d0424SChris Cain [aResp](const boost::system::error_code ec) { 21013a2d0424SChris Cain if (ec) 21023a2d0424SChris Cain { 21033a2d0424SChris Cain messages::internalError(aResp->res); 21043a2d0424SChris Cain return; 21053a2d0424SChris Cain } 21063a2d0424SChris Cain }, 21073a2d0424SChris Cain service, path, "org.freedesktop.DBus.Properties", "Set", 21083a2d0424SChris Cain "xyz.openbmc_project.Control.Power.Mode", "PowerMode", 2109168e20c1SEd Tanous dbus::utility::DbusVariantType(powerMode)); 21103a2d0424SChris Cain }, 21113a2d0424SChris Cain "xyz.openbmc_project.ObjectMapper", 21123a2d0424SChris Cain "/xyz/openbmc_project/object_mapper", 21133a2d0424SChris Cain "xyz.openbmc_project.ObjectMapper", "GetSubTree", "/", int32_t(0), 21143a2d0424SChris Cain std::array<const char*, 1>{"xyz.openbmc_project.Control.Power.Mode"}); 21153a2d0424SChris Cain } 21163a2d0424SChris Cain 21173a2d0424SChris Cain /** 211851709ffdSYong Li * @brief Translates watchdog timeout action DBUS property value to redfish. 211951709ffdSYong Li * 212051709ffdSYong Li * @param[in] dbusAction The watchdog timeout action in D-BUS. 212151709ffdSYong Li * 212251709ffdSYong Li * @return Returns as a string, the timeout action in Redfish terms. If 212351709ffdSYong Li * translation cannot be done, returns an empty string. 212451709ffdSYong Li */ 212523a21a1cSEd Tanous inline std::string dbusToRfWatchdogAction(const std::string& dbusAction) 212651709ffdSYong Li { 212751709ffdSYong Li if (dbusAction == "xyz.openbmc_project.State.Watchdog.Action.None") 212851709ffdSYong Li { 212951709ffdSYong Li return "None"; 213051709ffdSYong Li } 21313174e4dfSEd Tanous if (dbusAction == "xyz.openbmc_project.State.Watchdog.Action.HardReset") 213251709ffdSYong Li { 213351709ffdSYong Li return "ResetSystem"; 213451709ffdSYong Li } 21353174e4dfSEd Tanous if (dbusAction == "xyz.openbmc_project.State.Watchdog.Action.PowerOff") 213651709ffdSYong Li { 213751709ffdSYong Li return "PowerDown"; 213851709ffdSYong Li } 21393174e4dfSEd Tanous if (dbusAction == "xyz.openbmc_project.State.Watchdog.Action.PowerCycle") 214051709ffdSYong Li { 214151709ffdSYong Li return "PowerCycle"; 214251709ffdSYong Li } 214351709ffdSYong Li 214451709ffdSYong Li return ""; 214551709ffdSYong Li } 214651709ffdSYong Li 214751709ffdSYong Li /** 2148c45f0082SYong Li *@brief Translates timeout action from Redfish to DBUS property value. 2149c45f0082SYong Li * 2150c45f0082SYong Li *@param[in] rfAction The timeout action in Redfish. 2151c45f0082SYong Li * 2152c45f0082SYong Li *@return Returns as a string, the time_out action as expected by DBUS. 2153c45f0082SYong Li *If translation cannot be done, returns an empty string. 2154c45f0082SYong Li */ 2155c45f0082SYong Li 215623a21a1cSEd Tanous inline std::string rfToDbusWDTTimeOutAct(const std::string& rfAction) 2157c45f0082SYong Li { 2158c45f0082SYong Li if (rfAction == "None") 2159c45f0082SYong Li { 2160c45f0082SYong Li return "xyz.openbmc_project.State.Watchdog.Action.None"; 2161c45f0082SYong Li } 21623174e4dfSEd Tanous if (rfAction == "PowerCycle") 2163c45f0082SYong Li { 2164c45f0082SYong Li return "xyz.openbmc_project.State.Watchdog.Action.PowerCycle"; 2165c45f0082SYong Li } 21663174e4dfSEd Tanous if (rfAction == "PowerDown") 2167c45f0082SYong Li { 2168c45f0082SYong Li return "xyz.openbmc_project.State.Watchdog.Action.PowerOff"; 2169c45f0082SYong Li } 21703174e4dfSEd Tanous if (rfAction == "ResetSystem") 2171c45f0082SYong Li { 2172c45f0082SYong Li return "xyz.openbmc_project.State.Watchdog.Action.HardReset"; 2173c45f0082SYong Li } 2174c45f0082SYong Li 2175c45f0082SYong Li return ""; 2176c45f0082SYong Li } 2177c45f0082SYong Li 2178c45f0082SYong Li /** 217951709ffdSYong Li * @brief Retrieves host watchdog timer properties over DBUS 218051709ffdSYong Li * 218151709ffdSYong Li * @param[in] aResp Shared pointer for completing asynchronous calls. 218251709ffdSYong Li * 218351709ffdSYong Li * @return None. 218451709ffdSYong Li */ 21858d1b46d7Szhanghch05 inline void 21868d1b46d7Szhanghch05 getHostWatchdogTimer(const std::shared_ptr<bmcweb::AsyncResp>& aResp) 218751709ffdSYong Li { 218851709ffdSYong Li BMCWEB_LOG_DEBUG << "Get host watchodg"; 218951709ffdSYong Li crow::connections::systemBus->async_method_call( 219051709ffdSYong Li [aResp](const boost::system::error_code ec, 2191*b9d36b47SEd Tanous const dbus::utility::DBusPropertiesMap& properties) { 219251709ffdSYong Li if (ec) 219351709ffdSYong Li { 219451709ffdSYong Li // watchdog service is stopped 219551709ffdSYong Li BMCWEB_LOG_DEBUG << "DBUS response error " << ec; 219651709ffdSYong Li return; 219751709ffdSYong Li } 219851709ffdSYong Li 219951709ffdSYong Li BMCWEB_LOG_DEBUG << "Got " << properties.size() << " wdt prop."; 220051709ffdSYong Li 220151709ffdSYong Li nlohmann::json& hostWatchdogTimer = 220251709ffdSYong Li aResp->res.jsonValue["HostWatchdogTimer"]; 220351709ffdSYong Li 220451709ffdSYong Li // watchdog service is running/enabled 220551709ffdSYong Li hostWatchdogTimer["Status"]["State"] = "Enabled"; 220651709ffdSYong Li 220751709ffdSYong Li for (const auto& property : properties) 220851709ffdSYong Li { 220951709ffdSYong Li BMCWEB_LOG_DEBUG << "prop=" << property.first; 221051709ffdSYong Li if (property.first == "Enabled") 221151709ffdSYong Li { 221251709ffdSYong Li const bool* state = std::get_if<bool>(&property.second); 221351709ffdSYong Li 2214e662eae8SEd Tanous if (state == nullptr) 221551709ffdSYong Li { 221651709ffdSYong Li messages::internalError(aResp->res); 2217601af5edSChicago Duan return; 221851709ffdSYong Li } 221951709ffdSYong Li 222051709ffdSYong Li hostWatchdogTimer["FunctionEnabled"] = *state; 222151709ffdSYong Li } 222251709ffdSYong Li else if (property.first == "ExpireAction") 222351709ffdSYong Li { 222451709ffdSYong Li const std::string* s = 222551709ffdSYong Li std::get_if<std::string>(&property.second); 2226e662eae8SEd Tanous if (s == nullptr) 222751709ffdSYong Li { 222851709ffdSYong Li messages::internalError(aResp->res); 2229601af5edSChicago Duan return; 223051709ffdSYong Li } 223151709ffdSYong Li 223251709ffdSYong Li std::string action = dbusToRfWatchdogAction(*s); 223351709ffdSYong Li if (action.empty()) 223451709ffdSYong Li { 223551709ffdSYong Li messages::internalError(aResp->res); 2236601af5edSChicago Duan return; 223751709ffdSYong Li } 223851709ffdSYong Li hostWatchdogTimer["TimeoutAction"] = action; 223951709ffdSYong Li } 224051709ffdSYong Li } 224151709ffdSYong Li }, 224251709ffdSYong Li "xyz.openbmc_project.Watchdog", "/xyz/openbmc_project/watchdog/host0", 224351709ffdSYong Li "org.freedesktop.DBus.Properties", "GetAll", 224451709ffdSYong Li "xyz.openbmc_project.State.Watchdog"); 224551709ffdSYong Li } 224651709ffdSYong Li 224751709ffdSYong Li /** 2248c45f0082SYong Li * @brief Sets Host WatchDog Timer properties. 2249c45f0082SYong Li * 2250c45f0082SYong Li * @param[in] aResp Shared pointer for generating response message. 2251c45f0082SYong Li * @param[in] wdtEnable The WDTimer Enable value (true/false) from incoming 2252c45f0082SYong Li * RF request. 2253c45f0082SYong Li * @param[in] wdtTimeOutAction The WDT Timeout action, from incoming RF request. 2254c45f0082SYong Li * 2255c45f0082SYong Li * @return None. 2256c45f0082SYong Li */ 22578d1b46d7Szhanghch05 inline void setWDTProperties(const std::shared_ptr<bmcweb::AsyncResp>& aResp, 2258c45f0082SYong Li const std::optional<bool> wdtEnable, 2259c45f0082SYong Li const std::optional<std::string>& wdtTimeOutAction) 2260c45f0082SYong Li { 2261c45f0082SYong Li BMCWEB_LOG_DEBUG << "Set host watchdog"; 2262c45f0082SYong Li 2263c45f0082SYong Li if (wdtTimeOutAction) 2264c45f0082SYong Li { 2265c45f0082SYong Li std::string wdtTimeOutActStr = rfToDbusWDTTimeOutAct(*wdtTimeOutAction); 2266c45f0082SYong Li // check if TimeOut Action is Valid 2267c45f0082SYong Li if (wdtTimeOutActStr.empty()) 2268c45f0082SYong Li { 2269c45f0082SYong Li BMCWEB_LOG_DEBUG << "Unsupported value for TimeoutAction: " 2270c45f0082SYong Li << *wdtTimeOutAction; 2271c45f0082SYong Li messages::propertyValueNotInList(aResp->res, *wdtTimeOutAction, 2272c45f0082SYong Li "TimeoutAction"); 2273c45f0082SYong Li return; 2274c45f0082SYong Li } 2275c45f0082SYong Li 2276c45f0082SYong Li crow::connections::systemBus->async_method_call( 2277c45f0082SYong Li [aResp](const boost::system::error_code ec) { 2278c45f0082SYong Li if (ec) 2279c45f0082SYong Li { 2280c45f0082SYong Li BMCWEB_LOG_DEBUG << "DBUS response error " << ec; 2281c45f0082SYong Li messages::internalError(aResp->res); 2282c45f0082SYong Li return; 2283c45f0082SYong Li } 2284c45f0082SYong Li }, 2285c45f0082SYong Li "xyz.openbmc_project.Watchdog", 2286c45f0082SYong Li "/xyz/openbmc_project/watchdog/host0", 2287c45f0082SYong Li "org.freedesktop.DBus.Properties", "Set", 2288c45f0082SYong Li "xyz.openbmc_project.State.Watchdog", "ExpireAction", 2289168e20c1SEd Tanous dbus::utility::DbusVariantType(wdtTimeOutActStr)); 2290c45f0082SYong Li } 2291c45f0082SYong Li 2292c45f0082SYong Li if (wdtEnable) 2293c45f0082SYong Li { 2294c45f0082SYong Li crow::connections::systemBus->async_method_call( 2295c45f0082SYong Li [aResp](const boost::system::error_code ec) { 2296c45f0082SYong Li if (ec) 2297c45f0082SYong Li { 2298c45f0082SYong Li BMCWEB_LOG_DEBUG << "DBUS response error " << ec; 2299c45f0082SYong Li messages::internalError(aResp->res); 2300c45f0082SYong Li return; 2301c45f0082SYong Li } 2302c45f0082SYong Li }, 2303c45f0082SYong Li "xyz.openbmc_project.Watchdog", 2304c45f0082SYong Li "/xyz/openbmc_project/watchdog/host0", 2305c45f0082SYong Li "org.freedesktop.DBus.Properties", "Set", 2306c45f0082SYong Li "xyz.openbmc_project.State.Watchdog", "Enabled", 2307168e20c1SEd Tanous dbus::utility::DbusVariantType(*wdtEnable)); 2308c45f0082SYong Li } 2309c45f0082SYong Li } 2310c45f0082SYong Li 231137bbf98cSChris Cain using ipsPropertiesType = 231237bbf98cSChris Cain std::vector<std::pair<std::string, dbus::utility::DbusVariantType>>; 231337bbf98cSChris Cain /** 231437bbf98cSChris Cain * @brief Parse the Idle Power Saver properties into json 231537bbf98cSChris Cain * 231637bbf98cSChris Cain * @param[in] aResp Shared pointer for completing asynchronous calls. 231737bbf98cSChris Cain * @param[in] properties IPS property data from DBus. 231837bbf98cSChris Cain * 231937bbf98cSChris Cain * @return true if successful 232037bbf98cSChris Cain */ 2321f6674220SEd Tanous inline bool parseIpsProperties(const std::shared_ptr<bmcweb::AsyncResp>& aResp, 232237bbf98cSChris Cain ipsPropertiesType& properties) 232337bbf98cSChris Cain { 232437bbf98cSChris Cain for (const auto& property : properties) 232537bbf98cSChris Cain { 232637bbf98cSChris Cain if (property.first == "Enabled") 232737bbf98cSChris Cain { 232837bbf98cSChris Cain const bool* state = std::get_if<bool>(&property.second); 2329e662eae8SEd Tanous if (state == nullptr) 233037bbf98cSChris Cain { 233137bbf98cSChris Cain return false; 233237bbf98cSChris Cain } 233337bbf98cSChris Cain aResp->res.jsonValue["IdlePowerSaver"][property.first] = *state; 233437bbf98cSChris Cain } 233537bbf98cSChris Cain else if (property.first == "EnterUtilizationPercent") 233637bbf98cSChris Cain { 233737bbf98cSChris Cain const uint8_t* util = std::get_if<uint8_t>(&property.second); 2338e662eae8SEd Tanous if (util == nullptr) 233937bbf98cSChris Cain { 234037bbf98cSChris Cain return false; 234137bbf98cSChris Cain } 234237bbf98cSChris Cain aResp->res.jsonValue["IdlePowerSaver"][property.first] = *util; 234337bbf98cSChris Cain } 234437bbf98cSChris Cain else if (property.first == "EnterDwellTime") 234537bbf98cSChris Cain { 234637bbf98cSChris Cain // Convert Dbus time from milliseconds to seconds 234737bbf98cSChris Cain const uint64_t* timeMilliseconds = 234837bbf98cSChris Cain std::get_if<uint64_t>(&property.second); 2349e662eae8SEd Tanous if (timeMilliseconds == nullptr) 235037bbf98cSChris Cain { 235137bbf98cSChris Cain return false; 235237bbf98cSChris Cain } 235337bbf98cSChris Cain const std::chrono::duration<uint64_t, std::milli> ms( 235437bbf98cSChris Cain *timeMilliseconds); 235537bbf98cSChris Cain aResp->res.jsonValue["IdlePowerSaver"]["EnterDwellTimeSeconds"] = 235637bbf98cSChris Cain std::chrono::duration_cast<std::chrono::duration<uint64_t>>(ms) 235737bbf98cSChris Cain .count(); 235837bbf98cSChris Cain } 235937bbf98cSChris Cain else if (property.first == "ExitUtilizationPercent") 236037bbf98cSChris Cain { 236137bbf98cSChris Cain const uint8_t* util = std::get_if<uint8_t>(&property.second); 2362e662eae8SEd Tanous if (util == nullptr) 236337bbf98cSChris Cain { 236437bbf98cSChris Cain return false; 236537bbf98cSChris Cain } 236637bbf98cSChris Cain aResp->res.jsonValue["IdlePowerSaver"][property.first] = *util; 236737bbf98cSChris Cain } 236837bbf98cSChris Cain else if (property.first == "ExitDwellTime") 236937bbf98cSChris Cain { 237037bbf98cSChris Cain // Convert Dbus time from milliseconds to seconds 237137bbf98cSChris Cain const uint64_t* timeMilliseconds = 237237bbf98cSChris Cain std::get_if<uint64_t>(&property.second); 2373e662eae8SEd Tanous if (timeMilliseconds == nullptr) 237437bbf98cSChris Cain { 237537bbf98cSChris Cain return false; 237637bbf98cSChris Cain } 237737bbf98cSChris Cain const std::chrono::duration<uint64_t, std::milli> ms( 237837bbf98cSChris Cain *timeMilliseconds); 237937bbf98cSChris Cain aResp->res.jsonValue["IdlePowerSaver"]["ExitDwellTimeSeconds"] = 238037bbf98cSChris Cain std::chrono::duration_cast<std::chrono::duration<uint64_t>>(ms) 238137bbf98cSChris Cain .count(); 238237bbf98cSChris Cain } 238337bbf98cSChris Cain else 238437bbf98cSChris Cain { 238537bbf98cSChris Cain BMCWEB_LOG_WARNING << "Unexpected IdlePowerSaver property: " 238637bbf98cSChris Cain << property.first; 238737bbf98cSChris Cain } 238837bbf98cSChris Cain } 238937bbf98cSChris Cain 239037bbf98cSChris Cain return true; 239137bbf98cSChris Cain } 239237bbf98cSChris Cain 239337bbf98cSChris Cain /** 239437bbf98cSChris Cain * @brief Retrieves host watchdog timer properties over DBUS 239537bbf98cSChris Cain * 239637bbf98cSChris Cain * @param[in] aResp Shared pointer for completing asynchronous calls. 239737bbf98cSChris Cain * 239837bbf98cSChris Cain * @return None. 239937bbf98cSChris Cain */ 240037bbf98cSChris Cain inline void getIdlePowerSaver(const std::shared_ptr<bmcweb::AsyncResp>& aResp) 240137bbf98cSChris Cain { 240237bbf98cSChris Cain BMCWEB_LOG_DEBUG << "Get idle power saver parameters"; 240337bbf98cSChris Cain 240437bbf98cSChris Cain // Get IdlePowerSaver object path: 240537bbf98cSChris Cain crow::connections::systemBus->async_method_call( 2406*b9d36b47SEd Tanous [aResp](const boost::system::error_code ec, 2407*b9d36b47SEd Tanous const dbus::utility::MapperGetSubTreeResponse& subtree) { 240837bbf98cSChris Cain if (ec) 240937bbf98cSChris Cain { 241037bbf98cSChris Cain BMCWEB_LOG_DEBUG 241137bbf98cSChris Cain << "DBUS response error on Power.IdlePowerSaver GetSubTree " 241237bbf98cSChris Cain << ec; 241337bbf98cSChris Cain messages::internalError(aResp->res); 241437bbf98cSChris Cain return; 241537bbf98cSChris Cain } 241637bbf98cSChris Cain if (subtree.empty()) 241737bbf98cSChris Cain { 241837bbf98cSChris Cain // This is an optional interface so just return 241937bbf98cSChris Cain // if there is no instance found 242037bbf98cSChris Cain BMCWEB_LOG_DEBUG << "No instances found"; 242137bbf98cSChris Cain return; 242237bbf98cSChris Cain } 242337bbf98cSChris Cain if (subtree.size() > 1) 242437bbf98cSChris Cain { 242537bbf98cSChris Cain // More then one PowerIdlePowerSaver object is not supported and 242637bbf98cSChris Cain // is an error 242737bbf98cSChris Cain BMCWEB_LOG_DEBUG << "Found more than 1 system D-Bus " 242837bbf98cSChris Cain "Power.IdlePowerSaver objects: " 242937bbf98cSChris Cain << subtree.size(); 243037bbf98cSChris Cain messages::internalError(aResp->res); 243137bbf98cSChris Cain return; 243237bbf98cSChris Cain } 243337bbf98cSChris Cain if ((subtree[0].first.empty()) || (subtree[0].second.size() != 1)) 243437bbf98cSChris Cain { 243537bbf98cSChris Cain BMCWEB_LOG_DEBUG << "Power.IdlePowerSaver mapper error!"; 243637bbf98cSChris Cain messages::internalError(aResp->res); 243737bbf98cSChris Cain return; 243837bbf98cSChris Cain } 243937bbf98cSChris Cain const std::string& path = subtree[0].first; 244037bbf98cSChris Cain const std::string& service = subtree[0].second.begin()->first; 244137bbf98cSChris Cain if (service.empty()) 244237bbf98cSChris Cain { 244337bbf98cSChris Cain BMCWEB_LOG_DEBUG 244437bbf98cSChris Cain << "Power.IdlePowerSaver service mapper error!"; 244537bbf98cSChris Cain messages::internalError(aResp->res); 244637bbf98cSChris Cain return; 244737bbf98cSChris Cain } 244837bbf98cSChris Cain 244937bbf98cSChris Cain // Valid IdlePowerSaver object found, now read the current values 245037bbf98cSChris Cain crow::connections::systemBus->async_method_call( 245137bbf98cSChris Cain [aResp](const boost::system::error_code ec, 245237bbf98cSChris Cain ipsPropertiesType& properties) { 245337bbf98cSChris Cain if (ec) 245437bbf98cSChris Cain { 245537bbf98cSChris Cain BMCWEB_LOG_ERROR 245637bbf98cSChris Cain << "DBUS response error on IdlePowerSaver GetAll: " 245737bbf98cSChris Cain << ec; 245837bbf98cSChris Cain messages::internalError(aResp->res); 245937bbf98cSChris Cain return; 246037bbf98cSChris Cain } 246137bbf98cSChris Cain 2462e05aec50SEd Tanous if (!parseIpsProperties(aResp, properties)) 246337bbf98cSChris Cain { 246437bbf98cSChris Cain messages::internalError(aResp->res); 246537bbf98cSChris Cain return; 246637bbf98cSChris Cain } 246737bbf98cSChris Cain }, 246837bbf98cSChris Cain service, path, "org.freedesktop.DBus.Properties", "GetAll", 246937bbf98cSChris Cain "xyz.openbmc_project.Control.Power.IdlePowerSaver"); 247037bbf98cSChris Cain }, 247137bbf98cSChris Cain "xyz.openbmc_project.ObjectMapper", 247237bbf98cSChris Cain "/xyz/openbmc_project/object_mapper", 247337bbf98cSChris Cain "xyz.openbmc_project.ObjectMapper", "GetSubTree", "/", int32_t(0), 247437bbf98cSChris Cain std::array<const char*, 1>{ 247537bbf98cSChris Cain "xyz.openbmc_project.Control.Power.IdlePowerSaver"}); 247637bbf98cSChris Cain 247737bbf98cSChris Cain BMCWEB_LOG_DEBUG << "EXIT: Get idle power saver parameters"; 247837bbf98cSChris Cain } 247937bbf98cSChris Cain 248037bbf98cSChris Cain /** 248137bbf98cSChris Cain * @brief Sets Idle Power Saver properties. 248237bbf98cSChris Cain * 248337bbf98cSChris Cain * @param[in] aResp Shared pointer for generating response message. 248437bbf98cSChris Cain * @param[in] ipsEnable The IPS Enable value (true/false) from incoming 248537bbf98cSChris Cain * RF request. 248637bbf98cSChris Cain * @param[in] ipsEnterUtil The utilization limit to enter idle state. 248737bbf98cSChris Cain * @param[in] ipsEnterTime The time the utilization must be below ipsEnterUtil 248837bbf98cSChris Cain * before entering idle state. 248937bbf98cSChris Cain * @param[in] ipsExitUtil The utilization limit when exiting idle state. 249037bbf98cSChris Cain * @param[in] ipsExitTime The time the utilization must be above ipsExutUtil 249137bbf98cSChris Cain * before exiting idle state 249237bbf98cSChris Cain * 249337bbf98cSChris Cain * @return None. 249437bbf98cSChris Cain */ 249537bbf98cSChris Cain inline void setIdlePowerSaver(const std::shared_ptr<bmcweb::AsyncResp>& aResp, 249637bbf98cSChris Cain const std::optional<bool> ipsEnable, 249737bbf98cSChris Cain const std::optional<uint8_t> ipsEnterUtil, 249837bbf98cSChris Cain const std::optional<uint64_t> ipsEnterTime, 249937bbf98cSChris Cain const std::optional<uint8_t> ipsExitUtil, 250037bbf98cSChris Cain const std::optional<uint64_t> ipsExitTime) 250137bbf98cSChris Cain { 250237bbf98cSChris Cain BMCWEB_LOG_DEBUG << "Set idle power saver properties"; 250337bbf98cSChris Cain 250437bbf98cSChris Cain // Get IdlePowerSaver object path: 250537bbf98cSChris Cain crow::connections::systemBus->async_method_call( 250637bbf98cSChris Cain [aResp, ipsEnable, ipsEnterUtil, ipsEnterTime, ipsExitUtil, 2507*b9d36b47SEd Tanous ipsExitTime](const boost::system::error_code ec, 2508*b9d36b47SEd Tanous const dbus::utility::MapperGetSubTreeResponse& subtree) { 250937bbf98cSChris Cain if (ec) 251037bbf98cSChris Cain { 251137bbf98cSChris Cain BMCWEB_LOG_DEBUG 251237bbf98cSChris Cain << "DBUS response error on Power.IdlePowerSaver GetSubTree " 251337bbf98cSChris Cain << ec; 251437bbf98cSChris Cain messages::internalError(aResp->res); 251537bbf98cSChris Cain return; 251637bbf98cSChris Cain } 251737bbf98cSChris Cain if (subtree.empty()) 251837bbf98cSChris Cain { 251937bbf98cSChris Cain // This is an optional D-Bus object, but user attempted to patch 252037bbf98cSChris Cain messages::resourceNotFound(aResp->res, "ComputerSystem", 252137bbf98cSChris Cain "IdlePowerSaver"); 252237bbf98cSChris Cain return; 252337bbf98cSChris Cain } 252437bbf98cSChris Cain if (subtree.size() > 1) 252537bbf98cSChris Cain { 252637bbf98cSChris Cain // More then one PowerIdlePowerSaver object is not supported and 252737bbf98cSChris Cain // is an error 25280fda0f12SGeorge Liu BMCWEB_LOG_DEBUG 25290fda0f12SGeorge Liu << "Found more than 1 system D-Bus Power.IdlePowerSaver objects: " 253037bbf98cSChris Cain << subtree.size(); 253137bbf98cSChris Cain messages::internalError(aResp->res); 253237bbf98cSChris Cain return; 253337bbf98cSChris Cain } 253437bbf98cSChris Cain if ((subtree[0].first.empty()) || (subtree[0].second.size() != 1)) 253537bbf98cSChris Cain { 253637bbf98cSChris Cain BMCWEB_LOG_DEBUG << "Power.IdlePowerSaver mapper error!"; 253737bbf98cSChris Cain messages::internalError(aResp->res); 253837bbf98cSChris Cain return; 253937bbf98cSChris Cain } 254037bbf98cSChris Cain const std::string& path = subtree[0].first; 254137bbf98cSChris Cain const std::string& service = subtree[0].second.begin()->first; 254237bbf98cSChris Cain if (service.empty()) 254337bbf98cSChris Cain { 254437bbf98cSChris Cain BMCWEB_LOG_DEBUG 254537bbf98cSChris Cain << "Power.IdlePowerSaver service mapper error!"; 254637bbf98cSChris Cain messages::internalError(aResp->res); 254737bbf98cSChris Cain return; 254837bbf98cSChris Cain } 254937bbf98cSChris Cain 255037bbf98cSChris Cain // Valid Power IdlePowerSaver object found, now set any values that 255137bbf98cSChris Cain // need to be updated 255237bbf98cSChris Cain 255337bbf98cSChris Cain if (ipsEnable) 255437bbf98cSChris Cain { 255537bbf98cSChris Cain crow::connections::systemBus->async_method_call( 255637bbf98cSChris Cain [aResp](const boost::system::error_code ec) { 255737bbf98cSChris Cain if (ec) 255837bbf98cSChris Cain { 255937bbf98cSChris Cain BMCWEB_LOG_DEBUG << "DBUS response error " << ec; 256037bbf98cSChris Cain messages::internalError(aResp->res); 256137bbf98cSChris Cain return; 256237bbf98cSChris Cain } 256337bbf98cSChris Cain }, 256437bbf98cSChris Cain service, path, "org.freedesktop.DBus.Properties", "Set", 256537bbf98cSChris Cain "xyz.openbmc_project.Control.Power.IdlePowerSaver", 2566168e20c1SEd Tanous "Enabled", dbus::utility::DbusVariantType(*ipsEnable)); 256737bbf98cSChris Cain } 256837bbf98cSChris Cain if (ipsEnterUtil) 256937bbf98cSChris Cain { 257037bbf98cSChris Cain crow::connections::systemBus->async_method_call( 257137bbf98cSChris Cain [aResp](const boost::system::error_code ec) { 257237bbf98cSChris Cain if (ec) 257337bbf98cSChris Cain { 257437bbf98cSChris Cain BMCWEB_LOG_DEBUG << "DBUS response error " << ec; 257537bbf98cSChris Cain messages::internalError(aResp->res); 257637bbf98cSChris Cain return; 257737bbf98cSChris Cain } 257837bbf98cSChris Cain }, 257937bbf98cSChris Cain service, path, "org.freedesktop.DBus.Properties", "Set", 258037bbf98cSChris Cain "xyz.openbmc_project.Control.Power.IdlePowerSaver", 258137bbf98cSChris Cain "EnterUtilizationPercent", 2582168e20c1SEd Tanous dbus::utility::DbusVariantType(*ipsEnterUtil)); 258337bbf98cSChris Cain } 258437bbf98cSChris Cain if (ipsEnterTime) 258537bbf98cSChris Cain { 258637bbf98cSChris Cain // Convert from seconds into milliseconds for DBus 258737bbf98cSChris Cain const uint64_t timeMilliseconds = *ipsEnterTime * 1000; 258837bbf98cSChris Cain crow::connections::systemBus->async_method_call( 258937bbf98cSChris Cain [aResp](const boost::system::error_code ec) { 259037bbf98cSChris Cain if (ec) 259137bbf98cSChris Cain { 259237bbf98cSChris Cain BMCWEB_LOG_DEBUG << "DBUS response error " << ec; 259337bbf98cSChris Cain messages::internalError(aResp->res); 259437bbf98cSChris Cain return; 259537bbf98cSChris Cain } 259637bbf98cSChris Cain }, 259737bbf98cSChris Cain service, path, "org.freedesktop.DBus.Properties", "Set", 259837bbf98cSChris Cain "xyz.openbmc_project.Control.Power.IdlePowerSaver", 2599168e20c1SEd Tanous "EnterDwellTime", 2600168e20c1SEd Tanous dbus::utility::DbusVariantType(timeMilliseconds)); 260137bbf98cSChris Cain } 260237bbf98cSChris Cain if (ipsExitUtil) 260337bbf98cSChris Cain { 260437bbf98cSChris Cain crow::connections::systemBus->async_method_call( 260537bbf98cSChris Cain [aResp](const boost::system::error_code ec) { 260637bbf98cSChris Cain if (ec) 260737bbf98cSChris Cain { 260837bbf98cSChris Cain BMCWEB_LOG_DEBUG << "DBUS response error " << ec; 260937bbf98cSChris Cain messages::internalError(aResp->res); 261037bbf98cSChris Cain return; 261137bbf98cSChris Cain } 261237bbf98cSChris Cain }, 261337bbf98cSChris Cain service, path, "org.freedesktop.DBus.Properties", "Set", 261437bbf98cSChris Cain "xyz.openbmc_project.Control.Power.IdlePowerSaver", 261537bbf98cSChris Cain "ExitUtilizationPercent", 2616168e20c1SEd Tanous dbus::utility::DbusVariantType(*ipsExitUtil)); 261737bbf98cSChris Cain } 261837bbf98cSChris Cain if (ipsExitTime) 261937bbf98cSChris Cain { 262037bbf98cSChris Cain // Convert from seconds into milliseconds for DBus 262137bbf98cSChris Cain const uint64_t timeMilliseconds = *ipsExitTime * 1000; 262237bbf98cSChris Cain crow::connections::systemBus->async_method_call( 262337bbf98cSChris Cain [aResp](const boost::system::error_code ec) { 262437bbf98cSChris Cain if (ec) 262537bbf98cSChris Cain { 262637bbf98cSChris Cain BMCWEB_LOG_DEBUG << "DBUS response error " << ec; 262737bbf98cSChris Cain messages::internalError(aResp->res); 262837bbf98cSChris Cain return; 262937bbf98cSChris Cain } 263037bbf98cSChris Cain }, 263137bbf98cSChris Cain service, path, "org.freedesktop.DBus.Properties", "Set", 263237bbf98cSChris Cain "xyz.openbmc_project.Control.Power.IdlePowerSaver", 2633168e20c1SEd Tanous "ExitDwellTime", 2634168e20c1SEd Tanous dbus::utility::DbusVariantType(timeMilliseconds)); 263537bbf98cSChris Cain } 263637bbf98cSChris Cain }, 263737bbf98cSChris Cain "xyz.openbmc_project.ObjectMapper", 263837bbf98cSChris Cain "/xyz/openbmc_project/object_mapper", 263937bbf98cSChris Cain "xyz.openbmc_project.ObjectMapper", "GetSubTree", "/", int32_t(0), 264037bbf98cSChris Cain std::array<const char*, 1>{ 264137bbf98cSChris Cain "xyz.openbmc_project.Control.Power.IdlePowerSaver"}); 264237bbf98cSChris Cain 264337bbf98cSChris Cain BMCWEB_LOG_DEBUG << "EXIT: Set idle power saver parameters"; 264437bbf98cSChris Cain } 264537bbf98cSChris Cain 2646c45f0082SYong Li /** 2647c5b2abe0SLewanczyk, Dawid * SystemsCollection derived class for delivering ComputerSystems Collection 2648c5b2abe0SLewanczyk, Dawid * Schema 2649c5b2abe0SLewanczyk, Dawid */ 26507e860f15SJohn Edward Broadbent inline void requestRoutesSystemsCollection(App& app) 26511abe55efSEd Tanous { 26527e860f15SJohn Edward Broadbent BMCWEB_ROUTE(app, "/redfish/v1/Systems/") 2653ed398213SEd Tanous .privileges(redfish::privileges::getComputerSystemCollection) 26547e860f15SJohn Edward Broadbent .methods(boost::beast::http::verb::get)( 26554f48d5f6SEd Tanous [](const crow::Request& /*req*/, 26567e860f15SJohn Edward Broadbent const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) { 26578d1b46d7Szhanghch05 asyncResp->res.jsonValue["@odata.type"] = 26580f74e643SEd Tanous "#ComputerSystemCollection.ComputerSystemCollection"; 26598d1b46d7Szhanghch05 asyncResp->res.jsonValue["@odata.id"] = "/redfish/v1/Systems"; 26608d1b46d7Szhanghch05 asyncResp->res.jsonValue["Name"] = "Computer System Collection"; 2661462023adSSunitha Harish 26621e1e598dSJonathan Doman sdbusplus::asio::getProperty<std::string>( 26631e1e598dSJonathan Doman *crow::connections::systemBus, 26641e1e598dSJonathan Doman "xyz.openbmc_project.Settings", 26651e1e598dSJonathan Doman "/xyz/openbmc_project/network/hypervisor", 26661e1e598dSJonathan Doman "xyz.openbmc_project.Network.SystemConfiguration", 26671e1e598dSJonathan Doman "HostName", 26681e1e598dSJonathan Doman [asyncResp](const boost::system::error_code ec, 26691e1e598dSJonathan Doman const std::string& /*hostName*/) { 26702c70f800SEd Tanous nlohmann::json& ifaceArray = 2671462023adSSunitha Harish asyncResp->res.jsonValue["Members"]; 26722c70f800SEd Tanous ifaceArray = nlohmann::json::array(); 26737e860f15SJohn Edward Broadbent auto& count = 26747e860f15SJohn Edward Broadbent asyncResp->res.jsonValue["Members@odata.count"]; 26752c70f800SEd Tanous ifaceArray.push_back( 2676cb13a392SEd Tanous {{"@odata.id", "/redfish/v1/Systems/system"}}); 267794bda602STim Lee count = ifaceArray.size(); 2678cb13a392SEd Tanous if (!ec) 2679462023adSSunitha Harish { 2680462023adSSunitha Harish BMCWEB_LOG_DEBUG << "Hypervisor is available"; 26812c70f800SEd Tanous ifaceArray.push_back( 26827e860f15SJohn Edward Broadbent {{"@odata.id", 26837e860f15SJohn Edward Broadbent "/redfish/v1/Systems/hypervisor"}}); 26842c70f800SEd Tanous count = ifaceArray.size(); 2685cb13a392SEd Tanous } 26861e1e598dSJonathan Doman }); 26877e860f15SJohn Edward Broadbent }); 2688c5b2abe0SLewanczyk, Dawid } 26897e860f15SJohn Edward Broadbent 26907e860f15SJohn Edward Broadbent /** 26917e860f15SJohn Edward Broadbent * Function transceives data with dbus directly. 26927e860f15SJohn Edward Broadbent */ 26934f48d5f6SEd Tanous inline void doNMI(const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) 26947e860f15SJohn Edward Broadbent { 26957e860f15SJohn Edward Broadbent constexpr char const* serviceName = "xyz.openbmc_project.Control.Host.NMI"; 26967e860f15SJohn Edward Broadbent constexpr char const* objectPath = "/xyz/openbmc_project/control/host0/nmi"; 26977e860f15SJohn Edward Broadbent constexpr char const* interfaceName = 26987e860f15SJohn Edward Broadbent "xyz.openbmc_project.Control.Host.NMI"; 26997e860f15SJohn Edward Broadbent constexpr char const* method = "NMI"; 27007e860f15SJohn Edward Broadbent 27017e860f15SJohn Edward Broadbent crow::connections::systemBus->async_method_call( 27027e860f15SJohn Edward Broadbent [asyncResp](const boost::system::error_code ec) { 27037e860f15SJohn Edward Broadbent if (ec) 27047e860f15SJohn Edward Broadbent { 27057e860f15SJohn Edward Broadbent BMCWEB_LOG_ERROR << " Bad D-Bus request error: " << ec; 27067e860f15SJohn Edward Broadbent messages::internalError(asyncResp->res); 27077e860f15SJohn Edward Broadbent return; 27087e860f15SJohn Edward Broadbent } 27097e860f15SJohn Edward Broadbent messages::success(asyncResp->res); 27107e860f15SJohn Edward Broadbent }, 27117e860f15SJohn Edward Broadbent serviceName, objectPath, interfaceName, method); 27127e860f15SJohn Edward Broadbent } 2713c5b2abe0SLewanczyk, Dawid 2714c5b2abe0SLewanczyk, Dawid /** 2715cc340dd9SEd Tanous * SystemActionsReset class supports handle POST method for Reset action. 2716cc340dd9SEd Tanous * The class retrieves and sends data directly to D-Bus. 2717cc340dd9SEd Tanous */ 27187e860f15SJohn Edward Broadbent inline void requestRoutesSystemActionsReset(App& app) 2719cc340dd9SEd Tanous { 2720cc340dd9SEd Tanous /** 2721cc340dd9SEd Tanous * Function handles POST method request. 2722cc340dd9SEd Tanous * Analyzes POST body message before sends Reset request data to D-Bus. 2723cc340dd9SEd Tanous */ 27247e860f15SJohn Edward Broadbent BMCWEB_ROUTE(app, 27257e860f15SJohn Edward Broadbent "/redfish/v1/Systems/system/Actions/ComputerSystem.Reset/") 2726ed398213SEd Tanous .privileges(redfish::privileges::postComputerSystem) 27277e860f15SJohn Edward Broadbent .methods( 27287e860f15SJohn Edward Broadbent boost::beast::http::verb:: 27297e860f15SJohn Edward Broadbent post)([](const crow::Request& req, 27307e860f15SJohn Edward Broadbent const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) { 27319712f8acSEd Tanous std::string resetType; 273215ed6780SWilly Tu if (!json_util::readJsonAction(req, asyncResp->res, "ResetType", 27337e860f15SJohn Edward Broadbent resetType)) 2734cc340dd9SEd Tanous { 2735cc340dd9SEd Tanous return; 2736cc340dd9SEd Tanous } 2737cc340dd9SEd Tanous 2738d22c8396SJason M. Bills // Get the command and host vs. chassis 2739cc340dd9SEd Tanous std::string command; 2740543f4400SEd Tanous bool hostCommand = true; 2741d4d25793SEd Tanous if ((resetType == "On") || (resetType == "ForceOn")) 2742cc340dd9SEd Tanous { 2743cc340dd9SEd Tanous command = "xyz.openbmc_project.State.Host.Transition.On"; 2744d22c8396SJason M. Bills hostCommand = true; 2745d22c8396SJason M. Bills } 2746d22c8396SJason M. Bills else if (resetType == "ForceOff") 2747d22c8396SJason M. Bills { 2748d22c8396SJason M. Bills command = "xyz.openbmc_project.State.Chassis.Transition.Off"; 2749d22c8396SJason M. Bills hostCommand = false; 2750d22c8396SJason M. Bills } 2751d22c8396SJason M. Bills else if (resetType == "ForceRestart") 2752d22c8396SJason M. Bills { 275386a0851aSJason M. Bills command = 275486a0851aSJason M. Bills "xyz.openbmc_project.State.Host.Transition.ForceWarmReboot"; 275586a0851aSJason M. Bills hostCommand = true; 2756cc340dd9SEd Tanous } 27579712f8acSEd Tanous else if (resetType == "GracefulShutdown") 2758cc340dd9SEd Tanous { 2759cc340dd9SEd Tanous command = "xyz.openbmc_project.State.Host.Transition.Off"; 2760d22c8396SJason M. Bills hostCommand = true; 2761cc340dd9SEd Tanous } 27629712f8acSEd Tanous else if (resetType == "GracefulRestart") 2763cc340dd9SEd Tanous { 27640fda0f12SGeorge Liu command = 27650fda0f12SGeorge Liu "xyz.openbmc_project.State.Host.Transition.GracefulWarmReboot"; 2766d22c8396SJason M. Bills hostCommand = true; 2767d22c8396SJason M. Bills } 2768d22c8396SJason M. Bills else if (resetType == "PowerCycle") 2769d22c8396SJason M. Bills { 277086a0851aSJason M. Bills command = "xyz.openbmc_project.State.Host.Transition.Reboot"; 277186a0851aSJason M. Bills hostCommand = true; 2772cc340dd9SEd Tanous } 2773bfd5b826SLakshminarayana R. Kammath else if (resetType == "Nmi") 2774bfd5b826SLakshminarayana R. Kammath { 2775bfd5b826SLakshminarayana R. Kammath doNMI(asyncResp); 2776bfd5b826SLakshminarayana R. Kammath return; 2777bfd5b826SLakshminarayana R. Kammath } 2778cc340dd9SEd Tanous else 2779cc340dd9SEd Tanous { 27808d1b46d7Szhanghch05 messages::actionParameterUnknown(asyncResp->res, "Reset", 27818d1b46d7Szhanghch05 resetType); 2782cc340dd9SEd Tanous return; 2783cc340dd9SEd Tanous } 2784cc340dd9SEd Tanous 2785d22c8396SJason M. Bills if (hostCommand) 2786d22c8396SJason M. Bills { 2787cc340dd9SEd Tanous crow::connections::systemBus->async_method_call( 2788d22c8396SJason M. Bills [asyncResp, resetType](const boost::system::error_code ec) { 2789cc340dd9SEd Tanous if (ec) 2790cc340dd9SEd Tanous { 2791cc340dd9SEd Tanous BMCWEB_LOG_ERROR << "D-Bus responses error: " << ec; 27927e860f15SJohn Edward Broadbent if (ec.value() == 27937e860f15SJohn Edward Broadbent boost::asio::error::invalid_argument) 2794d22c8396SJason M. Bills { 2795d22c8396SJason M. Bills messages::actionParameterNotSupported( 2796d22c8396SJason M. Bills asyncResp->res, resetType, "Reset"); 2797d22c8396SJason M. Bills } 2798d22c8396SJason M. Bills else 2799d22c8396SJason M. Bills { 2800f12894f8SJason M. Bills messages::internalError(asyncResp->res); 2801d22c8396SJason M. Bills } 2802cc340dd9SEd Tanous return; 2803cc340dd9SEd Tanous } 2804f12894f8SJason M. Bills messages::success(asyncResp->res); 2805cc340dd9SEd Tanous }, 2806cc340dd9SEd Tanous "xyz.openbmc_project.State.Host", 2807cc340dd9SEd Tanous "/xyz/openbmc_project/state/host0", 2808cc340dd9SEd Tanous "org.freedesktop.DBus.Properties", "Set", 28099712f8acSEd Tanous "xyz.openbmc_project.State.Host", "RequestedHostTransition", 2810168e20c1SEd Tanous dbus::utility::DbusVariantType{command}); 2811cc340dd9SEd Tanous } 2812d22c8396SJason M. Bills else 2813d22c8396SJason M. Bills { 2814d22c8396SJason M. Bills crow::connections::systemBus->async_method_call( 2815d22c8396SJason M. Bills [asyncResp, resetType](const boost::system::error_code ec) { 2816d22c8396SJason M. Bills if (ec) 2817d22c8396SJason M. Bills { 2818d22c8396SJason M. Bills BMCWEB_LOG_ERROR << "D-Bus responses error: " << ec; 28197e860f15SJohn Edward Broadbent if (ec.value() == 28207e860f15SJohn Edward Broadbent boost::asio::error::invalid_argument) 2821d22c8396SJason M. Bills { 2822d22c8396SJason M. Bills messages::actionParameterNotSupported( 2823d22c8396SJason M. Bills asyncResp->res, resetType, "Reset"); 2824d22c8396SJason M. Bills } 2825d22c8396SJason M. Bills else 2826d22c8396SJason M. Bills { 2827d22c8396SJason M. Bills messages::internalError(asyncResp->res); 2828d22c8396SJason M. Bills } 2829d22c8396SJason M. Bills return; 2830d22c8396SJason M. Bills } 2831d22c8396SJason M. Bills messages::success(asyncResp->res); 2832d22c8396SJason M. Bills }, 2833d22c8396SJason M. Bills "xyz.openbmc_project.State.Chassis", 2834d22c8396SJason M. Bills "/xyz/openbmc_project/state/chassis0", 2835d22c8396SJason M. Bills "org.freedesktop.DBus.Properties", "Set", 28367e860f15SJohn Edward Broadbent "xyz.openbmc_project.State.Chassis", 28377e860f15SJohn Edward Broadbent "RequestedPowerTransition", 2838168e20c1SEd Tanous dbus::utility::DbusVariantType{command}); 2839d22c8396SJason M. Bills } 28407e860f15SJohn Edward Broadbent }); 2841d22c8396SJason M. Bills } 2842cc340dd9SEd Tanous 2843cc340dd9SEd Tanous /** 28446617338dSEd Tanous * Systems derived class for delivering Computer Systems Schema. 2845c5b2abe0SLewanczyk, Dawid */ 28467e860f15SJohn Edward Broadbent inline void requestRoutesSystems(App& app) 28471abe55efSEd Tanous { 2848c5b2abe0SLewanczyk, Dawid 2849c5b2abe0SLewanczyk, Dawid /** 2850c5b2abe0SLewanczyk, Dawid * Functions triggers appropriate requests on DBus 2851c5b2abe0SLewanczyk, Dawid */ 28527e860f15SJohn Edward Broadbent BMCWEB_ROUTE(app, "/redfish/v1/Systems/system/") 2853ed398213SEd Tanous .privileges(redfish::privileges::getComputerSystem) 28547e860f15SJohn Edward Broadbent .methods( 28557e860f15SJohn Edward Broadbent boost::beast::http::verb:: 28567e860f15SJohn Edward Broadbent get)([](const crow::Request&, 28577e860f15SJohn Edward Broadbent const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) { 28588d1b46d7Szhanghch05 asyncResp->res.jsonValue["@odata.type"] = 285937bbf98cSChris Cain "#ComputerSystem.v1_16_0.ComputerSystem"; 28608d1b46d7Szhanghch05 asyncResp->res.jsonValue["Name"] = "system"; 28618d1b46d7Szhanghch05 asyncResp->res.jsonValue["Id"] = "system"; 28628d1b46d7Szhanghch05 asyncResp->res.jsonValue["SystemType"] = "Physical"; 28638d1b46d7Szhanghch05 asyncResp->res.jsonValue["Description"] = "Computer System"; 28648d1b46d7Szhanghch05 asyncResp->res.jsonValue["ProcessorSummary"]["Count"] = 0; 28658d1b46d7Szhanghch05 asyncResp->res.jsonValue["ProcessorSummary"]["Status"]["State"] = 28668d1b46d7Szhanghch05 "Disabled"; 28678d1b46d7Szhanghch05 asyncResp->res.jsonValue["MemorySummary"]["TotalSystemMemoryGiB"] = 28688d1b46d7Szhanghch05 uint64_t(0); 28698d1b46d7Szhanghch05 asyncResp->res.jsonValue["MemorySummary"]["Status"]["State"] = 28708d1b46d7Szhanghch05 "Disabled"; 28717e860f15SJohn Edward Broadbent asyncResp->res.jsonValue["@odata.id"] = 28727e860f15SJohn Edward Broadbent "/redfish/v1/Systems/system"; 287304a258f4SEd Tanous 28748d1b46d7Szhanghch05 asyncResp->res.jsonValue["Processors"] = { 2875029573d4SEd Tanous {"@odata.id", "/redfish/v1/Systems/system/Processors"}}; 28768d1b46d7Szhanghch05 asyncResp->res.jsonValue["Memory"] = { 2877029573d4SEd Tanous {"@odata.id", "/redfish/v1/Systems/system/Memory"}}; 28788d1b46d7Szhanghch05 asyncResp->res.jsonValue["Storage"] = { 2879a25aeccfSNikhil Potade {"@odata.id", "/redfish/v1/Systems/system/Storage"}}; 2880029573d4SEd Tanous 28818d1b46d7Szhanghch05 asyncResp->res.jsonValue["Actions"]["#ComputerSystem.Reset"] = { 2882cc340dd9SEd Tanous {"target", 2883029573d4SEd Tanous "/redfish/v1/Systems/system/Actions/ComputerSystem.Reset"}, 28841cb1a9e6SAppaRao Puli {"@Redfish.ActionInfo", 28851cb1a9e6SAppaRao Puli "/redfish/v1/Systems/system/ResetActionInfo"}}; 2886c5b2abe0SLewanczyk, Dawid 28878d1b46d7Szhanghch05 asyncResp->res.jsonValue["LogServices"] = { 2888029573d4SEd Tanous {"@odata.id", "/redfish/v1/Systems/system/LogServices"}}; 2889c4bf6374SJason M. Bills 28908d1b46d7Szhanghch05 asyncResp->res.jsonValue["Bios"] = { 2891d82a3acdSCarol Wang {"@odata.id", "/redfish/v1/Systems/system/Bios"}}; 2892d82a3acdSCarol Wang 28938d1b46d7Szhanghch05 asyncResp->res.jsonValue["Links"]["ManagedBy"] = { 2894c5d03ff4SJennifer Lee {{"@odata.id", "/redfish/v1/Managers/bmc"}}}; 2895c5d03ff4SJennifer Lee 28968d1b46d7Szhanghch05 asyncResp->res.jsonValue["Status"] = { 2897c5d03ff4SJennifer Lee {"Health", "OK"}, 2898c5d03ff4SJennifer Lee {"State", "Enabled"}, 2899c5d03ff4SJennifer Lee }; 29000e8ac5e7SGunnar Mills 29010e8ac5e7SGunnar Mills // Fill in SerialConsole info 29020e8ac5e7SGunnar Mills asyncResp->res.jsonValue["SerialConsole"]["MaxConcurrentSessions"] = 29030e8ac5e7SGunnar Mills 15; 29040e8ac5e7SGunnar Mills asyncResp->res.jsonValue["SerialConsole"]["IPMI"] = { 29050e8ac5e7SGunnar Mills {"ServiceEnabled", true}, 29060e8ac5e7SGunnar Mills }; 29070e8ac5e7SGunnar Mills // TODO (Gunnar): Should look for obmc-console-ssh@2200.service 29080e8ac5e7SGunnar Mills asyncResp->res.jsonValue["SerialConsole"]["SSH"] = { 29090e8ac5e7SGunnar Mills {"ServiceEnabled", true}, 29100e8ac5e7SGunnar Mills {"Port", 2200}, 29110e8ac5e7SGunnar Mills // https://github.com/openbmc/docs/blob/master/console.md 29120e8ac5e7SGunnar Mills {"HotKeySequenceDisplay", "Press ~. to exit console"}, 29130e8ac5e7SGunnar Mills }; 29140e8ac5e7SGunnar Mills 29150e8ac5e7SGunnar Mills #ifdef BMCWEB_ENABLE_KVM 29160e8ac5e7SGunnar Mills // Fill in GraphicalConsole info 29170e8ac5e7SGunnar Mills asyncResp->res.jsonValue["GraphicalConsole"] = { 29180e8ac5e7SGunnar Mills {"ServiceEnabled", true}, 29190e8ac5e7SGunnar Mills {"MaxConcurrentSessions", 4}, 29200e8ac5e7SGunnar Mills {"ConnectTypesSupported", {"KVMIP"}}, 29210e8ac5e7SGunnar Mills }; 29220e8ac5e7SGunnar Mills #endif // BMCWEB_ENABLE_KVM 2923e284a7c1SJames Feist constexpr const std::array<const char*, 4> inventoryForSystems = { 2924b49ac873SJames Feist "xyz.openbmc_project.Inventory.Item.Dimm", 29252ad9c2f6SJames Feist "xyz.openbmc_project.Inventory.Item.Cpu", 2926e284a7c1SJames Feist "xyz.openbmc_project.Inventory.Item.Drive", 2927e284a7c1SJames Feist "xyz.openbmc_project.Inventory.Item.StorageController"}; 2928b49ac873SJames Feist 2929b49ac873SJames Feist auto health = std::make_shared<HealthPopulate>(asyncResp); 2930b49ac873SJames Feist crow::connections::systemBus->async_method_call( 2931b49ac873SJames Feist [health](const boost::system::error_code ec, 2932914e2d5dSEd Tanous const std::vector<std::string>& resp) { 2933b49ac873SJames Feist if (ec) 2934b49ac873SJames Feist { 2935b49ac873SJames Feist // no inventory 2936b49ac873SJames Feist return; 2937b49ac873SJames Feist } 2938b49ac873SJames Feist 2939914e2d5dSEd Tanous health->inventory = resp; 2940b49ac873SJames Feist }, 2941b49ac873SJames Feist "xyz.openbmc_project.ObjectMapper", 2942b49ac873SJames Feist "/xyz/openbmc_project/object_mapper", 2943b49ac873SJames Feist "xyz.openbmc_project.ObjectMapper", "GetSubTreePaths", "/", 2944b49ac873SJames Feist int32_t(0), inventoryForSystems); 2945b49ac873SJames Feist 2946b49ac873SJames Feist health->populate(); 2947b49ac873SJames Feist 29488d1b46d7Szhanghch05 getMainChassisId( 29498d1b46d7Szhanghch05 asyncResp, [](const std::string& chassisId, 29508d1b46d7Szhanghch05 const std::shared_ptr<bmcweb::AsyncResp>& aRsp) { 2951c5d03ff4SJennifer Lee aRsp->res.jsonValue["Links"]["Chassis"] = { 2952c5d03ff4SJennifer Lee {{"@odata.id", "/redfish/v1/Chassis/" + chassisId}}}; 2953c5d03ff4SJennifer Lee }); 2954a3002228SAppaRao Puli 29559f8bfa7cSGunnar Mills getLocationIndicatorActive(asyncResp); 29569f8bfa7cSGunnar Mills // TODO (Gunnar): Remove IndicatorLED after enough time has passed 2957a3002228SAppaRao Puli getIndicatorLedState(asyncResp); 29585bc2dc8eSJames Feist getComputerSystem(asyncResp, health); 29596c34de48SEd Tanous getHostState(asyncResp); 2960491d8ee7SSantosh Puranik getBootProperties(asyncResp); 2961978b8803SAndrew Geissler getBootProgress(asyncResp); 2962adbe192aSJason M. Bills getPCIeDeviceList(asyncResp, "PCIeDevices"); 296351709ffdSYong Li getHostWatchdogTimer(asyncResp); 2964c6a620f2SGeorge Liu getPowerRestorePolicy(asyncResp); 29656bd5a8d2SGunnar Mills getAutomaticRetry(asyncResp); 2966c0557e1aSGunnar Mills getLastResetTime(asyncResp); 2967a6349918SAppaRao Puli #ifdef BMCWEB_ENABLE_REDFISH_PROVISIONING_FEATURE 2968a6349918SAppaRao Puli getProvisioningStatus(asyncResp); 2969a6349918SAppaRao Puli #endif 29701981771bSAli Ahmed getTrustedModuleRequiredToBoot(asyncResp); 29713a2d0424SChris Cain getPowerMode(asyncResp); 297237bbf98cSChris Cain getIdlePowerSaver(asyncResp); 29737e860f15SJohn Edward Broadbent }); 29747e860f15SJohn Edward Broadbent BMCWEB_ROUTE(app, "/redfish/v1/Systems/system/") 2975ed398213SEd Tanous .privileges(redfish::privileges::patchComputerSystem) 29767e860f15SJohn Edward Broadbent .methods(boost::beast::http::verb::patch)( 29777e860f15SJohn Edward Broadbent [](const crow::Request& req, 29787e860f15SJohn Edward Broadbent const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) { 29799f8bfa7cSGunnar Mills std::optional<bool> locationIndicatorActive; 2980cde19e5fSSantosh Puranik std::optional<std::string> indicatorLed; 2981491d8ee7SSantosh Puranik std::optional<nlohmann::json> bootProps; 2982c45f0082SYong Li std::optional<nlohmann::json> wdtTimerProps; 298398e386ecSGunnar Mills std::optional<std::string> assetTag; 2984c6a620f2SGeorge Liu std::optional<std::string> powerRestorePolicy; 29853a2d0424SChris Cain std::optional<std::string> powerMode; 298637bbf98cSChris Cain std::optional<nlohmann::json> ipsProps; 298715ed6780SWilly Tu if (!json_util::readJsonPatch( 29888d1b46d7Szhanghch05 req, asyncResp->res, "IndicatorLED", indicatorLed, 29897e860f15SJohn Edward Broadbent "LocationIndicatorActive", locationIndicatorActive, 29907e860f15SJohn Edward Broadbent "Boot", bootProps, "WatchdogTimer", wdtTimerProps, 29917e860f15SJohn Edward Broadbent "PowerRestorePolicy", powerRestorePolicy, "AssetTag", 299237bbf98cSChris Cain assetTag, "PowerMode", powerMode, "IdlePowerSaver", 299337bbf98cSChris Cain ipsProps)) 29946617338dSEd Tanous { 29956617338dSEd Tanous return; 29966617338dSEd Tanous } 2997491d8ee7SSantosh Puranik 29988d1b46d7Szhanghch05 asyncResp->res.result(boost::beast::http::status::no_content); 2999c45f0082SYong Li 300098e386ecSGunnar Mills if (assetTag) 300198e386ecSGunnar Mills { 300298e386ecSGunnar Mills setAssetTag(asyncResp, *assetTag); 300398e386ecSGunnar Mills } 300498e386ecSGunnar Mills 3005c45f0082SYong Li if (wdtTimerProps) 3006c45f0082SYong Li { 3007c45f0082SYong Li std::optional<bool> wdtEnable; 3008c45f0082SYong Li std::optional<std::string> wdtTimeOutAction; 3009c45f0082SYong Li 3010c45f0082SYong Li if (!json_util::readJson(*wdtTimerProps, asyncResp->res, 3011c45f0082SYong Li "FunctionEnabled", wdtEnable, 3012c45f0082SYong Li "TimeoutAction", wdtTimeOutAction)) 3013c45f0082SYong Li { 3014c45f0082SYong Li return; 3015c45f0082SYong Li } 3016f23b7296SEd Tanous setWDTProperties(asyncResp, wdtEnable, wdtTimeOutAction); 3017c45f0082SYong Li } 3018c45f0082SYong Li 3019491d8ee7SSantosh Puranik if (bootProps) 3020491d8ee7SSantosh Puranik { 3021491d8ee7SSantosh Puranik std::optional<std::string> bootSource; 3022cd9a4666SKonstantin Aladyshev std::optional<std::string> bootType; 3023491d8ee7SSantosh Puranik std::optional<std::string> bootEnable; 302469f35306SGunnar Mills std::optional<std::string> automaticRetryConfig; 3025ac7e1e0bSAli Ahmed std::optional<bool> trustedModuleRequiredToBoot; 3026491d8ee7SSantosh Puranik 302769f35306SGunnar Mills if (!json_util::readJson( 30287e860f15SJohn Edward Broadbent *bootProps, asyncResp->res, 30297e860f15SJohn Edward Broadbent "BootSourceOverrideTarget", bootSource, 3030cd9a4666SKonstantin Aladyshev "BootSourceOverrideMode", bootType, 30317e860f15SJohn Edward Broadbent "BootSourceOverrideEnabled", bootEnable, 3032ac7e1e0bSAli Ahmed "AutomaticRetryConfig", automaticRetryConfig, 3033ac7e1e0bSAli Ahmed "TrustedModuleRequiredToBoot", 3034ac7e1e0bSAli Ahmed trustedModuleRequiredToBoot)) 3035491d8ee7SSantosh Puranik { 3036491d8ee7SSantosh Puranik return; 3037491d8ee7SSantosh Puranik } 3038c21865c4SKonstantin Aladyshev 3039cd9a4666SKonstantin Aladyshev if (bootSource || bootType || bootEnable) 304069f35306SGunnar Mills { 3041c21865c4SKonstantin Aladyshev setBootProperties(asyncResp, bootSource, bootType, 3042c21865c4SKonstantin Aladyshev bootEnable); 3043491d8ee7SSantosh Puranik } 304469f35306SGunnar Mills if (automaticRetryConfig) 304569f35306SGunnar Mills { 3046f23b7296SEd Tanous setAutomaticRetry(asyncResp, *automaticRetryConfig); 304769f35306SGunnar Mills } 3048ac7e1e0bSAli Ahmed 3049ac7e1e0bSAli Ahmed if (trustedModuleRequiredToBoot) 3050ac7e1e0bSAli Ahmed { 3051ac7e1e0bSAli Ahmed setTrustedModuleRequiredToBoot( 3052ac7e1e0bSAli Ahmed asyncResp, *trustedModuleRequiredToBoot); 3053ac7e1e0bSAli Ahmed } 305469f35306SGunnar Mills } 3055265c1602SJohnathan Mantey 30569f8bfa7cSGunnar Mills if (locationIndicatorActive) 30579f8bfa7cSGunnar Mills { 30587e860f15SJohn Edward Broadbent setLocationIndicatorActive(asyncResp, 30597e860f15SJohn Edward Broadbent *locationIndicatorActive); 30609f8bfa7cSGunnar Mills } 30619f8bfa7cSGunnar Mills 30627e860f15SJohn Edward Broadbent // TODO (Gunnar): Remove IndicatorLED after enough time has 30637e860f15SJohn Edward Broadbent // passed 30649712f8acSEd Tanous if (indicatorLed) 30656617338dSEd Tanous { 3066f23b7296SEd Tanous setIndicatorLedState(asyncResp, *indicatorLed); 30677e860f15SJohn Edward Broadbent asyncResp->res.addHeader( 30687e860f15SJohn Edward Broadbent boost::beast::http::field::warning, 3069d6aa0093SGunnar Mills "299 - \"IndicatorLED is deprecated. Use " 3070d6aa0093SGunnar Mills "LocationIndicatorActive instead.\""); 30716617338dSEd Tanous } 3072c6a620f2SGeorge Liu 3073c6a620f2SGeorge Liu if (powerRestorePolicy) 3074c6a620f2SGeorge Liu { 30754e69c904SGunnar Mills setPowerRestorePolicy(asyncResp, *powerRestorePolicy); 3076c6a620f2SGeorge Liu } 30773a2d0424SChris Cain 30783a2d0424SChris Cain if (powerMode) 30793a2d0424SChris Cain { 30803a2d0424SChris Cain setPowerMode(asyncResp, *powerMode); 30813a2d0424SChris Cain } 308237bbf98cSChris Cain 308337bbf98cSChris Cain if (ipsProps) 308437bbf98cSChris Cain { 308537bbf98cSChris Cain std::optional<bool> ipsEnable; 308637bbf98cSChris Cain std::optional<uint8_t> ipsEnterUtil; 308737bbf98cSChris Cain std::optional<uint64_t> ipsEnterTime; 308837bbf98cSChris Cain std::optional<uint8_t> ipsExitUtil; 308937bbf98cSChris Cain std::optional<uint64_t> ipsExitTime; 309037bbf98cSChris Cain 309137bbf98cSChris Cain if (!json_util::readJson( 309237bbf98cSChris Cain *ipsProps, asyncResp->res, "Enabled", ipsEnable, 309337bbf98cSChris Cain "EnterUtilizationPercent", ipsEnterUtil, 309437bbf98cSChris Cain "EnterDwellTimeSeconds", ipsEnterTime, 309537bbf98cSChris Cain "ExitUtilizationPercent", ipsExitUtil, 309637bbf98cSChris Cain "ExitDwellTimeSeconds", ipsExitTime)) 309737bbf98cSChris Cain { 309837bbf98cSChris Cain return; 309937bbf98cSChris Cain } 310037bbf98cSChris Cain setIdlePowerSaver(asyncResp, ipsEnable, ipsEnterUtil, 310137bbf98cSChris Cain ipsEnterTime, ipsExitUtil, ipsExitTime); 310237bbf98cSChris Cain } 31037e860f15SJohn Edward Broadbent }); 3104c5b2abe0SLewanczyk, Dawid } 31051cb1a9e6SAppaRao Puli 31061cb1a9e6SAppaRao Puli /** 31071cb1a9e6SAppaRao Puli * SystemResetActionInfo derived class for delivering Computer Systems 31081cb1a9e6SAppaRao Puli * ResetType AllowableValues using ResetInfo schema. 31091cb1a9e6SAppaRao Puli */ 31107e860f15SJohn Edward Broadbent inline void requestRoutesSystemResetActionInfo(App& app) 31111cb1a9e6SAppaRao Puli { 31121cb1a9e6SAppaRao Puli 31131cb1a9e6SAppaRao Puli /** 31141cb1a9e6SAppaRao Puli * Functions triggers appropriate requests on DBus 31151cb1a9e6SAppaRao Puli */ 31167e860f15SJohn Edward Broadbent BMCWEB_ROUTE(app, "/redfish/v1/Systems/system/ResetActionInfo/") 3117ed398213SEd Tanous .privileges(redfish::privileges::getActionInfo) 31187e860f15SJohn Edward Broadbent .methods(boost::beast::http::verb::get)( 31197e860f15SJohn Edward Broadbent [](const crow::Request&, 31207e860f15SJohn Edward Broadbent const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) { 31218d1b46d7Szhanghch05 asyncResp->res.jsonValue = { 31221cb1a9e6SAppaRao Puli {"@odata.type", "#ActionInfo.v1_1_2.ActionInfo"}, 31231cb1a9e6SAppaRao Puli {"@odata.id", "/redfish/v1/Systems/system/ResetActionInfo"}, 31241cb1a9e6SAppaRao Puli {"Name", "Reset Action Info"}, 31251cb1a9e6SAppaRao Puli {"Id", "ResetActionInfo"}, 31261cb1a9e6SAppaRao Puli {"Parameters", 31271cb1a9e6SAppaRao Puli {{{"Name", "ResetType"}, 31281cb1a9e6SAppaRao Puli {"Required", true}, 31291cb1a9e6SAppaRao Puli {"DataType", "String"}, 31301cb1a9e6SAppaRao Puli {"AllowableValues", 31317e860f15SJohn Edward Broadbent {"On", "ForceOff", "ForceOn", "ForceRestart", 31327e860f15SJohn Edward Broadbent "GracefulRestart", "GracefulShutdown", "PowerCycle", 31337e860f15SJohn Edward Broadbent "Nmi"}}}}}}; 31347e860f15SJohn Edward Broadbent }); 31351cb1a9e6SAppaRao Puli } 3136c5b2abe0SLewanczyk, Dawid } // namespace redfish 3137