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 189712f8acSEd Tanous #include <boost/container/flat_map.hpp> 199712f8acSEd Tanous #include <node.hpp> 20c5b2abe0SLewanczyk, Dawid #include <utils/json_utils.hpp> 21abf2add6SEd Tanous #include <variant> 22c5b2abe0SLewanczyk, Dawid 231abe55efSEd Tanous namespace redfish 241abe55efSEd Tanous { 25c5b2abe0SLewanczyk, Dawid 26c5b2abe0SLewanczyk, Dawid /** 27c5b2abe0SLewanczyk, Dawid * @brief Retrieves computer system properties over dbus 28c5b2abe0SLewanczyk, Dawid * 29c5b2abe0SLewanczyk, Dawid * @param[in] aResp Shared pointer for completing asynchronous calls 30c5b2abe0SLewanczyk, Dawid * @param[in] name Computer system name from request 31c5b2abe0SLewanczyk, Dawid * 32c5b2abe0SLewanczyk, Dawid * @return None. 33c5b2abe0SLewanczyk, Dawid */ 34029573d4SEd Tanous void getComputerSystem(std::shared_ptr<AsyncResp> aResp) 351abe55efSEd Tanous { 3655c7b7a2SEd Tanous BMCWEB_LOG_DEBUG << "Get available system components."; 3755c7b7a2SEd Tanous crow::connections::systemBus->async_method_call( 38029573d4SEd Tanous [aResp{std::move(aResp)}]( 39c5b2abe0SLewanczyk, Dawid const boost::system::error_code ec, 40c5b2abe0SLewanczyk, Dawid const std::vector<std::pair< 416c34de48SEd Tanous std::string, 426c34de48SEd Tanous std::vector<std::pair<std::string, std::vector<std::string>>>>> 43c5b2abe0SLewanczyk, Dawid &subtree) { 441abe55efSEd Tanous if (ec) 451abe55efSEd Tanous { 4655c7b7a2SEd Tanous BMCWEB_LOG_DEBUG << "DBUS response error"; 47f12894f8SJason M. Bills messages::internalError(aResp->res); 48c5b2abe0SLewanczyk, Dawid return; 49c5b2abe0SLewanczyk, Dawid } 50c5b2abe0SLewanczyk, Dawid // Iterate over all retrieved ObjectPaths. 516c34de48SEd Tanous for (const std::pair<std::string, 526c34de48SEd Tanous std::vector<std::pair< 536c34de48SEd Tanous std::string, std::vector<std::string>>>> 541abe55efSEd Tanous &object : subtree) 551abe55efSEd Tanous { 56c5b2abe0SLewanczyk, Dawid const std::string &path = object.first; 5755c7b7a2SEd Tanous BMCWEB_LOG_DEBUG << "Got path: " << path; 581abe55efSEd Tanous const std::vector< 591abe55efSEd Tanous std::pair<std::string, std::vector<std::string>>> 60c5b2abe0SLewanczyk, Dawid &connectionNames = object.second; 611abe55efSEd Tanous if (connectionNames.size() < 1) 621abe55efSEd Tanous { 63c5b2abe0SLewanczyk, Dawid continue; 64c5b2abe0SLewanczyk, Dawid } 65029573d4SEd Tanous 666c34de48SEd Tanous // This is not system, so check if it's cpu, dimm, UUID or 676c34de48SEd Tanous // BiosVer 6804a258f4SEd Tanous for (const auto &connection : connectionNames) 691abe55efSEd Tanous { 7004a258f4SEd Tanous for (const auto &interfaceName : connection.second) 711abe55efSEd Tanous { 7204a258f4SEd Tanous if (interfaceName == 7304a258f4SEd Tanous "xyz.openbmc_project.Inventory.Item.Dimm") 741abe55efSEd Tanous { 751abe55efSEd Tanous BMCWEB_LOG_DEBUG 7604a258f4SEd Tanous << "Found Dimm, now get its properties."; 7755c7b7a2SEd Tanous crow::connections::systemBus->async_method_call( 78029573d4SEd Tanous [aResp](const boost::system::error_code ec, 796c34de48SEd Tanous const std::vector< 806c34de48SEd Tanous std::pair<std::string, VariantType>> 811abe55efSEd Tanous &properties) { 821abe55efSEd Tanous if (ec) 831abe55efSEd Tanous { 841abe55efSEd Tanous BMCWEB_LOG_ERROR 856c34de48SEd Tanous << "DBUS response error " << ec; 86f12894f8SJason M. Bills messages::internalError(aResp->res); 87c5b2abe0SLewanczyk, Dawid return; 88c5b2abe0SLewanczyk, Dawid } 896c34de48SEd Tanous BMCWEB_LOG_DEBUG << "Got " 906c34de48SEd Tanous << properties.size() 91c5b2abe0SLewanczyk, Dawid << "Dimm properties."; 9204a258f4SEd Tanous for (const std::pair<std::string, 9304a258f4SEd Tanous VariantType> 9404a258f4SEd Tanous &property : properties) 951abe55efSEd Tanous { 96029573d4SEd Tanous if (property.first == "MemorySizeInKb") 971abe55efSEd Tanous { 9804a258f4SEd Tanous const uint64_t *value = 99029573d4SEd Tanous sdbusplus::message::variant_ns:: 100029573d4SEd Tanous get_if<uint64_t>( 1011b6b96c5SEd Tanous &property.second); 10204a258f4SEd Tanous if (value != nullptr) 1031abe55efSEd Tanous { 1041abe55efSEd Tanous aResp->res.jsonValue 1056c34de48SEd Tanous ["TotalSystemMemoryGi" 1066c34de48SEd Tanous "B"] += 10704a258f4SEd Tanous *value / (1024 * 1024); 108029573d4SEd Tanous aResp->res 109029573d4SEd Tanous .jsonValue["MemorySummary"] 110029573d4SEd Tanous ["Status"] 111029573d4SEd Tanous ["State"] = 1121abe55efSEd Tanous "Enabled"; 113c5b2abe0SLewanczyk, Dawid } 114c5b2abe0SLewanczyk, Dawid } 115c5b2abe0SLewanczyk, Dawid } 116c5b2abe0SLewanczyk, Dawid }, 11704a258f4SEd Tanous connection.first, path, 1186c34de48SEd Tanous "org.freedesktop.DBus.Properties", "GetAll", 1196c34de48SEd Tanous "xyz.openbmc_project.Inventory.Item.Dimm"); 1201abe55efSEd Tanous } 12104a258f4SEd Tanous else if (interfaceName == 12204a258f4SEd Tanous "xyz.openbmc_project.Inventory.Item.Cpu") 1231abe55efSEd Tanous { 1241abe55efSEd Tanous BMCWEB_LOG_DEBUG 12504a258f4SEd Tanous << "Found Cpu, now get its properties."; 126a0803efaSEd Tanous crow::connections::systemBus->async_method_call( 127029573d4SEd Tanous [aResp](const boost::system::error_code ec, 1286c34de48SEd Tanous const std::vector< 1296c34de48SEd Tanous std::pair<std::string, VariantType>> 1301abe55efSEd Tanous &properties) { 1311abe55efSEd Tanous if (ec) 1321abe55efSEd Tanous { 1331abe55efSEd Tanous BMCWEB_LOG_ERROR 1346c34de48SEd Tanous << "DBUS response error " << ec; 135f12894f8SJason M. Bills messages::internalError(aResp->res); 136c5b2abe0SLewanczyk, Dawid return; 137c5b2abe0SLewanczyk, Dawid } 1386c34de48SEd Tanous BMCWEB_LOG_DEBUG << "Got " 1396c34de48SEd Tanous << properties.size() 140c5b2abe0SLewanczyk, Dawid << "Cpu properties."; 14104a258f4SEd Tanous for (const auto &property : properties) 1421abe55efSEd Tanous { 143029573d4SEd Tanous if (property.first == "ProcessorFamily") 1441abe55efSEd Tanous { 145a0803efaSEd Tanous const std::string *value = 146029573d4SEd Tanous sdbusplus::message::variant_ns:: 147029573d4SEd Tanous get_if<std::string>( 1481b6b96c5SEd Tanous &property.second); 1491abe55efSEd Tanous if (value != nullptr) 1501abe55efSEd Tanous { 151029573d4SEd Tanous nlohmann::json &procSummary = 1521abe55efSEd Tanous aResp->res.jsonValue 1536c34de48SEd Tanous ["ProcessorSumm" 15404a258f4SEd Tanous "ary"]; 15504a258f4SEd Tanous nlohmann::json &procCount = 15604a258f4SEd Tanous procSummary["Count"]; 15704a258f4SEd Tanous 15804a258f4SEd Tanous procCount = 159029573d4SEd Tanous procCount.get<int>() + 1; 160029573d4SEd Tanous procSummary["Status"]["State"] = 161c5b2abe0SLewanczyk, Dawid "Enabled"; 162029573d4SEd Tanous procSummary["Model"] = *value; 163c5b2abe0SLewanczyk, Dawid } 164c5b2abe0SLewanczyk, Dawid } 165c5b2abe0SLewanczyk, Dawid } 166c5b2abe0SLewanczyk, Dawid }, 16704a258f4SEd Tanous connection.first, path, 1686c34de48SEd Tanous "org.freedesktop.DBus.Properties", "GetAll", 1696c34de48SEd Tanous "xyz.openbmc_project.Inventory.Item.Cpu"); 1701abe55efSEd Tanous } 17104a258f4SEd Tanous else if (interfaceName == 17204a258f4SEd Tanous "xyz.openbmc_project.Common.UUID") 1731abe55efSEd Tanous { 1741abe55efSEd Tanous BMCWEB_LOG_DEBUG 17504a258f4SEd Tanous << "Found UUID, now get its properties."; 17655c7b7a2SEd Tanous crow::connections::systemBus->async_method_call( 177029573d4SEd Tanous [aResp](const boost::system::error_code ec, 1786c34de48SEd Tanous const std::vector< 1796c34de48SEd Tanous std::pair<std::string, VariantType>> 1801abe55efSEd Tanous &properties) { 1811abe55efSEd Tanous if (ec) 1821abe55efSEd Tanous { 1831abe55efSEd Tanous BMCWEB_LOG_DEBUG 1846c34de48SEd Tanous << "DBUS response error " << ec; 185f12894f8SJason M. Bills messages::internalError(aResp->res); 186c5b2abe0SLewanczyk, Dawid return; 187c5b2abe0SLewanczyk, Dawid } 1886c34de48SEd Tanous BMCWEB_LOG_DEBUG << "Got " 1896c34de48SEd Tanous << properties.size() 190c5b2abe0SLewanczyk, Dawid << "UUID properties."; 1911abe55efSEd Tanous for (const std::pair<std::string, 19204a258f4SEd Tanous VariantType> 19304a258f4SEd Tanous &property : properties) 1941abe55efSEd Tanous { 19504a258f4SEd Tanous if (property.first == "BIOSVer") 1961abe55efSEd Tanous { 197c5b2abe0SLewanczyk, Dawid const std::string *value = 198029573d4SEd Tanous sdbusplus::message::variant_ns:: 199029573d4SEd Tanous get_if<std::string>( 2001b6b96c5SEd Tanous &property.second); 2011abe55efSEd Tanous if (value != nullptr) 2021abe55efSEd Tanous { 203029573d4SEd Tanous aResp->res 204029573d4SEd Tanous .jsonValue["BiosVersion"] = 2051abe55efSEd Tanous *value; 206c5b2abe0SLewanczyk, Dawid } 207c5b2abe0SLewanczyk, Dawid } 20804a258f4SEd Tanous if (property.first == "UUID") 2091abe55efSEd Tanous { 210c5b2abe0SLewanczyk, Dawid const std::string *value = 211029573d4SEd Tanous sdbusplus::message::variant_ns:: 212029573d4SEd Tanous get_if<std::string>( 2131b6b96c5SEd Tanous &property.second); 21404a258f4SEd Tanous 2151abe55efSEd Tanous if (value != nullptr) 2161abe55efSEd Tanous { 217029573d4SEd Tanous std::string valueStr = *value; 21804a258f4SEd Tanous if (valueStr.size() == 32) 2191abe55efSEd Tanous { 220029573d4SEd Tanous valueStr.insert(8, 1, '-'); 221029573d4SEd Tanous valueStr.insert(13, 1, '-'); 222029573d4SEd Tanous valueStr.insert(18, 1, '-'); 223029573d4SEd Tanous valueStr.insert(23, 1, '-'); 22404a258f4SEd Tanous } 225029573d4SEd Tanous BMCWEB_LOG_DEBUG << "UUID = " 22604a258f4SEd Tanous << valueStr; 227029573d4SEd Tanous aResp->res.jsonValue["UUID"] = 22804a258f4SEd Tanous valueStr; 229c5b2abe0SLewanczyk, Dawid } 230c5b2abe0SLewanczyk, Dawid } 231c5b2abe0SLewanczyk, Dawid } 232c5b2abe0SLewanczyk, Dawid }, 23304a258f4SEd Tanous connection.first, path, 2346c34de48SEd Tanous "org.freedesktop.DBus.Properties", "GetAll", 2351abe55efSEd Tanous "xyz.openbmc_project.Common.UUID"); 236c5b2abe0SLewanczyk, Dawid } 237029573d4SEd Tanous else if (interfaceName == 238029573d4SEd Tanous "xyz.openbmc_project.Inventory.Item.System") 2391abe55efSEd Tanous { 240029573d4SEd Tanous crow::connections::systemBus->async_method_call( 241029573d4SEd Tanous [aResp](const boost::system::error_code ec, 242029573d4SEd Tanous const std::vector< 243029573d4SEd Tanous std::pair<std::string, VariantType>> 244029573d4SEd Tanous &propertiesList) { 245029573d4SEd Tanous if (ec) 246029573d4SEd Tanous { 247029573d4SEd Tanous BMCWEB_LOG_ERROR 248029573d4SEd Tanous << "DBUS response error: " << ec; 249f12894f8SJason M. Bills messages::internalError(aResp->res); 250029573d4SEd Tanous return; 251029573d4SEd Tanous } 252029573d4SEd Tanous BMCWEB_LOG_DEBUG << "Got " 253029573d4SEd Tanous << propertiesList.size() 254029573d4SEd Tanous << "properties for system"; 255029573d4SEd Tanous for (const std::pair<std::string, 256029573d4SEd Tanous VariantType> 257029573d4SEd Tanous &property : propertiesList) 258029573d4SEd Tanous { 259fc5afcf9Sbeccabroek const std::string &propertyName = 260fc5afcf9Sbeccabroek property.first; 261fc5afcf9Sbeccabroek if ((propertyName == "PartNumber") || 262fc5afcf9Sbeccabroek (propertyName == "SerialNumber") || 263fc5afcf9Sbeccabroek (propertyName == "Manufacturer") || 264fc5afcf9Sbeccabroek (propertyName == "Model")) 265fc5afcf9Sbeccabroek { 266029573d4SEd Tanous const std::string *value = 267fc5afcf9Sbeccabroek std::get_if<std::string>( 268029573d4SEd Tanous &property.second); 269029573d4SEd Tanous if (value != nullptr) 270029573d4SEd Tanous { 271029573d4SEd Tanous aResp->res 272fc5afcf9Sbeccabroek .jsonValue[propertyName] = 273029573d4SEd Tanous *value; 274029573d4SEd Tanous } 275029573d4SEd Tanous } 276fc5afcf9Sbeccabroek } 277029573d4SEd Tanous aResp->res.jsonValue["Name"] = "system"; 278029573d4SEd Tanous aResp->res.jsonValue["Id"] = 279029573d4SEd Tanous aResp->res.jsonValue["SerialNumber"]; 280029573d4SEd Tanous }, 281029573d4SEd Tanous connection.first, path, 282029573d4SEd Tanous "org.freedesktop.DBus.Properties", "GetAll", 283029573d4SEd Tanous "xyz.openbmc_project.Inventory.Decorator." 284029573d4SEd Tanous "Asset"); 285029573d4SEd Tanous } 286029573d4SEd Tanous } 287029573d4SEd Tanous } 288c5b2abe0SLewanczyk, Dawid } 289c5b2abe0SLewanczyk, Dawid }, 290c5b2abe0SLewanczyk, Dawid "xyz.openbmc_project.ObjectMapper", 291c5b2abe0SLewanczyk, Dawid "/xyz/openbmc_project/object_mapper", 292c5b2abe0SLewanczyk, Dawid "xyz.openbmc_project.ObjectMapper", "GetSubTree", 2936617338dSEd Tanous "/xyz/openbmc_project/inventory", int32_t(0), 2946617338dSEd Tanous std::array<const char *, 5>{ 2956617338dSEd Tanous "xyz.openbmc_project.Inventory.Decorator.Asset", 2966617338dSEd Tanous "xyz.openbmc_project.Inventory.Item.Cpu", 2976617338dSEd Tanous "xyz.openbmc_project.Inventory.Item.Dimm", 2986617338dSEd Tanous "xyz.openbmc_project.Inventory.Item.System", 2996617338dSEd Tanous "xyz.openbmc_project.Common.UUID", 3006617338dSEd Tanous }); 301c5b2abe0SLewanczyk, Dawid } 302c5b2abe0SLewanczyk, Dawid 303c5b2abe0SLewanczyk, Dawid /** 304c5b2abe0SLewanczyk, Dawid * @brief Retrieves identify led group properties over dbus 305c5b2abe0SLewanczyk, Dawid * 306*491d8ee7SSantosh Puranik * @param[in] aResp Shared pointer for generating response message. 307c5b2abe0SLewanczyk, Dawid * @param[in] callback Callback for process retrieved data. 308c5b2abe0SLewanczyk, Dawid * 309c5b2abe0SLewanczyk, Dawid * @return None. 310c5b2abe0SLewanczyk, Dawid */ 311c5b2abe0SLewanczyk, Dawid template <typename CallbackFunc> 312a0803efaSEd Tanous void getLedGroupIdentify(std::shared_ptr<AsyncResp> aResp, 3131abe55efSEd Tanous CallbackFunc &&callback) 3141abe55efSEd Tanous { 31555c7b7a2SEd Tanous BMCWEB_LOG_DEBUG << "Get led groups"; 31655c7b7a2SEd Tanous crow::connections::systemBus->async_method_call( 3171abe55efSEd Tanous [aResp{std::move(aResp)}, 3186617338dSEd Tanous callback{std::move(callback)}](const boost::system::error_code &ec, 3191abe55efSEd Tanous const ManagedObjectsType &resp) { 3201abe55efSEd Tanous if (ec) 3211abe55efSEd Tanous { 32255c7b7a2SEd Tanous BMCWEB_LOG_DEBUG << "DBUS response error " << ec; 323f12894f8SJason M. Bills messages::internalError(aResp->res); 324c5b2abe0SLewanczyk, Dawid return; 325c5b2abe0SLewanczyk, Dawid } 3266c34de48SEd Tanous BMCWEB_LOG_DEBUG << "Got " << resp.size() << "led group objects."; 3271abe55efSEd Tanous for (const auto &objPath : resp) 3281abe55efSEd Tanous { 329c5b2abe0SLewanczyk, Dawid const std::string &path = objPath.first; 3301abe55efSEd Tanous if (path.rfind("enclosure_identify") != std::string::npos) 3311abe55efSEd Tanous { 3321abe55efSEd Tanous for (const auto &interface : objPath.second) 3331abe55efSEd Tanous { 3346c34de48SEd Tanous if (interface.first == "xyz.openbmc_project.Led.Group") 3351abe55efSEd Tanous { 3361abe55efSEd Tanous for (const auto &property : interface.second) 3371abe55efSEd Tanous { 3381abe55efSEd Tanous if (property.first == "Asserted") 3391abe55efSEd Tanous { 340c5b2abe0SLewanczyk, Dawid const bool *asserted = 341abf2add6SEd Tanous std::get_if<bool>(&property.second); 3421abe55efSEd Tanous if (nullptr != asserted) 3431abe55efSEd Tanous { 344c5b2abe0SLewanczyk, Dawid callback(*asserted, aResp); 3451abe55efSEd Tanous } 3461abe55efSEd Tanous else 3471abe55efSEd Tanous { 348c5b2abe0SLewanczyk, Dawid callback(false, aResp); 349c5b2abe0SLewanczyk, Dawid } 350c5b2abe0SLewanczyk, Dawid } 351c5b2abe0SLewanczyk, Dawid } 352c5b2abe0SLewanczyk, Dawid } 353c5b2abe0SLewanczyk, Dawid } 354c5b2abe0SLewanczyk, Dawid } 355c5b2abe0SLewanczyk, Dawid } 356c5b2abe0SLewanczyk, Dawid }, 357c5b2abe0SLewanczyk, Dawid "xyz.openbmc_project.LED.GroupManager", 3586c34de48SEd Tanous "/xyz/openbmc_project/led/groups", "org.freedesktop.DBus.ObjectManager", 3596c34de48SEd Tanous "GetManagedObjects"); 360c5b2abe0SLewanczyk, Dawid } 361c5b2abe0SLewanczyk, Dawid 362c5b2abe0SLewanczyk, Dawid template <typename CallbackFunc> 3636c34de48SEd Tanous void getLedIdentify(std::shared_ptr<AsyncResp> aResp, CallbackFunc &&callback) 3641abe55efSEd Tanous { 36555c7b7a2SEd Tanous BMCWEB_LOG_DEBUG << "Get identify led properties"; 36655c7b7a2SEd Tanous crow::connections::systemBus->async_method_call( 3676617338dSEd Tanous [aResp, 3686617338dSEd Tanous callback{std::move(callback)}](const boost::system::error_code ec, 369c5b2abe0SLewanczyk, Dawid const PropertiesType &properties) { 3701abe55efSEd Tanous if (ec) 3711abe55efSEd Tanous { 37255c7b7a2SEd Tanous BMCWEB_LOG_DEBUG << "DBUS response error " << ec; 373f12894f8SJason M. Bills messages::internalError(aResp->res); 374c5b2abe0SLewanczyk, Dawid return; 375c5b2abe0SLewanczyk, Dawid } 3761abe55efSEd Tanous BMCWEB_LOG_DEBUG << "Got " << properties.size() 3771abe55efSEd Tanous << "led properties."; 378c5b2abe0SLewanczyk, Dawid std::string output; 3791abe55efSEd Tanous for (const auto &property : properties) 3801abe55efSEd Tanous { 3811abe55efSEd Tanous if (property.first == "State") 3821abe55efSEd Tanous { 383c5b2abe0SLewanczyk, Dawid const std::string *s = 384abf2add6SEd Tanous std::get_if<std::string>(&property.second); 3851abe55efSEd Tanous if (nullptr != s) 3861abe55efSEd Tanous { 38755c7b7a2SEd Tanous BMCWEB_LOG_DEBUG << "Identify Led State: " << *s; 388c5b2abe0SLewanczyk, Dawid const auto pos = s->rfind('.'); 3891abe55efSEd Tanous if (pos != std::string::npos) 3901abe55efSEd Tanous { 391c5b2abe0SLewanczyk, Dawid auto led = s->substr(pos + 1); 3921abe55efSEd Tanous for (const std::pair<const char *, const char *> 3931abe55efSEd Tanous &p : 3941abe55efSEd Tanous std::array< 3956c34de48SEd Tanous std::pair<const char *, const char *>, 3>{ 3966c34de48SEd Tanous {{"On", "Lit"}, 397c5b2abe0SLewanczyk, Dawid {"Blink", "Blinking"}, 3981abe55efSEd Tanous {"Off", "Off"}}}) 3991abe55efSEd Tanous { 4001abe55efSEd Tanous if (led == p.first) 4011abe55efSEd Tanous { 402c5b2abe0SLewanczyk, Dawid output = p.second; 403c5b2abe0SLewanczyk, Dawid } 404c5b2abe0SLewanczyk, Dawid } 405c5b2abe0SLewanczyk, Dawid } 406c5b2abe0SLewanczyk, Dawid } 407c5b2abe0SLewanczyk, Dawid } 408c5b2abe0SLewanczyk, Dawid } 409c5b2abe0SLewanczyk, Dawid callback(output, aResp); 410c5b2abe0SLewanczyk, Dawid }, 411c5b2abe0SLewanczyk, Dawid "xyz.openbmc_project.LED.Controller.identify", 412c5b2abe0SLewanczyk, Dawid "/xyz/openbmc_project/led/physical/identify", 413c5b2abe0SLewanczyk, Dawid "org.freedesktop.DBus.Properties", "GetAll", 414c5b2abe0SLewanczyk, Dawid "xyz.openbmc_project.Led.Physical"); 415c5b2abe0SLewanczyk, Dawid } 416c5b2abe0SLewanczyk, Dawid 417c5b2abe0SLewanczyk, Dawid /** 418c5b2abe0SLewanczyk, Dawid * @brief Retrieves host state properties over dbus 419c5b2abe0SLewanczyk, Dawid * 420c5b2abe0SLewanczyk, Dawid * @param[in] aResp Shared pointer for completing asynchronous calls. 421c5b2abe0SLewanczyk, Dawid * 422c5b2abe0SLewanczyk, Dawid * @return None. 423c5b2abe0SLewanczyk, Dawid */ 424a0803efaSEd Tanous void getHostState(std::shared_ptr<AsyncResp> aResp) 4251abe55efSEd Tanous { 42655c7b7a2SEd Tanous BMCWEB_LOG_DEBUG << "Get host information."; 42755c7b7a2SEd Tanous crow::connections::systemBus->async_method_call( 428abf2add6SEd Tanous [aResp{std::move(aResp)}](const boost::system::error_code ec, 429abf2add6SEd Tanous const std::variant<std::string> &hostState) { 4301abe55efSEd Tanous if (ec) 4311abe55efSEd Tanous { 43255c7b7a2SEd Tanous BMCWEB_LOG_DEBUG << "DBUS response error " << ec; 433f12894f8SJason M. Bills messages::internalError(aResp->res); 434c5b2abe0SLewanczyk, Dawid return; 435c5b2abe0SLewanczyk, Dawid } 4366617338dSEd Tanous 437abf2add6SEd Tanous const std::string *s = std::get_if<std::string>(&hostState); 43855c7b7a2SEd Tanous BMCWEB_LOG_DEBUG << "Host state: " << *s; 4396617338dSEd Tanous if (s != nullptr) 4401abe55efSEd Tanous { 441c5b2abe0SLewanczyk, Dawid // Verify Host State 44294732661SAndrew Geissler if (*s == "xyz.openbmc_project.State.Host.HostState.Running") 4431abe55efSEd Tanous { 44455c7b7a2SEd Tanous aResp->res.jsonValue["PowerState"] = "On"; 4456617338dSEd Tanous aResp->res.jsonValue["Status"]["State"] = "Enabled"; 4461abe55efSEd Tanous } 4471abe55efSEd Tanous else 4481abe55efSEd Tanous { 44955c7b7a2SEd Tanous aResp->res.jsonValue["PowerState"] = "Off"; 4506617338dSEd Tanous aResp->res.jsonValue["Status"]["State"] = "Disabled"; 451c5b2abe0SLewanczyk, Dawid } 452c5b2abe0SLewanczyk, Dawid } 453c5b2abe0SLewanczyk, Dawid }, 4546c34de48SEd Tanous "xyz.openbmc_project.State.Host", "/xyz/openbmc_project/state/host0", 4556617338dSEd Tanous "org.freedesktop.DBus.Properties", "Get", 4566617338dSEd Tanous "xyz.openbmc_project.State.Host", "CurrentHostState"); 457c5b2abe0SLewanczyk, Dawid } 458c5b2abe0SLewanczyk, Dawid 459c5b2abe0SLewanczyk, Dawid /** 460*491d8ee7SSantosh Puranik * @brief Traslates boot source DBUS property value to redfish. 461*491d8ee7SSantosh Puranik * 462*491d8ee7SSantosh Puranik * @param[in] dbusSource The boot source in DBUS speak. 463*491d8ee7SSantosh Puranik * 464*491d8ee7SSantosh Puranik * @return Returns as a string, the boot source in Redfish terms. If translation 465*491d8ee7SSantosh Puranik * cannot be done, returns an empty string. 466*491d8ee7SSantosh Puranik */ 467*491d8ee7SSantosh Puranik static std::string dbusToRfBootSource(const std::string &dbusSource) 468*491d8ee7SSantosh Puranik { 469*491d8ee7SSantosh Puranik if (dbusSource == "xyz.openbmc_project.Control.Boot.Source.Sources.Default") 470*491d8ee7SSantosh Puranik { 471*491d8ee7SSantosh Puranik return "None"; 472*491d8ee7SSantosh Puranik } 473*491d8ee7SSantosh Puranik else if (dbusSource == 474*491d8ee7SSantosh Puranik "xyz.openbmc_project.Control.Boot.Source.Sources.Disk") 475*491d8ee7SSantosh Puranik { 476*491d8ee7SSantosh Puranik return "Hdd"; 477*491d8ee7SSantosh Puranik } 478*491d8ee7SSantosh Puranik else if (dbusSource == 479*491d8ee7SSantosh Puranik "xyz.openbmc_project.Control.Boot.Source.Sources.ExternalMedia") 480*491d8ee7SSantosh Puranik { 481*491d8ee7SSantosh Puranik return "Cd"; 482*491d8ee7SSantosh Puranik } 483*491d8ee7SSantosh Puranik else if (dbusSource == 484*491d8ee7SSantosh Puranik "xyz.openbmc_project.Control.Boot.Source.Sources.Network") 485*491d8ee7SSantosh Puranik { 486*491d8ee7SSantosh Puranik return "Pxe"; 487*491d8ee7SSantosh Puranik } 488*491d8ee7SSantosh Puranik else 489*491d8ee7SSantosh Puranik { 490*491d8ee7SSantosh Puranik return ""; 491*491d8ee7SSantosh Puranik } 492*491d8ee7SSantosh Puranik } 493*491d8ee7SSantosh Puranik 494*491d8ee7SSantosh Puranik /** 495*491d8ee7SSantosh Puranik * @brief Traslates boot mode DBUS property value to redfish. 496*491d8ee7SSantosh Puranik * 497*491d8ee7SSantosh Puranik * @param[in] dbusMode The boot mode in DBUS speak. 498*491d8ee7SSantosh Puranik * 499*491d8ee7SSantosh Puranik * @return Returns as a string, the boot mode in Redfish terms. If translation 500*491d8ee7SSantosh Puranik * cannot be done, returns an empty string. 501*491d8ee7SSantosh Puranik */ 502*491d8ee7SSantosh Puranik static std::string dbusToRfBootMode(const std::string &dbusMode) 503*491d8ee7SSantosh Puranik { 504*491d8ee7SSantosh Puranik if (dbusMode == "xyz.openbmc_project.Control.Boot.Mode.Modes.Regular") 505*491d8ee7SSantosh Puranik { 506*491d8ee7SSantosh Puranik return "None"; 507*491d8ee7SSantosh Puranik } 508*491d8ee7SSantosh Puranik else if (dbusMode == "xyz.openbmc_project.Control.Boot.Mode.Modes.Safe") 509*491d8ee7SSantosh Puranik { 510*491d8ee7SSantosh Puranik return "Diags"; 511*491d8ee7SSantosh Puranik } 512*491d8ee7SSantosh Puranik else if (dbusMode == "xyz.openbmc_project.Control.Boot.Mode.Modes.Setup") 513*491d8ee7SSantosh Puranik { 514*491d8ee7SSantosh Puranik return "BiosSetup"; 515*491d8ee7SSantosh Puranik } 516*491d8ee7SSantosh Puranik else 517*491d8ee7SSantosh Puranik { 518*491d8ee7SSantosh Puranik return ""; 519*491d8ee7SSantosh Puranik } 520*491d8ee7SSantosh Puranik } 521*491d8ee7SSantosh Puranik 522*491d8ee7SSantosh Puranik /** 523*491d8ee7SSantosh Puranik * @brief Traslates boot source from Redfish to DBUS property value. 524*491d8ee7SSantosh Puranik * 525*491d8ee7SSantosh Puranik * @param[in] rfSource The boot source in Redfish. 526*491d8ee7SSantosh Puranik * 527*491d8ee7SSantosh Puranik * @return Returns as a string, the boot source as expected by DBUS. 528*491d8ee7SSantosh Puranik * If translation cannot be done, returns an empty string. 529*491d8ee7SSantosh Puranik */ 530*491d8ee7SSantosh Puranik static std::string rfToDbusBootSource(const std::string &rfSource) 531*491d8ee7SSantosh Puranik { 532*491d8ee7SSantosh Puranik if (rfSource == "None") 533*491d8ee7SSantosh Puranik { 534*491d8ee7SSantosh Puranik return "xyz.openbmc_project.Control.Boot.Source.Sources.Default"; 535*491d8ee7SSantosh Puranik } 536*491d8ee7SSantosh Puranik else if (rfSource == "Hdd") 537*491d8ee7SSantosh Puranik { 538*491d8ee7SSantosh Puranik return "xyz.openbmc_project.Control.Boot.Source.Sources.Disk"; 539*491d8ee7SSantosh Puranik } 540*491d8ee7SSantosh Puranik else if (rfSource == "Cd") 541*491d8ee7SSantosh Puranik { 542*491d8ee7SSantosh Puranik return "xyz.openbmc_project.Control.Boot.Source.Sources.ExternalMedia"; 543*491d8ee7SSantosh Puranik } 544*491d8ee7SSantosh Puranik else if (rfSource == "Pxe") 545*491d8ee7SSantosh Puranik { 546*491d8ee7SSantosh Puranik return "xyz.openbmc_project.Control.Boot.Source.Sources.Network"; 547*491d8ee7SSantosh Puranik } 548*491d8ee7SSantosh Puranik else 549*491d8ee7SSantosh Puranik { 550*491d8ee7SSantosh Puranik return ""; 551*491d8ee7SSantosh Puranik } 552*491d8ee7SSantosh Puranik } 553*491d8ee7SSantosh Puranik 554*491d8ee7SSantosh Puranik /** 555*491d8ee7SSantosh Puranik * @brief Traslates boot mode from Redfish to DBUS property value. 556*491d8ee7SSantosh Puranik * 557*491d8ee7SSantosh Puranik * @param[in] rfMode The boot mode in Redfish. 558*491d8ee7SSantosh Puranik * 559*491d8ee7SSantosh Puranik * @return Returns as a string, the boot mode as expected by DBUS. 560*491d8ee7SSantosh Puranik * If translation cannot be done, returns an empty string. 561*491d8ee7SSantosh Puranik */ 562*491d8ee7SSantosh Puranik static std::string rfToDbusBootMode(const std::string &rfMode) 563*491d8ee7SSantosh Puranik { 564*491d8ee7SSantosh Puranik if (rfMode == "None") 565*491d8ee7SSantosh Puranik { 566*491d8ee7SSantosh Puranik return "xyz.openbmc_project.Control.Boot.Mode.Modes.Regular"; 567*491d8ee7SSantosh Puranik } 568*491d8ee7SSantosh Puranik else if (rfMode == "Diags") 569*491d8ee7SSantosh Puranik { 570*491d8ee7SSantosh Puranik return "xyz.openbmc_project.Control.Boot.Mode.Modes.Safe"; 571*491d8ee7SSantosh Puranik } 572*491d8ee7SSantosh Puranik else if (rfMode == "BiosSetup") 573*491d8ee7SSantosh Puranik { 574*491d8ee7SSantosh Puranik return "xyz.openbmc_project.Control.Boot.Mode.Modes.Setup"; 575*491d8ee7SSantosh Puranik } 576*491d8ee7SSantosh Puranik else 577*491d8ee7SSantosh Puranik { 578*491d8ee7SSantosh Puranik return ""; 579*491d8ee7SSantosh Puranik } 580*491d8ee7SSantosh Puranik } 581*491d8ee7SSantosh Puranik 582*491d8ee7SSantosh Puranik /** 583*491d8ee7SSantosh Puranik * @brief Retrieves boot mode over DBUS and fills out the response 584*491d8ee7SSantosh Puranik * 585*491d8ee7SSantosh Puranik * @param[in] aResp Shared pointer for generating response message. 586*491d8ee7SSantosh Puranik * @param[in] bootDbusObj The dbus object to query for boot properties. 587*491d8ee7SSantosh Puranik * 588*491d8ee7SSantosh Puranik * @return None. 589*491d8ee7SSantosh Puranik */ 590*491d8ee7SSantosh Puranik static void getBootMode(std::shared_ptr<AsyncResp> aResp, 591*491d8ee7SSantosh Puranik std::string bootDbusObj) 592*491d8ee7SSantosh Puranik { 593*491d8ee7SSantosh Puranik crow::connections::systemBus->async_method_call( 594*491d8ee7SSantosh Puranik [aResp](const boost::system::error_code ec, 595*491d8ee7SSantosh Puranik const std::variant<std::string> &bootMode) { 596*491d8ee7SSantosh Puranik if (ec) 597*491d8ee7SSantosh Puranik { 598*491d8ee7SSantosh Puranik BMCWEB_LOG_DEBUG << "DBUS response error " << ec; 599*491d8ee7SSantosh Puranik messages::internalError(aResp->res); 600*491d8ee7SSantosh Puranik return; 601*491d8ee7SSantosh Puranik } 602*491d8ee7SSantosh Puranik 603*491d8ee7SSantosh Puranik const std::string *bootModeStr = 604*491d8ee7SSantosh Puranik std::get_if<std::string>(&bootMode); 605*491d8ee7SSantosh Puranik 606*491d8ee7SSantosh Puranik if (!bootModeStr) 607*491d8ee7SSantosh Puranik { 608*491d8ee7SSantosh Puranik messages::internalError(aResp->res); 609*491d8ee7SSantosh Puranik return; 610*491d8ee7SSantosh Puranik } 611*491d8ee7SSantosh Puranik 612*491d8ee7SSantosh Puranik BMCWEB_LOG_DEBUG << "Boot mode: " << *bootModeStr; 613*491d8ee7SSantosh Puranik 614*491d8ee7SSantosh Puranik // TODO (Santosh): Do we need to support override mode? 615*491d8ee7SSantosh Puranik aResp->res.jsonValue["Boot"]["BootSourceOverrideMode"] = "Legacy"; 616*491d8ee7SSantosh Puranik aResp->res.jsonValue["Boot"]["BootSourceOverrideTarget@Redfish." 617*491d8ee7SSantosh Puranik "AllowableValues"] = { 618*491d8ee7SSantosh Puranik "None", "Pxe", "Hdd", "Cd", "Diags", "BiosSetup"}; 619*491d8ee7SSantosh Puranik 620*491d8ee7SSantosh Puranik if (*bootModeStr != 621*491d8ee7SSantosh Puranik "xyz.openbmc_project.Control.Boot.Mode.Modes.Regular") 622*491d8ee7SSantosh Puranik { 623*491d8ee7SSantosh Puranik auto rfMode = dbusToRfBootMode(*bootModeStr); 624*491d8ee7SSantosh Puranik if (!rfMode.empty()) 625*491d8ee7SSantosh Puranik { 626*491d8ee7SSantosh Puranik aResp->res.jsonValue["Boot"]["BootSourceOverrideTarget"] = 627*491d8ee7SSantosh Puranik rfMode; 628*491d8ee7SSantosh Puranik } 629*491d8ee7SSantosh Puranik } 630*491d8ee7SSantosh Puranik 631*491d8ee7SSantosh Puranik // If the BootSourceOverrideTarget is still "None" at the end, 632*491d8ee7SSantosh Puranik // reset the BootSourceOverrideEnabled to indicate that 633*491d8ee7SSantosh Puranik // overrides are disabled 634*491d8ee7SSantosh Puranik if (aResp->res.jsonValue["Boot"]["BootSourceOverrideTarget"] == 635*491d8ee7SSantosh Puranik "None") 636*491d8ee7SSantosh Puranik { 637*491d8ee7SSantosh Puranik aResp->res.jsonValue["Boot"]["BootSourceOverrideEnabled"] = 638*491d8ee7SSantosh Puranik "Disabled"; 639*491d8ee7SSantosh Puranik } 640*491d8ee7SSantosh Puranik }, 641*491d8ee7SSantosh Puranik "xyz.openbmc_project.Settings", bootDbusObj, 642*491d8ee7SSantosh Puranik "org.freedesktop.DBus.Properties", "Get", 643*491d8ee7SSantosh Puranik "xyz.openbmc_project.Control.Boot.Mode", "BootMode"); 644*491d8ee7SSantosh Puranik } 645*491d8ee7SSantosh Puranik 646*491d8ee7SSantosh Puranik /** 647*491d8ee7SSantosh Puranik * @brief Retrieves boot source over DBUS 648*491d8ee7SSantosh Puranik * 649*491d8ee7SSantosh Puranik * @param[in] aResp Shared pointer for generating response message. 650*491d8ee7SSantosh Puranik * @param[in] oneTimeEnable Boolean to indicate boot properties are one-time. 651*491d8ee7SSantosh Puranik * 652*491d8ee7SSantosh Puranik * @return None. 653*491d8ee7SSantosh Puranik */ 654*491d8ee7SSantosh Puranik static void getBootSource(std::shared_ptr<AsyncResp> aResp, bool oneTimeEnabled) 655*491d8ee7SSantosh Puranik { 656*491d8ee7SSantosh Puranik std::string bootDbusObj = 657*491d8ee7SSantosh Puranik oneTimeEnabled ? "/xyz/openbmc_project/control/host0/boot/one_time" 658*491d8ee7SSantosh Puranik : "/xyz/openbmc_project/control/host0/boot"; 659*491d8ee7SSantosh Puranik 660*491d8ee7SSantosh Puranik BMCWEB_LOG_DEBUG << "Is one time: " << oneTimeEnabled; 661*491d8ee7SSantosh Puranik aResp->res.jsonValue["Boot"]["BootSourceOverrideEnabled"] = 662*491d8ee7SSantosh Puranik (oneTimeEnabled) ? "Once" : "Continuous"; 663*491d8ee7SSantosh Puranik 664*491d8ee7SSantosh Puranik crow::connections::systemBus->async_method_call( 665*491d8ee7SSantosh Puranik [aResp, bootDbusObj](const boost::system::error_code ec, 666*491d8ee7SSantosh Puranik const std::variant<std::string> &bootSource) { 667*491d8ee7SSantosh Puranik if (ec) 668*491d8ee7SSantosh Puranik { 669*491d8ee7SSantosh Puranik BMCWEB_LOG_DEBUG << "DBUS response error " << ec; 670*491d8ee7SSantosh Puranik messages::internalError(aResp->res); 671*491d8ee7SSantosh Puranik return; 672*491d8ee7SSantosh Puranik } 673*491d8ee7SSantosh Puranik 674*491d8ee7SSantosh Puranik const std::string *bootSourceStr = 675*491d8ee7SSantosh Puranik std::get_if<std::string>(&bootSource); 676*491d8ee7SSantosh Puranik 677*491d8ee7SSantosh Puranik if (!bootSourceStr) 678*491d8ee7SSantosh Puranik { 679*491d8ee7SSantosh Puranik messages::internalError(aResp->res); 680*491d8ee7SSantosh Puranik return; 681*491d8ee7SSantosh Puranik } 682*491d8ee7SSantosh Puranik BMCWEB_LOG_DEBUG << "Boot source: " << *bootSourceStr; 683*491d8ee7SSantosh Puranik 684*491d8ee7SSantosh Puranik auto rfSource = dbusToRfBootSource(*bootSourceStr); 685*491d8ee7SSantosh Puranik if (!rfSource.empty()) 686*491d8ee7SSantosh Puranik { 687*491d8ee7SSantosh Puranik aResp->res.jsonValue["Boot"]["BootSourceOverrideTarget"] = 688*491d8ee7SSantosh Puranik rfSource; 689*491d8ee7SSantosh Puranik } 690*491d8ee7SSantosh Puranik }, 691*491d8ee7SSantosh Puranik "xyz.openbmc_project.Settings", bootDbusObj, 692*491d8ee7SSantosh Puranik "org.freedesktop.DBus.Properties", "Get", 693*491d8ee7SSantosh Puranik "xyz.openbmc_project.Control.Boot.Source", "BootSource"); 694*491d8ee7SSantosh Puranik getBootMode(std::move(aResp), std::move(bootDbusObj)); 695*491d8ee7SSantosh Puranik } 696*491d8ee7SSantosh Puranik 697*491d8ee7SSantosh Puranik /** 698*491d8ee7SSantosh Puranik * @brief Retrieves "One time" enabled setting over DBUS and calls function to 699*491d8ee7SSantosh Puranik * get boot source and boot mode. 700*491d8ee7SSantosh Puranik * 701*491d8ee7SSantosh Puranik * @param[in] aResp Shared pointer for generating response message. 702*491d8ee7SSantosh Puranik * 703*491d8ee7SSantosh Puranik * @return None. 704*491d8ee7SSantosh Puranik */ 705*491d8ee7SSantosh Puranik static void getBootProperties(std::shared_ptr<AsyncResp> aResp) 706*491d8ee7SSantosh Puranik { 707*491d8ee7SSantosh Puranik BMCWEB_LOG_DEBUG << "Get boot information."; 708*491d8ee7SSantosh Puranik 709*491d8ee7SSantosh Puranik crow::connections::systemBus->async_method_call( 710*491d8ee7SSantosh Puranik [aResp{std::move(aResp)}]( 711*491d8ee7SSantosh Puranik const boost::system::error_code ec, 712*491d8ee7SSantosh Puranik const sdbusplus::message::variant<bool> &oneTime) { 713*491d8ee7SSantosh Puranik if (ec) 714*491d8ee7SSantosh Puranik { 715*491d8ee7SSantosh Puranik BMCWEB_LOG_DEBUG << "DBUS response error " << ec; 716*491d8ee7SSantosh Puranik messages::internalError(aResp->res); 717*491d8ee7SSantosh Puranik return; 718*491d8ee7SSantosh Puranik } 719*491d8ee7SSantosh Puranik 720*491d8ee7SSantosh Puranik const bool *oneTimePtr = std::get_if<bool>(&oneTime); 721*491d8ee7SSantosh Puranik 722*491d8ee7SSantosh Puranik if (!oneTimePtr) 723*491d8ee7SSantosh Puranik { 724*491d8ee7SSantosh Puranik messages::internalError(aResp->res); 725*491d8ee7SSantosh Puranik return; 726*491d8ee7SSantosh Puranik } 727*491d8ee7SSantosh Puranik getBootSource(aResp, *oneTimePtr); 728*491d8ee7SSantosh Puranik }, 729*491d8ee7SSantosh Puranik "xyz.openbmc_project.Settings", 730*491d8ee7SSantosh Puranik "/xyz/openbmc_project/control/host0/boot/one_time", 731*491d8ee7SSantosh Puranik "org.freedesktop.DBus.Properties", "Get", 732*491d8ee7SSantosh Puranik "xyz.openbmc_project.Object.Enable", "Enabled"); 733*491d8ee7SSantosh Puranik } 734*491d8ee7SSantosh Puranik 735*491d8ee7SSantosh Puranik /** 736*491d8ee7SSantosh Puranik * @brief Sets boot properties into DBUS object(s). 737*491d8ee7SSantosh Puranik * 738*491d8ee7SSantosh Puranik * @param[in] aResp Shared pointer for generating response message. 739*491d8ee7SSantosh Puranik * @param[in] oneTimeEnabled Is "one-time" setting already enabled. 740*491d8ee7SSantosh Puranik * @param[in] bootSource The boot source to set. 741*491d8ee7SSantosh Puranik * @param[in] bootEnable The source override "enable" to set. 742*491d8ee7SSantosh Puranik * 743*491d8ee7SSantosh Puranik * @return None. 744*491d8ee7SSantosh Puranik */ 745*491d8ee7SSantosh Puranik static void setBootModeOrSource(std::shared_ptr<AsyncResp> aResp, 746*491d8ee7SSantosh Puranik bool oneTimeEnabled, 747*491d8ee7SSantosh Puranik std::optional<std::string> bootSource, 748*491d8ee7SSantosh Puranik std::optional<std::string> bootEnable) 749*491d8ee7SSantosh Puranik { 750*491d8ee7SSantosh Puranik if (bootEnable && (bootEnable != "Once") && (bootEnable != "Continuous") && 751*491d8ee7SSantosh Puranik (bootEnable != "Disabled")) 752*491d8ee7SSantosh Puranik { 753*491d8ee7SSantosh Puranik BMCWEB_LOG_DEBUG << "Unsupported value for BootSourceOverrideEnabled: " 754*491d8ee7SSantosh Puranik << *bootEnable; 755*491d8ee7SSantosh Puranik messages::propertyValueNotInList(aResp->res, *bootEnable, 756*491d8ee7SSantosh Puranik "BootSourceOverrideEnabled"); 757*491d8ee7SSantosh Puranik return; 758*491d8ee7SSantosh Puranik } 759*491d8ee7SSantosh Puranik 760*491d8ee7SSantosh Puranik bool oneTimeSetting = oneTimeEnabled; 761*491d8ee7SSantosh Puranik // Validate incoming parameters 762*491d8ee7SSantosh Puranik if (bootEnable) 763*491d8ee7SSantosh Puranik { 764*491d8ee7SSantosh Puranik if (*bootEnable == "Once") 765*491d8ee7SSantosh Puranik { 766*491d8ee7SSantosh Puranik oneTimeSetting = true; 767*491d8ee7SSantosh Puranik } 768*491d8ee7SSantosh Puranik else if (*bootEnable == "Continuous") 769*491d8ee7SSantosh Puranik { 770*491d8ee7SSantosh Puranik oneTimeSetting = false; 771*491d8ee7SSantosh Puranik } 772*491d8ee7SSantosh Puranik else if (*bootEnable == "Disabled") 773*491d8ee7SSantosh Puranik { 774*491d8ee7SSantosh Puranik oneTimeSetting = false; 775*491d8ee7SSantosh Puranik } 776*491d8ee7SSantosh Puranik else 777*491d8ee7SSantosh Puranik { 778*491d8ee7SSantosh Puranik 779*491d8ee7SSantosh Puranik BMCWEB_LOG_DEBUG << "Unsupported value for " 780*491d8ee7SSantosh Puranik "BootSourceOverrideEnabled: " 781*491d8ee7SSantosh Puranik << *bootEnable; 782*491d8ee7SSantosh Puranik messages::propertyValueNotInList(aResp->res, *bootEnable, 783*491d8ee7SSantosh Puranik "BootSourceOverrideEnabled"); 784*491d8ee7SSantosh Puranik return; 785*491d8ee7SSantosh Puranik } 786*491d8ee7SSantosh Puranik } 787*491d8ee7SSantosh Puranik std::string bootSourceStr; 788*491d8ee7SSantosh Puranik std::string bootModeStr; 789*491d8ee7SSantosh Puranik if (bootSource) 790*491d8ee7SSantosh Puranik { 791*491d8ee7SSantosh Puranik bootSourceStr = rfToDbusBootSource(*bootSource); 792*491d8ee7SSantosh Puranik bootModeStr = rfToDbusBootMode(*bootSource); 793*491d8ee7SSantosh Puranik 794*491d8ee7SSantosh Puranik BMCWEB_LOG_DEBUG << "DBUS boot source: " << bootSourceStr; 795*491d8ee7SSantosh Puranik BMCWEB_LOG_DEBUG << "DBUS boot mode: " << bootModeStr; 796*491d8ee7SSantosh Puranik 797*491d8ee7SSantosh Puranik if (bootSourceStr.empty() && bootModeStr.empty()) 798*491d8ee7SSantosh Puranik { 799*491d8ee7SSantosh Puranik BMCWEB_LOG_DEBUG << "Invalid property value for " 800*491d8ee7SSantosh Puranik "BootSourceOverrideTarget: " 801*491d8ee7SSantosh Puranik << *bootSource; 802*491d8ee7SSantosh Puranik messages::propertyValueNotInList(aResp->res, *bootSource, 803*491d8ee7SSantosh Puranik "BootSourceTargetOverride"); 804*491d8ee7SSantosh Puranik return; 805*491d8ee7SSantosh Puranik } 806*491d8ee7SSantosh Puranik } 807*491d8ee7SSantosh Puranik const char *bootObj = 808*491d8ee7SSantosh Puranik oneTimeSetting ? "/xyz/openbmc_project/control/host0/boot/one_time" 809*491d8ee7SSantosh Puranik : "/xyz/openbmc_project/control/host0/boot"; 810*491d8ee7SSantosh Puranik // Figure out what properties to set 811*491d8ee7SSantosh Puranik if (bootEnable && (*bootEnable == "Disabled")) 812*491d8ee7SSantosh Puranik { 813*491d8ee7SSantosh Puranik BMCWEB_LOG_DEBUG << "Boot source override will be disabled"; 814*491d8ee7SSantosh Puranik // Request to only turn OFF/ON enabled, if turning enabled OFF, need 815*491d8ee7SSantosh Puranik // to reset the source and mode too. If turning it ON, we only need 816*491d8ee7SSantosh Puranik // to set the enabled property 817*491d8ee7SSantosh Puranik bootSourceStr = 818*491d8ee7SSantosh Puranik "xyz.openbmc_project.Control.Boot.Source.Sources.Default"; 819*491d8ee7SSantosh Puranik bootModeStr = "xyz.openbmc_project.Control.Boot.Mode.Modes.Regular"; 820*491d8ee7SSantosh Puranik } 821*491d8ee7SSantosh Puranik else if (bootSource) 822*491d8ee7SSantosh Puranik { 823*491d8ee7SSantosh Puranik // Source target specified 824*491d8ee7SSantosh Puranik BMCWEB_LOG_DEBUG << "Boot source: " << *bootSource; 825*491d8ee7SSantosh Puranik // Figure out which DBUS interface and property to use 826*491d8ee7SSantosh Puranik bootSourceStr = rfToDbusBootSource(*bootSource); 827*491d8ee7SSantosh Puranik bootModeStr = rfToDbusBootMode(*bootSource); 828*491d8ee7SSantosh Puranik 829*491d8ee7SSantosh Puranik BMCWEB_LOG_DEBUG << "DBUS boot source: " << bootSourceStr; 830*491d8ee7SSantosh Puranik BMCWEB_LOG_DEBUG << "DBUS boot mode: " << bootModeStr; 831*491d8ee7SSantosh Puranik 832*491d8ee7SSantosh Puranik if (bootSourceStr.empty() && bootModeStr.empty()) 833*491d8ee7SSantosh Puranik { 834*491d8ee7SSantosh Puranik BMCWEB_LOG_DEBUG << "Invalid property value for " 835*491d8ee7SSantosh Puranik "BootSourceOverrideTarget: " 836*491d8ee7SSantosh Puranik << *bootSource; 837*491d8ee7SSantosh Puranik messages::propertyValueNotInList(aResp->res, *bootSource, 838*491d8ee7SSantosh Puranik "BootSourceTargetOverride"); 839*491d8ee7SSantosh Puranik return; 840*491d8ee7SSantosh Puranik } 841*491d8ee7SSantosh Puranik 842*491d8ee7SSantosh Puranik if (!bootSourceStr.empty()) 843*491d8ee7SSantosh Puranik { 844*491d8ee7SSantosh Puranik // If setting to anything other than default, also reset boot 845*491d8ee7SSantosh Puranik // mode property 846*491d8ee7SSantosh Puranik if (bootSourceStr != 847*491d8ee7SSantosh Puranik "xyz.openbmc_project.Control.Boot.Source.Sources.Default") 848*491d8ee7SSantosh Puranik { 849*491d8ee7SSantosh Puranik bootModeStr = 850*491d8ee7SSantosh Puranik "xyz.openbmc_project.Control.Boot.Mode.Modes.Regular"; 851*491d8ee7SSantosh Puranik } 852*491d8ee7SSantosh Puranik } 853*491d8ee7SSantosh Puranik else // if (!bootModeStr.empty()) 854*491d8ee7SSantosh Puranik { 855*491d8ee7SSantosh Puranik // If setting to anything other than default, also reset boot 856*491d8ee7SSantosh Puranik // source property 857*491d8ee7SSantosh Puranik if (bootModeStr != 858*491d8ee7SSantosh Puranik "xyz.openbmc_project.Control.Boot.Mode.Modes.Regular") 859*491d8ee7SSantosh Puranik { 860*491d8ee7SSantosh Puranik bootSourceStr = 861*491d8ee7SSantosh Puranik "xyz.openbmc_project.Control.Boot.Source.Sources.Default"; 862*491d8ee7SSantosh Puranik } 863*491d8ee7SSantosh Puranik } 864*491d8ee7SSantosh Puranik } 865*491d8ee7SSantosh Puranik if (!bootSourceStr.empty()) 866*491d8ee7SSantosh Puranik { 867*491d8ee7SSantosh Puranik crow::connections::systemBus->async_method_call( 868*491d8ee7SSantosh Puranik [aResp](const boost::system::error_code ec) { 869*491d8ee7SSantosh Puranik if (ec) 870*491d8ee7SSantosh Puranik { 871*491d8ee7SSantosh Puranik BMCWEB_LOG_DEBUG << "DBUS response error " << ec; 872*491d8ee7SSantosh Puranik messages::internalError(aResp->res); 873*491d8ee7SSantosh Puranik return; 874*491d8ee7SSantosh Puranik } 875*491d8ee7SSantosh Puranik BMCWEB_LOG_DEBUG << "Boot source update done."; 876*491d8ee7SSantosh Puranik }, 877*491d8ee7SSantosh Puranik "xyz.openbmc_project.Settings", bootObj, 878*491d8ee7SSantosh Puranik "org.freedesktop.DBus.Properties", "Set", 879*491d8ee7SSantosh Puranik "xyz.openbmc_project.Control.Boot.Source", "BootSource", 880*491d8ee7SSantosh Puranik std::variant<std::string>(bootSourceStr)); 881*491d8ee7SSantosh Puranik } 882*491d8ee7SSantosh Puranik if (!bootModeStr.empty()) 883*491d8ee7SSantosh Puranik { 884*491d8ee7SSantosh Puranik crow::connections::systemBus->async_method_call( 885*491d8ee7SSantosh Puranik [aResp](const boost::system::error_code ec) { 886*491d8ee7SSantosh Puranik if (ec) 887*491d8ee7SSantosh Puranik { 888*491d8ee7SSantosh Puranik BMCWEB_LOG_DEBUG << "DBUS response error " << ec; 889*491d8ee7SSantosh Puranik messages::internalError(aResp->res); 890*491d8ee7SSantosh Puranik return; 891*491d8ee7SSantosh Puranik } 892*491d8ee7SSantosh Puranik BMCWEB_LOG_DEBUG << "Boot mode update done."; 893*491d8ee7SSantosh Puranik }, 894*491d8ee7SSantosh Puranik "xyz.openbmc_project.Settings", bootObj, 895*491d8ee7SSantosh Puranik "org.freedesktop.DBus.Properties", "Set", 896*491d8ee7SSantosh Puranik "xyz.openbmc_project.Control.Boot.Mode", "BootMode", 897*491d8ee7SSantosh Puranik std::variant<std::string>(bootModeStr)); 898*491d8ee7SSantosh Puranik } 899*491d8ee7SSantosh Puranik crow::connections::systemBus->async_method_call( 900*491d8ee7SSantosh Puranik [aResp{std::move(aResp)}](const boost::system::error_code ec) { 901*491d8ee7SSantosh Puranik if (ec) 902*491d8ee7SSantosh Puranik { 903*491d8ee7SSantosh Puranik BMCWEB_LOG_DEBUG << "DBUS response error " << ec; 904*491d8ee7SSantosh Puranik messages::internalError(aResp->res); 905*491d8ee7SSantosh Puranik return; 906*491d8ee7SSantosh Puranik } 907*491d8ee7SSantosh Puranik BMCWEB_LOG_DEBUG << "Boot enable update done."; 908*491d8ee7SSantosh Puranik }, 909*491d8ee7SSantosh Puranik "xyz.openbmc_project.Settings", 910*491d8ee7SSantosh Puranik "/xyz/openbmc_project/control/host0/boot/one_time", 911*491d8ee7SSantosh Puranik "org.freedesktop.DBus.Properties", "Set", 912*491d8ee7SSantosh Puranik "xyz.openbmc_project.Object.Enable", "Enabled", 913*491d8ee7SSantosh Puranik std::variant<bool>(oneTimeSetting)); 914*491d8ee7SSantosh Puranik } 915*491d8ee7SSantosh Puranik 916*491d8ee7SSantosh Puranik /** 917*491d8ee7SSantosh Puranik * @brief Retrieves "One time" enabled setting over DBUS and calls function to 918*491d8ee7SSantosh Puranik * set boot source/boot mode properties. 919*491d8ee7SSantosh Puranik * 920*491d8ee7SSantosh Puranik * @param[in] aResp Shared pointer for generating response message. 921*491d8ee7SSantosh Puranik * @param[in] bootSource The boot source from incoming RF request. 922*491d8ee7SSantosh Puranik * @param[in] bootEnable The boot override enable from incoming RF request. 923*491d8ee7SSantosh Puranik * 924*491d8ee7SSantosh Puranik * @return None. 925*491d8ee7SSantosh Puranik */ 926*491d8ee7SSantosh Puranik static void setBootProperties(std::shared_ptr<AsyncResp> aResp, 927*491d8ee7SSantosh Puranik std::optional<std::string> bootSource, 928*491d8ee7SSantosh Puranik std::optional<std::string> bootEnable) 929*491d8ee7SSantosh Puranik { 930*491d8ee7SSantosh Puranik BMCWEB_LOG_DEBUG << "Set boot information."; 931*491d8ee7SSantosh Puranik 932*491d8ee7SSantosh Puranik crow::connections::systemBus->async_method_call( 933*491d8ee7SSantosh Puranik [aResp{std::move(aResp)}, bootSource{std::move(bootSource)}, 934*491d8ee7SSantosh Puranik bootEnable{std::move(bootEnable)}]( 935*491d8ee7SSantosh Puranik const boost::system::error_code ec, 936*491d8ee7SSantosh Puranik const sdbusplus::message::variant<bool> &oneTime) { 937*491d8ee7SSantosh Puranik if (ec) 938*491d8ee7SSantosh Puranik { 939*491d8ee7SSantosh Puranik BMCWEB_LOG_DEBUG << "DBUS response error " << ec; 940*491d8ee7SSantosh Puranik messages::internalError(aResp->res); 941*491d8ee7SSantosh Puranik return; 942*491d8ee7SSantosh Puranik } 943*491d8ee7SSantosh Puranik 944*491d8ee7SSantosh Puranik const bool *oneTimePtr = std::get_if<bool>(&oneTime); 945*491d8ee7SSantosh Puranik 946*491d8ee7SSantosh Puranik if (!oneTimePtr) 947*491d8ee7SSantosh Puranik { 948*491d8ee7SSantosh Puranik messages::internalError(aResp->res); 949*491d8ee7SSantosh Puranik return; 950*491d8ee7SSantosh Puranik } 951*491d8ee7SSantosh Puranik 952*491d8ee7SSantosh Puranik BMCWEB_LOG_DEBUG << "Got one time: " << *oneTimePtr; 953*491d8ee7SSantosh Puranik 954*491d8ee7SSantosh Puranik setBootModeOrSource(aResp, *oneTimePtr, std::move(bootSource), 955*491d8ee7SSantosh Puranik std::move(bootEnable)); 956*491d8ee7SSantosh Puranik }, 957*491d8ee7SSantosh Puranik "xyz.openbmc_project.Settings", 958*491d8ee7SSantosh Puranik "/xyz/openbmc_project/control/host0/boot/one_time", 959*491d8ee7SSantosh Puranik "org.freedesktop.DBus.Properties", "Get", 960*491d8ee7SSantosh Puranik "xyz.openbmc_project.Object.Enable", "Enabled"); 961*491d8ee7SSantosh Puranik } 962*491d8ee7SSantosh Puranik 963*491d8ee7SSantosh Puranik /** 964c5b2abe0SLewanczyk, Dawid * SystemsCollection derived class for delivering ComputerSystems Collection 965c5b2abe0SLewanczyk, Dawid * Schema 966c5b2abe0SLewanczyk, Dawid */ 9671abe55efSEd Tanous class SystemsCollection : public Node 9681abe55efSEd Tanous { 969c5b2abe0SLewanczyk, Dawid public: 9701abe55efSEd Tanous SystemsCollection(CrowApp &app) : Node(app, "/redfish/v1/Systems/") 9711abe55efSEd Tanous { 972c5b2abe0SLewanczyk, Dawid entityPrivileges = { 973c5b2abe0SLewanczyk, Dawid {boost::beast::http::verb::get, {{"Login"}}}, 974c5b2abe0SLewanczyk, Dawid {boost::beast::http::verb::head, {{"Login"}}}, 975c5b2abe0SLewanczyk, Dawid {boost::beast::http::verb::patch, {{"ConfigureComponents"}}}, 976c5b2abe0SLewanczyk, Dawid {boost::beast::http::verb::put, {{"ConfigureComponents"}}}, 977c5b2abe0SLewanczyk, Dawid {boost::beast::http::verb::delete_, {{"ConfigureComponents"}}}, 978c5b2abe0SLewanczyk, Dawid {boost::beast::http::verb::post, {{"ConfigureComponents"}}}}; 979c5b2abe0SLewanczyk, Dawid } 980c5b2abe0SLewanczyk, Dawid 981c5b2abe0SLewanczyk, Dawid private: 98255c7b7a2SEd Tanous void doGet(crow::Response &res, const crow::Request &req, 9831abe55efSEd Tanous const std::vector<std::string> ¶ms) override 9841abe55efSEd Tanous { 9850f74e643SEd Tanous res.jsonValue["@odata.type"] = 9860f74e643SEd Tanous "#ComputerSystemCollection.ComputerSystemCollection"; 9870f74e643SEd Tanous res.jsonValue["@odata.id"] = "/redfish/v1/Systems"; 9880f74e643SEd Tanous res.jsonValue["@odata.context"] = 9890f74e643SEd Tanous "/redfish/v1/" 9900f74e643SEd Tanous "$metadata#ComputerSystemCollection.ComputerSystemCollection"; 9910f74e643SEd Tanous res.jsonValue["Name"] = "Computer System Collection"; 992029573d4SEd Tanous res.jsonValue["Members"] = { 993029573d4SEd Tanous {{"@odata.id", "/redfish/v1/Systems/system"}}}; 994029573d4SEd Tanous res.jsonValue["Members@odata.count"] = 1; 995029573d4SEd Tanous res.end(); 996c5b2abe0SLewanczyk, Dawid } 997c5b2abe0SLewanczyk, Dawid }; 998c5b2abe0SLewanczyk, Dawid 999c5b2abe0SLewanczyk, Dawid /** 1000cc340dd9SEd Tanous * SystemActionsReset class supports handle POST method for Reset action. 1001cc340dd9SEd Tanous * The class retrieves and sends data directly to D-Bus. 1002cc340dd9SEd Tanous */ 1003cc340dd9SEd Tanous class SystemActionsReset : public Node 1004cc340dd9SEd Tanous { 1005cc340dd9SEd Tanous public: 1006cc340dd9SEd Tanous SystemActionsReset(CrowApp &app) : 1007029573d4SEd Tanous Node(app, "/redfish/v1/Systems/system/Actions/ComputerSystem.Reset/") 1008cc340dd9SEd Tanous { 1009cc340dd9SEd Tanous entityPrivileges = { 1010cc340dd9SEd Tanous {boost::beast::http::verb::post, {{"ConfigureComponents"}}}}; 1011cc340dd9SEd Tanous } 1012cc340dd9SEd Tanous 1013cc340dd9SEd Tanous private: 1014cc340dd9SEd Tanous /** 1015cc340dd9SEd Tanous * Function handles POST method request. 1016cc340dd9SEd Tanous * Analyzes POST body message before sends Reset request data to D-Bus. 1017cc340dd9SEd Tanous */ 1018cc340dd9SEd Tanous void doPost(crow::Response &res, const crow::Request &req, 1019cc340dd9SEd Tanous const std::vector<std::string> ¶ms) override 1020cc340dd9SEd Tanous { 1021cc340dd9SEd Tanous auto asyncResp = std::make_shared<AsyncResp>(res); 1022cc340dd9SEd Tanous 10239712f8acSEd Tanous std::string resetType; 10249712f8acSEd Tanous if (!json_util::readJson(req, res, "ResetType", resetType)) 1025cc340dd9SEd Tanous { 1026cc340dd9SEd Tanous return; 1027cc340dd9SEd Tanous } 1028cc340dd9SEd Tanous 10299712f8acSEd Tanous if (resetType == "ForceOff") 1030cc340dd9SEd Tanous { 1031cc340dd9SEd Tanous // Force off acts on the chassis 1032cc340dd9SEd Tanous crow::connections::systemBus->async_method_call( 1033cc340dd9SEd Tanous [asyncResp](const boost::system::error_code ec) { 1034cc340dd9SEd Tanous if (ec) 1035cc340dd9SEd Tanous { 10369712f8acSEd Tanous BMCWEB_LOG_ERROR << "D-Bus responses error: " << ec; 1037f12894f8SJason M. Bills messages::internalError(asyncResp->res); 1038cc340dd9SEd Tanous return; 1039cc340dd9SEd Tanous } 1040cc340dd9SEd Tanous // TODO Consider support polling mechanism to verify 1041cc340dd9SEd Tanous // status of host and chassis after execute the 1042cc340dd9SEd Tanous // requested action. 1043f12894f8SJason M. Bills messages::success(asyncResp->res); 1044cc340dd9SEd Tanous }, 1045cc340dd9SEd Tanous "xyz.openbmc_project.State.Chassis", 1046cc340dd9SEd Tanous "/xyz/openbmc_project/state/chassis0", 1047cc340dd9SEd Tanous "org.freedesktop.DBus.Properties", "Set", 10489712f8acSEd Tanous "xyz.openbmc_project.State.Chassis", "RequestedPowerTransition", 1049abf2add6SEd Tanous std::variant<std::string>{ 10509712f8acSEd Tanous "xyz.openbmc_project.State.Chassis.Transition.Off"}); 1051cc340dd9SEd Tanous return; 1052cc340dd9SEd Tanous } 1053cc340dd9SEd Tanous // all other actions operate on the host 1054cc340dd9SEd Tanous std::string command; 1055cc340dd9SEd Tanous // Execute Reset Action regarding to each reset type. 10569712f8acSEd Tanous if (resetType == "On") 1057cc340dd9SEd Tanous { 1058cc340dd9SEd Tanous command = "xyz.openbmc_project.State.Host.Transition.On"; 1059cc340dd9SEd Tanous } 10609712f8acSEd Tanous else if (resetType == "GracefulShutdown") 1061cc340dd9SEd Tanous { 1062cc340dd9SEd Tanous command = "xyz.openbmc_project.State.Host.Transition.Off"; 1063cc340dd9SEd Tanous } 10649712f8acSEd Tanous else if (resetType == "GracefulRestart") 1065cc340dd9SEd Tanous { 10669712f8acSEd Tanous command = "xyz.openbmc_project.State.Host.Transition.Reboot"; 1067cc340dd9SEd Tanous } 1068cc340dd9SEd Tanous else 1069cc340dd9SEd Tanous { 1070f12894f8SJason M. Bills messages::actionParameterUnknown(res, "Reset", resetType); 1071cc340dd9SEd Tanous return; 1072cc340dd9SEd Tanous } 1073cc340dd9SEd Tanous 1074cc340dd9SEd Tanous crow::connections::systemBus->async_method_call( 1075cc340dd9SEd Tanous [asyncResp](const boost::system::error_code ec) { 1076cc340dd9SEd Tanous if (ec) 1077cc340dd9SEd Tanous { 1078cc340dd9SEd Tanous BMCWEB_LOG_ERROR << "D-Bus responses error: " << ec; 1079f12894f8SJason M. Bills messages::internalError(asyncResp->res); 1080cc340dd9SEd Tanous return; 1081cc340dd9SEd Tanous } 1082cc340dd9SEd Tanous // TODO Consider support polling mechanism to verify 1083cc340dd9SEd Tanous // status of host and chassis after execute the 1084cc340dd9SEd Tanous // requested action. 1085f12894f8SJason M. Bills messages::success(asyncResp->res); 1086cc340dd9SEd Tanous }, 1087cc340dd9SEd Tanous "xyz.openbmc_project.State.Host", 1088cc340dd9SEd Tanous "/xyz/openbmc_project/state/host0", 1089cc340dd9SEd Tanous "org.freedesktop.DBus.Properties", "Set", 10909712f8acSEd Tanous "xyz.openbmc_project.State.Host", "RequestedHostTransition", 1091abf2add6SEd Tanous std::variant<std::string>{command}); 1092cc340dd9SEd Tanous } 1093cc340dd9SEd Tanous }; 1094cc340dd9SEd Tanous 1095cc340dd9SEd Tanous /** 10966617338dSEd Tanous * Systems derived class for delivering Computer Systems Schema. 1097c5b2abe0SLewanczyk, Dawid */ 10981abe55efSEd Tanous class Systems : public Node 10991abe55efSEd Tanous { 1100c5b2abe0SLewanczyk, Dawid public: 1101c5b2abe0SLewanczyk, Dawid /* 1102c5b2abe0SLewanczyk, Dawid * Default Constructor 1103c5b2abe0SLewanczyk, Dawid */ 1104029573d4SEd Tanous Systems(CrowApp &app) : Node(app, "/redfish/v1/Systems/system/") 11051abe55efSEd Tanous { 1106c5b2abe0SLewanczyk, Dawid entityPrivileges = { 1107c5b2abe0SLewanczyk, Dawid {boost::beast::http::verb::get, {{"Login"}}}, 1108c5b2abe0SLewanczyk, Dawid {boost::beast::http::verb::head, {{"Login"}}}, 1109c5b2abe0SLewanczyk, Dawid {boost::beast::http::verb::patch, {{"ConfigureComponents"}}}, 1110c5b2abe0SLewanczyk, Dawid {boost::beast::http::verb::put, {{"ConfigureComponents"}}}, 1111c5b2abe0SLewanczyk, Dawid {boost::beast::http::verb::delete_, {{"ConfigureComponents"}}}, 1112c5b2abe0SLewanczyk, Dawid {boost::beast::http::verb::post, {{"ConfigureComponents"}}}}; 1113c5b2abe0SLewanczyk, Dawid } 1114c5b2abe0SLewanczyk, Dawid 1115c5b2abe0SLewanczyk, Dawid private: 1116c5b2abe0SLewanczyk, Dawid /** 1117c5b2abe0SLewanczyk, Dawid * Functions triggers appropriate requests on DBus 1118c5b2abe0SLewanczyk, Dawid */ 111955c7b7a2SEd Tanous void doGet(crow::Response &res, const crow::Request &req, 11201abe55efSEd Tanous const std::vector<std::string> ¶ms) override 11211abe55efSEd Tanous { 1122*491d8ee7SSantosh Puranik res.jsonValue["@odata.type"] = "#ComputerSystem.v1_6_0.ComputerSystem"; 11230f74e643SEd Tanous res.jsonValue["@odata.context"] = 11240f74e643SEd Tanous "/redfish/v1/$metadata#ComputerSystem.ComputerSystem"; 1125029573d4SEd Tanous res.jsonValue["Name"] = "Computer System"; 1126029573d4SEd Tanous res.jsonValue["Id"] = "system"; 11270f74e643SEd Tanous res.jsonValue["SystemType"] = "Physical"; 11280f74e643SEd Tanous res.jsonValue["Description"] = "Computer System"; 11290f74e643SEd Tanous res.jsonValue["ProcessorSummary"]["Count"] = 0; 11300f74e643SEd Tanous res.jsonValue["ProcessorSummary"]["Status"]["State"] = "Disabled"; 11310f74e643SEd Tanous res.jsonValue["MemorySummary"]["TotalSystemMemoryGiB"] = int(0); 11320f74e643SEd Tanous res.jsonValue["MemorySummary"]["Status"]["State"] = "Disabled"; 1133029573d4SEd Tanous res.jsonValue["@odata.id"] = "/redfish/v1/Systems/system"; 113404a258f4SEd Tanous 1135443c2934SRapkiewicz, Pawel res.jsonValue["Processors"] = { 1136029573d4SEd Tanous {"@odata.id", "/redfish/v1/Systems/system/Processors"}}; 1137443c2934SRapkiewicz, Pawel res.jsonValue["Memory"] = { 1138029573d4SEd Tanous {"@odata.id", "/redfish/v1/Systems/system/Memory"}}; 1139029573d4SEd Tanous 1140cc340dd9SEd Tanous // TODO Need to support ForceRestart. 1141cc340dd9SEd Tanous res.jsonValue["Actions"]["#ComputerSystem.Reset"] = { 1142cc340dd9SEd Tanous {"target", 1143029573d4SEd Tanous "/redfish/v1/Systems/system/Actions/ComputerSystem.Reset"}, 1144cc340dd9SEd Tanous {"ResetType@Redfish.AllowableValues", 1145cc340dd9SEd Tanous {"On", "ForceOff", "GracefulRestart", "GracefulShutdown"}}}; 1146c5b2abe0SLewanczyk, Dawid 1147c4bf6374SJason M. Bills res.jsonValue["LogServices"] = { 1148029573d4SEd Tanous {"@odata.id", "/redfish/v1/Systems/system/LogServices"}}; 1149c4bf6374SJason M. Bills 1150a0803efaSEd Tanous auto asyncResp = std::make_shared<AsyncResp>(res); 1151c5b2abe0SLewanczyk, Dawid 11526c34de48SEd Tanous getLedGroupIdentify( 1153a0803efaSEd Tanous asyncResp, 1154a0803efaSEd Tanous [&](const bool &asserted, const std::shared_ptr<AsyncResp> &aResp) { 11551abe55efSEd Tanous if (asserted) 11561abe55efSEd Tanous { 1157c5b2abe0SLewanczyk, Dawid // If led group is asserted, then another call is needed to 1158c5b2abe0SLewanczyk, Dawid // get led status 11596c34de48SEd Tanous getLedIdentify( 1160a0803efaSEd Tanous aResp, [](const std::string &ledStatus, 1161a0803efaSEd Tanous const std::shared_ptr<AsyncResp> &aResp) { 11621abe55efSEd Tanous if (!ledStatus.empty()) 11631abe55efSEd Tanous { 11641abe55efSEd Tanous aResp->res.jsonValue["IndicatorLED"] = 11651abe55efSEd Tanous ledStatus; 1166c5b2abe0SLewanczyk, Dawid } 1167c5b2abe0SLewanczyk, Dawid }); 11681abe55efSEd Tanous } 11691abe55efSEd Tanous else 11701abe55efSEd Tanous { 117155c7b7a2SEd Tanous aResp->res.jsonValue["IndicatorLED"] = "Off"; 1172c5b2abe0SLewanczyk, Dawid } 1173c5b2abe0SLewanczyk, Dawid }); 1174029573d4SEd Tanous getComputerSystem(asyncResp); 11756c34de48SEd Tanous getHostState(asyncResp); 1176*491d8ee7SSantosh Puranik getBootProperties(asyncResp); 1177c5b2abe0SLewanczyk, Dawid } 1178c5b2abe0SLewanczyk, Dawid 117955c7b7a2SEd Tanous void doPatch(crow::Response &res, const crow::Request &req, 11801abe55efSEd Tanous const std::vector<std::string> ¶ms) override 11811abe55efSEd Tanous { 1182cde19e5fSSantosh Puranik std::optional<std::string> indicatorLed; 1183*491d8ee7SSantosh Puranik std::optional<nlohmann::json> bootProps; 1184*491d8ee7SSantosh Puranik if (!json_util::readJson(req, res, "IndicatorLED", indicatorLed, "Boot", 1185*491d8ee7SSantosh Puranik bootProps)) 11866617338dSEd Tanous { 11876617338dSEd Tanous return; 11886617338dSEd Tanous } 1189*491d8ee7SSantosh Puranik 1190029573d4SEd Tanous auto asyncResp = std::make_shared<AsyncResp>(res); 1191029573d4SEd Tanous messages::success(asyncResp->res); 1192*491d8ee7SSantosh Puranik 1193*491d8ee7SSantosh Puranik if (bootProps) 1194*491d8ee7SSantosh Puranik { 1195*491d8ee7SSantosh Puranik std::optional<std::string> bootSource; 1196*491d8ee7SSantosh Puranik std::optional<std::string> bootEnable; 1197*491d8ee7SSantosh Puranik 1198*491d8ee7SSantosh Puranik if (!json_util::readJson(*bootProps, asyncResp->res, 1199*491d8ee7SSantosh Puranik "BootSourceOverrideTarget", bootSource, 1200*491d8ee7SSantosh Puranik "BootSourceOverrideEnabled", bootEnable)) 1201*491d8ee7SSantosh Puranik { 1202*491d8ee7SSantosh Puranik return; 1203*491d8ee7SSantosh Puranik } 1204*491d8ee7SSantosh Puranik setBootProperties(asyncResp, std::move(bootSource), 1205*491d8ee7SSantosh Puranik std::move(bootEnable)); 1206*491d8ee7SSantosh Puranik } 12079712f8acSEd Tanous if (indicatorLed) 12086617338dSEd Tanous { 12099712f8acSEd Tanous std::string dbusLedState; 12109712f8acSEd Tanous if (*indicatorLed == "On") 12119712f8acSEd Tanous { 12129712f8acSEd Tanous dbusLedState = "xyz.openbmc_project.Led.Physical.Action.Lit"; 12136617338dSEd Tanous } 12149712f8acSEd Tanous else if (*indicatorLed == "Blink") 12156617338dSEd Tanous { 12166617338dSEd Tanous dbusLedState = 12176617338dSEd Tanous "xyz.openbmc_project.Led.Physical.Action.Blinking"; 12186617338dSEd Tanous } 12199712f8acSEd Tanous else if (*indicatorLed == "Off") 12206617338dSEd Tanous { 12219712f8acSEd Tanous dbusLedState = "xyz.openbmc_project.Led.Physical.Action.Off"; 12226617338dSEd Tanous } 12236617338dSEd Tanous else 12246617338dSEd Tanous { 1225a08b46ccSJason M. Bills messages::propertyValueNotInList(res, *indicatorLed, 1226a08b46ccSJason M. Bills "IndicatorLED"); 12276617338dSEd Tanous return; 12286617338dSEd Tanous } 12296617338dSEd Tanous 12306c34de48SEd Tanous getHostState(asyncResp); 1231029573d4SEd Tanous getComputerSystem(asyncResp); 1232c5b2abe0SLewanczyk, Dawid 1233c5b2abe0SLewanczyk, Dawid // Update led group 123455c7b7a2SEd Tanous BMCWEB_LOG_DEBUG << "Update led group."; 123555c7b7a2SEd Tanous crow::connections::systemBus->async_method_call( 1236cde19e5fSSantosh Puranik [asyncResp](const boost::system::error_code ec) { 12371abe55efSEd Tanous if (ec) 12381abe55efSEd Tanous { 123955c7b7a2SEd Tanous BMCWEB_LOG_DEBUG << "DBUS response error " << ec; 1240f12894f8SJason M. Bills messages::internalError(asyncResp->res); 1241c5b2abe0SLewanczyk, Dawid return; 1242c5b2abe0SLewanczyk, Dawid } 124355c7b7a2SEd Tanous BMCWEB_LOG_DEBUG << "Led group update done."; 1244c5b2abe0SLewanczyk, Dawid }, 1245c5b2abe0SLewanczyk, Dawid "xyz.openbmc_project.LED.GroupManager", 1246c5b2abe0SLewanczyk, Dawid "/xyz/openbmc_project/led/groups/enclosure_identify", 1247c5b2abe0SLewanczyk, Dawid "org.freedesktop.DBus.Properties", "Set", 1248c5b2abe0SLewanczyk, Dawid "xyz.openbmc_project.Led.Group", "Asserted", 1249abf2add6SEd Tanous std::variant<bool>( 12506617338dSEd Tanous (dbusLedState == 12516617338dSEd Tanous "xyz.openbmc_project.Led.Physical.Action.Off" 12526617338dSEd Tanous ? false 12536617338dSEd Tanous : true))); 1254c5b2abe0SLewanczyk, Dawid // Update identify led status 125555c7b7a2SEd Tanous BMCWEB_LOG_DEBUG << "Update led SoftwareInventoryCollection."; 125655c7b7a2SEd Tanous crow::connections::systemBus->async_method_call( 12576617338dSEd Tanous [asyncResp{std::move(asyncResp)}, 12589712f8acSEd Tanous indicatorLed{std::move(*indicatorLed)}]( 1259c5b2abe0SLewanczyk, Dawid const boost::system::error_code ec) { 12601abe55efSEd Tanous if (ec) 12611abe55efSEd Tanous { 126255c7b7a2SEd Tanous BMCWEB_LOG_DEBUG << "DBUS response error " << ec; 1263f12894f8SJason M. Bills messages::internalError(asyncResp->res); 1264c5b2abe0SLewanczyk, Dawid return; 1265c5b2abe0SLewanczyk, Dawid } 126655c7b7a2SEd Tanous BMCWEB_LOG_DEBUG << "Led state update done."; 1267c5b2abe0SLewanczyk, Dawid }, 1268c5b2abe0SLewanczyk, Dawid "xyz.openbmc_project.LED.Controller.identify", 1269c5b2abe0SLewanczyk, Dawid "/xyz/openbmc_project/led/physical/identify", 1270c5b2abe0SLewanczyk, Dawid "org.freedesktop.DBus.Properties", "Set", 1271c5b2abe0SLewanczyk, Dawid "xyz.openbmc_project.Led.Physical", "State", 1272abf2add6SEd Tanous std::variant<std::string>(dbusLedState)); 12736617338dSEd Tanous } 1274c5b2abe0SLewanczyk, Dawid } 1275c5b2abe0SLewanczyk, Dawid }; 1276c5b2abe0SLewanczyk, Dawid } // namespace redfish 1277