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 183ccb3adbSEd Tanous #include "app.hpp" 191e1e598dSJonathan Doman #include "dbus_singleton.hpp" 207a1dbc48SGeorge Liu #include "dbus_utility.hpp" 21b49ac873SJames Feist #include "health.hpp" 22746b56f3SAsmitha Karunanithi #include "hypervisor_system.hpp" 231c8fba97SJames Feist #include "led.hpp" 24f5c9f8bdSJason M. Bills #include "pcie.hpp" 25f4c99e70SEd Tanous #include "query.hpp" 26c5d03ff4SJennifer Lee #include "redfish_util.hpp" 273ccb3adbSEd Tanous #include "registries/privilege_registry.hpp" 283ccb3adbSEd Tanous #include "utils/dbus_utils.hpp" 293ccb3adbSEd Tanous #include "utils/json_utils.hpp" 303ccb3adbSEd Tanous #include "utils/sw_utils.hpp" 312b82937eSEd Tanous #include "utils/time_utils.hpp" 32c5d03ff4SJennifer Lee 339712f8acSEd Tanous #include <boost/container/flat_map.hpp> 34e99073f5SGeorge Liu #include <boost/system/error_code.hpp> 351e1e598dSJonathan Doman #include <sdbusplus/asio/property.hpp> 36bc1d29deSKrzysztof Grobelny #include <sdbusplus/unpack_properties.hpp> 371214b7e7SGunnar Mills 387a1dbc48SGeorge Liu #include <array> 397a1dbc48SGeorge Liu #include <string_view> 40abf2add6SEd Tanous #include <variant> 41c5b2abe0SLewanczyk, Dawid 421abe55efSEd Tanous namespace redfish 431abe55efSEd Tanous { 44c5b2abe0SLewanczyk, Dawid 455c3e9272SAbhishek Patel const static std::array<std::pair<std::string_view, std::string_view>, 2> 465c3e9272SAbhishek Patel protocolToDBusForSystems{ 475c3e9272SAbhishek Patel {{"SSH", "obmc-console-ssh"}, {"IPMI", "phosphor-ipmi-net"}}}; 485c3e9272SAbhishek Patel 499d3ae10eSAlpana Kumari /** 509d3ae10eSAlpana Kumari * @brief Updates the Functional State of DIMMs 519d3ae10eSAlpana Kumari * 529d3ae10eSAlpana Kumari * @param[in] aResp Shared pointer for completing asynchronous calls 539d3ae10eSAlpana Kumari * @param[in] dimmState Dimm's Functional state, true/false 549d3ae10eSAlpana Kumari * 559d3ae10eSAlpana Kumari * @return None. 569d3ae10eSAlpana Kumari */ 578d1b46d7Szhanghch05 inline void 588d1b46d7Szhanghch05 updateDimmProperties(const std::shared_ptr<bmcweb::AsyncResp>& aResp, 591e1e598dSJonathan Doman bool isDimmFunctional) 609d3ae10eSAlpana Kumari { 611e1e598dSJonathan Doman BMCWEB_LOG_DEBUG << "Dimm Functional: " << isDimmFunctional; 629d3ae10eSAlpana Kumari 639d3ae10eSAlpana Kumari // Set it as Enabled if at least one DIMM is functional 649d3ae10eSAlpana Kumari // Update STATE only if previous State was DISABLED and current Dimm is 659d3ae10eSAlpana Kumari // ENABLED. 6602cad96eSEd Tanous const nlohmann::json& prevMemSummary = 679d3ae10eSAlpana Kumari aResp->res.jsonValue["MemorySummary"]["Status"]["State"]; 689d3ae10eSAlpana Kumari if (prevMemSummary == "Disabled") 699d3ae10eSAlpana Kumari { 70e05aec50SEd Tanous if (isDimmFunctional) 719d3ae10eSAlpana Kumari { 729d3ae10eSAlpana Kumari aResp->res.jsonValue["MemorySummary"]["Status"]["State"] = 739d3ae10eSAlpana Kumari "Enabled"; 749d3ae10eSAlpana Kumari } 759d3ae10eSAlpana Kumari } 769d3ae10eSAlpana Kumari } 779d3ae10eSAlpana Kumari 7857e8c9beSAlpana Kumari /* 7957e8c9beSAlpana Kumari * @brief Update "ProcessorSummary" "Count" based on Cpu PresenceState 8057e8c9beSAlpana Kumari * 8157e8c9beSAlpana Kumari * @param[in] aResp Shared pointer for completing asynchronous calls 8257e8c9beSAlpana Kumari * @param[in] cpuPresenceState CPU present or not 8357e8c9beSAlpana Kumari * 8457e8c9beSAlpana Kumari * @return None. 8557e8c9beSAlpana Kumari */ 861e1e598dSJonathan Doman inline void 871e1e598dSJonathan Doman modifyCpuPresenceState(const std::shared_ptr<bmcweb::AsyncResp>& aResp, 881e1e598dSJonathan Doman bool isCpuPresent) 8957e8c9beSAlpana Kumari { 901e1e598dSJonathan Doman BMCWEB_LOG_DEBUG << "Cpu Present: " << isCpuPresent; 9157e8c9beSAlpana Kumari 9255f79e6fSEd Tanous if (isCpuPresent) 9357e8c9beSAlpana Kumari { 94b4b9595aSJames Feist nlohmann::json& procCount = 95b4b9595aSJames Feist aResp->res.jsonValue["ProcessorSummary"]["Count"]; 9655f79e6fSEd Tanous auto* procCountPtr = 97b4b9595aSJames Feist procCount.get_ptr<nlohmann::json::number_integer_t*>(); 98b4b9595aSJames Feist if (procCountPtr != nullptr) 99b4b9595aSJames Feist { 100b4b9595aSJames Feist // shouldn't be possible to be nullptr 101b4b9595aSJames Feist *procCountPtr += 1; 10257e8c9beSAlpana Kumari } 103b4b9595aSJames Feist } 10457e8c9beSAlpana Kumari } 10557e8c9beSAlpana Kumari 10657e8c9beSAlpana Kumari /* 10757e8c9beSAlpana Kumari * @brief Update "ProcessorSummary" "Status" "State" based on 10857e8c9beSAlpana Kumari * CPU Functional State 10957e8c9beSAlpana Kumari * 11057e8c9beSAlpana Kumari * @param[in] aResp Shared pointer for completing asynchronous calls 11157e8c9beSAlpana Kumari * @param[in] cpuFunctionalState is CPU functional true/false 11257e8c9beSAlpana Kumari * 11357e8c9beSAlpana Kumari * @return None. 11457e8c9beSAlpana Kumari */ 1151e1e598dSJonathan Doman inline void 1161e1e598dSJonathan Doman modifyCpuFunctionalState(const std::shared_ptr<bmcweb::AsyncResp>& aResp, 1171e1e598dSJonathan Doman bool isCpuFunctional) 11857e8c9beSAlpana Kumari { 1191e1e598dSJonathan Doman BMCWEB_LOG_DEBUG << "Cpu Functional: " << isCpuFunctional; 12057e8c9beSAlpana Kumari 12102cad96eSEd Tanous const nlohmann::json& prevProcState = 12257e8c9beSAlpana Kumari aResp->res.jsonValue["ProcessorSummary"]["Status"]["State"]; 12357e8c9beSAlpana Kumari 12457e8c9beSAlpana Kumari // Set it as Enabled if at least one CPU is functional 12557e8c9beSAlpana Kumari // Update STATE only if previous State was Non_Functional and current CPU is 12657e8c9beSAlpana Kumari // Functional. 12757e8c9beSAlpana Kumari if (prevProcState == "Disabled") 12857e8c9beSAlpana Kumari { 129e05aec50SEd Tanous if (isCpuFunctional) 13057e8c9beSAlpana Kumari { 13157e8c9beSAlpana Kumari aResp->res.jsonValue["ProcessorSummary"]["Status"]["State"] = 13257e8c9beSAlpana Kumari "Enabled"; 13357e8c9beSAlpana Kumari } 13457e8c9beSAlpana Kumari } 13557e8c9beSAlpana Kumari } 13657e8c9beSAlpana Kumari 137382d6475SAli Ahmed inline void getProcessorProperties( 138382d6475SAli Ahmed const std::shared_ptr<bmcweb::AsyncResp>& aResp, 139382d6475SAli Ahmed const std::vector<std::pair<std::string, dbus::utility::DbusVariantType>>& 140382d6475SAli Ahmed properties) 14103fbed92SAli Ahmed { 14203fbed92SAli Ahmed BMCWEB_LOG_DEBUG << "Got " << properties.size() << " Cpu properties."; 14303fbed92SAli Ahmed 14403fbed92SAli Ahmed // TODO: Get Model 14503fbed92SAli Ahmed 146bc1d29deSKrzysztof Grobelny const uint16_t* coreCount = nullptr; 14703fbed92SAli Ahmed 148bc1d29deSKrzysztof Grobelny const bool success = sdbusplus::unpackPropertiesNoThrow( 149bc1d29deSKrzysztof Grobelny dbus_utils::UnpackErrorPrinter(), properties, "CoreCount", coreCount); 15003fbed92SAli Ahmed 151bc1d29deSKrzysztof Grobelny if (!success) 15203fbed92SAli Ahmed { 15303fbed92SAli Ahmed messages::internalError(aResp->res); 15403fbed92SAli Ahmed return; 15503fbed92SAli Ahmed } 15603fbed92SAli Ahmed 157bc1d29deSKrzysztof Grobelny if (coreCount != nullptr) 15803fbed92SAli Ahmed { 159bc1d29deSKrzysztof Grobelny nlohmann::json& coreCountJson = 160bc1d29deSKrzysztof Grobelny aResp->res.jsonValue["ProcessorSummary"]["CoreCount"]; 161bc1d29deSKrzysztof Grobelny uint64_t* coreCountJsonPtr = coreCountJson.get_ptr<uint64_t*>(); 162bc1d29deSKrzysztof Grobelny 163bc1d29deSKrzysztof Grobelny if (coreCountJsonPtr == nullptr) 164bc1d29deSKrzysztof Grobelny { 165bc1d29deSKrzysztof Grobelny coreCountJson = *coreCount; 16603fbed92SAli Ahmed } 16703fbed92SAli Ahmed else 16803fbed92SAli Ahmed { 169bc1d29deSKrzysztof Grobelny *coreCountJsonPtr += *coreCount; 17003fbed92SAli Ahmed } 17103fbed92SAli Ahmed } 17203fbed92SAli Ahmed } 17303fbed92SAli Ahmed 17403fbed92SAli Ahmed /* 17503fbed92SAli Ahmed * @brief Get ProcessorSummary fields 17603fbed92SAli Ahmed * 17703fbed92SAli Ahmed * @param[in] aResp Shared pointer for completing asynchronous calls 17803fbed92SAli Ahmed * @param[in] service dbus service for Cpu Information 17903fbed92SAli Ahmed * @param[in] path dbus path for Cpu 18003fbed92SAli Ahmed * 18103fbed92SAli Ahmed * @return None. 18203fbed92SAli Ahmed */ 18303fbed92SAli Ahmed inline void getProcessorSummary(const std::shared_ptr<bmcweb::AsyncResp>& aResp, 18403fbed92SAli Ahmed const std::string& service, 18503fbed92SAli Ahmed const std::string& path) 18603fbed92SAli Ahmed { 1875e7e2dc5SEd Tanous auto getCpuPresenceState = [aResp](const boost::system::error_code& ec3, 188382d6475SAli Ahmed const bool cpuPresenceCheck) { 189382d6475SAli Ahmed if (ec3) 190382d6475SAli Ahmed { 191382d6475SAli Ahmed BMCWEB_LOG_ERROR << "DBUS response error " << ec3; 192382d6475SAli Ahmed return; 193382d6475SAli Ahmed } 194382d6475SAli Ahmed modifyCpuPresenceState(aResp, cpuPresenceCheck); 195382d6475SAli Ahmed }; 196382d6475SAli Ahmed 1975e7e2dc5SEd Tanous auto getCpuFunctionalState = [aResp](const boost::system::error_code& ec3, 198382d6475SAli Ahmed const bool cpuFunctionalCheck) { 199382d6475SAli Ahmed if (ec3) 200382d6475SAli Ahmed { 201382d6475SAli Ahmed BMCWEB_LOG_ERROR << "DBUS response error " << ec3; 202382d6475SAli Ahmed return; 203382d6475SAli Ahmed } 204382d6475SAli Ahmed modifyCpuFunctionalState(aResp, cpuFunctionalCheck); 205382d6475SAli Ahmed }; 206382d6475SAli Ahmed 207382d6475SAli Ahmed // Get the Presence of CPU 208382d6475SAli Ahmed sdbusplus::asio::getProperty<bool>( 209382d6475SAli Ahmed *crow::connections::systemBus, service, path, 210382d6475SAli Ahmed "xyz.openbmc_project.Inventory.Item", "Present", 211382d6475SAli Ahmed std::move(getCpuPresenceState)); 212382d6475SAli Ahmed 213382d6475SAli Ahmed // Get the Functional State 214382d6475SAli Ahmed sdbusplus::asio::getProperty<bool>( 215382d6475SAli Ahmed *crow::connections::systemBus, service, path, 216382d6475SAli Ahmed "xyz.openbmc_project.State.Decorator.OperationalStatus", "Functional", 217382d6475SAli Ahmed std::move(getCpuFunctionalState)); 218382d6475SAli Ahmed 219bc1d29deSKrzysztof Grobelny sdbusplus::asio::getAllProperties( 220bc1d29deSKrzysztof Grobelny *crow::connections::systemBus, service, path, 221bc1d29deSKrzysztof Grobelny "xyz.openbmc_project.Inventory.Item.Cpu", 22203fbed92SAli Ahmed [aResp, service, 2235e7e2dc5SEd Tanous path](const boost::system::error_code& ec2, 224b9d36b47SEd Tanous const dbus::utility::DBusPropertiesMap& properties) { 22503fbed92SAli Ahmed if (ec2) 22603fbed92SAli Ahmed { 22703fbed92SAli Ahmed BMCWEB_LOG_ERROR << "DBUS response error " << ec2; 22803fbed92SAli Ahmed messages::internalError(aResp->res); 22903fbed92SAli Ahmed return; 23003fbed92SAli Ahmed } 231382d6475SAli Ahmed getProcessorProperties(aResp, properties); 232bc1d29deSKrzysztof Grobelny }); 23303fbed92SAli Ahmed } 23403fbed92SAli Ahmed 23557e8c9beSAlpana Kumari /* 236c5b2abe0SLewanczyk, Dawid * @brief Retrieves computer system properties over dbus 237c5b2abe0SLewanczyk, Dawid * 238c5b2abe0SLewanczyk, Dawid * @param[in] aResp Shared pointer for completing asynchronous calls 2398f9ee3cdSGunnar Mills * @param[in] systemHealth Shared HealthPopulate pointer 240c5b2abe0SLewanczyk, Dawid * 241c5b2abe0SLewanczyk, Dawid * @return None. 242c5b2abe0SLewanczyk, Dawid */ 243b5a76932SEd Tanous inline void 2448d1b46d7Szhanghch05 getComputerSystem(const std::shared_ptr<bmcweb::AsyncResp>& aResp, 245b5a76932SEd Tanous const std::shared_ptr<HealthPopulate>& systemHealth) 2461abe55efSEd Tanous { 24755c7b7a2SEd Tanous BMCWEB_LOG_DEBUG << "Get available system components."; 248e99073f5SGeorge Liu constexpr std::array<std::string_view, 5> interfaces = { 249e99073f5SGeorge Liu "xyz.openbmc_project.Inventory.Decorator.Asset", 250e99073f5SGeorge Liu "xyz.openbmc_project.Inventory.Item.Cpu", 251e99073f5SGeorge Liu "xyz.openbmc_project.Inventory.Item.Dimm", 252e99073f5SGeorge Liu "xyz.openbmc_project.Inventory.Item.System", 253e99073f5SGeorge Liu "xyz.openbmc_project.Common.UUID", 254e99073f5SGeorge Liu }; 255e99073f5SGeorge Liu dbus::utility::getSubTree( 256e99073f5SGeorge Liu "/xyz/openbmc_project/inventory", 0, interfaces, 257b9d36b47SEd Tanous [aResp, 258e99073f5SGeorge Liu systemHealth](const boost::system::error_code& ec, 259b9d36b47SEd Tanous const dbus::utility::MapperGetSubTreeResponse& subtree) { 2601abe55efSEd Tanous if (ec) 2611abe55efSEd Tanous { 26255c7b7a2SEd Tanous BMCWEB_LOG_DEBUG << "DBUS response error"; 263f12894f8SJason M. Bills messages::internalError(aResp->res); 264c5b2abe0SLewanczyk, Dawid return; 265c5b2abe0SLewanczyk, Dawid } 266c5b2abe0SLewanczyk, Dawid // Iterate over all retrieved ObjectPaths. 267002d39b4SEd Tanous for (const std::pair< 268002d39b4SEd Tanous std::string, 269002d39b4SEd Tanous std::vector<std::pair<std::string, std::vector<std::string>>>>& 2701214b7e7SGunnar Mills object : subtree) 2711abe55efSEd Tanous { 272c5b2abe0SLewanczyk, Dawid const std::string& path = object.first; 27355c7b7a2SEd Tanous BMCWEB_LOG_DEBUG << "Got path: " << path; 274002d39b4SEd Tanous const std::vector<std::pair<std::string, std::vector<std::string>>>& 2751214b7e7SGunnar Mills connectionNames = object.second; 27626f6976fSEd Tanous if (connectionNames.empty()) 2771abe55efSEd Tanous { 278c5b2abe0SLewanczyk, Dawid continue; 279c5b2abe0SLewanczyk, Dawid } 280029573d4SEd Tanous 2815bc2dc8eSJames Feist auto memoryHealth = std::make_shared<HealthPopulate>( 282dfababfcSNan Zhou aResp, "/MemorySummary/Status"_json_pointer); 2835bc2dc8eSJames Feist 2845bc2dc8eSJames Feist auto cpuHealth = std::make_shared<HealthPopulate>( 285dfababfcSNan Zhou aResp, "/ProcessorSummary/Status"_json_pointer); 2865bc2dc8eSJames Feist 2875bc2dc8eSJames Feist systemHealth->children.emplace_back(memoryHealth); 2885bc2dc8eSJames Feist systemHealth->children.emplace_back(cpuHealth); 2895bc2dc8eSJames Feist 2906c34de48SEd Tanous // This is not system, so check if it's cpu, dimm, UUID or 2916c34de48SEd Tanous // BiosVer 29204a258f4SEd Tanous for (const auto& connection : connectionNames) 2931abe55efSEd Tanous { 29404a258f4SEd Tanous for (const auto& interfaceName : connection.second) 2951abe55efSEd Tanous { 29604a258f4SEd Tanous if (interfaceName == 29704a258f4SEd Tanous "xyz.openbmc_project.Inventory.Item.Dimm") 2981abe55efSEd Tanous { 2991abe55efSEd Tanous BMCWEB_LOG_DEBUG 30004a258f4SEd Tanous << "Found Dimm, now get its properties."; 3019d3ae10eSAlpana Kumari 302bc1d29deSKrzysztof Grobelny sdbusplus::asio::getAllProperties( 303bc1d29deSKrzysztof Grobelny *crow::connections::systemBus, connection.first, 304bc1d29deSKrzysztof Grobelny path, "xyz.openbmc_project.Inventory.Item.Dimm", 3059d3ae10eSAlpana Kumari [aResp, service{connection.first}, 3065e7e2dc5SEd Tanous path](const boost::system::error_code& ec2, 307b9d36b47SEd Tanous const dbus::utility::DBusPropertiesMap& 3081214b7e7SGunnar Mills properties) { 309cb13a392SEd Tanous if (ec2) 3101abe55efSEd Tanous { 311002d39b4SEd Tanous BMCWEB_LOG_ERROR << "DBUS response error " 312002d39b4SEd Tanous << ec2; 313f12894f8SJason M. Bills messages::internalError(aResp->res); 314c5b2abe0SLewanczyk, Dawid return; 315c5b2abe0SLewanczyk, Dawid } 316002d39b4SEd Tanous BMCWEB_LOG_DEBUG << "Got " << properties.size() 317c5b2abe0SLewanczyk, Dawid << " Dimm properties."; 3189d3ae10eSAlpana Kumari 319bc1d29deSKrzysztof Grobelny if (properties.empty()) 3209d3ae10eSAlpana Kumari { 3211e1e598dSJonathan Doman sdbusplus::asio::getProperty<bool>( 322002d39b4SEd Tanous *crow::connections::systemBus, service, 323002d39b4SEd Tanous path, 3241e1e598dSJonathan Doman "xyz.openbmc_project.State." 3251e1e598dSJonathan Doman "Decorator.OperationalStatus", 3261e1e598dSJonathan Doman "Functional", 3275e7e2dc5SEd Tanous [aResp]( 3285e7e2dc5SEd Tanous const boost::system::error_code& ec3, 3291e1e598dSJonathan Doman bool dimmState) { 330cb13a392SEd Tanous if (ec3) 3319d3ae10eSAlpana Kumari { 3329d3ae10eSAlpana Kumari BMCWEB_LOG_ERROR 333002d39b4SEd Tanous << "DBUS response error " << ec3; 3349d3ae10eSAlpana Kumari return; 3359d3ae10eSAlpana Kumari } 336002d39b4SEd Tanous updateDimmProperties(aResp, dimmState); 3371e1e598dSJonathan Doman }); 338bc1d29deSKrzysztof Grobelny return; 3399d3ae10eSAlpana Kumari } 340bc1d29deSKrzysztof Grobelny 341bc1d29deSKrzysztof Grobelny const uint32_t* memorySizeInKB = nullptr; 342bc1d29deSKrzysztof Grobelny 343bc1d29deSKrzysztof Grobelny const bool success = 344bc1d29deSKrzysztof Grobelny sdbusplus::unpackPropertiesNoThrow( 345bc1d29deSKrzysztof Grobelny dbus_utils::UnpackErrorPrinter(), 346bc1d29deSKrzysztof Grobelny properties, "MemorySizeInKB", 347bc1d29deSKrzysztof Grobelny memorySizeInKB); 348bc1d29deSKrzysztof Grobelny 349bc1d29deSKrzysztof Grobelny if (!success) 350bc1d29deSKrzysztof Grobelny { 351bc1d29deSKrzysztof Grobelny messages::internalError(aResp->res); 352bc1d29deSKrzysztof Grobelny return; 353bc1d29deSKrzysztof Grobelny } 354bc1d29deSKrzysztof Grobelny 355bc1d29deSKrzysztof Grobelny if (memorySizeInKB != nullptr) 356bc1d29deSKrzysztof Grobelny { 357bc1d29deSKrzysztof Grobelny nlohmann::json& totalMemory = 358bc1d29deSKrzysztof Grobelny aResp->res 359bc1d29deSKrzysztof Grobelny .jsonValue["MemorySummary"] 360bc1d29deSKrzysztof Grobelny ["TotalSystemMemoryGiB"]; 361bc1d29deSKrzysztof Grobelny const uint64_t* preValue = 362bc1d29deSKrzysztof Grobelny totalMemory.get_ptr<const uint64_t*>(); 363bc1d29deSKrzysztof Grobelny if (preValue == nullptr) 364bc1d29deSKrzysztof Grobelny { 365bc1d29deSKrzysztof Grobelny aResp->res 366bc1d29deSKrzysztof Grobelny .jsonValue["MemorySummary"] 367bc1d29deSKrzysztof Grobelny ["TotalSystemMemoryGiB"] = 368bc1d29deSKrzysztof Grobelny *memorySizeInKB / (1024 * 1024); 369bc1d29deSKrzysztof Grobelny } 370bc1d29deSKrzysztof Grobelny else 371bc1d29deSKrzysztof Grobelny { 372bc1d29deSKrzysztof Grobelny aResp->res 373bc1d29deSKrzysztof Grobelny .jsonValue["MemorySummary"] 374bc1d29deSKrzysztof Grobelny ["TotalSystemMemoryGiB"] = 375bc1d29deSKrzysztof Grobelny *memorySizeInKB / (1024 * 1024) + 376bc1d29deSKrzysztof Grobelny *preValue; 377bc1d29deSKrzysztof Grobelny } 378bc1d29deSKrzysztof Grobelny aResp->res.jsonValue["MemorySummary"]["Status"] 379bc1d29deSKrzysztof Grobelny ["State"] = "Enabled"; 380bc1d29deSKrzysztof Grobelny } 381bc1d29deSKrzysztof Grobelny }); 3825bc2dc8eSJames Feist 3835bc2dc8eSJames Feist memoryHealth->inventory.emplace_back(path); 3841abe55efSEd Tanous } 38504a258f4SEd Tanous else if (interfaceName == 38604a258f4SEd Tanous "xyz.openbmc_project.Inventory.Item.Cpu") 3871abe55efSEd Tanous { 3881abe55efSEd Tanous BMCWEB_LOG_DEBUG 38904a258f4SEd Tanous << "Found Cpu, now get its properties."; 39057e8c9beSAlpana Kumari 39103fbed92SAli Ahmed getProcessorSummary(aResp, connection.first, path); 3925bc2dc8eSJames Feist 3935bc2dc8eSJames Feist cpuHealth->inventory.emplace_back(path); 3941abe55efSEd Tanous } 395002d39b4SEd Tanous else if (interfaceName == "xyz.openbmc_project.Common.UUID") 3961abe55efSEd Tanous { 3971abe55efSEd Tanous BMCWEB_LOG_DEBUG 39804a258f4SEd Tanous << "Found UUID, now get its properties."; 399bc1d29deSKrzysztof Grobelny 400bc1d29deSKrzysztof Grobelny sdbusplus::asio::getAllProperties( 401bc1d29deSKrzysztof Grobelny *crow::connections::systemBus, connection.first, 402bc1d29deSKrzysztof Grobelny path, "xyz.openbmc_project.Common.UUID", 4035e7e2dc5SEd Tanous [aResp](const boost::system::error_code& ec3, 404b9d36b47SEd Tanous const dbus::utility::DBusPropertiesMap& 4051214b7e7SGunnar Mills properties) { 406cb13a392SEd Tanous if (ec3) 4071abe55efSEd Tanous { 408002d39b4SEd Tanous BMCWEB_LOG_DEBUG << "DBUS response error " 409002d39b4SEd Tanous << ec3; 410f12894f8SJason M. Bills messages::internalError(aResp->res); 411c5b2abe0SLewanczyk, Dawid return; 412c5b2abe0SLewanczyk, Dawid } 413002d39b4SEd Tanous BMCWEB_LOG_DEBUG << "Got " << properties.size() 414c5b2abe0SLewanczyk, Dawid << " UUID properties."; 41504a258f4SEd Tanous 416bc1d29deSKrzysztof Grobelny const std::string* uUID = nullptr; 417bc1d29deSKrzysztof Grobelny 418bc1d29deSKrzysztof Grobelny const bool success = 419bc1d29deSKrzysztof Grobelny sdbusplus::unpackPropertiesNoThrow( 420bc1d29deSKrzysztof Grobelny dbus_utils::UnpackErrorPrinter(), 421bc1d29deSKrzysztof Grobelny properties, "UUID", uUID); 422bc1d29deSKrzysztof Grobelny 423bc1d29deSKrzysztof Grobelny if (!success) 4241abe55efSEd Tanous { 425bc1d29deSKrzysztof Grobelny messages::internalError(aResp->res); 426bc1d29deSKrzysztof Grobelny return; 427bc1d29deSKrzysztof Grobelny } 428bc1d29deSKrzysztof Grobelny 429bc1d29deSKrzysztof Grobelny if (uUID != nullptr) 430bc1d29deSKrzysztof Grobelny { 431bc1d29deSKrzysztof Grobelny std::string valueStr = *uUID; 43204a258f4SEd Tanous if (valueStr.size() == 32) 4331abe55efSEd Tanous { 434029573d4SEd Tanous valueStr.insert(8, 1, '-'); 435029573d4SEd Tanous valueStr.insert(13, 1, '-'); 436029573d4SEd Tanous valueStr.insert(18, 1, '-'); 437029573d4SEd Tanous valueStr.insert(23, 1, '-'); 43804a258f4SEd Tanous } 439bc1d29deSKrzysztof Grobelny BMCWEB_LOG_DEBUG << "UUID = " << valueStr; 440002d39b4SEd Tanous aResp->res.jsonValue["UUID"] = valueStr; 441c5b2abe0SLewanczyk, Dawid } 442bc1d29deSKrzysztof Grobelny }); 443c5b2abe0SLewanczyk, Dawid } 444029573d4SEd Tanous else if (interfaceName == 445029573d4SEd Tanous "xyz.openbmc_project.Inventory.Item.System") 4461abe55efSEd Tanous { 447bc1d29deSKrzysztof Grobelny sdbusplus::asio::getAllProperties( 448bc1d29deSKrzysztof Grobelny *crow::connections::systemBus, connection.first, 449bc1d29deSKrzysztof Grobelny path, 450bc1d29deSKrzysztof Grobelny "xyz.openbmc_project.Inventory.Decorator.Asset", 4515e7e2dc5SEd Tanous [aResp](const boost::system::error_code& ec2, 452b9d36b47SEd Tanous const dbus::utility::DBusPropertiesMap& 4531214b7e7SGunnar Mills propertiesList) { 454cb13a392SEd Tanous if (ec2) 455029573d4SEd Tanous { 456e4a4b9a9SJames Feist // doesn't have to include this 457e4a4b9a9SJames Feist // interface 458029573d4SEd Tanous return; 459029573d4SEd Tanous } 460002d39b4SEd Tanous BMCWEB_LOG_DEBUG << "Got " << propertiesList.size() 461029573d4SEd Tanous << " properties for system"; 462bc1d29deSKrzysztof Grobelny 463bc1d29deSKrzysztof Grobelny const std::string* partNumber = nullptr; 464bc1d29deSKrzysztof Grobelny const std::string* serialNumber = nullptr; 465bc1d29deSKrzysztof Grobelny const std::string* manufacturer = nullptr; 466bc1d29deSKrzysztof Grobelny const std::string* model = nullptr; 467bc1d29deSKrzysztof Grobelny const std::string* subModel = nullptr; 468bc1d29deSKrzysztof Grobelny 469bc1d29deSKrzysztof Grobelny const bool success = 470bc1d29deSKrzysztof Grobelny sdbusplus::unpackPropertiesNoThrow( 471bc1d29deSKrzysztof Grobelny dbus_utils::UnpackErrorPrinter(), 472bc1d29deSKrzysztof Grobelny propertiesList, "PartNumber", partNumber, 473bc1d29deSKrzysztof Grobelny "SerialNumber", serialNumber, 474bc1d29deSKrzysztof Grobelny "Manufacturer", manufacturer, "Model", 475bc1d29deSKrzysztof Grobelny model, "SubModel", subModel); 476bc1d29deSKrzysztof Grobelny 477bc1d29deSKrzysztof Grobelny if (!success) 478029573d4SEd Tanous { 479bc1d29deSKrzysztof Grobelny messages::internalError(aResp->res); 480bc1d29deSKrzysztof Grobelny return; 481029573d4SEd Tanous } 482bc1d29deSKrzysztof Grobelny 483bc1d29deSKrzysztof Grobelny if (partNumber != nullptr) 484bc1d29deSKrzysztof Grobelny { 485bc1d29deSKrzysztof Grobelny aResp->res.jsonValue["PartNumber"] = 486bc1d29deSKrzysztof Grobelny *partNumber; 487029573d4SEd Tanous } 488bc1d29deSKrzysztof Grobelny 489bc1d29deSKrzysztof Grobelny if (serialNumber != nullptr) 490bc1d29deSKrzysztof Grobelny { 491bc1d29deSKrzysztof Grobelny aResp->res.jsonValue["SerialNumber"] = 492bc1d29deSKrzysztof Grobelny *serialNumber; 493bc1d29deSKrzysztof Grobelny } 494bc1d29deSKrzysztof Grobelny 495bc1d29deSKrzysztof Grobelny if (manufacturer != nullptr) 496bc1d29deSKrzysztof Grobelny { 497bc1d29deSKrzysztof Grobelny aResp->res.jsonValue["Manufacturer"] = 498bc1d29deSKrzysztof Grobelny *manufacturer; 499bc1d29deSKrzysztof Grobelny } 500bc1d29deSKrzysztof Grobelny 501bc1d29deSKrzysztof Grobelny if (model != nullptr) 502bc1d29deSKrzysztof Grobelny { 503bc1d29deSKrzysztof Grobelny aResp->res.jsonValue["Model"] = *model; 504bc1d29deSKrzysztof Grobelny } 505bc1d29deSKrzysztof Grobelny 506bc1d29deSKrzysztof Grobelny if (subModel != nullptr) 507bc1d29deSKrzysztof Grobelny { 508bc1d29deSKrzysztof Grobelny aResp->res.jsonValue["SubModel"] = *subModel; 509fc5afcf9Sbeccabroek } 510c1e236a6SGunnar Mills 511cb7e1e7bSAndrew Geissler // Grab the bios version 512eee0013eSWilly Tu sw_util::populateSoftwareInformation( 513eee0013eSWilly Tu aResp, sw_util::biosPurpose, "BiosVersion", 514002d39b4SEd Tanous false); 515bc1d29deSKrzysztof Grobelny }); 516e4a4b9a9SJames Feist 5171e1e598dSJonathan Doman sdbusplus::asio::getProperty<std::string>( 5181e1e598dSJonathan Doman *crow::connections::systemBus, connection.first, 5191e1e598dSJonathan Doman path, 5201e1e598dSJonathan Doman "xyz.openbmc_project.Inventory.Decorator." 5211e1e598dSJonathan Doman "AssetTag", 5221e1e598dSJonathan Doman "AssetTag", 5235e7e2dc5SEd Tanous [aResp](const boost::system::error_code& ec2, 5241e1e598dSJonathan Doman const std::string& value) { 525cb13a392SEd Tanous if (ec2) 526e4a4b9a9SJames Feist { 527e4a4b9a9SJames Feist // doesn't have to include this 528e4a4b9a9SJames Feist // interface 529e4a4b9a9SJames Feist return; 530e4a4b9a9SJames Feist } 531e4a4b9a9SJames Feist 5321e1e598dSJonathan Doman aResp->res.jsonValue["AssetTag"] = value; 5331e1e598dSJonathan Doman }); 534029573d4SEd Tanous } 535029573d4SEd Tanous } 536029573d4SEd Tanous } 537c5b2abe0SLewanczyk, Dawid } 5386617338dSEd Tanous }); 539c5b2abe0SLewanczyk, Dawid } 540c5b2abe0SLewanczyk, Dawid 541c5b2abe0SLewanczyk, Dawid /** 542c5b2abe0SLewanczyk, Dawid * @brief Retrieves host state properties over dbus 543c5b2abe0SLewanczyk, Dawid * 544c5b2abe0SLewanczyk, Dawid * @param[in] aResp Shared pointer for completing asynchronous calls. 545c5b2abe0SLewanczyk, Dawid * 546c5b2abe0SLewanczyk, Dawid * @return None. 547c5b2abe0SLewanczyk, Dawid */ 5488d1b46d7Szhanghch05 inline void getHostState(const std::shared_ptr<bmcweb::AsyncResp>& aResp) 5491abe55efSEd Tanous { 55055c7b7a2SEd Tanous BMCWEB_LOG_DEBUG << "Get host information."; 5511e1e598dSJonathan Doman sdbusplus::asio::getProperty<std::string>( 5521e1e598dSJonathan Doman *crow::connections::systemBus, "xyz.openbmc_project.State.Host", 5531e1e598dSJonathan Doman "/xyz/openbmc_project/state/host0", "xyz.openbmc_project.State.Host", 5541e1e598dSJonathan Doman "CurrentHostState", 5555e7e2dc5SEd Tanous [aResp](const boost::system::error_code& ec, 5561e1e598dSJonathan Doman const std::string& hostState) { 5571abe55efSEd Tanous if (ec) 5581abe55efSEd Tanous { 55922228c28SAndrew Geissler if (ec == boost::system::errc::host_unreachable) 56022228c28SAndrew Geissler { 56122228c28SAndrew Geissler // Service not available, no error, just don't return 56222228c28SAndrew Geissler // host state info 56322228c28SAndrew Geissler BMCWEB_LOG_DEBUG << "Service not available " << ec; 56422228c28SAndrew Geissler return; 56522228c28SAndrew Geissler } 56622228c28SAndrew Geissler BMCWEB_LOG_ERROR << "DBUS response error " << ec; 567f12894f8SJason M. Bills messages::internalError(aResp->res); 568c5b2abe0SLewanczyk, Dawid return; 569c5b2abe0SLewanczyk, Dawid } 5706617338dSEd Tanous 5711e1e598dSJonathan Doman BMCWEB_LOG_DEBUG << "Host state: " << hostState; 572c5b2abe0SLewanczyk, Dawid // Verify Host State 5731e1e598dSJonathan Doman if (hostState == "xyz.openbmc_project.State.Host.HostState.Running") 5741abe55efSEd Tanous { 57555c7b7a2SEd Tanous aResp->res.jsonValue["PowerState"] = "On"; 5766617338dSEd Tanous aResp->res.jsonValue["Status"]["State"] = "Enabled"; 5771abe55efSEd Tanous } 5781e1e598dSJonathan Doman else if (hostState == 5790fda0f12SGeorge Liu "xyz.openbmc_project.State.Host.HostState.Quiesced") 5808c888608SGunnar Mills { 5818c888608SGunnar Mills aResp->res.jsonValue["PowerState"] = "On"; 5828c888608SGunnar Mills aResp->res.jsonValue["Status"]["State"] = "Quiesced"; 5838c888608SGunnar Mills } 5841e1e598dSJonathan Doman else if (hostState == 5850fda0f12SGeorge Liu "xyz.openbmc_project.State.Host.HostState.DiagnosticMode") 58683935af9SAndrew Geissler { 58783935af9SAndrew Geissler aResp->res.jsonValue["PowerState"] = "On"; 58883935af9SAndrew Geissler aResp->res.jsonValue["Status"]["State"] = "InTest"; 58983935af9SAndrew Geissler } 5900fda0f12SGeorge Liu else if ( 5911e1e598dSJonathan Doman hostState == 5920fda0f12SGeorge Liu "xyz.openbmc_project.State.Host.HostState.TransitioningToRunning") 5931a2a1437SAndrew Geissler { 5941a2a1437SAndrew Geissler aResp->res.jsonValue["PowerState"] = "PoweringOn"; 59515c27bf8SNoah Brewer aResp->res.jsonValue["Status"]["State"] = "Starting"; 5961a2a1437SAndrew Geissler } 597002d39b4SEd Tanous else if (hostState == 5980fda0f12SGeorge Liu "xyz.openbmc_project.State.Host.HostState.TransitioningToOff") 5991a2a1437SAndrew Geissler { 6001a2a1437SAndrew Geissler aResp->res.jsonValue["PowerState"] = "PoweringOff"; 6011a2a1437SAndrew Geissler aResp->res.jsonValue["Status"]["State"] = "Disabled"; 6021a2a1437SAndrew Geissler } 6031abe55efSEd Tanous else 6041abe55efSEd Tanous { 60555c7b7a2SEd Tanous aResp->res.jsonValue["PowerState"] = "Off"; 6066617338dSEd Tanous aResp->res.jsonValue["Status"]["State"] = "Disabled"; 607c5b2abe0SLewanczyk, Dawid } 6081e1e598dSJonathan Doman }); 609c5b2abe0SLewanczyk, Dawid } 610c5b2abe0SLewanczyk, Dawid 611c5b2abe0SLewanczyk, Dawid /** 612786d0f60SGunnar Mills * @brief Translates boot source DBUS property value to redfish. 613491d8ee7SSantosh Puranik * 614491d8ee7SSantosh Puranik * @param[in] dbusSource The boot source in DBUS speak. 615491d8ee7SSantosh Puranik * 616491d8ee7SSantosh Puranik * @return Returns as a string, the boot source in Redfish terms. If translation 617491d8ee7SSantosh Puranik * cannot be done, returns an empty string. 618491d8ee7SSantosh Puranik */ 61923a21a1cSEd Tanous inline std::string dbusToRfBootSource(const std::string& dbusSource) 620491d8ee7SSantosh Puranik { 621491d8ee7SSantosh Puranik if (dbusSource == "xyz.openbmc_project.Control.Boot.Source.Sources.Default") 622491d8ee7SSantosh Puranik { 623491d8ee7SSantosh Puranik return "None"; 624491d8ee7SSantosh Puranik } 6253174e4dfSEd Tanous if (dbusSource == "xyz.openbmc_project.Control.Boot.Source.Sources.Disk") 626491d8ee7SSantosh Puranik { 627491d8ee7SSantosh Puranik return "Hdd"; 628491d8ee7SSantosh Puranik } 6293174e4dfSEd Tanous if (dbusSource == 630a71dc0b7SSantosh Puranik "xyz.openbmc_project.Control.Boot.Source.Sources.ExternalMedia") 631491d8ee7SSantosh Puranik { 632491d8ee7SSantosh Puranik return "Cd"; 633491d8ee7SSantosh Puranik } 6343174e4dfSEd Tanous if (dbusSource == "xyz.openbmc_project.Control.Boot.Source.Sources.Network") 635491d8ee7SSantosh Puranik { 636491d8ee7SSantosh Puranik return "Pxe"; 637491d8ee7SSantosh Puranik } 6383174e4dfSEd Tanous if (dbusSource == 639944ffaf9SJohnathan Mantey "xyz.openbmc_project.Control.Boot.Source.Sources.RemovableMedia") 6409f16b2c1SJennifer Lee { 6419f16b2c1SJennifer Lee return "Usb"; 6429f16b2c1SJennifer Lee } 643491d8ee7SSantosh Puranik return ""; 644491d8ee7SSantosh Puranik } 645491d8ee7SSantosh Puranik 646491d8ee7SSantosh Puranik /** 647cd9a4666SKonstantin Aladyshev * @brief Translates boot type DBUS property value to redfish. 648cd9a4666SKonstantin Aladyshev * 649cd9a4666SKonstantin Aladyshev * @param[in] dbusType The boot type in DBUS speak. 650cd9a4666SKonstantin Aladyshev * 651cd9a4666SKonstantin Aladyshev * @return Returns as a string, the boot type in Redfish terms. If translation 652cd9a4666SKonstantin Aladyshev * cannot be done, returns an empty string. 653cd9a4666SKonstantin Aladyshev */ 654cd9a4666SKonstantin Aladyshev inline std::string dbusToRfBootType(const std::string& dbusType) 655cd9a4666SKonstantin Aladyshev { 656cd9a4666SKonstantin Aladyshev if (dbusType == "xyz.openbmc_project.Control.Boot.Type.Types.Legacy") 657cd9a4666SKonstantin Aladyshev { 658cd9a4666SKonstantin Aladyshev return "Legacy"; 659cd9a4666SKonstantin Aladyshev } 660cd9a4666SKonstantin Aladyshev if (dbusType == "xyz.openbmc_project.Control.Boot.Type.Types.EFI") 661cd9a4666SKonstantin Aladyshev { 662cd9a4666SKonstantin Aladyshev return "UEFI"; 663cd9a4666SKonstantin Aladyshev } 664cd9a4666SKonstantin Aladyshev return ""; 665cd9a4666SKonstantin Aladyshev } 666cd9a4666SKonstantin Aladyshev 667cd9a4666SKonstantin Aladyshev /** 668786d0f60SGunnar Mills * @brief Translates boot mode DBUS property value to redfish. 669491d8ee7SSantosh Puranik * 670491d8ee7SSantosh Puranik * @param[in] dbusMode The boot mode in DBUS speak. 671491d8ee7SSantosh Puranik * 672491d8ee7SSantosh Puranik * @return Returns as a string, the boot mode in Redfish terms. If translation 673491d8ee7SSantosh Puranik * cannot be done, returns an empty string. 674491d8ee7SSantosh Puranik */ 67523a21a1cSEd Tanous inline std::string dbusToRfBootMode(const std::string& dbusMode) 676491d8ee7SSantosh Puranik { 677491d8ee7SSantosh Puranik if (dbusMode == "xyz.openbmc_project.Control.Boot.Mode.Modes.Regular") 678491d8ee7SSantosh Puranik { 679491d8ee7SSantosh Puranik return "None"; 680491d8ee7SSantosh Puranik } 6813174e4dfSEd Tanous if (dbusMode == "xyz.openbmc_project.Control.Boot.Mode.Modes.Safe") 682491d8ee7SSantosh Puranik { 683491d8ee7SSantosh Puranik return "Diags"; 684491d8ee7SSantosh Puranik } 6853174e4dfSEd Tanous if (dbusMode == "xyz.openbmc_project.Control.Boot.Mode.Modes.Setup") 686491d8ee7SSantosh Puranik { 687491d8ee7SSantosh Puranik return "BiosSetup"; 688491d8ee7SSantosh Puranik } 689491d8ee7SSantosh Puranik return ""; 690491d8ee7SSantosh Puranik } 691491d8ee7SSantosh Puranik 692491d8ee7SSantosh Puranik /** 693e43914b3SAndrew Geissler * @brief Translates boot progress DBUS property value to redfish. 694e43914b3SAndrew Geissler * 695e43914b3SAndrew Geissler * @param[in] dbusBootProgress The boot progress in DBUS speak. 696e43914b3SAndrew Geissler * 697e43914b3SAndrew Geissler * @return Returns as a string, the boot progress in Redfish terms. If 698e43914b3SAndrew Geissler * translation cannot be done, returns "None". 699e43914b3SAndrew Geissler */ 700e43914b3SAndrew Geissler inline std::string dbusToRfBootProgress(const std::string& dbusBootProgress) 701e43914b3SAndrew Geissler { 702e43914b3SAndrew Geissler // Now convert the D-Bus BootProgress to the appropriate Redfish 703e43914b3SAndrew Geissler // enum 704e43914b3SAndrew Geissler std::string rfBpLastState = "None"; 705e43914b3SAndrew Geissler if (dbusBootProgress == "xyz.openbmc_project.State.Boot.Progress." 706e43914b3SAndrew Geissler "ProgressStages.Unspecified") 707e43914b3SAndrew Geissler { 708e43914b3SAndrew Geissler rfBpLastState = "None"; 709e43914b3SAndrew Geissler } 710e43914b3SAndrew Geissler else if (dbusBootProgress == 711e43914b3SAndrew Geissler "xyz.openbmc_project.State.Boot.Progress.ProgressStages." 712e43914b3SAndrew Geissler "PrimaryProcInit") 713e43914b3SAndrew Geissler { 714e43914b3SAndrew Geissler rfBpLastState = "PrimaryProcessorInitializationStarted"; 715e43914b3SAndrew Geissler } 716e43914b3SAndrew Geissler else if (dbusBootProgress == 717e43914b3SAndrew Geissler "xyz.openbmc_project.State.Boot.Progress.ProgressStages." 718e43914b3SAndrew Geissler "BusInit") 719e43914b3SAndrew Geissler { 720e43914b3SAndrew Geissler rfBpLastState = "BusInitializationStarted"; 721e43914b3SAndrew Geissler } 722e43914b3SAndrew Geissler else if (dbusBootProgress == 723e43914b3SAndrew Geissler "xyz.openbmc_project.State.Boot.Progress.ProgressStages." 724e43914b3SAndrew Geissler "MemoryInit") 725e43914b3SAndrew Geissler { 726e43914b3SAndrew Geissler rfBpLastState = "MemoryInitializationStarted"; 727e43914b3SAndrew Geissler } 728e43914b3SAndrew Geissler else if (dbusBootProgress == 729e43914b3SAndrew Geissler "xyz.openbmc_project.State.Boot.Progress.ProgressStages." 730e43914b3SAndrew Geissler "SecondaryProcInit") 731e43914b3SAndrew Geissler { 732e43914b3SAndrew Geissler rfBpLastState = "SecondaryProcessorInitializationStarted"; 733e43914b3SAndrew Geissler } 734e43914b3SAndrew Geissler else if (dbusBootProgress == 735e43914b3SAndrew Geissler "xyz.openbmc_project.State.Boot.Progress.ProgressStages." 736e43914b3SAndrew Geissler "PCIInit") 737e43914b3SAndrew Geissler { 738e43914b3SAndrew Geissler rfBpLastState = "PCIResourceConfigStarted"; 739e43914b3SAndrew Geissler } 740e43914b3SAndrew Geissler else if (dbusBootProgress == 741e43914b3SAndrew Geissler "xyz.openbmc_project.State.Boot.Progress.ProgressStages." 742e43914b3SAndrew Geissler "SystemSetup") 743e43914b3SAndrew Geissler { 744e43914b3SAndrew Geissler rfBpLastState = "SetupEntered"; 745e43914b3SAndrew Geissler } 746e43914b3SAndrew Geissler else if (dbusBootProgress == 747e43914b3SAndrew Geissler "xyz.openbmc_project.State.Boot.Progress.ProgressStages." 748e43914b3SAndrew Geissler "SystemInitComplete") 749e43914b3SAndrew Geissler { 750e43914b3SAndrew Geissler rfBpLastState = "SystemHardwareInitializationComplete"; 751e43914b3SAndrew Geissler } 752e43914b3SAndrew Geissler else if (dbusBootProgress == 753e43914b3SAndrew Geissler "xyz.openbmc_project.State.Boot.Progress.ProgressStages." 754e43914b3SAndrew Geissler "OSStart") 755e43914b3SAndrew Geissler { 756e43914b3SAndrew Geissler rfBpLastState = "OSBootStarted"; 757e43914b3SAndrew Geissler } 758e43914b3SAndrew Geissler else if (dbusBootProgress == 759e43914b3SAndrew Geissler "xyz.openbmc_project.State.Boot.Progress.ProgressStages." 760e43914b3SAndrew Geissler "OSRunning") 761e43914b3SAndrew Geissler { 762e43914b3SAndrew Geissler rfBpLastState = "OSRunning"; 763e43914b3SAndrew Geissler } 764e43914b3SAndrew Geissler else 765e43914b3SAndrew Geissler { 766e43914b3SAndrew Geissler BMCWEB_LOG_DEBUG << "Unsupported D-Bus BootProgress " 767e43914b3SAndrew Geissler << dbusBootProgress; 768e43914b3SAndrew Geissler // Just return the default 769e43914b3SAndrew Geissler } 770e43914b3SAndrew Geissler return rfBpLastState; 771e43914b3SAndrew Geissler } 772e43914b3SAndrew Geissler 773e43914b3SAndrew Geissler /** 774786d0f60SGunnar Mills * @brief Translates boot source from Redfish to the DBus boot paths. 775491d8ee7SSantosh Puranik * 776491d8ee7SSantosh Puranik * @param[in] rfSource The boot source in Redfish. 777944ffaf9SJohnathan Mantey * @param[out] bootSource The DBus source 778944ffaf9SJohnathan Mantey * @param[out] bootMode the DBus boot mode 779491d8ee7SSantosh Puranik * 780944ffaf9SJohnathan Mantey * @return Integer error code. 781491d8ee7SSantosh Puranik */ 7828d1b46d7Szhanghch05 inline int assignBootParameters(const std::shared_ptr<bmcweb::AsyncResp>& aResp, 783944ffaf9SJohnathan Mantey const std::string& rfSource, 784944ffaf9SJohnathan Mantey std::string& bootSource, std::string& bootMode) 785491d8ee7SSantosh Puranik { 786c21865c4SKonstantin Aladyshev bootSource = "xyz.openbmc_project.Control.Boot.Source.Sources.Default"; 787c21865c4SKonstantin Aladyshev bootMode = "xyz.openbmc_project.Control.Boot.Mode.Modes.Regular"; 788944ffaf9SJohnathan Mantey 789491d8ee7SSantosh Puranik if (rfSource == "None") 790491d8ee7SSantosh Puranik { 791944ffaf9SJohnathan Mantey return 0; 792491d8ee7SSantosh Puranik } 7933174e4dfSEd Tanous if (rfSource == "Pxe") 794491d8ee7SSantosh Puranik { 795944ffaf9SJohnathan Mantey bootSource = "xyz.openbmc_project.Control.Boot.Source.Sources.Network"; 796944ffaf9SJohnathan Mantey } 797944ffaf9SJohnathan Mantey else if (rfSource == "Hdd") 798944ffaf9SJohnathan Mantey { 799944ffaf9SJohnathan Mantey bootSource = "xyz.openbmc_project.Control.Boot.Source.Sources.Disk"; 800944ffaf9SJohnathan Mantey } 801944ffaf9SJohnathan Mantey else if (rfSource == "Diags") 802944ffaf9SJohnathan Mantey { 803944ffaf9SJohnathan Mantey bootMode = "xyz.openbmc_project.Control.Boot.Mode.Modes.Safe"; 804944ffaf9SJohnathan Mantey } 805944ffaf9SJohnathan Mantey else if (rfSource == "Cd") 806944ffaf9SJohnathan Mantey { 807944ffaf9SJohnathan Mantey bootSource = 808944ffaf9SJohnathan Mantey "xyz.openbmc_project.Control.Boot.Source.Sources.ExternalMedia"; 809944ffaf9SJohnathan Mantey } 810944ffaf9SJohnathan Mantey else if (rfSource == "BiosSetup") 811944ffaf9SJohnathan Mantey { 812944ffaf9SJohnathan Mantey bootMode = "xyz.openbmc_project.Control.Boot.Mode.Modes.Setup"; 813491d8ee7SSantosh Puranik } 8149f16b2c1SJennifer Lee else if (rfSource == "Usb") 8159f16b2c1SJennifer Lee { 816944ffaf9SJohnathan Mantey bootSource = 817944ffaf9SJohnathan Mantey "xyz.openbmc_project.Control.Boot.Source.Sources.RemovableMedia"; 8189f16b2c1SJennifer Lee } 819491d8ee7SSantosh Puranik else 820491d8ee7SSantosh Puranik { 8210fda0f12SGeorge Liu BMCWEB_LOG_DEBUG 8220fda0f12SGeorge Liu << "Invalid property value for BootSourceOverrideTarget: " 823944ffaf9SJohnathan Mantey << bootSource; 824944ffaf9SJohnathan Mantey messages::propertyValueNotInList(aResp->res, rfSource, 825944ffaf9SJohnathan Mantey "BootSourceTargetOverride"); 826944ffaf9SJohnathan Mantey return -1; 827491d8ee7SSantosh Puranik } 828944ffaf9SJohnathan Mantey return 0; 829491d8ee7SSantosh Puranik } 8301981771bSAli Ahmed 831978b8803SAndrew Geissler /** 832978b8803SAndrew Geissler * @brief Retrieves boot progress of the system 833978b8803SAndrew Geissler * 834978b8803SAndrew Geissler * @param[in] aResp Shared pointer for generating response message. 835978b8803SAndrew Geissler * 836978b8803SAndrew Geissler * @return None. 837978b8803SAndrew Geissler */ 8388d1b46d7Szhanghch05 inline void getBootProgress(const std::shared_ptr<bmcweb::AsyncResp>& aResp) 839978b8803SAndrew Geissler { 8401e1e598dSJonathan Doman sdbusplus::asio::getProperty<std::string>( 8411e1e598dSJonathan Doman *crow::connections::systemBus, "xyz.openbmc_project.State.Host", 8421e1e598dSJonathan Doman "/xyz/openbmc_project/state/host0", 8431e1e598dSJonathan Doman "xyz.openbmc_project.State.Boot.Progress", "BootProgress", 8445e7e2dc5SEd Tanous [aResp](const boost::system::error_code& ec, 8451e1e598dSJonathan Doman const std::string& bootProgressStr) { 846978b8803SAndrew Geissler if (ec) 847978b8803SAndrew Geissler { 848978b8803SAndrew Geissler // BootProgress is an optional object so just do nothing if 849978b8803SAndrew Geissler // not found 850978b8803SAndrew Geissler return; 851978b8803SAndrew Geissler } 852978b8803SAndrew Geissler 8531e1e598dSJonathan Doman BMCWEB_LOG_DEBUG << "Boot Progress: " << bootProgressStr; 854978b8803SAndrew Geissler 855e43914b3SAndrew Geissler aResp->res.jsonValue["BootProgress"]["LastState"] = 856e43914b3SAndrew Geissler dbusToRfBootProgress(bootProgressStr); 8571e1e598dSJonathan Doman }); 858978b8803SAndrew Geissler } 859491d8ee7SSantosh Puranik 860491d8ee7SSantosh Puranik /** 861b6d5d45cSHieu Huynh * @brief Retrieves boot progress Last Update of the system 862b6d5d45cSHieu Huynh * 863b6d5d45cSHieu Huynh * @param[in] aResp Shared pointer for generating response message. 864b6d5d45cSHieu Huynh * 865b6d5d45cSHieu Huynh * @return None. 866b6d5d45cSHieu Huynh */ 867b6d5d45cSHieu Huynh inline void getBootProgressLastStateTime( 868b6d5d45cSHieu Huynh const std::shared_ptr<bmcweb::AsyncResp>& aResp) 869b6d5d45cSHieu Huynh { 870b6d5d45cSHieu Huynh sdbusplus::asio::getProperty<uint64_t>( 871b6d5d45cSHieu Huynh *crow::connections::systemBus, "xyz.openbmc_project.State.Host", 872b6d5d45cSHieu Huynh "/xyz/openbmc_project/state/host0", 873b6d5d45cSHieu Huynh "xyz.openbmc_project.State.Boot.Progress", "BootProgressLastUpdate", 8745e7e2dc5SEd Tanous [aResp](const boost::system::error_code& ec, 875b6d5d45cSHieu Huynh const uint64_t lastStateTime) { 876b6d5d45cSHieu Huynh if (ec) 877b6d5d45cSHieu Huynh { 878b6d5d45cSHieu Huynh BMCWEB_LOG_DEBUG << "D-BUS response error " << ec; 879b6d5d45cSHieu Huynh return; 880b6d5d45cSHieu Huynh } 881b6d5d45cSHieu Huynh 882b6d5d45cSHieu Huynh // BootProgressLastUpdate is the last time the BootProgress property 883b6d5d45cSHieu Huynh // was updated. The time is the Epoch time, number of microseconds 884b6d5d45cSHieu Huynh // since 1 Jan 1970 00::00::00 UTC." 885b6d5d45cSHieu Huynh // https://github.com/openbmc/phosphor-dbus-interfaces/blob/master/ 886b6d5d45cSHieu Huynh // yaml/xyz/openbmc_project/State/Boot/Progress.interface.yaml#L11 887b6d5d45cSHieu Huynh 888b6d5d45cSHieu Huynh // Convert to ISO 8601 standard 889b6d5d45cSHieu Huynh aResp->res.jsonValue["BootProgress"]["LastStateTime"] = 890b6d5d45cSHieu Huynh redfish::time_utils::getDateTimeUintUs(lastStateTime); 891b6d5d45cSHieu Huynh }); 892b6d5d45cSHieu Huynh } 893b6d5d45cSHieu Huynh 894b6d5d45cSHieu Huynh /** 895c21865c4SKonstantin Aladyshev * @brief Retrieves boot override type over DBUS and fills out the response 896cd9a4666SKonstantin Aladyshev * 897cd9a4666SKonstantin Aladyshev * @param[in] aResp Shared pointer for generating response message. 898cd9a4666SKonstantin Aladyshev * 899cd9a4666SKonstantin Aladyshev * @return None. 900cd9a4666SKonstantin Aladyshev */ 901cd9a4666SKonstantin Aladyshev 902c21865c4SKonstantin Aladyshev inline void getBootOverrideType(const std::shared_ptr<bmcweb::AsyncResp>& aResp) 903cd9a4666SKonstantin Aladyshev { 9041e1e598dSJonathan Doman sdbusplus::asio::getProperty<std::string>( 9051e1e598dSJonathan Doman *crow::connections::systemBus, "xyz.openbmc_project.Settings", 9061e1e598dSJonathan Doman "/xyz/openbmc_project/control/host0/boot", 9071e1e598dSJonathan Doman "xyz.openbmc_project.Control.Boot.Type", "BootType", 9085e7e2dc5SEd Tanous [aResp](const boost::system::error_code& ec, 9091e1e598dSJonathan Doman const std::string& bootType) { 910cd9a4666SKonstantin Aladyshev if (ec) 911cd9a4666SKonstantin Aladyshev { 912cd9a4666SKonstantin Aladyshev // not an error, don't have to have the interface 913cd9a4666SKonstantin Aladyshev return; 914cd9a4666SKonstantin Aladyshev } 915cd9a4666SKonstantin Aladyshev 9161e1e598dSJonathan Doman BMCWEB_LOG_DEBUG << "Boot type: " << bootType; 917cd9a4666SKonstantin Aladyshev 918002d39b4SEd Tanous aResp->res.jsonValue["Boot"] 919002d39b4SEd Tanous ["BootSourceOverrideMode@Redfish.AllowableValues"] = 920613dabeaSEd Tanous nlohmann::json::array_t({"Legacy", "UEFI"}); 921cd9a4666SKonstantin Aladyshev 9221e1e598dSJonathan Doman auto rfType = dbusToRfBootType(bootType); 923cd9a4666SKonstantin Aladyshev if (rfType.empty()) 924cd9a4666SKonstantin Aladyshev { 925cd9a4666SKonstantin Aladyshev messages::internalError(aResp->res); 926cd9a4666SKonstantin Aladyshev return; 927cd9a4666SKonstantin Aladyshev } 928cd9a4666SKonstantin Aladyshev 929cd9a4666SKonstantin Aladyshev aResp->res.jsonValue["Boot"]["BootSourceOverrideMode"] = rfType; 9301e1e598dSJonathan Doman }); 931cd9a4666SKonstantin Aladyshev } 932cd9a4666SKonstantin Aladyshev 933cd9a4666SKonstantin Aladyshev /** 934c21865c4SKonstantin Aladyshev * @brief Retrieves boot override mode over DBUS and fills out the response 935491d8ee7SSantosh Puranik * 936491d8ee7SSantosh Puranik * @param[in] aResp Shared pointer for generating response message. 937491d8ee7SSantosh Puranik * 938491d8ee7SSantosh Puranik * @return None. 939491d8ee7SSantosh Puranik */ 940c21865c4SKonstantin Aladyshev 941c21865c4SKonstantin Aladyshev inline void getBootOverrideMode(const std::shared_ptr<bmcweb::AsyncResp>& aResp) 942491d8ee7SSantosh Puranik { 9431e1e598dSJonathan Doman sdbusplus::asio::getProperty<std::string>( 9441e1e598dSJonathan Doman *crow::connections::systemBus, "xyz.openbmc_project.Settings", 9451e1e598dSJonathan Doman "/xyz/openbmc_project/control/host0/boot", 9461e1e598dSJonathan Doman "xyz.openbmc_project.Control.Boot.Mode", "BootMode", 9475e7e2dc5SEd Tanous [aResp](const boost::system::error_code& ec, 9481e1e598dSJonathan Doman const std::string& bootModeStr) { 949491d8ee7SSantosh Puranik if (ec) 950491d8ee7SSantosh Puranik { 951491d8ee7SSantosh Puranik BMCWEB_LOG_DEBUG << "DBUS response error " << ec; 952491d8ee7SSantosh Puranik messages::internalError(aResp->res); 953491d8ee7SSantosh Puranik return; 954491d8ee7SSantosh Puranik } 955491d8ee7SSantosh Puranik 9561e1e598dSJonathan Doman BMCWEB_LOG_DEBUG << "Boot mode: " << bootModeStr; 957491d8ee7SSantosh Puranik 9580fda0f12SGeorge Liu aResp->res 9590fda0f12SGeorge Liu .jsonValue["Boot"] 960002d39b4SEd Tanous ["BootSourceOverrideTarget@Redfish.AllowableValues"] = { 961002d39b4SEd Tanous "None", "Pxe", "Hdd", "Cd", "Diags", "BiosSetup", "Usb"}; 962491d8ee7SSantosh Puranik 9631e1e598dSJonathan Doman if (bootModeStr != 964491d8ee7SSantosh Puranik "xyz.openbmc_project.Control.Boot.Mode.Modes.Regular") 965491d8ee7SSantosh Puranik { 9661e1e598dSJonathan Doman auto rfMode = dbusToRfBootMode(bootModeStr); 967491d8ee7SSantosh Puranik if (!rfMode.empty()) 968491d8ee7SSantosh Puranik { 969491d8ee7SSantosh Puranik aResp->res.jsonValue["Boot"]["BootSourceOverrideTarget"] = 970491d8ee7SSantosh Puranik rfMode; 971491d8ee7SSantosh Puranik } 972491d8ee7SSantosh Puranik } 9731e1e598dSJonathan Doman }); 974491d8ee7SSantosh Puranik } 975491d8ee7SSantosh Puranik 976491d8ee7SSantosh Puranik /** 977c21865c4SKonstantin Aladyshev * @brief Retrieves boot override source over DBUS 978491d8ee7SSantosh Puranik * 979491d8ee7SSantosh Puranik * @param[in] aResp Shared pointer for generating response message. 980491d8ee7SSantosh Puranik * 981491d8ee7SSantosh Puranik * @return None. 982491d8ee7SSantosh Puranik */ 983c21865c4SKonstantin Aladyshev 984c21865c4SKonstantin Aladyshev inline void 985c21865c4SKonstantin Aladyshev getBootOverrideSource(const std::shared_ptr<bmcweb::AsyncResp>& aResp) 986491d8ee7SSantosh Puranik { 9871e1e598dSJonathan Doman sdbusplus::asio::getProperty<std::string>( 9881e1e598dSJonathan Doman *crow::connections::systemBus, "xyz.openbmc_project.Settings", 9891e1e598dSJonathan Doman "/xyz/openbmc_project/control/host0/boot", 9901e1e598dSJonathan Doman "xyz.openbmc_project.Control.Boot.Source", "BootSource", 9915e7e2dc5SEd Tanous [aResp](const boost::system::error_code& ec, 9921e1e598dSJonathan Doman const std::string& bootSourceStr) { 993491d8ee7SSantosh Puranik if (ec) 994491d8ee7SSantosh Puranik { 995491d8ee7SSantosh Puranik BMCWEB_LOG_DEBUG << "DBUS response error " << ec; 9965ef735c8SNan Zhou if (ec.value() == boost::asio::error::host_unreachable) 9975ef735c8SNan Zhou { 9985ef735c8SNan Zhou return; 9995ef735c8SNan Zhou } 1000491d8ee7SSantosh Puranik messages::internalError(aResp->res); 1001491d8ee7SSantosh Puranik return; 1002491d8ee7SSantosh Puranik } 1003491d8ee7SSantosh Puranik 10041e1e598dSJonathan Doman BMCWEB_LOG_DEBUG << "Boot source: " << bootSourceStr; 1005491d8ee7SSantosh Puranik 10061e1e598dSJonathan Doman auto rfSource = dbusToRfBootSource(bootSourceStr); 1007491d8ee7SSantosh Puranik if (!rfSource.empty()) 1008491d8ee7SSantosh Puranik { 1009002d39b4SEd Tanous aResp->res.jsonValue["Boot"]["BootSourceOverrideTarget"] = rfSource; 1010491d8ee7SSantosh Puranik } 1011cd9a4666SKonstantin Aladyshev 1012cd9a4666SKonstantin Aladyshev // Get BootMode as BootSourceOverrideTarget is constructed 1013cd9a4666SKonstantin Aladyshev // from both BootSource and BootMode 1014c21865c4SKonstantin Aladyshev getBootOverrideMode(aResp); 10151e1e598dSJonathan Doman }); 1016491d8ee7SSantosh Puranik } 1017491d8ee7SSantosh Puranik 1018491d8ee7SSantosh Puranik /** 1019c21865c4SKonstantin Aladyshev * @brief This functions abstracts all the logic behind getting a 1020c21865c4SKonstantin Aladyshev * "BootSourceOverrideEnabled" property from an overall boot override enable 1021c21865c4SKonstantin Aladyshev * state 1022491d8ee7SSantosh Puranik * 1023491d8ee7SSantosh Puranik * @param[in] aResp Shared pointer for generating response message. 1024491d8ee7SSantosh Puranik * 1025491d8ee7SSantosh Puranik * @return None. 1026491d8ee7SSantosh Puranik */ 1027491d8ee7SSantosh Puranik 1028c21865c4SKonstantin Aladyshev inline void 1029c21865c4SKonstantin Aladyshev processBootOverrideEnable(const std::shared_ptr<bmcweb::AsyncResp>& aResp, 1030c21865c4SKonstantin Aladyshev const bool bootOverrideEnableSetting) 1031c21865c4SKonstantin Aladyshev { 1032c21865c4SKonstantin Aladyshev if (!bootOverrideEnableSetting) 1033c21865c4SKonstantin Aladyshev { 1034c21865c4SKonstantin Aladyshev aResp->res.jsonValue["Boot"]["BootSourceOverrideEnabled"] = "Disabled"; 1035c21865c4SKonstantin Aladyshev return; 1036c21865c4SKonstantin Aladyshev } 1037c21865c4SKonstantin Aladyshev 1038c21865c4SKonstantin Aladyshev // If boot source override is enabled, we need to check 'one_time' 1039c21865c4SKonstantin Aladyshev // property to set a correct value for the "BootSourceOverrideEnabled" 10401e1e598dSJonathan Doman sdbusplus::asio::getProperty<bool>( 10411e1e598dSJonathan Doman *crow::connections::systemBus, "xyz.openbmc_project.Settings", 10421e1e598dSJonathan Doman "/xyz/openbmc_project/control/host0/boot/one_time", 10431e1e598dSJonathan Doman "xyz.openbmc_project.Object.Enable", "Enabled", 10445e7e2dc5SEd Tanous [aResp](const boost::system::error_code& ec, bool oneTimeSetting) { 1045491d8ee7SSantosh Puranik if (ec) 1046491d8ee7SSantosh Puranik { 1047491d8ee7SSantosh Puranik BMCWEB_LOG_DEBUG << "DBUS response error " << ec; 1048c21865c4SKonstantin Aladyshev messages::internalError(aResp->res); 1049491d8ee7SSantosh Puranik return; 1050491d8ee7SSantosh Puranik } 1051491d8ee7SSantosh Puranik 1052c21865c4SKonstantin Aladyshev if (oneTimeSetting) 1053c21865c4SKonstantin Aladyshev { 1054002d39b4SEd Tanous aResp->res.jsonValue["Boot"]["BootSourceOverrideEnabled"] = "Once"; 1055c21865c4SKonstantin Aladyshev } 1056c21865c4SKonstantin Aladyshev else 1057c21865c4SKonstantin Aladyshev { 1058c21865c4SKonstantin Aladyshev aResp->res.jsonValue["Boot"]["BootSourceOverrideEnabled"] = 1059c21865c4SKonstantin Aladyshev "Continuous"; 1060c21865c4SKonstantin Aladyshev } 10611e1e598dSJonathan Doman }); 1062491d8ee7SSantosh Puranik } 1063491d8ee7SSantosh Puranik 1064491d8ee7SSantosh Puranik /** 1065c21865c4SKonstantin Aladyshev * @brief Retrieves boot override enable over DBUS 1066c21865c4SKonstantin Aladyshev * 1067c21865c4SKonstantin Aladyshev * @param[in] aResp Shared pointer for generating response message. 1068c21865c4SKonstantin Aladyshev * 1069c21865c4SKonstantin Aladyshev * @return None. 1070c21865c4SKonstantin Aladyshev */ 1071c21865c4SKonstantin Aladyshev 1072c21865c4SKonstantin Aladyshev inline void 1073c21865c4SKonstantin Aladyshev getBootOverrideEnable(const std::shared_ptr<bmcweb::AsyncResp>& aResp) 1074c21865c4SKonstantin Aladyshev { 10751e1e598dSJonathan Doman sdbusplus::asio::getProperty<bool>( 10761e1e598dSJonathan Doman *crow::connections::systemBus, "xyz.openbmc_project.Settings", 10771e1e598dSJonathan Doman "/xyz/openbmc_project/control/host0/boot", 10781e1e598dSJonathan Doman "xyz.openbmc_project.Object.Enable", "Enabled", 10795e7e2dc5SEd Tanous [aResp](const boost::system::error_code& ec, 10801e1e598dSJonathan Doman const bool bootOverrideEnable) { 1081c21865c4SKonstantin Aladyshev if (ec) 1082c21865c4SKonstantin Aladyshev { 1083c21865c4SKonstantin Aladyshev BMCWEB_LOG_DEBUG << "DBUS response error " << ec; 10845ef735c8SNan Zhou if (ec.value() == boost::asio::error::host_unreachable) 10855ef735c8SNan Zhou { 10865ef735c8SNan Zhou return; 10875ef735c8SNan Zhou } 1088c21865c4SKonstantin Aladyshev messages::internalError(aResp->res); 1089c21865c4SKonstantin Aladyshev return; 1090c21865c4SKonstantin Aladyshev } 1091c21865c4SKonstantin Aladyshev 10921e1e598dSJonathan Doman processBootOverrideEnable(aResp, bootOverrideEnable); 10931e1e598dSJonathan Doman }); 1094c21865c4SKonstantin Aladyshev } 1095c21865c4SKonstantin Aladyshev 1096c21865c4SKonstantin Aladyshev /** 1097c21865c4SKonstantin Aladyshev * @brief Retrieves boot source override properties 1098c21865c4SKonstantin Aladyshev * 1099c21865c4SKonstantin Aladyshev * @param[in] aResp Shared pointer for generating response message. 1100c21865c4SKonstantin Aladyshev * 1101c21865c4SKonstantin Aladyshev * @return None. 1102c21865c4SKonstantin Aladyshev */ 1103c21865c4SKonstantin Aladyshev inline void getBootProperties(const std::shared_ptr<bmcweb::AsyncResp>& aResp) 1104c21865c4SKonstantin Aladyshev { 1105c21865c4SKonstantin Aladyshev BMCWEB_LOG_DEBUG << "Get boot information."; 1106c21865c4SKonstantin Aladyshev 1107c21865c4SKonstantin Aladyshev getBootOverrideSource(aResp); 1108c21865c4SKonstantin Aladyshev getBootOverrideType(aResp); 1109c21865c4SKonstantin Aladyshev getBootOverrideEnable(aResp); 1110c21865c4SKonstantin Aladyshev } 1111c21865c4SKonstantin Aladyshev 1112c21865c4SKonstantin Aladyshev /** 1113c0557e1aSGunnar Mills * @brief Retrieves the Last Reset Time 1114c0557e1aSGunnar Mills * 1115c0557e1aSGunnar Mills * "Reset" is an overloaded term in Redfish, "Reset" includes power on 1116c0557e1aSGunnar Mills * and power off. Even though this is the "system" Redfish object look at the 1117c0557e1aSGunnar Mills * chassis D-Bus interface for the LastStateChangeTime since this has the 1118c0557e1aSGunnar Mills * last power operation time. 1119c0557e1aSGunnar Mills * 1120c0557e1aSGunnar Mills * @param[in] aResp Shared pointer for generating response message. 1121c0557e1aSGunnar Mills * 1122c0557e1aSGunnar Mills * @return None. 1123c0557e1aSGunnar Mills */ 11248d1b46d7Szhanghch05 inline void getLastResetTime(const std::shared_ptr<bmcweb::AsyncResp>& aResp) 1125c0557e1aSGunnar Mills { 1126c0557e1aSGunnar Mills BMCWEB_LOG_DEBUG << "Getting System Last Reset Time"; 1127c0557e1aSGunnar Mills 11281e1e598dSJonathan Doman sdbusplus::asio::getProperty<uint64_t>( 11291e1e598dSJonathan Doman *crow::connections::systemBus, "xyz.openbmc_project.State.Chassis", 11301e1e598dSJonathan Doman "/xyz/openbmc_project/state/chassis0", 11311e1e598dSJonathan Doman "xyz.openbmc_project.State.Chassis", "LastStateChangeTime", 11325e7e2dc5SEd Tanous [aResp](const boost::system::error_code& ec, uint64_t lastResetTime) { 1133c0557e1aSGunnar Mills if (ec) 1134c0557e1aSGunnar Mills { 1135c0557e1aSGunnar Mills BMCWEB_LOG_DEBUG << "D-BUS response error " << ec; 1136c0557e1aSGunnar Mills return; 1137c0557e1aSGunnar Mills } 1138c0557e1aSGunnar Mills 1139c0557e1aSGunnar Mills // LastStateChangeTime is epoch time, in milliseconds 1140c0557e1aSGunnar Mills // https://github.com/openbmc/phosphor-dbus-interfaces/blob/33e8e1dd64da53a66e888d33dc82001305cd0bf9/xyz/openbmc_project/State/Chassis.interface.yaml#L19 11411e1e598dSJonathan Doman uint64_t lastResetTimeStamp = lastResetTime / 1000; 1142c0557e1aSGunnar Mills 1143c0557e1aSGunnar Mills // Convert to ISO 8601 standard 1144c0557e1aSGunnar Mills aResp->res.jsonValue["LastResetTime"] = 11452b82937eSEd Tanous redfish::time_utils::getDateTimeUint(lastResetTimeStamp); 11461e1e598dSJonathan Doman }); 1147c0557e1aSGunnar Mills } 1148c0557e1aSGunnar Mills 1149c0557e1aSGunnar Mills /** 1150797d5daeSCorey Hardesty * @brief Retrieves the number of automatic boot Retry attempts allowed/left. 1151797d5daeSCorey Hardesty * 1152797d5daeSCorey Hardesty * The total number of automatic reboot retries allowed "RetryAttempts" and its 1153797d5daeSCorey Hardesty * corresponding property "AttemptsLeft" that keeps track of the amount of 1154797d5daeSCorey Hardesty * automatic retry attempts left are hosted in phosphor-state-manager through 1155797d5daeSCorey Hardesty * dbus. 1156797d5daeSCorey Hardesty * 1157797d5daeSCorey Hardesty * @param[in] aResp Shared pointer for generating response message. 1158797d5daeSCorey Hardesty * 1159797d5daeSCorey Hardesty * @return None. 1160797d5daeSCorey Hardesty */ 1161797d5daeSCorey Hardesty inline void 1162797d5daeSCorey Hardesty getAutomaticRebootAttempts(const std::shared_ptr<bmcweb::AsyncResp>& aResp) 1163797d5daeSCorey Hardesty { 1164797d5daeSCorey Hardesty BMCWEB_LOG_DEBUG << "Get Automatic Retry policy"; 1165797d5daeSCorey Hardesty 1166797d5daeSCorey Hardesty sdbusplus::asio::getAllProperties( 1167797d5daeSCorey Hardesty *crow::connections::systemBus, "xyz.openbmc_project.State.Host", 1168797d5daeSCorey Hardesty "/xyz/openbmc_project/state/host0", 1169797d5daeSCorey Hardesty "xyz.openbmc_project.Control.Boot.RebootAttempts", 1170797d5daeSCorey Hardesty [aResp{aResp}](const boost::system::error_code& ec, 1171797d5daeSCorey Hardesty const dbus::utility::DBusPropertiesMap& propertiesList) { 1172797d5daeSCorey Hardesty if (ec) 1173797d5daeSCorey Hardesty { 1174797d5daeSCorey Hardesty if (ec.value() != EBADR) 1175797d5daeSCorey Hardesty { 1176797d5daeSCorey Hardesty BMCWEB_LOG_ERROR << "D-Bus responses error: " << ec; 1177797d5daeSCorey Hardesty messages::internalError(aResp->res); 1178797d5daeSCorey Hardesty } 1179797d5daeSCorey Hardesty return; 1180797d5daeSCorey Hardesty } 1181797d5daeSCorey Hardesty 1182797d5daeSCorey Hardesty const uint32_t* attemptsLeft = nullptr; 1183797d5daeSCorey Hardesty const uint32_t* retryAttempts = nullptr; 1184797d5daeSCorey Hardesty 1185797d5daeSCorey Hardesty const bool success = sdbusplus::unpackPropertiesNoThrow( 1186797d5daeSCorey Hardesty dbus_utils::UnpackErrorPrinter(), propertiesList, "AttemptsLeft", 1187797d5daeSCorey Hardesty attemptsLeft, "RetryAttempts", retryAttempts); 1188797d5daeSCorey Hardesty 1189797d5daeSCorey Hardesty if (!success) 1190797d5daeSCorey Hardesty { 1191797d5daeSCorey Hardesty messages::internalError(aResp->res); 1192797d5daeSCorey Hardesty return; 1193797d5daeSCorey Hardesty } 1194797d5daeSCorey Hardesty 1195797d5daeSCorey Hardesty if (attemptsLeft != nullptr) 1196797d5daeSCorey Hardesty { 1197797d5daeSCorey Hardesty aResp->res.jsonValue["Boot"]["RemainingAutomaticRetryAttempts"] = 1198797d5daeSCorey Hardesty *attemptsLeft; 1199797d5daeSCorey Hardesty } 1200797d5daeSCorey Hardesty 1201797d5daeSCorey Hardesty if (retryAttempts != nullptr) 1202797d5daeSCorey Hardesty { 1203797d5daeSCorey Hardesty aResp->res.jsonValue["Boot"]["AutomaticRetryAttempts"] = 1204797d5daeSCorey Hardesty *retryAttempts; 1205797d5daeSCorey Hardesty } 1206797d5daeSCorey Hardesty }); 1207797d5daeSCorey Hardesty } 1208797d5daeSCorey Hardesty 1209797d5daeSCorey Hardesty /** 12106bd5a8d2SGunnar Mills * @brief Retrieves Automatic Retry properties. Known on D-Bus as AutoReboot. 12116bd5a8d2SGunnar Mills * 12126bd5a8d2SGunnar Mills * @param[in] aResp Shared pointer for generating response message. 12136bd5a8d2SGunnar Mills * 12146bd5a8d2SGunnar Mills * @return None. 12156bd5a8d2SGunnar Mills */ 1216797d5daeSCorey Hardesty inline void 1217797d5daeSCorey Hardesty getAutomaticRetryPolicy(const std::shared_ptr<bmcweb::AsyncResp>& aResp) 12186bd5a8d2SGunnar Mills { 12196bd5a8d2SGunnar Mills BMCWEB_LOG_DEBUG << "Get Automatic Retry policy"; 12206bd5a8d2SGunnar Mills 12211e1e598dSJonathan Doman sdbusplus::asio::getProperty<bool>( 12221e1e598dSJonathan Doman *crow::connections::systemBus, "xyz.openbmc_project.Settings", 12231e1e598dSJonathan Doman "/xyz/openbmc_project/control/host0/auto_reboot", 12241e1e598dSJonathan Doman "xyz.openbmc_project.Control.Boot.RebootPolicy", "AutoReboot", 12255e7e2dc5SEd Tanous [aResp](const boost::system::error_code& ec, bool autoRebootEnabled) { 12266bd5a8d2SGunnar Mills if (ec) 12276bd5a8d2SGunnar Mills { 1228797d5daeSCorey Hardesty if (ec.value() != EBADR) 1229797d5daeSCorey Hardesty { 1230797d5daeSCorey Hardesty BMCWEB_LOG_ERROR << "D-Bus responses error: " << ec; 1231797d5daeSCorey Hardesty messages::internalError(aResp->res); 1232797d5daeSCorey Hardesty } 12336bd5a8d2SGunnar Mills return; 12346bd5a8d2SGunnar Mills } 12356bd5a8d2SGunnar Mills 12361e1e598dSJonathan Doman BMCWEB_LOG_DEBUG << "Auto Reboot: " << autoRebootEnabled; 1237e05aec50SEd Tanous if (autoRebootEnabled) 12386bd5a8d2SGunnar Mills { 12396bd5a8d2SGunnar Mills aResp->res.jsonValue["Boot"]["AutomaticRetryConfig"] = 12406bd5a8d2SGunnar Mills "RetryAttempts"; 12416bd5a8d2SGunnar Mills } 12426bd5a8d2SGunnar Mills else 12436bd5a8d2SGunnar Mills { 1244002d39b4SEd Tanous aResp->res.jsonValue["Boot"]["AutomaticRetryConfig"] = "Disabled"; 12456bd5a8d2SGunnar Mills } 1246797d5daeSCorey Hardesty getAutomaticRebootAttempts(aResp); 124769f35306SGunnar Mills 124869f35306SGunnar Mills // "AutomaticRetryConfig" can be 3 values, Disabled, RetryAlways, 124969f35306SGunnar Mills // and RetryAttempts. OpenBMC only supports Disabled and 125069f35306SGunnar Mills // RetryAttempts. 1251002d39b4SEd Tanous aResp->res.jsonValue["Boot"] 12520fda0f12SGeorge Liu ["AutomaticRetryConfig@Redfish.AllowableValues"] = { 12530fda0f12SGeorge Liu "Disabled", "RetryAttempts"}; 12541e1e598dSJonathan Doman }); 12556bd5a8d2SGunnar Mills } 12566bd5a8d2SGunnar Mills 12576bd5a8d2SGunnar Mills /** 1258797d5daeSCorey Hardesty * @brief Sets RetryAttempts 1259797d5daeSCorey Hardesty * 1260797d5daeSCorey Hardesty * @param[in] aResp Shared pointer for generating response message. 1261797d5daeSCorey Hardesty * @param[in] retryAttempts "AutomaticRetryAttempts" from request. 1262797d5daeSCorey Hardesty * 1263797d5daeSCorey Hardesty *@return None. 1264797d5daeSCorey Hardesty */ 1265797d5daeSCorey Hardesty 1266797d5daeSCorey Hardesty inline void 1267797d5daeSCorey Hardesty setAutomaticRetryAttempts(const std::shared_ptr<bmcweb::AsyncResp>& aResp, 1268797d5daeSCorey Hardesty const uint32_t retryAttempts) 1269797d5daeSCorey Hardesty { 1270797d5daeSCorey Hardesty BMCWEB_LOG_DEBUG << "Set Automatic Retry Attempts."; 1271797d5daeSCorey Hardesty crow::connections::systemBus->async_method_call( 1272797d5daeSCorey Hardesty [aResp](const boost::system::error_code& ec) { 1273797d5daeSCorey Hardesty if (ec) 1274797d5daeSCorey Hardesty { 1275797d5daeSCorey Hardesty BMCWEB_LOG_ERROR 1276797d5daeSCorey Hardesty << "DBUS response error: Set setAutomaticRetryAttempts" << ec; 1277797d5daeSCorey Hardesty messages::internalError(aResp->res); 1278797d5daeSCorey Hardesty return; 1279797d5daeSCorey Hardesty } 1280797d5daeSCorey Hardesty }, 1281797d5daeSCorey Hardesty "xyz.openbmc_project.State.Host", "/xyz/openbmc_project/state/host0", 1282797d5daeSCorey Hardesty "org.freedesktop.DBus.Properties", "Set", 1283797d5daeSCorey Hardesty "xyz.openbmc_project.Control.Boot.RebootAttempts", "RetryAttempts", 1284797d5daeSCorey Hardesty std::variant<uint32_t>(retryAttempts)); 1285797d5daeSCorey Hardesty } 1286797d5daeSCorey Hardesty 1287797d5daeSCorey Hardesty /** 1288c6a620f2SGeorge Liu * @brief Retrieves power restore policy over DBUS. 1289c6a620f2SGeorge Liu * 1290c6a620f2SGeorge Liu * @param[in] aResp Shared pointer for generating response message. 1291c6a620f2SGeorge Liu * 1292c6a620f2SGeorge Liu * @return None. 1293c6a620f2SGeorge Liu */ 12948d1b46d7Szhanghch05 inline void 12958d1b46d7Szhanghch05 getPowerRestorePolicy(const std::shared_ptr<bmcweb::AsyncResp>& aResp) 1296c6a620f2SGeorge Liu { 1297c6a620f2SGeorge Liu BMCWEB_LOG_DEBUG << "Get power restore policy"; 1298c6a620f2SGeorge Liu 12991e1e598dSJonathan Doman sdbusplus::asio::getProperty<std::string>( 13001e1e598dSJonathan Doman *crow::connections::systemBus, "xyz.openbmc_project.Settings", 13011e1e598dSJonathan Doman "/xyz/openbmc_project/control/host0/power_restore_policy", 13021e1e598dSJonathan Doman "xyz.openbmc_project.Control.Power.RestorePolicy", "PowerRestorePolicy", 13035e7e2dc5SEd Tanous [aResp](const boost::system::error_code& ec, 13045e7e2dc5SEd Tanous const std::string& policy) { 1305c6a620f2SGeorge Liu if (ec) 1306c6a620f2SGeorge Liu { 1307c6a620f2SGeorge Liu BMCWEB_LOG_DEBUG << "DBUS response error " << ec; 1308c6a620f2SGeorge Liu return; 1309c6a620f2SGeorge Liu } 1310c6a620f2SGeorge Liu 13110fda0f12SGeorge Liu const boost::container::flat_map<std::string, std::string> policyMaps = { 13120fda0f12SGeorge Liu {"xyz.openbmc_project.Control.Power.RestorePolicy.Policy.AlwaysOn", 1313c6a620f2SGeorge Liu "AlwaysOn"}, 13140fda0f12SGeorge Liu {"xyz.openbmc_project.Control.Power.RestorePolicy.Policy.AlwaysOff", 1315c6a620f2SGeorge Liu "AlwaysOff"}, 13160fda0f12SGeorge Liu {"xyz.openbmc_project.Control.Power.RestorePolicy.Policy.Restore", 13174ed47cb8SMatthew Barth "LastState"}, 13184ed47cb8SMatthew Barth // Return `AlwaysOff` when power restore policy set to "None" 13194ed47cb8SMatthew Barth {"xyz.openbmc_project.Control.Power.RestorePolicy.Policy.None", 13204ed47cb8SMatthew Barth "AlwaysOff"}}; 1321c6a620f2SGeorge Liu 13221e1e598dSJonathan Doman auto policyMapsIt = policyMaps.find(policy); 1323c6a620f2SGeorge Liu if (policyMapsIt == policyMaps.end()) 1324c6a620f2SGeorge Liu { 1325c6a620f2SGeorge Liu messages::internalError(aResp->res); 1326c6a620f2SGeorge Liu return; 1327c6a620f2SGeorge Liu } 1328c6a620f2SGeorge Liu 1329c6a620f2SGeorge Liu aResp->res.jsonValue["PowerRestorePolicy"] = policyMapsIt->second; 13301e1e598dSJonathan Doman }); 1331c6a620f2SGeorge Liu } 1332c6a620f2SGeorge Liu 1333c6a620f2SGeorge Liu /** 13341981771bSAli Ahmed * @brief Get TrustedModuleRequiredToBoot property. Determines whether or not 13351981771bSAli Ahmed * TPM is required for booting the host. 13361981771bSAli Ahmed * 13371981771bSAli Ahmed * @param[in] aResp Shared pointer for generating response message. 13381981771bSAli Ahmed * 13391981771bSAli Ahmed * @return None. 13401981771bSAli Ahmed */ 13411981771bSAli Ahmed inline void getTrustedModuleRequiredToBoot( 13421981771bSAli Ahmed const std::shared_ptr<bmcweb::AsyncResp>& aResp) 13431981771bSAli Ahmed { 13441981771bSAli Ahmed BMCWEB_LOG_DEBUG << "Get TPM required to boot."; 1345e99073f5SGeorge Liu constexpr std::array<std::string_view, 1> interfaces = { 1346e99073f5SGeorge Liu "xyz.openbmc_project.Control.TPM.Policy"}; 1347e99073f5SGeorge Liu dbus::utility::getSubTree( 1348e99073f5SGeorge Liu "/", 0, interfaces, 1349e99073f5SGeorge Liu [aResp](const boost::system::error_code& ec, 1350b9d36b47SEd Tanous const dbus::utility::MapperGetSubTreeResponse& subtree) { 13511981771bSAli Ahmed if (ec) 13521981771bSAli Ahmed { 1353002d39b4SEd Tanous BMCWEB_LOG_DEBUG << "DBUS response error on TPM.Policy GetSubTree" 1354002d39b4SEd Tanous << ec; 13551981771bSAli Ahmed // This is an optional D-Bus object so just return if 13561981771bSAli Ahmed // error occurs 13571981771bSAli Ahmed return; 13581981771bSAli Ahmed } 135926f6976fSEd Tanous if (subtree.empty()) 13601981771bSAli Ahmed { 13611981771bSAli Ahmed // As noted above, this is an optional interface so just return 13621981771bSAli Ahmed // if there is no instance found 13631981771bSAli Ahmed return; 13641981771bSAli Ahmed } 13651981771bSAli Ahmed 13661981771bSAli Ahmed /* When there is more than one TPMEnable object... */ 13671981771bSAli Ahmed if (subtree.size() > 1) 13681981771bSAli Ahmed { 13691981771bSAli Ahmed BMCWEB_LOG_DEBUG 13701981771bSAli Ahmed << "DBUS response has more than 1 TPM Enable object:" 13711981771bSAli Ahmed << subtree.size(); 13721981771bSAli Ahmed // Throw an internal Error and return 13731981771bSAli Ahmed messages::internalError(aResp->res); 13741981771bSAli Ahmed return; 13751981771bSAli Ahmed } 13761981771bSAli Ahmed 13771981771bSAli Ahmed // Make sure the Dbus response map has a service and objectPath 13781981771bSAli Ahmed // field 13791981771bSAli Ahmed if (subtree[0].first.empty() || subtree[0].second.size() != 1) 13801981771bSAli Ahmed { 13811981771bSAli Ahmed BMCWEB_LOG_DEBUG << "TPM.Policy mapper error!"; 13821981771bSAli Ahmed messages::internalError(aResp->res); 13831981771bSAli Ahmed return; 13841981771bSAli Ahmed } 13851981771bSAli Ahmed 13861981771bSAli Ahmed const std::string& path = subtree[0].first; 13871981771bSAli Ahmed const std::string& serv = subtree[0].second.begin()->first; 13881981771bSAli Ahmed 13891981771bSAli Ahmed // Valid TPM Enable object found, now reading the current value 13901e1e598dSJonathan Doman sdbusplus::asio::getProperty<bool>( 13911e1e598dSJonathan Doman *crow::connections::systemBus, serv, path, 13921e1e598dSJonathan Doman "xyz.openbmc_project.Control.TPM.Policy", "TPMEnable", 13935e7e2dc5SEd Tanous [aResp](const boost::system::error_code& ec2, bool tpmRequired) { 13948a592810SEd Tanous if (ec2) 13951981771bSAli Ahmed { 1396002d39b4SEd Tanous BMCWEB_LOG_DEBUG << "D-BUS response error on TPM.Policy Get" 13978a592810SEd Tanous << ec2; 13981981771bSAli Ahmed messages::internalError(aResp->res); 13991981771bSAli Ahmed return; 14001981771bSAli Ahmed } 14011981771bSAli Ahmed 14021e1e598dSJonathan Doman if (tpmRequired) 14031981771bSAli Ahmed { 1404002d39b4SEd Tanous aResp->res.jsonValue["Boot"]["TrustedModuleRequiredToBoot"] = 14051981771bSAli Ahmed "Required"; 14061981771bSAli Ahmed } 14071981771bSAli Ahmed else 14081981771bSAli Ahmed { 1409002d39b4SEd Tanous aResp->res.jsonValue["Boot"]["TrustedModuleRequiredToBoot"] = 14101981771bSAli Ahmed "Disabled"; 14111981771bSAli Ahmed } 14121e1e598dSJonathan Doman }); 1413e99073f5SGeorge Liu }); 14141981771bSAli Ahmed } 14151981771bSAli Ahmed 14161981771bSAli Ahmed /** 14171c05dae3SAli Ahmed * @brief Set TrustedModuleRequiredToBoot property. Determines whether or not 14181c05dae3SAli Ahmed * TPM is required for booting the host. 14191c05dae3SAli Ahmed * 14201c05dae3SAli Ahmed * @param[in] aResp Shared pointer for generating response message. 14211c05dae3SAli Ahmed * @param[in] tpmRequired Value to set TPM Required To Boot property to. 14221c05dae3SAli Ahmed * 14231c05dae3SAli Ahmed * @return None. 14241c05dae3SAli Ahmed */ 14251c05dae3SAli Ahmed inline void setTrustedModuleRequiredToBoot( 14261c05dae3SAli Ahmed const std::shared_ptr<bmcweb::AsyncResp>& aResp, const bool tpmRequired) 14271c05dae3SAli Ahmed { 14281c05dae3SAli Ahmed BMCWEB_LOG_DEBUG << "Set TrustedModuleRequiredToBoot."; 1429e99073f5SGeorge Liu constexpr std::array<std::string_view, 1> interfaces = { 1430e99073f5SGeorge Liu "xyz.openbmc_project.Control.TPM.Policy"}; 1431e99073f5SGeorge Liu dbus::utility::getSubTree( 1432e99073f5SGeorge Liu "/", 0, interfaces, 1433e99073f5SGeorge Liu [aResp, 1434e99073f5SGeorge Liu tpmRequired](const boost::system::error_code& ec, 1435e99073f5SGeorge Liu const dbus::utility::MapperGetSubTreeResponse& subtree) { 14361c05dae3SAli Ahmed if (ec) 14371c05dae3SAli Ahmed { 1438002d39b4SEd Tanous BMCWEB_LOG_DEBUG << "DBUS response error on TPM.Policy GetSubTree" 1439002d39b4SEd Tanous << ec; 14401c05dae3SAli Ahmed messages::internalError(aResp->res); 14411c05dae3SAli Ahmed return; 14421c05dae3SAli Ahmed } 144326f6976fSEd Tanous if (subtree.empty()) 14441c05dae3SAli Ahmed { 14451c05dae3SAli Ahmed messages::propertyValueNotInList(aResp->res, "ComputerSystem", 14461c05dae3SAli Ahmed "TrustedModuleRequiredToBoot"); 14471c05dae3SAli Ahmed return; 14481c05dae3SAli Ahmed } 14491c05dae3SAli Ahmed 14501c05dae3SAli Ahmed /* When there is more than one TPMEnable object... */ 14511c05dae3SAli Ahmed if (subtree.size() > 1) 14521c05dae3SAli Ahmed { 14531c05dae3SAli Ahmed BMCWEB_LOG_DEBUG 14541c05dae3SAli Ahmed << "DBUS response has more than 1 TPM Enable object:" 14551c05dae3SAli Ahmed << subtree.size(); 14561c05dae3SAli Ahmed // Throw an internal Error and return 14571c05dae3SAli Ahmed messages::internalError(aResp->res); 14581c05dae3SAli Ahmed return; 14591c05dae3SAli Ahmed } 14601c05dae3SAli Ahmed 14611c05dae3SAli Ahmed // Make sure the Dbus response map has a service and objectPath 14621c05dae3SAli Ahmed // field 14631c05dae3SAli Ahmed if (subtree[0].first.empty() || subtree[0].second.size() != 1) 14641c05dae3SAli Ahmed { 14651c05dae3SAli Ahmed BMCWEB_LOG_DEBUG << "TPM.Policy mapper error!"; 14661c05dae3SAli Ahmed messages::internalError(aResp->res); 14671c05dae3SAli Ahmed return; 14681c05dae3SAli Ahmed } 14691c05dae3SAli Ahmed 14701c05dae3SAli Ahmed const std::string& path = subtree[0].first; 14711c05dae3SAli Ahmed const std::string& serv = subtree[0].second.begin()->first; 14721c05dae3SAli Ahmed 14731c05dae3SAli Ahmed if (serv.empty()) 14741c05dae3SAli Ahmed { 14751c05dae3SAli Ahmed BMCWEB_LOG_DEBUG << "TPM.Policy service mapper error!"; 14761c05dae3SAli Ahmed messages::internalError(aResp->res); 14771c05dae3SAli Ahmed return; 14781c05dae3SAli Ahmed } 14791c05dae3SAli Ahmed 14801c05dae3SAli Ahmed // Valid TPM Enable object found, now setting the value 14811c05dae3SAli Ahmed crow::connections::systemBus->async_method_call( 14825e7e2dc5SEd Tanous [aResp](const boost::system::error_code& ec2) { 14838a592810SEd Tanous if (ec2) 14841c05dae3SAli Ahmed { 14850fda0f12SGeorge Liu BMCWEB_LOG_DEBUG 14860fda0f12SGeorge Liu << "DBUS response error: Set TrustedModuleRequiredToBoot" 14878a592810SEd Tanous << ec2; 14881c05dae3SAli Ahmed messages::internalError(aResp->res); 14891c05dae3SAli Ahmed return; 14901c05dae3SAli Ahmed } 14911c05dae3SAli Ahmed BMCWEB_LOG_DEBUG << "Set TrustedModuleRequiredToBoot done."; 14921c05dae3SAli Ahmed }, 14931c05dae3SAli Ahmed serv, path, "org.freedesktop.DBus.Properties", "Set", 14941c05dae3SAli Ahmed "xyz.openbmc_project.Control.TPM.Policy", "TPMEnable", 1495168e20c1SEd Tanous dbus::utility::DbusVariantType(tpmRequired)); 1496e99073f5SGeorge Liu }); 14971c05dae3SAli Ahmed } 14981c05dae3SAli Ahmed 14991c05dae3SAli Ahmed /** 1500491d8ee7SSantosh Puranik * @brief Sets boot properties into DBUS object(s). 1501491d8ee7SSantosh Puranik * 1502491d8ee7SSantosh Puranik * @param[in] aResp Shared pointer for generating response message. 1503cd9a4666SKonstantin Aladyshev * @param[in] bootType The boot type to set. 1504cd9a4666SKonstantin Aladyshev * @return Integer error code. 1505cd9a4666SKonstantin Aladyshev */ 1506cd9a4666SKonstantin Aladyshev inline void setBootType(const std::shared_ptr<bmcweb::AsyncResp>& aResp, 1507cd9a4666SKonstantin Aladyshev const std::optional<std::string>& bootType) 1508cd9a4666SKonstantin Aladyshev { 1509c21865c4SKonstantin Aladyshev std::string bootTypeStr; 1510cd9a4666SKonstantin Aladyshev 1511c21865c4SKonstantin Aladyshev if (!bootType) 1512cd9a4666SKonstantin Aladyshev { 1513c21865c4SKonstantin Aladyshev return; 1514c21865c4SKonstantin Aladyshev } 1515c21865c4SKonstantin Aladyshev 1516cd9a4666SKonstantin Aladyshev // Source target specified 1517cd9a4666SKonstantin Aladyshev BMCWEB_LOG_DEBUG << "Boot type: " << *bootType; 1518cd9a4666SKonstantin Aladyshev // Figure out which DBUS interface and property to use 1519cd9a4666SKonstantin Aladyshev if (*bootType == "Legacy") 1520cd9a4666SKonstantin Aladyshev { 1521cd9a4666SKonstantin Aladyshev bootTypeStr = "xyz.openbmc_project.Control.Boot.Type.Types.Legacy"; 1522cd9a4666SKonstantin Aladyshev } 1523cd9a4666SKonstantin Aladyshev else if (*bootType == "UEFI") 1524cd9a4666SKonstantin Aladyshev { 1525cd9a4666SKonstantin Aladyshev bootTypeStr = "xyz.openbmc_project.Control.Boot.Type.Types.EFI"; 1526cd9a4666SKonstantin Aladyshev } 1527cd9a4666SKonstantin Aladyshev else 1528cd9a4666SKonstantin Aladyshev { 1529cd9a4666SKonstantin Aladyshev BMCWEB_LOG_DEBUG << "Invalid property value for " 1530cd9a4666SKonstantin Aladyshev "BootSourceOverrideMode: " 1531cd9a4666SKonstantin Aladyshev << *bootType; 1532cd9a4666SKonstantin Aladyshev messages::propertyValueNotInList(aResp->res, *bootType, 1533cd9a4666SKonstantin Aladyshev "BootSourceOverrideMode"); 1534cd9a4666SKonstantin Aladyshev return; 1535cd9a4666SKonstantin Aladyshev } 1536cd9a4666SKonstantin Aladyshev 1537cd9a4666SKonstantin Aladyshev // Act on validated parameters 1538cd9a4666SKonstantin Aladyshev BMCWEB_LOG_DEBUG << "DBUS boot type: " << bootTypeStr; 1539cd9a4666SKonstantin Aladyshev 1540cd9a4666SKonstantin Aladyshev crow::connections::systemBus->async_method_call( 15415e7e2dc5SEd Tanous [aResp](const boost::system::error_code& ec) { 1542cd9a4666SKonstantin Aladyshev if (ec) 1543cd9a4666SKonstantin Aladyshev { 1544cd9a4666SKonstantin Aladyshev BMCWEB_LOG_DEBUG << "DBUS response error " << ec; 1545cd9a4666SKonstantin Aladyshev if (ec.value() == boost::asio::error::host_unreachable) 1546cd9a4666SKonstantin Aladyshev { 1547cd9a4666SKonstantin Aladyshev messages::resourceNotFound(aResp->res, "Set", "BootType"); 1548cd9a4666SKonstantin Aladyshev return; 1549cd9a4666SKonstantin Aladyshev } 1550cd9a4666SKonstantin Aladyshev messages::internalError(aResp->res); 1551cd9a4666SKonstantin Aladyshev return; 1552cd9a4666SKonstantin Aladyshev } 1553cd9a4666SKonstantin Aladyshev BMCWEB_LOG_DEBUG << "Boot type update done."; 1554cd9a4666SKonstantin Aladyshev }, 1555c21865c4SKonstantin Aladyshev "xyz.openbmc_project.Settings", 1556c21865c4SKonstantin Aladyshev "/xyz/openbmc_project/control/host0/boot", 1557cd9a4666SKonstantin Aladyshev "org.freedesktop.DBus.Properties", "Set", 1558cd9a4666SKonstantin Aladyshev "xyz.openbmc_project.Control.Boot.Type", "BootType", 1559168e20c1SEd Tanous dbus::utility::DbusVariantType(bootTypeStr)); 1560cd9a4666SKonstantin Aladyshev } 1561cd9a4666SKonstantin Aladyshev 1562cd9a4666SKonstantin Aladyshev /** 1563cd9a4666SKonstantin Aladyshev * @brief Sets boot properties into DBUS object(s). 1564cd9a4666SKonstantin Aladyshev * 1565cd9a4666SKonstantin Aladyshev * @param[in] aResp Shared pointer for generating response message. 1566c21865c4SKonstantin Aladyshev * @param[in] bootType The boot type to set. 1567c21865c4SKonstantin Aladyshev * @return Integer error code. 1568c21865c4SKonstantin Aladyshev */ 1569c21865c4SKonstantin Aladyshev inline void setBootEnable(const std::shared_ptr<bmcweb::AsyncResp>& aResp, 1570c21865c4SKonstantin Aladyshev const std::optional<std::string>& bootEnable) 1571c21865c4SKonstantin Aladyshev { 1572c21865c4SKonstantin Aladyshev if (!bootEnable) 1573c21865c4SKonstantin Aladyshev { 1574c21865c4SKonstantin Aladyshev return; 1575c21865c4SKonstantin Aladyshev } 1576c21865c4SKonstantin Aladyshev // Source target specified 1577c21865c4SKonstantin Aladyshev BMCWEB_LOG_DEBUG << "Boot enable: " << *bootEnable; 1578c21865c4SKonstantin Aladyshev 1579c21865c4SKonstantin Aladyshev bool bootOverrideEnable = false; 1580c21865c4SKonstantin Aladyshev bool bootOverridePersistent = false; 1581c21865c4SKonstantin Aladyshev // Figure out which DBUS interface and property to use 1582c21865c4SKonstantin Aladyshev if (*bootEnable == "Disabled") 1583c21865c4SKonstantin Aladyshev { 1584c21865c4SKonstantin Aladyshev bootOverrideEnable = false; 1585c21865c4SKonstantin Aladyshev } 1586c21865c4SKonstantin Aladyshev else if (*bootEnable == "Once") 1587c21865c4SKonstantin Aladyshev { 1588c21865c4SKonstantin Aladyshev bootOverrideEnable = true; 1589c21865c4SKonstantin Aladyshev bootOverridePersistent = false; 1590c21865c4SKonstantin Aladyshev } 1591c21865c4SKonstantin Aladyshev else if (*bootEnable == "Continuous") 1592c21865c4SKonstantin Aladyshev { 1593c21865c4SKonstantin Aladyshev bootOverrideEnable = true; 1594c21865c4SKonstantin Aladyshev bootOverridePersistent = true; 1595c21865c4SKonstantin Aladyshev } 1596c21865c4SKonstantin Aladyshev else 1597c21865c4SKonstantin Aladyshev { 15980fda0f12SGeorge Liu BMCWEB_LOG_DEBUG 15990fda0f12SGeorge Liu << "Invalid property value for BootSourceOverrideEnabled: " 1600c21865c4SKonstantin Aladyshev << *bootEnable; 1601c21865c4SKonstantin Aladyshev messages::propertyValueNotInList(aResp->res, *bootEnable, 1602c21865c4SKonstantin Aladyshev "BootSourceOverrideEnabled"); 1603c21865c4SKonstantin Aladyshev return; 1604c21865c4SKonstantin Aladyshev } 1605c21865c4SKonstantin Aladyshev 1606c21865c4SKonstantin Aladyshev // Act on validated parameters 1607c21865c4SKonstantin Aladyshev BMCWEB_LOG_DEBUG << "DBUS boot override enable: " << bootOverrideEnable; 1608c21865c4SKonstantin Aladyshev 1609c21865c4SKonstantin Aladyshev crow::connections::systemBus->async_method_call( 16105e7e2dc5SEd Tanous [aResp](const boost::system::error_code& ec2) { 16118a592810SEd Tanous if (ec2) 1612c21865c4SKonstantin Aladyshev { 16138a592810SEd Tanous BMCWEB_LOG_DEBUG << "DBUS response error " << ec2; 1614c21865c4SKonstantin Aladyshev messages::internalError(aResp->res); 1615c21865c4SKonstantin Aladyshev return; 1616c21865c4SKonstantin Aladyshev } 1617c21865c4SKonstantin Aladyshev BMCWEB_LOG_DEBUG << "Boot override enable update done."; 1618c21865c4SKonstantin Aladyshev }, 1619c21865c4SKonstantin Aladyshev "xyz.openbmc_project.Settings", 1620c21865c4SKonstantin Aladyshev "/xyz/openbmc_project/control/host0/boot", 1621c21865c4SKonstantin Aladyshev "org.freedesktop.DBus.Properties", "Set", 1622c21865c4SKonstantin Aladyshev "xyz.openbmc_project.Object.Enable", "Enabled", 1623168e20c1SEd Tanous dbus::utility::DbusVariantType(bootOverrideEnable)); 1624c21865c4SKonstantin Aladyshev 1625c21865c4SKonstantin Aladyshev if (!bootOverrideEnable) 1626c21865c4SKonstantin Aladyshev { 1627c21865c4SKonstantin Aladyshev return; 1628c21865c4SKonstantin Aladyshev } 1629c21865c4SKonstantin Aladyshev 1630c21865c4SKonstantin Aladyshev // In case boot override is enabled we need to set correct value for the 1631c21865c4SKonstantin Aladyshev // 'one_time' enable DBus interface 1632c21865c4SKonstantin Aladyshev BMCWEB_LOG_DEBUG << "DBUS boot override persistent: " 1633c21865c4SKonstantin Aladyshev << bootOverridePersistent; 1634c21865c4SKonstantin Aladyshev 1635c21865c4SKonstantin Aladyshev crow::connections::systemBus->async_method_call( 16365e7e2dc5SEd Tanous [aResp](const boost::system::error_code& ec) { 1637c21865c4SKonstantin Aladyshev if (ec) 1638c21865c4SKonstantin Aladyshev { 1639c21865c4SKonstantin Aladyshev BMCWEB_LOG_DEBUG << "DBUS response error " << ec; 1640c21865c4SKonstantin Aladyshev messages::internalError(aResp->res); 1641c21865c4SKonstantin Aladyshev return; 1642c21865c4SKonstantin Aladyshev } 1643c21865c4SKonstantin Aladyshev BMCWEB_LOG_DEBUG << "Boot one_time update done."; 1644c21865c4SKonstantin Aladyshev }, 1645c21865c4SKonstantin Aladyshev "xyz.openbmc_project.Settings", 1646c21865c4SKonstantin Aladyshev "/xyz/openbmc_project/control/host0/boot/one_time", 1647c21865c4SKonstantin Aladyshev "org.freedesktop.DBus.Properties", "Set", 1648c21865c4SKonstantin Aladyshev "xyz.openbmc_project.Object.Enable", "Enabled", 1649168e20c1SEd Tanous dbus::utility::DbusVariantType(!bootOverridePersistent)); 1650c21865c4SKonstantin Aladyshev } 1651c21865c4SKonstantin Aladyshev 1652c21865c4SKonstantin Aladyshev /** 1653c21865c4SKonstantin Aladyshev * @brief Sets boot properties into DBUS object(s). 1654c21865c4SKonstantin Aladyshev * 1655c21865c4SKonstantin Aladyshev * @param[in] aResp Shared pointer for generating response message. 1656491d8ee7SSantosh Puranik * @param[in] bootSource The boot source to set. 1657491d8ee7SSantosh Puranik * 1658265c1602SJohnathan Mantey * @return Integer error code. 1659491d8ee7SSantosh Puranik */ 1660cd9a4666SKonstantin Aladyshev inline void setBootModeOrSource(const std::shared_ptr<bmcweb::AsyncResp>& aResp, 1661cd9a4666SKonstantin Aladyshev const std::optional<std::string>& bootSource) 1662491d8ee7SSantosh Puranik { 1663c21865c4SKonstantin Aladyshev std::string bootSourceStr; 1664c21865c4SKonstantin Aladyshev std::string bootModeStr; 1665944ffaf9SJohnathan Mantey 1666c21865c4SKonstantin Aladyshev if (!bootSource) 1667491d8ee7SSantosh Puranik { 1668c21865c4SKonstantin Aladyshev return; 1669c21865c4SKonstantin Aladyshev } 1670c21865c4SKonstantin Aladyshev 1671491d8ee7SSantosh Puranik // Source target specified 1672491d8ee7SSantosh Puranik BMCWEB_LOG_DEBUG << "Boot source: " << *bootSource; 1673491d8ee7SSantosh Puranik // Figure out which DBUS interface and property to use 1674e662eae8SEd Tanous if (assignBootParameters(aResp, *bootSource, bootSourceStr, bootModeStr) != 1675e662eae8SEd Tanous 0) 1676491d8ee7SSantosh Puranik { 1677944ffaf9SJohnathan Mantey BMCWEB_LOG_DEBUG 1678944ffaf9SJohnathan Mantey << "Invalid property value for BootSourceOverrideTarget: " 1679491d8ee7SSantosh Puranik << *bootSource; 1680491d8ee7SSantosh Puranik messages::propertyValueNotInList(aResp->res, *bootSource, 1681491d8ee7SSantosh Puranik "BootSourceTargetOverride"); 1682491d8ee7SSantosh Puranik return; 1683491d8ee7SSantosh Puranik } 1684491d8ee7SSantosh Puranik 1685944ffaf9SJohnathan Mantey // Act on validated parameters 1686944ffaf9SJohnathan Mantey BMCWEB_LOG_DEBUG << "DBUS boot source: " << bootSourceStr; 1687944ffaf9SJohnathan Mantey BMCWEB_LOG_DEBUG << "DBUS boot mode: " << bootModeStr; 1688944ffaf9SJohnathan Mantey 1689491d8ee7SSantosh Puranik crow::connections::systemBus->async_method_call( 16905e7e2dc5SEd Tanous [aResp](const boost::system::error_code& ec) { 1691491d8ee7SSantosh Puranik if (ec) 1692491d8ee7SSantosh Puranik { 1693491d8ee7SSantosh Puranik BMCWEB_LOG_DEBUG << "DBUS response error " << ec; 1694491d8ee7SSantosh Puranik messages::internalError(aResp->res); 1695491d8ee7SSantosh Puranik return; 1696491d8ee7SSantosh Puranik } 1697491d8ee7SSantosh Puranik BMCWEB_LOG_DEBUG << "Boot source update done."; 1698491d8ee7SSantosh Puranik }, 1699c21865c4SKonstantin Aladyshev "xyz.openbmc_project.Settings", 1700c21865c4SKonstantin Aladyshev "/xyz/openbmc_project/control/host0/boot", 1701491d8ee7SSantosh Puranik "org.freedesktop.DBus.Properties", "Set", 1702491d8ee7SSantosh Puranik "xyz.openbmc_project.Control.Boot.Source", "BootSource", 1703168e20c1SEd Tanous dbus::utility::DbusVariantType(bootSourceStr)); 1704944ffaf9SJohnathan Mantey 1705491d8ee7SSantosh Puranik crow::connections::systemBus->async_method_call( 17065e7e2dc5SEd Tanous [aResp](const boost::system::error_code& ec) { 1707491d8ee7SSantosh Puranik if (ec) 1708491d8ee7SSantosh Puranik { 1709491d8ee7SSantosh Puranik BMCWEB_LOG_DEBUG << "DBUS response error " << ec; 1710491d8ee7SSantosh Puranik messages::internalError(aResp->res); 1711491d8ee7SSantosh Puranik return; 1712491d8ee7SSantosh Puranik } 1713491d8ee7SSantosh Puranik BMCWEB_LOG_DEBUG << "Boot mode update done."; 1714491d8ee7SSantosh Puranik }, 1715c21865c4SKonstantin Aladyshev "xyz.openbmc_project.Settings", 1716c21865c4SKonstantin Aladyshev "/xyz/openbmc_project/control/host0/boot", 1717491d8ee7SSantosh Puranik "org.freedesktop.DBus.Properties", "Set", 1718491d8ee7SSantosh Puranik "xyz.openbmc_project.Control.Boot.Mode", "BootMode", 1719168e20c1SEd Tanous dbus::utility::DbusVariantType(bootModeStr)); 1720cd9a4666SKonstantin Aladyshev } 1721944ffaf9SJohnathan Mantey 1722cd9a4666SKonstantin Aladyshev /** 1723c21865c4SKonstantin Aladyshev * @brief Sets Boot source override properties. 1724491d8ee7SSantosh Puranik * 1725491d8ee7SSantosh Puranik * @param[in] aResp Shared pointer for generating response message. 1726491d8ee7SSantosh Puranik * @param[in] bootSource The boot source from incoming RF request. 1727cd9a4666SKonstantin Aladyshev * @param[in] bootType The boot type from incoming RF request. 1728491d8ee7SSantosh Puranik * @param[in] bootEnable The boot override enable from incoming RF request. 1729491d8ee7SSantosh Puranik * 1730265c1602SJohnathan Mantey * @return Integer error code. 1731491d8ee7SSantosh Puranik */ 1732c21865c4SKonstantin Aladyshev 1733c21865c4SKonstantin Aladyshev inline void setBootProperties(const std::shared_ptr<bmcweb::AsyncResp>& aResp, 1734c21865c4SKonstantin Aladyshev const std::optional<std::string>& bootSource, 1735c21865c4SKonstantin Aladyshev const std::optional<std::string>& bootType, 1736c21865c4SKonstantin Aladyshev const std::optional<std::string>& bootEnable) 1737491d8ee7SSantosh Puranik { 1738491d8ee7SSantosh Puranik BMCWEB_LOG_DEBUG << "Set boot information."; 1739491d8ee7SSantosh Puranik 1740c21865c4SKonstantin Aladyshev setBootModeOrSource(aResp, bootSource); 1741c21865c4SKonstantin Aladyshev setBootType(aResp, bootType); 1742c21865c4SKonstantin Aladyshev setBootEnable(aResp, bootEnable); 1743491d8ee7SSantosh Puranik } 1744491d8ee7SSantosh Puranik 1745c6a620f2SGeorge Liu /** 174698e386ecSGunnar Mills * @brief Sets AssetTag 174798e386ecSGunnar Mills * 174898e386ecSGunnar Mills * @param[in] aResp Shared pointer for generating response message. 174998e386ecSGunnar Mills * @param[in] assetTag "AssetTag" from request. 175098e386ecSGunnar Mills * 175198e386ecSGunnar Mills * @return None. 175298e386ecSGunnar Mills */ 17538d1b46d7Szhanghch05 inline void setAssetTag(const std::shared_ptr<bmcweb::AsyncResp>& aResp, 175498e386ecSGunnar Mills const std::string& assetTag) 175598e386ecSGunnar Mills { 1756e99073f5SGeorge Liu constexpr std::array<std::string_view, 1> interfaces = { 1757e99073f5SGeorge Liu "xyz.openbmc_project.Inventory.Item.System"}; 1758e99073f5SGeorge Liu dbus::utility::getSubTree( 1759e99073f5SGeorge Liu "/xyz/openbmc_project/inventory", 0, interfaces, 1760b9d36b47SEd Tanous [aResp, 1761e99073f5SGeorge Liu assetTag](const boost::system::error_code& ec, 1762b9d36b47SEd Tanous const dbus::utility::MapperGetSubTreeResponse& subtree) { 176398e386ecSGunnar Mills if (ec) 176498e386ecSGunnar Mills { 176598e386ecSGunnar Mills BMCWEB_LOG_DEBUG << "D-Bus response error on GetSubTree " << ec; 176698e386ecSGunnar Mills messages::internalError(aResp->res); 176798e386ecSGunnar Mills return; 176898e386ecSGunnar Mills } 176926f6976fSEd Tanous if (subtree.empty()) 177098e386ecSGunnar Mills { 177198e386ecSGunnar Mills BMCWEB_LOG_DEBUG << "Can't find system D-Bus object!"; 177298e386ecSGunnar Mills messages::internalError(aResp->res); 177398e386ecSGunnar Mills return; 177498e386ecSGunnar Mills } 177598e386ecSGunnar Mills // Assume only 1 system D-Bus object 177698e386ecSGunnar Mills // Throw an error if there is more than 1 177798e386ecSGunnar Mills if (subtree.size() > 1) 177898e386ecSGunnar Mills { 177998e386ecSGunnar Mills BMCWEB_LOG_DEBUG << "Found more than 1 system D-Bus object!"; 178098e386ecSGunnar Mills messages::internalError(aResp->res); 178198e386ecSGunnar Mills return; 178298e386ecSGunnar Mills } 178398e386ecSGunnar Mills if (subtree[0].first.empty() || subtree[0].second.size() != 1) 178498e386ecSGunnar Mills { 178598e386ecSGunnar Mills BMCWEB_LOG_DEBUG << "Asset Tag Set mapper error!"; 178698e386ecSGunnar Mills messages::internalError(aResp->res); 178798e386ecSGunnar Mills return; 178898e386ecSGunnar Mills } 178998e386ecSGunnar Mills 179098e386ecSGunnar Mills const std::string& path = subtree[0].first; 179198e386ecSGunnar Mills const std::string& service = subtree[0].second.begin()->first; 179298e386ecSGunnar Mills 179398e386ecSGunnar Mills if (service.empty()) 179498e386ecSGunnar Mills { 179598e386ecSGunnar Mills BMCWEB_LOG_DEBUG << "Asset Tag Set service mapper error!"; 179698e386ecSGunnar Mills messages::internalError(aResp->res); 179798e386ecSGunnar Mills return; 179898e386ecSGunnar Mills } 179998e386ecSGunnar Mills 180098e386ecSGunnar Mills crow::connections::systemBus->async_method_call( 18015e7e2dc5SEd Tanous [aResp](const boost::system::error_code& ec2) { 180298e386ecSGunnar Mills if (ec2) 180398e386ecSGunnar Mills { 1804002d39b4SEd Tanous BMCWEB_LOG_DEBUG << "D-Bus response error on AssetTag Set " 1805002d39b4SEd Tanous << ec2; 180698e386ecSGunnar Mills messages::internalError(aResp->res); 180798e386ecSGunnar Mills return; 180898e386ecSGunnar Mills } 180998e386ecSGunnar Mills }, 181098e386ecSGunnar Mills service, path, "org.freedesktop.DBus.Properties", "Set", 181198e386ecSGunnar Mills "xyz.openbmc_project.Inventory.Decorator.AssetTag", "AssetTag", 1812168e20c1SEd Tanous dbus::utility::DbusVariantType(assetTag)); 1813e99073f5SGeorge Liu }); 181498e386ecSGunnar Mills } 181598e386ecSGunnar Mills 181698e386ecSGunnar Mills /** 181769f35306SGunnar Mills * @brief Sets automaticRetry (Auto Reboot) 181869f35306SGunnar Mills * 181969f35306SGunnar Mills * @param[in] aResp Shared pointer for generating response message. 182069f35306SGunnar Mills * @param[in] automaticRetryConfig "AutomaticRetryConfig" from request. 182169f35306SGunnar Mills * 182269f35306SGunnar Mills * @return None. 182369f35306SGunnar Mills */ 18248d1b46d7Szhanghch05 inline void setAutomaticRetry(const std::shared_ptr<bmcweb::AsyncResp>& aResp, 1825f23b7296SEd Tanous const std::string& automaticRetryConfig) 182669f35306SGunnar Mills { 182769f35306SGunnar Mills BMCWEB_LOG_DEBUG << "Set Automatic Retry."; 182869f35306SGunnar Mills 182969f35306SGunnar Mills // OpenBMC only supports "Disabled" and "RetryAttempts". 1830543f4400SEd Tanous bool autoRebootEnabled = false; 183169f35306SGunnar Mills 183269f35306SGunnar Mills if (automaticRetryConfig == "Disabled") 183369f35306SGunnar Mills { 183469f35306SGunnar Mills autoRebootEnabled = false; 183569f35306SGunnar Mills } 183669f35306SGunnar Mills else if (automaticRetryConfig == "RetryAttempts") 183769f35306SGunnar Mills { 183869f35306SGunnar Mills autoRebootEnabled = true; 183969f35306SGunnar Mills } 184069f35306SGunnar Mills else 184169f35306SGunnar Mills { 18420fda0f12SGeorge Liu BMCWEB_LOG_DEBUG << "Invalid property value for AutomaticRetryConfig: " 184369f35306SGunnar Mills << automaticRetryConfig; 184469f35306SGunnar Mills messages::propertyValueNotInList(aResp->res, automaticRetryConfig, 184569f35306SGunnar Mills "AutomaticRetryConfig"); 184669f35306SGunnar Mills return; 184769f35306SGunnar Mills } 184869f35306SGunnar Mills 184969f35306SGunnar Mills crow::connections::systemBus->async_method_call( 18505e7e2dc5SEd Tanous [aResp](const boost::system::error_code& ec) { 185169f35306SGunnar Mills if (ec) 185269f35306SGunnar Mills { 185369f35306SGunnar Mills messages::internalError(aResp->res); 185469f35306SGunnar Mills return; 185569f35306SGunnar Mills } 185669f35306SGunnar Mills }, 185769f35306SGunnar Mills "xyz.openbmc_project.Settings", 185869f35306SGunnar Mills "/xyz/openbmc_project/control/host0/auto_reboot", 185969f35306SGunnar Mills "org.freedesktop.DBus.Properties", "Set", 186069f35306SGunnar Mills "xyz.openbmc_project.Control.Boot.RebootPolicy", "AutoReboot", 1861168e20c1SEd Tanous dbus::utility::DbusVariantType(autoRebootEnabled)); 186269f35306SGunnar Mills } 186369f35306SGunnar Mills 186469f35306SGunnar Mills /** 1865c6a620f2SGeorge Liu * @brief Sets power restore policy properties. 1866c6a620f2SGeorge Liu * 1867c6a620f2SGeorge Liu * @param[in] aResp Shared pointer for generating response message. 1868c6a620f2SGeorge Liu * @param[in] policy power restore policy properties from request. 1869c6a620f2SGeorge Liu * 1870c6a620f2SGeorge Liu * @return None. 1871c6a620f2SGeorge Liu */ 18728d1b46d7Szhanghch05 inline void 18738d1b46d7Szhanghch05 setPowerRestorePolicy(const std::shared_ptr<bmcweb::AsyncResp>& aResp, 18744e69c904SGunnar Mills const std::string& policy) 1875c6a620f2SGeorge Liu { 1876c6a620f2SGeorge Liu BMCWEB_LOG_DEBUG << "Set power restore policy."; 1877c6a620f2SGeorge Liu 1878c6a620f2SGeorge Liu const boost::container::flat_map<std::string, std::string> policyMaps = { 18790fda0f12SGeorge Liu {"AlwaysOn", 18800fda0f12SGeorge Liu "xyz.openbmc_project.Control.Power.RestorePolicy.Policy.AlwaysOn"}, 18810fda0f12SGeorge Liu {"AlwaysOff", 18820fda0f12SGeorge Liu "xyz.openbmc_project.Control.Power.RestorePolicy.Policy.AlwaysOff"}, 18830fda0f12SGeorge Liu {"LastState", 18840fda0f12SGeorge Liu "xyz.openbmc_project.Control.Power.RestorePolicy.Policy.Restore"}}; 1885c6a620f2SGeorge Liu 1886c6a620f2SGeorge Liu std::string powerRestorPolicy; 1887c6a620f2SGeorge Liu 18884e69c904SGunnar Mills auto policyMapsIt = policyMaps.find(policy); 1889c6a620f2SGeorge Liu if (policyMapsIt == policyMaps.end()) 1890c6a620f2SGeorge Liu { 18914e69c904SGunnar Mills messages::propertyValueNotInList(aResp->res, policy, 18924e69c904SGunnar Mills "PowerRestorePolicy"); 1893c6a620f2SGeorge Liu return; 1894c6a620f2SGeorge Liu } 1895c6a620f2SGeorge Liu 1896c6a620f2SGeorge Liu powerRestorPolicy = policyMapsIt->second; 1897c6a620f2SGeorge Liu 1898c6a620f2SGeorge Liu crow::connections::systemBus->async_method_call( 18995e7e2dc5SEd Tanous [aResp](const boost::system::error_code& ec) { 1900c6a620f2SGeorge Liu if (ec) 1901c6a620f2SGeorge Liu { 1902c6a620f2SGeorge Liu messages::internalError(aResp->res); 1903c6a620f2SGeorge Liu return; 1904c6a620f2SGeorge Liu } 1905c6a620f2SGeorge Liu }, 1906c6a620f2SGeorge Liu "xyz.openbmc_project.Settings", 1907c6a620f2SGeorge Liu "/xyz/openbmc_project/control/host0/power_restore_policy", 1908c6a620f2SGeorge Liu "org.freedesktop.DBus.Properties", "Set", 1909c6a620f2SGeorge Liu "xyz.openbmc_project.Control.Power.RestorePolicy", "PowerRestorePolicy", 1910168e20c1SEd Tanous dbus::utility::DbusVariantType(powerRestorPolicy)); 1911c6a620f2SGeorge Liu } 1912c6a620f2SGeorge Liu 1913a6349918SAppaRao Puli #ifdef BMCWEB_ENABLE_REDFISH_PROVISIONING_FEATURE 1914a6349918SAppaRao Puli /** 1915a6349918SAppaRao Puli * @brief Retrieves provisioning status 1916a6349918SAppaRao Puli * 1917a6349918SAppaRao Puli * @param[in] aResp Shared pointer for completing asynchronous calls. 1918a6349918SAppaRao Puli * 1919a6349918SAppaRao Puli * @return None. 1920a6349918SAppaRao Puli */ 19218d1b46d7Szhanghch05 inline void getProvisioningStatus(std::shared_ptr<bmcweb::AsyncResp> aResp) 1922a6349918SAppaRao Puli { 1923a6349918SAppaRao Puli BMCWEB_LOG_DEBUG << "Get OEM information."; 1924bc1d29deSKrzysztof Grobelny sdbusplus::asio::getAllProperties( 1925bc1d29deSKrzysztof Grobelny *crow::connections::systemBus, "xyz.openbmc_project.PFR.Manager", 1926bc1d29deSKrzysztof Grobelny "/xyz/openbmc_project/pfr", "xyz.openbmc_project.PFR.Attributes", 19275e7e2dc5SEd Tanous [aResp](const boost::system::error_code& ec, 1928b9d36b47SEd Tanous const dbus::utility::DBusPropertiesMap& propertiesList) { 1929b99fb1a9SAppaRao Puli nlohmann::json& oemPFR = 1930b99fb1a9SAppaRao Puli aResp->res.jsonValue["Oem"]["OpenBmc"]["FirmwareProvisioning"]; 193150626f4fSJames Feist aResp->res.jsonValue["Oem"]["OpenBmc"]["@odata.type"] = 193250626f4fSJames Feist "#OemComputerSystem.OpenBmc"; 193350626f4fSJames Feist oemPFR["@odata.type"] = "#OemComputerSystem.FirmwareProvisioning"; 193450626f4fSJames Feist 1935a6349918SAppaRao Puli if (ec) 1936a6349918SAppaRao Puli { 1937a6349918SAppaRao Puli BMCWEB_LOG_DEBUG << "DBUS response error " << ec; 1938b99fb1a9SAppaRao Puli // not an error, don't have to have the interface 1939b99fb1a9SAppaRao Puli oemPFR["ProvisioningStatus"] = "NotProvisioned"; 1940a6349918SAppaRao Puli return; 1941a6349918SAppaRao Puli } 1942a6349918SAppaRao Puli 1943a6349918SAppaRao Puli const bool* provState = nullptr; 1944a6349918SAppaRao Puli const bool* lockState = nullptr; 1945bc1d29deSKrzysztof Grobelny 1946bc1d29deSKrzysztof Grobelny const bool success = sdbusplus::unpackPropertiesNoThrow( 19470d4befa8SJiaqing Zhao dbus_utils::UnpackErrorPrinter(), propertiesList, "UfmProvisioned", 19480d4befa8SJiaqing Zhao provState, "UfmLocked", lockState); 1949bc1d29deSKrzysztof Grobelny 1950bc1d29deSKrzysztof Grobelny if (!success) 1951a6349918SAppaRao Puli { 1952bc1d29deSKrzysztof Grobelny messages::internalError(aResp->res); 1953bc1d29deSKrzysztof Grobelny return; 1954a6349918SAppaRao Puli } 1955a6349918SAppaRao Puli 1956a6349918SAppaRao Puli if ((provState == nullptr) || (lockState == nullptr)) 1957a6349918SAppaRao Puli { 1958a6349918SAppaRao Puli BMCWEB_LOG_DEBUG << "Unable to get PFR attributes."; 1959a6349918SAppaRao Puli messages::internalError(aResp->res); 1960a6349918SAppaRao Puli return; 1961a6349918SAppaRao Puli } 1962a6349918SAppaRao Puli 1963a6349918SAppaRao Puli if (*provState == true) 1964a6349918SAppaRao Puli { 1965a6349918SAppaRao Puli if (*lockState == true) 1966a6349918SAppaRao Puli { 1967a6349918SAppaRao Puli oemPFR["ProvisioningStatus"] = "ProvisionedAndLocked"; 1968a6349918SAppaRao Puli } 1969a6349918SAppaRao Puli else 1970a6349918SAppaRao Puli { 1971a6349918SAppaRao Puli oemPFR["ProvisioningStatus"] = "ProvisionedButNotLocked"; 1972a6349918SAppaRao Puli } 1973a6349918SAppaRao Puli } 1974a6349918SAppaRao Puli else 1975a6349918SAppaRao Puli { 1976a6349918SAppaRao Puli oemPFR["ProvisioningStatus"] = "NotProvisioned"; 1977a6349918SAppaRao Puli } 1978bc1d29deSKrzysztof Grobelny }); 1979a6349918SAppaRao Puli } 1980a6349918SAppaRao Puli #endif 1981a6349918SAppaRao Puli 1982491d8ee7SSantosh Puranik /** 19833a2d0424SChris Cain * @brief Translate the PowerMode to a response message. 19843a2d0424SChris Cain * 19853a2d0424SChris Cain * @param[in] aResp Shared pointer for generating response message. 19863a2d0424SChris Cain * @param[in] modeValue PowerMode value to be translated 19873a2d0424SChris Cain * 19883a2d0424SChris Cain * @return None. 19893a2d0424SChris Cain */ 19903a2d0424SChris Cain inline void translatePowerMode(const std::shared_ptr<bmcweb::AsyncResp>& aResp, 19913a2d0424SChris Cain const std::string& modeValue) 19923a2d0424SChris Cain { 19930fda0f12SGeorge Liu if (modeValue == "xyz.openbmc_project.Control.Power.Mode.PowerMode.Static") 19943a2d0424SChris Cain { 19953a2d0424SChris Cain aResp->res.jsonValue["PowerMode"] = "Static"; 19963a2d0424SChris Cain } 19970fda0f12SGeorge Liu else if ( 19980fda0f12SGeorge Liu modeValue == 19990fda0f12SGeorge Liu "xyz.openbmc_project.Control.Power.Mode.PowerMode.MaximumPerformance") 20003a2d0424SChris Cain { 20013a2d0424SChris Cain aResp->res.jsonValue["PowerMode"] = "MaximumPerformance"; 20023a2d0424SChris Cain } 20030fda0f12SGeorge Liu else if (modeValue == 20040fda0f12SGeorge Liu "xyz.openbmc_project.Control.Power.Mode.PowerMode.PowerSaving") 20053a2d0424SChris Cain { 20063a2d0424SChris Cain aResp->res.jsonValue["PowerMode"] = "PowerSaving"; 20073a2d0424SChris Cain } 20080fda0f12SGeorge Liu else if (modeValue == 20090fda0f12SGeorge Liu "xyz.openbmc_project.Control.Power.Mode.PowerMode.OEM") 20103a2d0424SChris Cain { 20113a2d0424SChris Cain aResp->res.jsonValue["PowerMode"] = "OEM"; 20123a2d0424SChris Cain } 20133a2d0424SChris Cain else 20143a2d0424SChris Cain { 20153a2d0424SChris Cain // Any other values would be invalid 20163a2d0424SChris Cain BMCWEB_LOG_DEBUG << "PowerMode value was not valid: " << modeValue; 20173a2d0424SChris Cain messages::internalError(aResp->res); 20183a2d0424SChris Cain } 20193a2d0424SChris Cain } 20203a2d0424SChris Cain 20213a2d0424SChris Cain /** 20223a2d0424SChris Cain * @brief Retrieves system power mode 20233a2d0424SChris Cain * 20243a2d0424SChris Cain * @param[in] aResp Shared pointer for generating response message. 20253a2d0424SChris Cain * 20263a2d0424SChris Cain * @return None. 20273a2d0424SChris Cain */ 20283a2d0424SChris Cain inline void getPowerMode(const std::shared_ptr<bmcweb::AsyncResp>& aResp) 20293a2d0424SChris Cain { 20303a2d0424SChris Cain BMCWEB_LOG_DEBUG << "Get power mode."; 20313a2d0424SChris Cain 20323a2d0424SChris Cain // Get Power Mode object path: 2033e99073f5SGeorge Liu constexpr std::array<std::string_view, 1> interfaces = { 2034e99073f5SGeorge Liu "xyz.openbmc_project.Control.Power.Mode"}; 2035e99073f5SGeorge Liu dbus::utility::getSubTree( 2036e99073f5SGeorge Liu "/", 0, interfaces, 2037e99073f5SGeorge Liu [aResp](const boost::system::error_code& ec, 2038b9d36b47SEd Tanous const dbus::utility::MapperGetSubTreeResponse& subtree) { 20393a2d0424SChris Cain if (ec) 20403a2d0424SChris Cain { 2041002d39b4SEd Tanous BMCWEB_LOG_DEBUG << "DBUS response error on Power.Mode GetSubTree " 2042002d39b4SEd Tanous << ec; 20433a2d0424SChris Cain // This is an optional D-Bus object so just return if 20443a2d0424SChris Cain // error occurs 20453a2d0424SChris Cain return; 20463a2d0424SChris Cain } 20473a2d0424SChris Cain if (subtree.empty()) 20483a2d0424SChris Cain { 20493a2d0424SChris Cain // As noted above, this is an optional interface so just return 20503a2d0424SChris Cain // if there is no instance found 20513a2d0424SChris Cain return; 20523a2d0424SChris Cain } 20533a2d0424SChris Cain if (subtree.size() > 1) 20543a2d0424SChris Cain { 20553a2d0424SChris Cain // More then one PowerMode object is not supported and is an 20563a2d0424SChris Cain // error 20573a2d0424SChris Cain BMCWEB_LOG_DEBUG 20583a2d0424SChris Cain << "Found more than 1 system D-Bus Power.Mode objects: " 20593a2d0424SChris Cain << subtree.size(); 20603a2d0424SChris Cain messages::internalError(aResp->res); 20613a2d0424SChris Cain return; 20623a2d0424SChris Cain } 20633a2d0424SChris Cain if ((subtree[0].first.empty()) || (subtree[0].second.size() != 1)) 20643a2d0424SChris Cain { 20653a2d0424SChris Cain BMCWEB_LOG_DEBUG << "Power.Mode mapper error!"; 20663a2d0424SChris Cain messages::internalError(aResp->res); 20673a2d0424SChris Cain return; 20683a2d0424SChris Cain } 20693a2d0424SChris Cain const std::string& path = subtree[0].first; 20703a2d0424SChris Cain const std::string& service = subtree[0].second.begin()->first; 20713a2d0424SChris Cain if (service.empty()) 20723a2d0424SChris Cain { 20733a2d0424SChris Cain BMCWEB_LOG_DEBUG << "Power.Mode service mapper error!"; 20743a2d0424SChris Cain messages::internalError(aResp->res); 20753a2d0424SChris Cain return; 20763a2d0424SChris Cain } 20773a2d0424SChris Cain // Valid Power Mode object found, now read the current value 20781e1e598dSJonathan Doman sdbusplus::asio::getProperty<std::string>( 20791e1e598dSJonathan Doman *crow::connections::systemBus, service, path, 20801e1e598dSJonathan Doman "xyz.openbmc_project.Control.Power.Mode", "PowerMode", 20815e7e2dc5SEd Tanous [aResp](const boost::system::error_code& ec2, 20821e1e598dSJonathan Doman const std::string& pmode) { 20838a592810SEd Tanous if (ec2) 20843a2d0424SChris Cain { 2085002d39b4SEd Tanous BMCWEB_LOG_DEBUG << "DBUS response error on PowerMode Get: " 20868a592810SEd Tanous << ec2; 20873a2d0424SChris Cain messages::internalError(aResp->res); 20883a2d0424SChris Cain return; 20893a2d0424SChris Cain } 20903a2d0424SChris Cain 2091002d39b4SEd Tanous aResp->res.jsonValue["PowerMode@Redfish.AllowableValues"] = { 2092002d39b4SEd Tanous "Static", "MaximumPerformance", "PowerSaving"}; 20933a2d0424SChris Cain 20941e1e598dSJonathan Doman BMCWEB_LOG_DEBUG << "Current power mode: " << pmode; 20951e1e598dSJonathan Doman translatePowerMode(aResp, pmode); 20961e1e598dSJonathan Doman }); 2097e99073f5SGeorge Liu }); 20983a2d0424SChris Cain } 20993a2d0424SChris Cain 21003a2d0424SChris Cain /** 21013a2d0424SChris Cain * @brief Validate the specified mode is valid and return the PowerMode 21023a2d0424SChris Cain * name associated with that string 21033a2d0424SChris Cain * 21043a2d0424SChris Cain * @param[in] aResp Shared pointer for generating response message. 21053a2d0424SChris Cain * @param[in] modeString String representing the desired PowerMode 21063a2d0424SChris Cain * 21073a2d0424SChris Cain * @return PowerMode value or empty string if mode is not valid 21083a2d0424SChris Cain */ 21093a2d0424SChris Cain inline std::string 21103a2d0424SChris Cain validatePowerMode(const std::shared_ptr<bmcweb::AsyncResp>& aResp, 21113a2d0424SChris Cain const std::string& modeString) 21123a2d0424SChris Cain { 21133a2d0424SChris Cain std::string mode; 21143a2d0424SChris Cain 21153a2d0424SChris Cain if (modeString == "Static") 21163a2d0424SChris Cain { 21173a2d0424SChris Cain mode = "xyz.openbmc_project.Control.Power.Mode.PowerMode.Static"; 21183a2d0424SChris Cain } 21193a2d0424SChris Cain else if (modeString == "MaximumPerformance") 21203a2d0424SChris Cain { 21210fda0f12SGeorge Liu mode = 21220fda0f12SGeorge Liu "xyz.openbmc_project.Control.Power.Mode.PowerMode.MaximumPerformance"; 21233a2d0424SChris Cain } 21243a2d0424SChris Cain else if (modeString == "PowerSaving") 21253a2d0424SChris Cain { 21263a2d0424SChris Cain mode = "xyz.openbmc_project.Control.Power.Mode.PowerMode.PowerSaving"; 21273a2d0424SChris Cain } 21283a2d0424SChris Cain else 21293a2d0424SChris Cain { 21303a2d0424SChris Cain messages::propertyValueNotInList(aResp->res, modeString, "PowerMode"); 21313a2d0424SChris Cain } 21323a2d0424SChris Cain return mode; 21333a2d0424SChris Cain } 21343a2d0424SChris Cain 21353a2d0424SChris Cain /** 21363a2d0424SChris Cain * @brief Sets system power mode. 21373a2d0424SChris Cain * 21383a2d0424SChris Cain * @param[in] aResp Shared pointer for generating response message. 21393a2d0424SChris Cain * @param[in] pmode System power mode from request. 21403a2d0424SChris Cain * 21413a2d0424SChris Cain * @return None. 21423a2d0424SChris Cain */ 21433a2d0424SChris Cain inline void setPowerMode(const std::shared_ptr<bmcweb::AsyncResp>& aResp, 21443a2d0424SChris Cain const std::string& pmode) 21453a2d0424SChris Cain { 21463a2d0424SChris Cain BMCWEB_LOG_DEBUG << "Set power mode."; 21473a2d0424SChris Cain 21483a2d0424SChris Cain std::string powerMode = validatePowerMode(aResp, pmode); 21493a2d0424SChris Cain if (powerMode.empty()) 21503a2d0424SChris Cain { 21513a2d0424SChris Cain return; 21523a2d0424SChris Cain } 21533a2d0424SChris Cain 21543a2d0424SChris Cain // Get Power Mode object path: 2155e99073f5SGeorge Liu constexpr std::array<std::string_view, 1> interfaces = { 2156e99073f5SGeorge Liu "xyz.openbmc_project.Control.Power.Mode"}; 2157e99073f5SGeorge Liu dbus::utility::getSubTree( 2158e99073f5SGeorge Liu "/", 0, interfaces, 2159b9d36b47SEd Tanous [aResp, 2160e99073f5SGeorge Liu powerMode](const boost::system::error_code& ec, 2161b9d36b47SEd Tanous const dbus::utility::MapperGetSubTreeResponse& subtree) { 21623a2d0424SChris Cain if (ec) 21633a2d0424SChris Cain { 2164002d39b4SEd Tanous BMCWEB_LOG_DEBUG << "DBUS response error on Power.Mode GetSubTree " 2165002d39b4SEd Tanous << ec; 21663a2d0424SChris Cain // This is an optional D-Bus object, but user attempted to patch 21673a2d0424SChris Cain messages::internalError(aResp->res); 21683a2d0424SChris Cain return; 21693a2d0424SChris Cain } 21703a2d0424SChris Cain if (subtree.empty()) 21713a2d0424SChris Cain { 21723a2d0424SChris Cain // This is an optional D-Bus object, but user attempted to patch 21733a2d0424SChris Cain messages::resourceNotFound(aResp->res, "ComputerSystem", 21743a2d0424SChris Cain "PowerMode"); 21753a2d0424SChris Cain return; 21763a2d0424SChris Cain } 21773a2d0424SChris Cain if (subtree.size() > 1) 21783a2d0424SChris Cain { 21793a2d0424SChris Cain // More then one PowerMode object is not supported and is an 21803a2d0424SChris Cain // error 21813a2d0424SChris Cain BMCWEB_LOG_DEBUG 21823a2d0424SChris Cain << "Found more than 1 system D-Bus Power.Mode objects: " 21833a2d0424SChris Cain << subtree.size(); 21843a2d0424SChris Cain messages::internalError(aResp->res); 21853a2d0424SChris Cain return; 21863a2d0424SChris Cain } 21873a2d0424SChris Cain if ((subtree[0].first.empty()) || (subtree[0].second.size() != 1)) 21883a2d0424SChris Cain { 21893a2d0424SChris Cain BMCWEB_LOG_DEBUG << "Power.Mode mapper error!"; 21903a2d0424SChris Cain messages::internalError(aResp->res); 21913a2d0424SChris Cain return; 21923a2d0424SChris Cain } 21933a2d0424SChris Cain const std::string& path = subtree[0].first; 21943a2d0424SChris Cain const std::string& service = subtree[0].second.begin()->first; 21953a2d0424SChris Cain if (service.empty()) 21963a2d0424SChris Cain { 21973a2d0424SChris Cain BMCWEB_LOG_DEBUG << "Power.Mode service mapper error!"; 21983a2d0424SChris Cain messages::internalError(aResp->res); 21993a2d0424SChris Cain return; 22003a2d0424SChris Cain } 22013a2d0424SChris Cain 22023a2d0424SChris Cain BMCWEB_LOG_DEBUG << "Setting power mode(" << powerMode << ") -> " 22033a2d0424SChris Cain << path; 22043a2d0424SChris Cain 22053a2d0424SChris Cain // Set the Power Mode property 22063a2d0424SChris Cain crow::connections::systemBus->async_method_call( 22075e7e2dc5SEd Tanous [aResp](const boost::system::error_code& ec2) { 22088a592810SEd Tanous if (ec2) 22093a2d0424SChris Cain { 22103a2d0424SChris Cain messages::internalError(aResp->res); 22113a2d0424SChris Cain return; 22123a2d0424SChris Cain } 22133a2d0424SChris Cain }, 22143a2d0424SChris Cain service, path, "org.freedesktop.DBus.Properties", "Set", 22153a2d0424SChris Cain "xyz.openbmc_project.Control.Power.Mode", "PowerMode", 2216168e20c1SEd Tanous dbus::utility::DbusVariantType(powerMode)); 2217e99073f5SGeorge Liu }); 22183a2d0424SChris Cain } 22193a2d0424SChris Cain 22203a2d0424SChris Cain /** 222151709ffdSYong Li * @brief Translates watchdog timeout action DBUS property value to redfish. 222251709ffdSYong Li * 222351709ffdSYong Li * @param[in] dbusAction The watchdog timeout action in D-BUS. 222451709ffdSYong Li * 222551709ffdSYong Li * @return Returns as a string, the timeout action in Redfish terms. If 222651709ffdSYong Li * translation cannot be done, returns an empty string. 222751709ffdSYong Li */ 222823a21a1cSEd Tanous inline std::string dbusToRfWatchdogAction(const std::string& dbusAction) 222951709ffdSYong Li { 223051709ffdSYong Li if (dbusAction == "xyz.openbmc_project.State.Watchdog.Action.None") 223151709ffdSYong Li { 223251709ffdSYong Li return "None"; 223351709ffdSYong Li } 22343174e4dfSEd Tanous if (dbusAction == "xyz.openbmc_project.State.Watchdog.Action.HardReset") 223551709ffdSYong Li { 223651709ffdSYong Li return "ResetSystem"; 223751709ffdSYong Li } 22383174e4dfSEd Tanous if (dbusAction == "xyz.openbmc_project.State.Watchdog.Action.PowerOff") 223951709ffdSYong Li { 224051709ffdSYong Li return "PowerDown"; 224151709ffdSYong Li } 22423174e4dfSEd Tanous if (dbusAction == "xyz.openbmc_project.State.Watchdog.Action.PowerCycle") 224351709ffdSYong Li { 224451709ffdSYong Li return "PowerCycle"; 224551709ffdSYong Li } 224651709ffdSYong Li 224751709ffdSYong Li return ""; 224851709ffdSYong Li } 224951709ffdSYong Li 225051709ffdSYong Li /** 2251c45f0082SYong Li *@brief Translates timeout action from Redfish to DBUS property value. 2252c45f0082SYong Li * 2253c45f0082SYong Li *@param[in] rfAction The timeout action in Redfish. 2254c45f0082SYong Li * 2255c45f0082SYong Li *@return Returns as a string, the time_out action as expected by DBUS. 2256c45f0082SYong Li *If translation cannot be done, returns an empty string. 2257c45f0082SYong Li */ 2258c45f0082SYong Li 225923a21a1cSEd Tanous inline std::string rfToDbusWDTTimeOutAct(const std::string& rfAction) 2260c45f0082SYong Li { 2261c45f0082SYong Li if (rfAction == "None") 2262c45f0082SYong Li { 2263c45f0082SYong Li return "xyz.openbmc_project.State.Watchdog.Action.None"; 2264c45f0082SYong Li } 22653174e4dfSEd Tanous if (rfAction == "PowerCycle") 2266c45f0082SYong Li { 2267c45f0082SYong Li return "xyz.openbmc_project.State.Watchdog.Action.PowerCycle"; 2268c45f0082SYong Li } 22693174e4dfSEd Tanous if (rfAction == "PowerDown") 2270c45f0082SYong Li { 2271c45f0082SYong Li return "xyz.openbmc_project.State.Watchdog.Action.PowerOff"; 2272c45f0082SYong Li } 22733174e4dfSEd Tanous if (rfAction == "ResetSystem") 2274c45f0082SYong Li { 2275c45f0082SYong Li return "xyz.openbmc_project.State.Watchdog.Action.HardReset"; 2276c45f0082SYong Li } 2277c45f0082SYong Li 2278c45f0082SYong Li return ""; 2279c45f0082SYong Li } 2280c45f0082SYong Li 2281c45f0082SYong Li /** 228251709ffdSYong Li * @brief Retrieves host watchdog timer properties over DBUS 228351709ffdSYong Li * 228451709ffdSYong Li * @param[in] aResp Shared pointer for completing asynchronous calls. 228551709ffdSYong Li * 228651709ffdSYong Li * @return None. 228751709ffdSYong Li */ 22888d1b46d7Szhanghch05 inline void 22898d1b46d7Szhanghch05 getHostWatchdogTimer(const std::shared_ptr<bmcweb::AsyncResp>& aResp) 229051709ffdSYong Li { 229151709ffdSYong Li BMCWEB_LOG_DEBUG << "Get host watchodg"; 2292bc1d29deSKrzysztof Grobelny sdbusplus::asio::getAllProperties( 2293bc1d29deSKrzysztof Grobelny *crow::connections::systemBus, "xyz.openbmc_project.Watchdog", 2294bc1d29deSKrzysztof Grobelny "/xyz/openbmc_project/watchdog/host0", 2295bc1d29deSKrzysztof Grobelny "xyz.openbmc_project.State.Watchdog", 22965e7e2dc5SEd Tanous [aResp](const boost::system::error_code& ec, 2297b9d36b47SEd Tanous const dbus::utility::DBusPropertiesMap& properties) { 229851709ffdSYong Li if (ec) 229951709ffdSYong Li { 230051709ffdSYong Li // watchdog service is stopped 230151709ffdSYong Li BMCWEB_LOG_DEBUG << "DBUS response error " << ec; 230251709ffdSYong Li return; 230351709ffdSYong Li } 230451709ffdSYong Li 230551709ffdSYong Li BMCWEB_LOG_DEBUG << "Got " << properties.size() << " wdt prop."; 230651709ffdSYong Li 230751709ffdSYong Li nlohmann::json& hostWatchdogTimer = 230851709ffdSYong Li aResp->res.jsonValue["HostWatchdogTimer"]; 230951709ffdSYong Li 231051709ffdSYong Li // watchdog service is running/enabled 231151709ffdSYong Li hostWatchdogTimer["Status"]["State"] = "Enabled"; 231251709ffdSYong Li 2313bc1d29deSKrzysztof Grobelny const bool* enabled = nullptr; 2314bc1d29deSKrzysztof Grobelny const std::string* expireAction = nullptr; 231551709ffdSYong Li 2316bc1d29deSKrzysztof Grobelny const bool success = sdbusplus::unpackPropertiesNoThrow( 2317bc1d29deSKrzysztof Grobelny dbus_utils::UnpackErrorPrinter(), properties, "Enabled", enabled, 2318bc1d29deSKrzysztof Grobelny "ExpireAction", expireAction); 2319bc1d29deSKrzysztof Grobelny 2320bc1d29deSKrzysztof Grobelny if (!success) 232151709ffdSYong Li { 232251709ffdSYong Li messages::internalError(aResp->res); 2323601af5edSChicago Duan return; 232451709ffdSYong Li } 232551709ffdSYong Li 2326bc1d29deSKrzysztof Grobelny if (enabled != nullptr) 232751709ffdSYong Li { 2328bc1d29deSKrzysztof Grobelny hostWatchdogTimer["FunctionEnabled"] = *enabled; 232951709ffdSYong Li } 233051709ffdSYong Li 2331bc1d29deSKrzysztof Grobelny if (expireAction != nullptr) 2332bc1d29deSKrzysztof Grobelny { 2333bc1d29deSKrzysztof Grobelny std::string action = dbusToRfWatchdogAction(*expireAction); 233451709ffdSYong Li if (action.empty()) 233551709ffdSYong Li { 233651709ffdSYong Li messages::internalError(aResp->res); 2337601af5edSChicago Duan return; 233851709ffdSYong Li } 233951709ffdSYong Li hostWatchdogTimer["TimeoutAction"] = action; 234051709ffdSYong Li } 2341bc1d29deSKrzysztof Grobelny }); 234251709ffdSYong Li } 234351709ffdSYong Li 234451709ffdSYong Li /** 2345c45f0082SYong Li * @brief Sets Host WatchDog Timer properties. 2346c45f0082SYong Li * 2347c45f0082SYong Li * @param[in] aResp Shared pointer for generating response message. 2348c45f0082SYong Li * @param[in] wdtEnable The WDTimer Enable value (true/false) from incoming 2349c45f0082SYong Li * RF request. 2350c45f0082SYong Li * @param[in] wdtTimeOutAction The WDT Timeout action, from incoming RF request. 2351c45f0082SYong Li * 2352c45f0082SYong Li * @return None. 2353c45f0082SYong Li */ 23548d1b46d7Szhanghch05 inline void setWDTProperties(const std::shared_ptr<bmcweb::AsyncResp>& aResp, 2355c45f0082SYong Li const std::optional<bool> wdtEnable, 2356c45f0082SYong Li const std::optional<std::string>& wdtTimeOutAction) 2357c45f0082SYong Li { 2358c45f0082SYong Li BMCWEB_LOG_DEBUG << "Set host watchdog"; 2359c45f0082SYong Li 2360c45f0082SYong Li if (wdtTimeOutAction) 2361c45f0082SYong Li { 2362c45f0082SYong Li std::string wdtTimeOutActStr = rfToDbusWDTTimeOutAct(*wdtTimeOutAction); 2363c45f0082SYong Li // check if TimeOut Action is Valid 2364c45f0082SYong Li if (wdtTimeOutActStr.empty()) 2365c45f0082SYong Li { 2366c45f0082SYong Li BMCWEB_LOG_DEBUG << "Unsupported value for TimeoutAction: " 2367c45f0082SYong Li << *wdtTimeOutAction; 2368c45f0082SYong Li messages::propertyValueNotInList(aResp->res, *wdtTimeOutAction, 2369c45f0082SYong Li "TimeoutAction"); 2370c45f0082SYong Li return; 2371c45f0082SYong Li } 2372c45f0082SYong Li 2373c45f0082SYong Li crow::connections::systemBus->async_method_call( 23745e7e2dc5SEd Tanous [aResp](const boost::system::error_code& ec) { 2375c45f0082SYong Li if (ec) 2376c45f0082SYong Li { 2377c45f0082SYong Li BMCWEB_LOG_DEBUG << "DBUS response error " << ec; 2378c45f0082SYong Li messages::internalError(aResp->res); 2379c45f0082SYong Li return; 2380c45f0082SYong Li } 2381c45f0082SYong Li }, 2382c45f0082SYong Li "xyz.openbmc_project.Watchdog", 2383c45f0082SYong Li "/xyz/openbmc_project/watchdog/host0", 2384c45f0082SYong Li "org.freedesktop.DBus.Properties", "Set", 2385c45f0082SYong Li "xyz.openbmc_project.State.Watchdog", "ExpireAction", 2386168e20c1SEd Tanous dbus::utility::DbusVariantType(wdtTimeOutActStr)); 2387c45f0082SYong Li } 2388c45f0082SYong Li 2389c45f0082SYong Li if (wdtEnable) 2390c45f0082SYong Li { 2391c45f0082SYong Li crow::connections::systemBus->async_method_call( 23925e7e2dc5SEd Tanous [aResp](const boost::system::error_code& ec) { 2393c45f0082SYong Li if (ec) 2394c45f0082SYong Li { 2395c45f0082SYong Li BMCWEB_LOG_DEBUG << "DBUS response error " << ec; 2396c45f0082SYong Li messages::internalError(aResp->res); 2397c45f0082SYong Li return; 2398c45f0082SYong Li } 2399c45f0082SYong Li }, 2400c45f0082SYong Li "xyz.openbmc_project.Watchdog", 2401c45f0082SYong Li "/xyz/openbmc_project/watchdog/host0", 2402c45f0082SYong Li "org.freedesktop.DBus.Properties", "Set", 2403c45f0082SYong Li "xyz.openbmc_project.State.Watchdog", "Enabled", 2404168e20c1SEd Tanous dbus::utility::DbusVariantType(*wdtEnable)); 2405c45f0082SYong Li } 2406c45f0082SYong Li } 2407c45f0082SYong Li 240837bbf98cSChris Cain /** 240937bbf98cSChris Cain * @brief Parse the Idle Power Saver properties into json 241037bbf98cSChris Cain * 241137bbf98cSChris Cain * @param[in] aResp Shared pointer for completing asynchronous calls. 241237bbf98cSChris Cain * @param[in] properties IPS property data from DBus. 241337bbf98cSChris Cain * 241437bbf98cSChris Cain * @return true if successful 241537bbf98cSChris Cain */ 24161e5b7c88SJiaqing Zhao inline bool 24171e5b7c88SJiaqing Zhao parseIpsProperties(const std::shared_ptr<bmcweb::AsyncResp>& aResp, 24181e5b7c88SJiaqing Zhao const dbus::utility::DBusPropertiesMap& properties) 241937bbf98cSChris Cain { 2420bc1d29deSKrzysztof Grobelny const bool* enabled = nullptr; 2421bc1d29deSKrzysztof Grobelny const uint8_t* enterUtilizationPercent = nullptr; 2422bc1d29deSKrzysztof Grobelny const uint64_t* enterDwellTime = nullptr; 2423bc1d29deSKrzysztof Grobelny const uint8_t* exitUtilizationPercent = nullptr; 2424bc1d29deSKrzysztof Grobelny const uint64_t* exitDwellTime = nullptr; 2425bc1d29deSKrzysztof Grobelny 2426bc1d29deSKrzysztof Grobelny const bool success = sdbusplus::unpackPropertiesNoThrow( 2427bc1d29deSKrzysztof Grobelny dbus_utils::UnpackErrorPrinter(), properties, "Enabled", enabled, 24282661b72cSChris Cain "EnterUtilizationPercent", enterUtilizationPercent, "EnterDwellTime", 24292661b72cSChris Cain enterDwellTime, "ExitUtilizationPercent", exitUtilizationPercent, 24302661b72cSChris Cain "ExitDwellTime", exitDwellTime); 2431bc1d29deSKrzysztof Grobelny 2432bc1d29deSKrzysztof Grobelny if (!success) 243337bbf98cSChris Cain { 243437bbf98cSChris Cain return false; 243537bbf98cSChris Cain } 2436bc1d29deSKrzysztof Grobelny 2437bc1d29deSKrzysztof Grobelny if (enabled != nullptr) 243837bbf98cSChris Cain { 2439bc1d29deSKrzysztof Grobelny aResp->res.jsonValue["IdlePowerSaver"]["Enabled"] = *enabled; 244037bbf98cSChris Cain } 2441bc1d29deSKrzysztof Grobelny 2442bc1d29deSKrzysztof Grobelny if (enterUtilizationPercent != nullptr) 244337bbf98cSChris Cain { 2444bc1d29deSKrzysztof Grobelny aResp->res.jsonValue["IdlePowerSaver"]["EnterUtilizationPercent"] = 2445bc1d29deSKrzysztof Grobelny *enterUtilizationPercent; 244637bbf98cSChris Cain } 2447bc1d29deSKrzysztof Grobelny 2448bc1d29deSKrzysztof Grobelny if (enterDwellTime != nullptr) 2449bc1d29deSKrzysztof Grobelny { 2450bc1d29deSKrzysztof Grobelny const std::chrono::duration<uint64_t, std::milli> ms(*enterDwellTime); 245137bbf98cSChris Cain aResp->res.jsonValue["IdlePowerSaver"]["EnterDwellTimeSeconds"] = 245237bbf98cSChris Cain std::chrono::duration_cast<std::chrono::duration<uint64_t>>(ms) 245337bbf98cSChris Cain .count(); 245437bbf98cSChris Cain } 2455bc1d29deSKrzysztof Grobelny 2456bc1d29deSKrzysztof Grobelny if (exitUtilizationPercent != nullptr) 245737bbf98cSChris Cain { 2458bc1d29deSKrzysztof Grobelny aResp->res.jsonValue["IdlePowerSaver"]["ExitUtilizationPercent"] = 2459bc1d29deSKrzysztof Grobelny *exitUtilizationPercent; 246037bbf98cSChris Cain } 2461bc1d29deSKrzysztof Grobelny 2462bc1d29deSKrzysztof Grobelny if (exitDwellTime != nullptr) 246337bbf98cSChris Cain { 2464bc1d29deSKrzysztof Grobelny const std::chrono::duration<uint64_t, std::milli> ms(*exitDwellTime); 246537bbf98cSChris Cain aResp->res.jsonValue["IdlePowerSaver"]["ExitDwellTimeSeconds"] = 246637bbf98cSChris Cain std::chrono::duration_cast<std::chrono::duration<uint64_t>>(ms) 246737bbf98cSChris Cain .count(); 246837bbf98cSChris Cain } 246937bbf98cSChris Cain 247037bbf98cSChris Cain return true; 247137bbf98cSChris Cain } 247237bbf98cSChris Cain 247337bbf98cSChris Cain /** 247437bbf98cSChris Cain * @brief Retrieves host watchdog timer properties over DBUS 247537bbf98cSChris Cain * 247637bbf98cSChris Cain * @param[in] aResp Shared pointer for completing asynchronous calls. 247737bbf98cSChris Cain * 247837bbf98cSChris Cain * @return None. 247937bbf98cSChris Cain */ 248037bbf98cSChris Cain inline void getIdlePowerSaver(const std::shared_ptr<bmcweb::AsyncResp>& aResp) 248137bbf98cSChris Cain { 248237bbf98cSChris Cain BMCWEB_LOG_DEBUG << "Get idle power saver parameters"; 248337bbf98cSChris Cain 248437bbf98cSChris Cain // Get IdlePowerSaver object path: 2485e99073f5SGeorge Liu constexpr std::array<std::string_view, 1> interfaces = { 2486e99073f5SGeorge Liu "xyz.openbmc_project.Control.Power.IdlePowerSaver"}; 2487e99073f5SGeorge Liu dbus::utility::getSubTree( 2488e99073f5SGeorge Liu "/", 0, interfaces, 2489e99073f5SGeorge Liu [aResp](const boost::system::error_code& ec, 2490b9d36b47SEd Tanous const dbus::utility::MapperGetSubTreeResponse& subtree) { 249137bbf98cSChris Cain if (ec) 249237bbf98cSChris Cain { 249337bbf98cSChris Cain BMCWEB_LOG_DEBUG 249437bbf98cSChris Cain << "DBUS response error on Power.IdlePowerSaver GetSubTree " 249537bbf98cSChris Cain << ec; 249637bbf98cSChris Cain messages::internalError(aResp->res); 249737bbf98cSChris Cain return; 249837bbf98cSChris Cain } 249937bbf98cSChris Cain if (subtree.empty()) 250037bbf98cSChris Cain { 250137bbf98cSChris Cain // This is an optional interface so just return 250237bbf98cSChris Cain // if there is no instance found 250337bbf98cSChris Cain BMCWEB_LOG_DEBUG << "No instances found"; 250437bbf98cSChris Cain return; 250537bbf98cSChris Cain } 250637bbf98cSChris Cain if (subtree.size() > 1) 250737bbf98cSChris Cain { 250837bbf98cSChris Cain // More then one PowerIdlePowerSaver object is not supported and 250937bbf98cSChris Cain // is an error 251037bbf98cSChris Cain BMCWEB_LOG_DEBUG << "Found more than 1 system D-Bus " 251137bbf98cSChris Cain "Power.IdlePowerSaver objects: " 251237bbf98cSChris Cain << subtree.size(); 251337bbf98cSChris Cain messages::internalError(aResp->res); 251437bbf98cSChris Cain return; 251537bbf98cSChris Cain } 251637bbf98cSChris Cain if ((subtree[0].first.empty()) || (subtree[0].second.size() != 1)) 251737bbf98cSChris Cain { 251837bbf98cSChris Cain BMCWEB_LOG_DEBUG << "Power.IdlePowerSaver mapper error!"; 251937bbf98cSChris Cain messages::internalError(aResp->res); 252037bbf98cSChris Cain return; 252137bbf98cSChris Cain } 252237bbf98cSChris Cain const std::string& path = subtree[0].first; 252337bbf98cSChris Cain const std::string& service = subtree[0].second.begin()->first; 252437bbf98cSChris Cain if (service.empty()) 252537bbf98cSChris Cain { 2526002d39b4SEd Tanous BMCWEB_LOG_DEBUG << "Power.IdlePowerSaver service mapper error!"; 252737bbf98cSChris Cain messages::internalError(aResp->res); 252837bbf98cSChris Cain return; 252937bbf98cSChris Cain } 253037bbf98cSChris Cain 253137bbf98cSChris Cain // Valid IdlePowerSaver object found, now read the current values 2532bc1d29deSKrzysztof Grobelny sdbusplus::asio::getAllProperties( 2533bc1d29deSKrzysztof Grobelny *crow::connections::systemBus, service, path, 2534bc1d29deSKrzysztof Grobelny "xyz.openbmc_project.Control.Power.IdlePowerSaver", 25355e7e2dc5SEd Tanous [aResp](const boost::system::error_code& ec2, 25361e5b7c88SJiaqing Zhao const dbus::utility::DBusPropertiesMap& properties) { 25378a592810SEd Tanous if (ec2) 253837bbf98cSChris Cain { 253937bbf98cSChris Cain BMCWEB_LOG_ERROR 25408a592810SEd Tanous << "DBUS response error on IdlePowerSaver GetAll: " << ec2; 254137bbf98cSChris Cain messages::internalError(aResp->res); 254237bbf98cSChris Cain return; 254337bbf98cSChris Cain } 254437bbf98cSChris Cain 2545e05aec50SEd Tanous if (!parseIpsProperties(aResp, properties)) 254637bbf98cSChris Cain { 254737bbf98cSChris Cain messages::internalError(aResp->res); 254837bbf98cSChris Cain return; 254937bbf98cSChris Cain } 2550bc1d29deSKrzysztof Grobelny }); 2551e99073f5SGeorge Liu }); 255237bbf98cSChris Cain 255337bbf98cSChris Cain BMCWEB_LOG_DEBUG << "EXIT: Get idle power saver parameters"; 255437bbf98cSChris Cain } 255537bbf98cSChris Cain 255637bbf98cSChris Cain /** 255737bbf98cSChris Cain * @brief Sets Idle Power Saver properties. 255837bbf98cSChris Cain * 255937bbf98cSChris Cain * @param[in] aResp Shared pointer for generating response message. 256037bbf98cSChris Cain * @param[in] ipsEnable The IPS Enable value (true/false) from incoming 256137bbf98cSChris Cain * RF request. 256237bbf98cSChris Cain * @param[in] ipsEnterUtil The utilization limit to enter idle state. 256337bbf98cSChris Cain * @param[in] ipsEnterTime The time the utilization must be below ipsEnterUtil 256437bbf98cSChris Cain * before entering idle state. 256537bbf98cSChris Cain * @param[in] ipsExitUtil The utilization limit when exiting idle state. 256637bbf98cSChris Cain * @param[in] ipsExitTime The time the utilization must be above ipsExutUtil 256737bbf98cSChris Cain * before exiting idle state 256837bbf98cSChris Cain * 256937bbf98cSChris Cain * @return None. 257037bbf98cSChris Cain */ 257137bbf98cSChris Cain inline void setIdlePowerSaver(const std::shared_ptr<bmcweb::AsyncResp>& aResp, 257237bbf98cSChris Cain const std::optional<bool> ipsEnable, 257337bbf98cSChris Cain const std::optional<uint8_t> ipsEnterUtil, 257437bbf98cSChris Cain const std::optional<uint64_t> ipsEnterTime, 257537bbf98cSChris Cain const std::optional<uint8_t> ipsExitUtil, 257637bbf98cSChris Cain const std::optional<uint64_t> ipsExitTime) 257737bbf98cSChris Cain { 257837bbf98cSChris Cain BMCWEB_LOG_DEBUG << "Set idle power saver properties"; 257937bbf98cSChris Cain 258037bbf98cSChris Cain // Get IdlePowerSaver object path: 2581e99073f5SGeorge Liu constexpr std::array<std::string_view, 1> interfaces = { 2582e99073f5SGeorge Liu "xyz.openbmc_project.Control.Power.IdlePowerSaver"}; 2583e99073f5SGeorge Liu dbus::utility::getSubTree( 2584e99073f5SGeorge Liu "/", 0, interfaces, 258537bbf98cSChris Cain [aResp, ipsEnable, ipsEnterUtil, ipsEnterTime, ipsExitUtil, 2586e99073f5SGeorge Liu ipsExitTime](const boost::system::error_code& ec, 2587b9d36b47SEd Tanous const dbus::utility::MapperGetSubTreeResponse& subtree) { 258837bbf98cSChris Cain if (ec) 258937bbf98cSChris Cain { 259037bbf98cSChris Cain BMCWEB_LOG_DEBUG 259137bbf98cSChris Cain << "DBUS response error on Power.IdlePowerSaver GetSubTree " 259237bbf98cSChris Cain << ec; 259337bbf98cSChris Cain messages::internalError(aResp->res); 259437bbf98cSChris Cain return; 259537bbf98cSChris Cain } 259637bbf98cSChris Cain if (subtree.empty()) 259737bbf98cSChris Cain { 259837bbf98cSChris Cain // This is an optional D-Bus object, but user attempted to patch 259937bbf98cSChris Cain messages::resourceNotFound(aResp->res, "ComputerSystem", 260037bbf98cSChris Cain "IdlePowerSaver"); 260137bbf98cSChris Cain return; 260237bbf98cSChris Cain } 260337bbf98cSChris Cain if (subtree.size() > 1) 260437bbf98cSChris Cain { 260537bbf98cSChris Cain // More then one PowerIdlePowerSaver object is not supported and 260637bbf98cSChris Cain // is an error 26070fda0f12SGeorge Liu BMCWEB_LOG_DEBUG 26080fda0f12SGeorge Liu << "Found more than 1 system D-Bus Power.IdlePowerSaver objects: " 260937bbf98cSChris Cain << subtree.size(); 261037bbf98cSChris Cain messages::internalError(aResp->res); 261137bbf98cSChris Cain return; 261237bbf98cSChris Cain } 261337bbf98cSChris Cain if ((subtree[0].first.empty()) || (subtree[0].second.size() != 1)) 261437bbf98cSChris Cain { 261537bbf98cSChris Cain BMCWEB_LOG_DEBUG << "Power.IdlePowerSaver mapper error!"; 261637bbf98cSChris Cain messages::internalError(aResp->res); 261737bbf98cSChris Cain return; 261837bbf98cSChris Cain } 261937bbf98cSChris Cain const std::string& path = subtree[0].first; 262037bbf98cSChris Cain const std::string& service = subtree[0].second.begin()->first; 262137bbf98cSChris Cain if (service.empty()) 262237bbf98cSChris Cain { 2623002d39b4SEd Tanous BMCWEB_LOG_DEBUG << "Power.IdlePowerSaver service mapper error!"; 262437bbf98cSChris Cain messages::internalError(aResp->res); 262537bbf98cSChris Cain return; 262637bbf98cSChris Cain } 262737bbf98cSChris Cain 262837bbf98cSChris Cain // Valid Power IdlePowerSaver object found, now set any values that 262937bbf98cSChris Cain // need to be updated 263037bbf98cSChris Cain 263137bbf98cSChris Cain if (ipsEnable) 263237bbf98cSChris Cain { 263337bbf98cSChris Cain crow::connections::systemBus->async_method_call( 26345e7e2dc5SEd Tanous [aResp](const boost::system::error_code& ec2) { 26358a592810SEd Tanous if (ec2) 263637bbf98cSChris Cain { 26378a592810SEd Tanous BMCWEB_LOG_DEBUG << "DBUS response error " << ec2; 263837bbf98cSChris Cain messages::internalError(aResp->res); 263937bbf98cSChris Cain return; 264037bbf98cSChris Cain } 264137bbf98cSChris Cain }, 264237bbf98cSChris Cain service, path, "org.freedesktop.DBus.Properties", "Set", 2643002d39b4SEd Tanous "xyz.openbmc_project.Control.Power.IdlePowerSaver", "Enabled", 2644002d39b4SEd Tanous dbus::utility::DbusVariantType(*ipsEnable)); 264537bbf98cSChris Cain } 264637bbf98cSChris Cain if (ipsEnterUtil) 264737bbf98cSChris Cain { 264837bbf98cSChris Cain crow::connections::systemBus->async_method_call( 26495e7e2dc5SEd Tanous [aResp](const boost::system::error_code& ec2) { 26508a592810SEd Tanous if (ec2) 265137bbf98cSChris Cain { 26528a592810SEd Tanous BMCWEB_LOG_DEBUG << "DBUS response error " << ec2; 265337bbf98cSChris Cain messages::internalError(aResp->res); 265437bbf98cSChris Cain return; 265537bbf98cSChris Cain } 265637bbf98cSChris Cain }, 265737bbf98cSChris Cain service, path, "org.freedesktop.DBus.Properties", "Set", 265837bbf98cSChris Cain "xyz.openbmc_project.Control.Power.IdlePowerSaver", 265937bbf98cSChris Cain "EnterUtilizationPercent", 2660168e20c1SEd Tanous dbus::utility::DbusVariantType(*ipsEnterUtil)); 266137bbf98cSChris Cain } 266237bbf98cSChris Cain if (ipsEnterTime) 266337bbf98cSChris Cain { 266437bbf98cSChris Cain // Convert from seconds into milliseconds for DBus 266537bbf98cSChris Cain const uint64_t timeMilliseconds = *ipsEnterTime * 1000; 266637bbf98cSChris Cain crow::connections::systemBus->async_method_call( 26675e7e2dc5SEd Tanous [aResp](const boost::system::error_code& ec2) { 26688a592810SEd Tanous if (ec2) 266937bbf98cSChris Cain { 26708a592810SEd Tanous BMCWEB_LOG_DEBUG << "DBUS response error " << ec2; 267137bbf98cSChris Cain messages::internalError(aResp->res); 267237bbf98cSChris Cain return; 267337bbf98cSChris Cain } 267437bbf98cSChris Cain }, 267537bbf98cSChris Cain service, path, "org.freedesktop.DBus.Properties", "Set", 267637bbf98cSChris Cain "xyz.openbmc_project.Control.Power.IdlePowerSaver", 2677168e20c1SEd Tanous "EnterDwellTime", 2678168e20c1SEd Tanous dbus::utility::DbusVariantType(timeMilliseconds)); 267937bbf98cSChris Cain } 268037bbf98cSChris Cain if (ipsExitUtil) 268137bbf98cSChris Cain { 268237bbf98cSChris Cain crow::connections::systemBus->async_method_call( 26835e7e2dc5SEd Tanous [aResp](const boost::system::error_code& ec2) { 26848a592810SEd Tanous if (ec2) 268537bbf98cSChris Cain { 26868a592810SEd Tanous BMCWEB_LOG_DEBUG << "DBUS response error " << ec2; 268737bbf98cSChris Cain messages::internalError(aResp->res); 268837bbf98cSChris Cain return; 268937bbf98cSChris Cain } 269037bbf98cSChris Cain }, 269137bbf98cSChris Cain service, path, "org.freedesktop.DBus.Properties", "Set", 269237bbf98cSChris Cain "xyz.openbmc_project.Control.Power.IdlePowerSaver", 269337bbf98cSChris Cain "ExitUtilizationPercent", 2694168e20c1SEd Tanous dbus::utility::DbusVariantType(*ipsExitUtil)); 269537bbf98cSChris Cain } 269637bbf98cSChris Cain if (ipsExitTime) 269737bbf98cSChris Cain { 269837bbf98cSChris Cain // Convert from seconds into milliseconds for DBus 269937bbf98cSChris Cain const uint64_t timeMilliseconds = *ipsExitTime * 1000; 270037bbf98cSChris Cain crow::connections::systemBus->async_method_call( 27015e7e2dc5SEd Tanous [aResp](const boost::system::error_code& ec2) { 27028a592810SEd Tanous if (ec2) 270337bbf98cSChris Cain { 27048a592810SEd Tanous BMCWEB_LOG_DEBUG << "DBUS response error " << ec2; 270537bbf98cSChris Cain messages::internalError(aResp->res); 270637bbf98cSChris Cain return; 270737bbf98cSChris Cain } 270837bbf98cSChris Cain }, 270937bbf98cSChris Cain service, path, "org.freedesktop.DBus.Properties", "Set", 271037bbf98cSChris Cain "xyz.openbmc_project.Control.Power.IdlePowerSaver", 2711168e20c1SEd Tanous "ExitDwellTime", 2712168e20c1SEd Tanous dbus::utility::DbusVariantType(timeMilliseconds)); 271337bbf98cSChris Cain } 2714e99073f5SGeorge Liu }); 271537bbf98cSChris Cain 271637bbf98cSChris Cain BMCWEB_LOG_DEBUG << "EXIT: Set idle power saver parameters"; 271737bbf98cSChris Cain } 271837bbf98cSChris Cain 2719dd60b9edSEd Tanous inline void handleComputerSystemHead( 2720dd60b9edSEd Tanous crow::App& app, const crow::Request& req, 2721dd60b9edSEd Tanous const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) 2722dd60b9edSEd Tanous { 2723dd60b9edSEd Tanous if (!redfish::setUpRedfishRoute(app, req, asyncResp)) 2724dd60b9edSEd Tanous { 2725dd60b9edSEd Tanous return; 2726dd60b9edSEd Tanous } 2727dd60b9edSEd Tanous asyncResp->res.addHeader( 2728dd60b9edSEd Tanous boost::beast::http::field::link, 2729dd60b9edSEd Tanous "</redfish/v1/JsonSchemas/ComputerSystemCollection/ComputerSystemCollection.json>; rel=describedby"); 2730dd60b9edSEd Tanous } 2731dd60b9edSEd Tanous 2732c45f0082SYong Li /** 2733c5b2abe0SLewanczyk, Dawid * SystemsCollection derived class for delivering ComputerSystems Collection 2734c5b2abe0SLewanczyk, Dawid * Schema 2735c5b2abe0SLewanczyk, Dawid */ 27367e860f15SJohn Edward Broadbent inline void requestRoutesSystemsCollection(App& app) 27371abe55efSEd Tanous { 27387e860f15SJohn Edward Broadbent BMCWEB_ROUTE(app, "/redfish/v1/Systems/") 2739dd60b9edSEd Tanous .privileges(redfish::privileges::headComputerSystemCollection) 2740dd60b9edSEd Tanous .methods(boost::beast::http::verb::head)( 2741dd60b9edSEd Tanous std::bind_front(handleComputerSystemHead, std::ref(app))); 2742dd60b9edSEd Tanous 2743dd60b9edSEd Tanous BMCWEB_ROUTE(app, "/redfish/v1/Systems/") 2744ed398213SEd Tanous .privileges(redfish::privileges::getComputerSystemCollection) 27457e860f15SJohn Edward Broadbent .methods(boost::beast::http::verb::get)( 2746f4c99e70SEd Tanous [&app](const crow::Request& req, 27477e860f15SJohn Edward Broadbent const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) { 27483ba00073SCarson Labrado if (!redfish::setUpRedfishRoute(app, req, asyncResp)) 2749f4c99e70SEd Tanous { 2750f4c99e70SEd Tanous return; 2751f4c99e70SEd Tanous } 2752dd60b9edSEd Tanous 2753dd60b9edSEd Tanous asyncResp->res.addHeader( 2754dd60b9edSEd Tanous boost::beast::http::field::link, 2755dd60b9edSEd Tanous "</redfish/v1/JsonSchemas/ComputerSystemCollection.json>; rel=describedby"); 27568d1b46d7Szhanghch05 asyncResp->res.jsonValue["@odata.type"] = 27570f74e643SEd Tanous "#ComputerSystemCollection.ComputerSystemCollection"; 27588d1b46d7Szhanghch05 asyncResp->res.jsonValue["@odata.id"] = "/redfish/v1/Systems"; 27598d1b46d7Szhanghch05 asyncResp->res.jsonValue["Name"] = "Computer System Collection"; 2760462023adSSunitha Harish 27611e1e598dSJonathan Doman sdbusplus::asio::getProperty<std::string>( 2762002d39b4SEd Tanous *crow::connections::systemBus, "xyz.openbmc_project.Settings", 27631e1e598dSJonathan Doman "/xyz/openbmc_project/network/hypervisor", 2764002d39b4SEd Tanous "xyz.openbmc_project.Network.SystemConfiguration", "HostName", 27655e7e2dc5SEd Tanous [asyncResp](const boost::system::error_code& ec2, 27661e1e598dSJonathan Doman const std::string& /*hostName*/) { 2767002d39b4SEd Tanous nlohmann::json& ifaceArray = asyncResp->res.jsonValue["Members"]; 27682c70f800SEd Tanous ifaceArray = nlohmann::json::array(); 2769002d39b4SEd Tanous auto& count = asyncResp->res.jsonValue["Members@odata.count"]; 27701476687dSEd Tanous 27711476687dSEd Tanous nlohmann::json::object_t system; 27721476687dSEd Tanous system["@odata.id"] = "/redfish/v1/Systems/system"; 2773*b2ba3072SPatrick Williams ifaceArray.emplace_back(std::move(system)); 277494bda602STim Lee count = ifaceArray.size(); 27758a592810SEd Tanous if (!ec2) 2776462023adSSunitha Harish { 2777462023adSSunitha Harish BMCWEB_LOG_DEBUG << "Hypervisor is available"; 27781476687dSEd Tanous nlohmann::json::object_t hypervisor; 2779002d39b4SEd Tanous hypervisor["@odata.id"] = "/redfish/v1/Systems/hypervisor"; 2780*b2ba3072SPatrick Williams ifaceArray.emplace_back(std::move(hypervisor)); 27812c70f800SEd Tanous count = ifaceArray.size(); 2782cb13a392SEd Tanous } 27831e1e598dSJonathan Doman }); 27847e860f15SJohn Edward Broadbent }); 2785c5b2abe0SLewanczyk, Dawid } 27867e860f15SJohn Edward Broadbent 27877e860f15SJohn Edward Broadbent /** 27887e860f15SJohn Edward Broadbent * Function transceives data with dbus directly. 27897e860f15SJohn Edward Broadbent */ 27904f48d5f6SEd Tanous inline void doNMI(const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) 27917e860f15SJohn Edward Broadbent { 279289492a15SPatrick Williams constexpr const char* serviceName = "xyz.openbmc_project.Control.Host.NMI"; 279389492a15SPatrick Williams constexpr const char* objectPath = "/xyz/openbmc_project/control/host0/nmi"; 279489492a15SPatrick Williams constexpr const char* interfaceName = 27957e860f15SJohn Edward Broadbent "xyz.openbmc_project.Control.Host.NMI"; 279689492a15SPatrick Williams constexpr const char* method = "NMI"; 27977e860f15SJohn Edward Broadbent 27987e860f15SJohn Edward Broadbent crow::connections::systemBus->async_method_call( 27995e7e2dc5SEd Tanous [asyncResp](const boost::system::error_code& ec) { 28007e860f15SJohn Edward Broadbent if (ec) 28017e860f15SJohn Edward Broadbent { 28027e860f15SJohn Edward Broadbent BMCWEB_LOG_ERROR << " Bad D-Bus request error: " << ec; 28037e860f15SJohn Edward Broadbent messages::internalError(asyncResp->res); 28047e860f15SJohn Edward Broadbent return; 28057e860f15SJohn Edward Broadbent } 28067e860f15SJohn Edward Broadbent messages::success(asyncResp->res); 28077e860f15SJohn Edward Broadbent }, 28087e860f15SJohn Edward Broadbent serviceName, objectPath, interfaceName, method); 28097e860f15SJohn Edward Broadbent } 2810c5b2abe0SLewanczyk, Dawid 2811c5b2abe0SLewanczyk, Dawid /** 2812cc340dd9SEd Tanous * SystemActionsReset class supports handle POST method for Reset action. 2813cc340dd9SEd Tanous * The class retrieves and sends data directly to D-Bus. 2814cc340dd9SEd Tanous */ 28157e860f15SJohn Edward Broadbent inline void requestRoutesSystemActionsReset(App& app) 2816cc340dd9SEd Tanous { 2817cc340dd9SEd Tanous /** 2818cc340dd9SEd Tanous * Function handles POST method request. 2819cc340dd9SEd Tanous * Analyzes POST body message before sends Reset request data to D-Bus. 2820cc340dd9SEd Tanous */ 28217e860f15SJohn Edward Broadbent BMCWEB_ROUTE(app, 28227e860f15SJohn Edward Broadbent "/redfish/v1/Systems/system/Actions/ComputerSystem.Reset/") 2823ed398213SEd Tanous .privileges(redfish::privileges::postComputerSystem) 2824002d39b4SEd Tanous .methods(boost::beast::http::verb::post)( 2825002d39b4SEd Tanous [&app](const crow::Request& req, 28267e860f15SJohn Edward Broadbent const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) { 28273ba00073SCarson Labrado if (!redfish::setUpRedfishRoute(app, req, asyncResp)) 282845ca1b86SEd Tanous { 282945ca1b86SEd Tanous return; 283045ca1b86SEd Tanous } 28319712f8acSEd Tanous std::string resetType; 283215ed6780SWilly Tu if (!json_util::readJsonAction(req, asyncResp->res, "ResetType", 28337e860f15SJohn Edward Broadbent resetType)) 2834cc340dd9SEd Tanous { 2835cc340dd9SEd Tanous return; 2836cc340dd9SEd Tanous } 2837cc340dd9SEd Tanous 2838d22c8396SJason M. Bills // Get the command and host vs. chassis 2839cc340dd9SEd Tanous std::string command; 2840543f4400SEd Tanous bool hostCommand = true; 2841d4d25793SEd Tanous if ((resetType == "On") || (resetType == "ForceOn")) 2842cc340dd9SEd Tanous { 2843cc340dd9SEd Tanous command = "xyz.openbmc_project.State.Host.Transition.On"; 2844d22c8396SJason M. Bills hostCommand = true; 2845d22c8396SJason M. Bills } 2846d22c8396SJason M. Bills else if (resetType == "ForceOff") 2847d22c8396SJason M. Bills { 2848d22c8396SJason M. Bills command = "xyz.openbmc_project.State.Chassis.Transition.Off"; 2849d22c8396SJason M. Bills hostCommand = false; 2850d22c8396SJason M. Bills } 2851d22c8396SJason M. Bills else if (resetType == "ForceRestart") 2852d22c8396SJason M. Bills { 285386a0851aSJason M. Bills command = 285486a0851aSJason M. Bills "xyz.openbmc_project.State.Host.Transition.ForceWarmReboot"; 285586a0851aSJason M. Bills hostCommand = true; 2856cc340dd9SEd Tanous } 28579712f8acSEd Tanous else if (resetType == "GracefulShutdown") 2858cc340dd9SEd Tanous { 2859cc340dd9SEd Tanous command = "xyz.openbmc_project.State.Host.Transition.Off"; 2860d22c8396SJason M. Bills hostCommand = true; 2861cc340dd9SEd Tanous } 28629712f8acSEd Tanous else if (resetType == "GracefulRestart") 2863cc340dd9SEd Tanous { 28640fda0f12SGeorge Liu command = 28650fda0f12SGeorge Liu "xyz.openbmc_project.State.Host.Transition.GracefulWarmReboot"; 2866d22c8396SJason M. Bills hostCommand = true; 2867d22c8396SJason M. Bills } 2868d22c8396SJason M. Bills else if (resetType == "PowerCycle") 2869d22c8396SJason M. Bills { 287086a0851aSJason M. Bills command = "xyz.openbmc_project.State.Host.Transition.Reboot"; 287186a0851aSJason M. Bills hostCommand = true; 2872cc340dd9SEd Tanous } 2873bfd5b826SLakshminarayana R. Kammath else if (resetType == "Nmi") 2874bfd5b826SLakshminarayana R. Kammath { 2875bfd5b826SLakshminarayana R. Kammath doNMI(asyncResp); 2876bfd5b826SLakshminarayana R. Kammath return; 2877bfd5b826SLakshminarayana R. Kammath } 2878cc340dd9SEd Tanous else 2879cc340dd9SEd Tanous { 28808d1b46d7Szhanghch05 messages::actionParameterUnknown(asyncResp->res, "Reset", 28818d1b46d7Szhanghch05 resetType); 2882cc340dd9SEd Tanous return; 2883cc340dd9SEd Tanous } 2884cc340dd9SEd Tanous 2885d22c8396SJason M. Bills if (hostCommand) 2886d22c8396SJason M. Bills { 2887cc340dd9SEd Tanous crow::connections::systemBus->async_method_call( 28885e7e2dc5SEd Tanous [asyncResp, resetType](const boost::system::error_code& ec) { 2889cc340dd9SEd Tanous if (ec) 2890cc340dd9SEd Tanous { 2891cc340dd9SEd Tanous BMCWEB_LOG_ERROR << "D-Bus responses error: " << ec; 2892002d39b4SEd Tanous if (ec.value() == boost::asio::error::invalid_argument) 2893d22c8396SJason M. Bills { 2894d22c8396SJason M. Bills messages::actionParameterNotSupported( 2895d22c8396SJason M. Bills asyncResp->res, resetType, "Reset"); 2896d22c8396SJason M. Bills } 2897d22c8396SJason M. Bills else 2898d22c8396SJason M. Bills { 2899f12894f8SJason M. Bills messages::internalError(asyncResp->res); 2900d22c8396SJason M. Bills } 2901cc340dd9SEd Tanous return; 2902cc340dd9SEd Tanous } 2903f12894f8SJason M. Bills messages::success(asyncResp->res); 2904cc340dd9SEd Tanous }, 2905cc340dd9SEd Tanous "xyz.openbmc_project.State.Host", 2906cc340dd9SEd Tanous "/xyz/openbmc_project/state/host0", 2907cc340dd9SEd Tanous "org.freedesktop.DBus.Properties", "Set", 29089712f8acSEd Tanous "xyz.openbmc_project.State.Host", "RequestedHostTransition", 2909168e20c1SEd Tanous dbus::utility::DbusVariantType{command}); 2910cc340dd9SEd Tanous } 2911d22c8396SJason M. Bills else 2912d22c8396SJason M. Bills { 2913d22c8396SJason M. Bills crow::connections::systemBus->async_method_call( 29145e7e2dc5SEd Tanous [asyncResp, resetType](const boost::system::error_code& ec) { 2915d22c8396SJason M. Bills if (ec) 2916d22c8396SJason M. Bills { 2917d22c8396SJason M. Bills BMCWEB_LOG_ERROR << "D-Bus responses error: " << ec; 2918002d39b4SEd Tanous if (ec.value() == boost::asio::error::invalid_argument) 2919d22c8396SJason M. Bills { 2920d22c8396SJason M. Bills messages::actionParameterNotSupported( 2921d22c8396SJason M. Bills asyncResp->res, resetType, "Reset"); 2922d22c8396SJason M. Bills } 2923d22c8396SJason M. Bills else 2924d22c8396SJason M. Bills { 2925d22c8396SJason M. Bills messages::internalError(asyncResp->res); 2926d22c8396SJason M. Bills } 2927d22c8396SJason M. Bills return; 2928d22c8396SJason M. Bills } 2929d22c8396SJason M. Bills messages::success(asyncResp->res); 2930d22c8396SJason M. Bills }, 2931d22c8396SJason M. Bills "xyz.openbmc_project.State.Chassis", 2932d22c8396SJason M. Bills "/xyz/openbmc_project/state/chassis0", 2933d22c8396SJason M. Bills "org.freedesktop.DBus.Properties", "Set", 2934002d39b4SEd Tanous "xyz.openbmc_project.State.Chassis", "RequestedPowerTransition", 2935168e20c1SEd Tanous dbus::utility::DbusVariantType{command}); 2936d22c8396SJason M. Bills } 29377e860f15SJohn Edward Broadbent }); 2938d22c8396SJason M. Bills } 2939cc340dd9SEd Tanous 294038c8a6f2SEd Tanous inline void handleComputerSystemCollectionHead( 2941dd60b9edSEd Tanous App& app, const crow::Request& req, 2942dd60b9edSEd Tanous const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) 2943dd60b9edSEd Tanous { 2944dd60b9edSEd Tanous if (!redfish::setUpRedfishRoute(app, req, asyncResp)) 2945dd60b9edSEd Tanous { 2946dd60b9edSEd Tanous return; 2947dd60b9edSEd Tanous } 2948dd60b9edSEd Tanous 2949dd60b9edSEd Tanous asyncResp->res.addHeader( 2950dd60b9edSEd Tanous boost::beast::http::field::link, 2951dd60b9edSEd Tanous "</redfish/v1/JsonSchemas/ComputerSystem/ComputerSystem.json>; rel=describedby"); 2952dd60b9edSEd Tanous } 2953dd60b9edSEd Tanous 29545c3e9272SAbhishek Patel inline void afterPortRequest( 29555c3e9272SAbhishek Patel const std::shared_ptr<bmcweb::AsyncResp>& asyncResp, 29565c3e9272SAbhishek Patel const boost::system::error_code& ec, 29575c3e9272SAbhishek Patel const std::vector<std::tuple<std::string, std::string, bool>>& socketData) 29585c3e9272SAbhishek Patel { 29595c3e9272SAbhishek Patel if (ec) 29605c3e9272SAbhishek Patel { 29615c3e9272SAbhishek Patel messages::internalError(asyncResp->res); 29625c3e9272SAbhishek Patel return; 29635c3e9272SAbhishek Patel } 29645c3e9272SAbhishek Patel for (const auto& data : socketData) 29655c3e9272SAbhishek Patel { 29665c3e9272SAbhishek Patel const std::string& socketPath = get<0>(data); 29675c3e9272SAbhishek Patel const std::string& protocolName = get<1>(data); 29685c3e9272SAbhishek Patel bool isProtocolEnabled = get<2>(data); 29695c3e9272SAbhishek Patel nlohmann::json& dataJson = asyncResp->res.jsonValue["SerialConsole"]; 29705c3e9272SAbhishek Patel dataJson[protocolName]["ServiceEnabled"] = isProtocolEnabled; 29715c3e9272SAbhishek Patel // need to retrieve port number for 29725c3e9272SAbhishek Patel // obmc-console-ssh service 29735c3e9272SAbhishek Patel if (protocolName == "SSH") 29745c3e9272SAbhishek Patel { 29755c3e9272SAbhishek Patel getPortNumber(socketPath, [asyncResp, protocolName]( 29765c3e9272SAbhishek Patel const boost::system::error_code ec1, 29775c3e9272SAbhishek Patel int portNumber) { 29785c3e9272SAbhishek Patel if (ec1) 29795c3e9272SAbhishek Patel { 29805c3e9272SAbhishek Patel messages::internalError(asyncResp->res); 29815c3e9272SAbhishek Patel return; 29825c3e9272SAbhishek Patel } 29835c3e9272SAbhishek Patel nlohmann::json& dataJson1 = 29845c3e9272SAbhishek Patel asyncResp->res.jsonValue["SerialConsole"]; 29855c3e9272SAbhishek Patel dataJson1[protocolName]["Port"] = portNumber; 29865c3e9272SAbhishek Patel }); 29875c3e9272SAbhishek Patel } 29885c3e9272SAbhishek Patel } 29895c3e9272SAbhishek Patel } 2990cc340dd9SEd Tanous /** 29916617338dSEd Tanous * Systems derived class for delivering Computer Systems Schema. 2992c5b2abe0SLewanczyk, Dawid */ 29937e860f15SJohn Edward Broadbent inline void requestRoutesSystems(App& app) 29941abe55efSEd Tanous { 2995dd60b9edSEd Tanous BMCWEB_ROUTE(app, "/redfish/v1/Systems/system/") 2996dd60b9edSEd Tanous .privileges(redfish::privileges::headComputerSystem) 2997dd60b9edSEd Tanous .methods(boost::beast::http::verb::head)( 2998dd60b9edSEd Tanous std::bind_front(handleComputerSystemCollectionHead, std::ref(app))); 2999c5b2abe0SLewanczyk, Dawid /** 3000c5b2abe0SLewanczyk, Dawid * Functions triggers appropriate requests on DBus 3001c5b2abe0SLewanczyk, Dawid */ 300222d268cbSEd Tanous BMCWEB_ROUTE(app, "/redfish/v1/Systems/<str>/") 3003ed398213SEd Tanous .privileges(redfish::privileges::getComputerSystem) 3004002d39b4SEd Tanous .methods(boost::beast::http::verb::get)( 3005002d39b4SEd Tanous [&app](const crow::Request& req, 300622d268cbSEd Tanous const std::shared_ptr<bmcweb::AsyncResp>& asyncResp, 300722d268cbSEd Tanous const std::string& systemName) { 30083ba00073SCarson Labrado if (!redfish::setUpRedfishRoute(app, req, asyncResp)) 300945ca1b86SEd Tanous { 301045ca1b86SEd Tanous return; 301145ca1b86SEd Tanous } 3012746b56f3SAsmitha Karunanithi 3013746b56f3SAsmitha Karunanithi if (systemName == "hypervisor") 3014746b56f3SAsmitha Karunanithi { 3015746b56f3SAsmitha Karunanithi handleHypervisorSystemGet(asyncResp); 3016746b56f3SAsmitha Karunanithi return; 3017746b56f3SAsmitha Karunanithi } 3018746b56f3SAsmitha Karunanithi 301922d268cbSEd Tanous if (systemName != "system") 302022d268cbSEd Tanous { 302122d268cbSEd Tanous messages::resourceNotFound(asyncResp->res, "ComputerSystem", 302222d268cbSEd Tanous systemName); 302322d268cbSEd Tanous return; 302422d268cbSEd Tanous } 3025dd60b9edSEd Tanous asyncResp->res.addHeader( 3026dd60b9edSEd Tanous boost::beast::http::field::link, 3027dd60b9edSEd Tanous "</redfish/v1/JsonSchemas/ComputerSystem/ComputerSystem.json>; rel=describedby"); 30288d1b46d7Szhanghch05 asyncResp->res.jsonValue["@odata.type"] = 302937bbf98cSChris Cain "#ComputerSystem.v1_16_0.ComputerSystem"; 30308d1b46d7Szhanghch05 asyncResp->res.jsonValue["Name"] = "system"; 30318d1b46d7Szhanghch05 asyncResp->res.jsonValue["Id"] = "system"; 30328d1b46d7Szhanghch05 asyncResp->res.jsonValue["SystemType"] = "Physical"; 30338d1b46d7Szhanghch05 asyncResp->res.jsonValue["Description"] = "Computer System"; 30348d1b46d7Szhanghch05 asyncResp->res.jsonValue["ProcessorSummary"]["Count"] = 0; 30358d1b46d7Szhanghch05 asyncResp->res.jsonValue["ProcessorSummary"]["Status"]["State"] = 30368d1b46d7Szhanghch05 "Disabled"; 30378d1b46d7Szhanghch05 asyncResp->res.jsonValue["MemorySummary"]["TotalSystemMemoryGiB"] = 30388d1b46d7Szhanghch05 uint64_t(0); 30398d1b46d7Szhanghch05 asyncResp->res.jsonValue["MemorySummary"]["Status"]["State"] = 30408d1b46d7Szhanghch05 "Disabled"; 3041002d39b4SEd Tanous asyncResp->res.jsonValue["@odata.id"] = "/redfish/v1/Systems/system"; 304204a258f4SEd Tanous 30431476687dSEd Tanous asyncResp->res.jsonValue["Processors"]["@odata.id"] = 30441476687dSEd Tanous "/redfish/v1/Systems/system/Processors"; 30451476687dSEd Tanous asyncResp->res.jsonValue["Memory"]["@odata.id"] = 30461476687dSEd Tanous "/redfish/v1/Systems/system/Memory"; 30471476687dSEd Tanous asyncResp->res.jsonValue["Storage"]["@odata.id"] = 30481476687dSEd Tanous "/redfish/v1/Systems/system/Storage"; 30493179105bSSunny Srivastava asyncResp->res.jsonValue["FabricAdapters"]["@odata.id"] = 30503179105bSSunny Srivastava "/redfish/v1/Systems/system/FabricAdapters"; 3051029573d4SEd Tanous 3052002d39b4SEd Tanous asyncResp->res.jsonValue["Actions"]["#ComputerSystem.Reset"]["target"] = 30531476687dSEd Tanous "/redfish/v1/Systems/system/Actions/ComputerSystem.Reset"; 30541476687dSEd Tanous asyncResp->res.jsonValue["Actions"]["#ComputerSystem.Reset"] 30551476687dSEd Tanous ["@Redfish.ActionInfo"] = 30561476687dSEd Tanous "/redfish/v1/Systems/system/ResetActionInfo"; 3057c5b2abe0SLewanczyk, Dawid 30581476687dSEd Tanous asyncResp->res.jsonValue["LogServices"]["@odata.id"] = 30591476687dSEd Tanous "/redfish/v1/Systems/system/LogServices"; 30601476687dSEd Tanous asyncResp->res.jsonValue["Bios"]["@odata.id"] = 30611476687dSEd Tanous "/redfish/v1/Systems/system/Bios"; 3062c4bf6374SJason M. Bills 30631476687dSEd Tanous nlohmann::json::array_t managedBy; 30641476687dSEd Tanous nlohmann::json& manager = managedBy.emplace_back(); 30651476687dSEd Tanous manager["@odata.id"] = "/redfish/v1/Managers/bmc"; 3066002d39b4SEd Tanous asyncResp->res.jsonValue["Links"]["ManagedBy"] = std::move(managedBy); 30671476687dSEd Tanous asyncResp->res.jsonValue["Status"]["Health"] = "OK"; 30681476687dSEd Tanous asyncResp->res.jsonValue["Status"]["State"] = "Enabled"; 30690e8ac5e7SGunnar Mills 30700e8ac5e7SGunnar Mills // Fill in SerialConsole info 3071002d39b4SEd Tanous asyncResp->res.jsonValue["SerialConsole"]["MaxConcurrentSessions"] = 15; 3072002d39b4SEd Tanous asyncResp->res.jsonValue["SerialConsole"]["IPMI"]["ServiceEnabled"] = 3073002d39b4SEd Tanous true; 30741476687dSEd Tanous 30750e8ac5e7SGunnar Mills // TODO (Gunnar): Should look for obmc-console-ssh@2200.service 30761476687dSEd Tanous asyncResp->res.jsonValue["SerialConsole"]["SSH"]["ServiceEnabled"] = 30771476687dSEd Tanous true; 30781476687dSEd Tanous asyncResp->res.jsonValue["SerialConsole"]["SSH"]["Port"] = 2200; 30791476687dSEd Tanous asyncResp->res 30801476687dSEd Tanous .jsonValue["SerialConsole"]["SSH"]["HotKeySequenceDisplay"] = 30811476687dSEd Tanous "Press ~. to exit console"; 30825c3e9272SAbhishek Patel getPortStatusAndPath(std::span{protocolToDBusForSystems}, 30835c3e9272SAbhishek Patel std::bind_front(afterPortRequest, asyncResp)); 30840e8ac5e7SGunnar Mills 30850e8ac5e7SGunnar Mills #ifdef BMCWEB_ENABLE_KVM 30860e8ac5e7SGunnar Mills // Fill in GraphicalConsole info 3087002d39b4SEd Tanous asyncResp->res.jsonValue["GraphicalConsole"]["ServiceEnabled"] = true; 3088002d39b4SEd Tanous asyncResp->res.jsonValue["GraphicalConsole"]["MaxConcurrentSessions"] = 3089002d39b4SEd Tanous 4; 3090613dabeaSEd Tanous asyncResp->res.jsonValue["GraphicalConsole"]["ConnectTypesSupported"] = 3091613dabeaSEd Tanous nlohmann::json::array_t({"KVMIP"}); 30921476687dSEd Tanous 30930e8ac5e7SGunnar Mills #endif // BMCWEB_ENABLE_KVM 30947a1dbc48SGeorge Liu constexpr std::array<std::string_view, 4> inventoryForSystems{ 3095b49ac873SJames Feist "xyz.openbmc_project.Inventory.Item.Dimm", 30962ad9c2f6SJames Feist "xyz.openbmc_project.Inventory.Item.Cpu", 3097e284a7c1SJames Feist "xyz.openbmc_project.Inventory.Item.Drive", 3098e284a7c1SJames Feist "xyz.openbmc_project.Inventory.Item.StorageController"}; 3099b49ac873SJames Feist 3100b49ac873SJames Feist auto health = std::make_shared<HealthPopulate>(asyncResp); 31017a1dbc48SGeorge Liu dbus::utility::getSubTreePaths( 31027a1dbc48SGeorge Liu "/", 0, inventoryForSystems, 31037a1dbc48SGeorge Liu [health](const boost::system::error_code& ec, 3104914e2d5dSEd Tanous const std::vector<std::string>& resp) { 3105b49ac873SJames Feist if (ec) 3106b49ac873SJames Feist { 3107b49ac873SJames Feist // no inventory 3108b49ac873SJames Feist return; 3109b49ac873SJames Feist } 3110b49ac873SJames Feist 3111914e2d5dSEd Tanous health->inventory = resp; 31127a1dbc48SGeorge Liu }); 3113b49ac873SJames Feist 3114b49ac873SJames Feist health->populate(); 3115b49ac873SJames Feist 3116002d39b4SEd Tanous getMainChassisId(asyncResp, 3117002d39b4SEd Tanous [](const std::string& chassisId, 31188d1b46d7Szhanghch05 const std::shared_ptr<bmcweb::AsyncResp>& aRsp) { 3119b2c7e208SEd Tanous nlohmann::json::array_t chassisArray; 3120b2c7e208SEd Tanous nlohmann::json& chassis = chassisArray.emplace_back(); 3121eddfc437SWilly Tu chassis["@odata.id"] = crow::utility::urlFromPieces( 3122eddfc437SWilly Tu "redfish", "v1", "Chassis", chassisId); 3123002d39b4SEd Tanous aRsp->res.jsonValue["Links"]["Chassis"] = std::move(chassisArray); 3124c5d03ff4SJennifer Lee }); 3125a3002228SAppaRao Puli 31269f8bfa7cSGunnar Mills getLocationIndicatorActive(asyncResp); 31279f8bfa7cSGunnar Mills // TODO (Gunnar): Remove IndicatorLED after enough time has passed 3128a3002228SAppaRao Puli getIndicatorLedState(asyncResp); 31295bc2dc8eSJames Feist getComputerSystem(asyncResp, health); 31306c34de48SEd Tanous getHostState(asyncResp); 3131491d8ee7SSantosh Puranik getBootProperties(asyncResp); 3132978b8803SAndrew Geissler getBootProgress(asyncResp); 3133b6d5d45cSHieu Huynh getBootProgressLastStateTime(asyncResp); 3134adbe192aSJason M. Bills getPCIeDeviceList(asyncResp, "PCIeDevices"); 313551709ffdSYong Li getHostWatchdogTimer(asyncResp); 3136c6a620f2SGeorge Liu getPowerRestorePolicy(asyncResp); 3137797d5daeSCorey Hardesty getAutomaticRetryPolicy(asyncResp); 3138c0557e1aSGunnar Mills getLastResetTime(asyncResp); 3139a6349918SAppaRao Puli #ifdef BMCWEB_ENABLE_REDFISH_PROVISIONING_FEATURE 3140a6349918SAppaRao Puli getProvisioningStatus(asyncResp); 3141a6349918SAppaRao Puli #endif 31421981771bSAli Ahmed getTrustedModuleRequiredToBoot(asyncResp); 31433a2d0424SChris Cain getPowerMode(asyncResp); 314437bbf98cSChris Cain getIdlePowerSaver(asyncResp); 31457e860f15SJohn Edward Broadbent }); 3146550a6bf8SJiaqing Zhao 314722d268cbSEd Tanous BMCWEB_ROUTE(app, "/redfish/v1/Systems/<str>/") 3148ed398213SEd Tanous .privileges(redfish::privileges::patchComputerSystem) 31497e860f15SJohn Edward Broadbent .methods(boost::beast::http::verb::patch)( 315045ca1b86SEd Tanous [&app](const crow::Request& req, 315122d268cbSEd Tanous const std::shared_ptr<bmcweb::AsyncResp>& asyncResp, 315222d268cbSEd Tanous const std::string& systemName) { 31533ba00073SCarson Labrado if (!redfish::setUpRedfishRoute(app, req, asyncResp)) 315445ca1b86SEd Tanous { 315545ca1b86SEd Tanous return; 315645ca1b86SEd Tanous } 315722d268cbSEd Tanous if (systemName != "system") 315822d268cbSEd Tanous { 315922d268cbSEd Tanous messages::resourceNotFound(asyncResp->res, "ComputerSystem", 316022d268cbSEd Tanous systemName); 316122d268cbSEd Tanous return; 316222d268cbSEd Tanous } 316322d268cbSEd Tanous 3164dd60b9edSEd Tanous asyncResp->res.addHeader( 3165dd60b9edSEd Tanous boost::beast::http::field::link, 3166dd60b9edSEd Tanous "</redfish/v1/JsonSchemas/ComputerSystem/ComputerSystem.json>; rel=describedby"); 3167dd60b9edSEd Tanous 31689f8bfa7cSGunnar Mills std::optional<bool> locationIndicatorActive; 3169cde19e5fSSantosh Puranik std::optional<std::string> indicatorLed; 317098e386ecSGunnar Mills std::optional<std::string> assetTag; 3171c6a620f2SGeorge Liu std::optional<std::string> powerRestorePolicy; 31723a2d0424SChris Cain std::optional<std::string> powerMode; 3173550a6bf8SJiaqing Zhao std::optional<bool> wdtEnable; 3174550a6bf8SJiaqing Zhao std::optional<std::string> wdtTimeOutAction; 3175550a6bf8SJiaqing Zhao std::optional<std::string> bootSource; 3176550a6bf8SJiaqing Zhao std::optional<std::string> bootType; 3177550a6bf8SJiaqing Zhao std::optional<std::string> bootEnable; 3178550a6bf8SJiaqing Zhao std::optional<std::string> bootAutomaticRetry; 3179797d5daeSCorey Hardesty std::optional<uint32_t> bootAutomaticRetryAttempts; 3180550a6bf8SJiaqing Zhao std::optional<bool> bootTrustedModuleRequired; 3181550a6bf8SJiaqing Zhao std::optional<bool> ipsEnable; 3182550a6bf8SJiaqing Zhao std::optional<uint8_t> ipsEnterUtil; 3183550a6bf8SJiaqing Zhao std::optional<uint64_t> ipsEnterTime; 3184550a6bf8SJiaqing Zhao std::optional<uint8_t> ipsExitUtil; 3185550a6bf8SJiaqing Zhao std::optional<uint64_t> ipsExitTime; 3186550a6bf8SJiaqing Zhao 3187550a6bf8SJiaqing Zhao // clang-format off 318815ed6780SWilly Tu if (!json_util::readJsonPatch( 3189550a6bf8SJiaqing Zhao req, asyncResp->res, 3190550a6bf8SJiaqing Zhao "IndicatorLED", indicatorLed, 31917e860f15SJohn Edward Broadbent "LocationIndicatorActive", locationIndicatorActive, 3192550a6bf8SJiaqing Zhao "AssetTag", assetTag, 3193550a6bf8SJiaqing Zhao "PowerRestorePolicy", powerRestorePolicy, 3194550a6bf8SJiaqing Zhao "PowerMode", powerMode, 3195550a6bf8SJiaqing Zhao "HostWatchdogTimer/FunctionEnabled", wdtEnable, 3196550a6bf8SJiaqing Zhao "HostWatchdogTimer/TimeoutAction", wdtTimeOutAction, 3197550a6bf8SJiaqing Zhao "Boot/BootSourceOverrideTarget", bootSource, 3198550a6bf8SJiaqing Zhao "Boot/BootSourceOverrideMode", bootType, 3199550a6bf8SJiaqing Zhao "Boot/BootSourceOverrideEnabled", bootEnable, 3200550a6bf8SJiaqing Zhao "Boot/AutomaticRetryConfig", bootAutomaticRetry, 3201797d5daeSCorey Hardesty "Boot/AutomaticRetryAttempts", bootAutomaticRetryAttempts, 3202550a6bf8SJiaqing Zhao "Boot/TrustedModuleRequiredToBoot", bootTrustedModuleRequired, 3203550a6bf8SJiaqing Zhao "IdlePowerSaver/Enabled", ipsEnable, 3204550a6bf8SJiaqing Zhao "IdlePowerSaver/EnterUtilizationPercent", ipsEnterUtil, 3205550a6bf8SJiaqing Zhao "IdlePowerSaver/EnterDwellTimeSeconds", ipsEnterTime, 3206550a6bf8SJiaqing Zhao "IdlePowerSaver/ExitUtilizationPercent", ipsExitUtil, 3207550a6bf8SJiaqing Zhao "IdlePowerSaver/ExitDwellTimeSeconds", ipsExitTime)) 32086617338dSEd Tanous { 32096617338dSEd Tanous return; 32106617338dSEd Tanous } 3211550a6bf8SJiaqing Zhao // clang-format on 3212491d8ee7SSantosh Puranik 32138d1b46d7Szhanghch05 asyncResp->res.result(boost::beast::http::status::no_content); 3214c45f0082SYong Li 321598e386ecSGunnar Mills if (assetTag) 321698e386ecSGunnar Mills { 321798e386ecSGunnar Mills setAssetTag(asyncResp, *assetTag); 321898e386ecSGunnar Mills } 321998e386ecSGunnar Mills 3220550a6bf8SJiaqing Zhao if (wdtEnable || wdtTimeOutAction) 3221c45f0082SYong Li { 3222f23b7296SEd Tanous setWDTProperties(asyncResp, wdtEnable, wdtTimeOutAction); 3223c45f0082SYong Li } 3224c45f0082SYong Li 3225cd9a4666SKonstantin Aladyshev if (bootSource || bootType || bootEnable) 322669f35306SGunnar Mills { 3227002d39b4SEd Tanous setBootProperties(asyncResp, bootSource, bootType, bootEnable); 3228491d8ee7SSantosh Puranik } 3229550a6bf8SJiaqing Zhao if (bootAutomaticRetry) 323069f35306SGunnar Mills { 3231550a6bf8SJiaqing Zhao setAutomaticRetry(asyncResp, *bootAutomaticRetry); 323269f35306SGunnar Mills } 3233ac7e1e0bSAli Ahmed 3234797d5daeSCorey Hardesty if (bootAutomaticRetryAttempts) 3235797d5daeSCorey Hardesty { 3236797d5daeSCorey Hardesty setAutomaticRetryAttempts(asyncResp, 3237797d5daeSCorey Hardesty bootAutomaticRetryAttempts.value()); 3238797d5daeSCorey Hardesty } 3239797d5daeSCorey Hardesty 3240550a6bf8SJiaqing Zhao if (bootTrustedModuleRequired) 3241ac7e1e0bSAli Ahmed { 3242550a6bf8SJiaqing Zhao setTrustedModuleRequiredToBoot(asyncResp, 3243550a6bf8SJiaqing Zhao *bootTrustedModuleRequired); 324469f35306SGunnar Mills } 3245265c1602SJohnathan Mantey 32469f8bfa7cSGunnar Mills if (locationIndicatorActive) 32479f8bfa7cSGunnar Mills { 3248002d39b4SEd Tanous setLocationIndicatorActive(asyncResp, *locationIndicatorActive); 32499f8bfa7cSGunnar Mills } 32509f8bfa7cSGunnar Mills 32517e860f15SJohn Edward Broadbent // TODO (Gunnar): Remove IndicatorLED after enough time has 32527e860f15SJohn Edward Broadbent // passed 32539712f8acSEd Tanous if (indicatorLed) 32546617338dSEd Tanous { 3255f23b7296SEd Tanous setIndicatorLedState(asyncResp, *indicatorLed); 3256002d39b4SEd Tanous asyncResp->res.addHeader(boost::beast::http::field::warning, 3257d6aa0093SGunnar Mills "299 - \"IndicatorLED is deprecated. Use " 3258d6aa0093SGunnar Mills "LocationIndicatorActive instead.\""); 32596617338dSEd Tanous } 3260c6a620f2SGeorge Liu 3261c6a620f2SGeorge Liu if (powerRestorePolicy) 3262c6a620f2SGeorge Liu { 32634e69c904SGunnar Mills setPowerRestorePolicy(asyncResp, *powerRestorePolicy); 3264c6a620f2SGeorge Liu } 32653a2d0424SChris Cain 32663a2d0424SChris Cain if (powerMode) 32673a2d0424SChris Cain { 32683a2d0424SChris Cain setPowerMode(asyncResp, *powerMode); 32693a2d0424SChris Cain } 327037bbf98cSChris Cain 3271550a6bf8SJiaqing Zhao if (ipsEnable || ipsEnterUtil || ipsEnterTime || ipsExitUtil || 3272550a6bf8SJiaqing Zhao ipsExitTime) 327337bbf98cSChris Cain { 3274002d39b4SEd Tanous setIdlePowerSaver(asyncResp, ipsEnable, ipsEnterUtil, ipsEnterTime, 3275002d39b4SEd Tanous ipsExitUtil, ipsExitTime); 327637bbf98cSChris Cain } 32777e860f15SJohn Edward Broadbent }); 3278c5b2abe0SLewanczyk, Dawid } 32791cb1a9e6SAppaRao Puli 328038c8a6f2SEd Tanous inline void handleSystemCollectionResetActionHead( 3281dd60b9edSEd Tanous crow::App& app, const crow::Request& req, 3282dd60b9edSEd Tanous const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) 3283dd60b9edSEd Tanous { 3284dd60b9edSEd Tanous if (!redfish::setUpRedfishRoute(app, req, asyncResp)) 3285dd60b9edSEd Tanous { 3286dd60b9edSEd Tanous return; 3287dd60b9edSEd Tanous } 3288dd60b9edSEd Tanous asyncResp->res.addHeader( 3289dd60b9edSEd Tanous boost::beast::http::field::link, 3290dd60b9edSEd Tanous "</redfish/v1/JsonSchemas/ActionInfo/ActionInfo.json>; rel=describedby"); 3291dd60b9edSEd Tanous } 3292dd60b9edSEd Tanous 32931cb1a9e6SAppaRao Puli /** 32941cb1a9e6SAppaRao Puli * SystemResetActionInfo derived class for delivering Computer Systems 32951cb1a9e6SAppaRao Puli * ResetType AllowableValues using ResetInfo schema. 32961cb1a9e6SAppaRao Puli */ 32977e860f15SJohn Edward Broadbent inline void requestRoutesSystemResetActionInfo(App& app) 32981cb1a9e6SAppaRao Puli { 3299dd60b9edSEd Tanous BMCWEB_ROUTE(app, "/redfish/v1/Systems/system/ResetActionInfo/") 3300dd60b9edSEd Tanous .privileges(redfish::privileges::headActionInfo) 3301dd60b9edSEd Tanous .methods(boost::beast::http::verb::head)(std::bind_front( 3302dd60b9edSEd Tanous handleSystemCollectionResetActionHead, std::ref(app))); 33031cb1a9e6SAppaRao Puli /** 33041cb1a9e6SAppaRao Puli * Functions triggers appropriate requests on DBus 33051cb1a9e6SAppaRao Puli */ 330622d268cbSEd Tanous BMCWEB_ROUTE(app, "/redfish/v1/Systems/<str>/ResetActionInfo/") 3307ed398213SEd Tanous .privileges(redfish::privileges::getActionInfo) 33087e860f15SJohn Edward Broadbent .methods(boost::beast::http::verb::get)( 330945ca1b86SEd Tanous [&app](const crow::Request& req, 331022d268cbSEd Tanous const std::shared_ptr<bmcweb::AsyncResp>& asyncResp, 331122d268cbSEd Tanous const std::string& systemName) { 33123ba00073SCarson Labrado if (!redfish::setUpRedfishRoute(app, req, asyncResp)) 331345ca1b86SEd Tanous { 331445ca1b86SEd Tanous return; 331545ca1b86SEd Tanous } 3316746b56f3SAsmitha Karunanithi 3317746b56f3SAsmitha Karunanithi if (systemName == "hypervisor") 3318746b56f3SAsmitha Karunanithi { 3319746b56f3SAsmitha Karunanithi handleHypervisorResetActionGet(asyncResp); 3320746b56f3SAsmitha Karunanithi return; 3321746b56f3SAsmitha Karunanithi } 3322746b56f3SAsmitha Karunanithi 332322d268cbSEd Tanous if (systemName != "system") 332422d268cbSEd Tanous { 332522d268cbSEd Tanous messages::resourceNotFound(asyncResp->res, "ComputerSystem", 332622d268cbSEd Tanous systemName); 332722d268cbSEd Tanous return; 332822d268cbSEd Tanous } 332922d268cbSEd Tanous 3330dd60b9edSEd Tanous asyncResp->res.addHeader( 3331dd60b9edSEd Tanous boost::beast::http::field::link, 3332dd60b9edSEd Tanous "</redfish/v1/JsonSchemas/ActionInfo/ActionInfo.json>; rel=describedby"); 33331476687dSEd Tanous 33341476687dSEd Tanous asyncResp->res.jsonValue["@odata.id"] = 33351476687dSEd Tanous "/redfish/v1/Systems/system/ResetActionInfo"; 33361476687dSEd Tanous asyncResp->res.jsonValue["@odata.type"] = 33371476687dSEd Tanous "#ActionInfo.v1_1_2.ActionInfo"; 33381476687dSEd Tanous asyncResp->res.jsonValue["Name"] = "Reset Action Info"; 33391476687dSEd Tanous asyncResp->res.jsonValue["Id"] = "ResetActionInfo"; 33403215e700SNan Zhou 33413215e700SNan Zhou nlohmann::json::array_t parameters; 33423215e700SNan Zhou nlohmann::json::object_t parameter; 33433215e700SNan Zhou 33443215e700SNan Zhou parameter["Name"] = "ResetType"; 33453215e700SNan Zhou parameter["Required"] = true; 33463215e700SNan Zhou parameter["DataType"] = "String"; 33473215e700SNan Zhou nlohmann::json::array_t allowableValues; 33483215e700SNan Zhou allowableValues.emplace_back("On"); 33493215e700SNan Zhou allowableValues.emplace_back("ForceOff"); 33503215e700SNan Zhou allowableValues.emplace_back("ForceOn"); 33513215e700SNan Zhou allowableValues.emplace_back("ForceRestart"); 33523215e700SNan Zhou allowableValues.emplace_back("GracefulRestart"); 33533215e700SNan Zhou allowableValues.emplace_back("GracefulShutdown"); 33543215e700SNan Zhou allowableValues.emplace_back("PowerCycle"); 33553215e700SNan Zhou allowableValues.emplace_back("Nmi"); 33563215e700SNan Zhou parameter["AllowableValues"] = std::move(allowableValues); 33573215e700SNan Zhou parameters.emplace_back(std::move(parameter)); 33583215e700SNan Zhou 33593215e700SNan Zhou asyncResp->res.jsonValue["Parameters"] = std::move(parameters); 33607e860f15SJohn Edward Broadbent }); 33611cb1a9e6SAppaRao Puli } 3362c5b2abe0SLewanczyk, Dawid } // namespace redfish 3363