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> 21c5b2abe0SLewanczyk, Dawid 221abe55efSEd Tanous namespace redfish 231abe55efSEd Tanous { 24c5b2abe0SLewanczyk, Dawid 25c5b2abe0SLewanczyk, Dawid /** 26c5b2abe0SLewanczyk, Dawid * @brief Retrieves computer system properties over dbus 27c5b2abe0SLewanczyk, Dawid * 28c5b2abe0SLewanczyk, Dawid * @param[in] aResp Shared pointer for completing asynchronous calls 29c5b2abe0SLewanczyk, Dawid * @param[in] name Computer system name from request 30c5b2abe0SLewanczyk, Dawid * 31c5b2abe0SLewanczyk, Dawid * @return None. 32c5b2abe0SLewanczyk, Dawid */ 33a0803efaSEd Tanous void getComputerSystem(std::shared_ptr<AsyncResp> aResp, 341abe55efSEd Tanous const std::string &name) 351abe55efSEd Tanous { 3655c7b7a2SEd Tanous BMCWEB_LOG_DEBUG << "Get available system components."; 3755c7b7a2SEd Tanous crow::connections::systemBus->async_method_call( 38c5b2abe0SLewanczyk, Dawid [name, 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 bool foundName = false; 51c5b2abe0SLewanczyk, Dawid // Iterate over all retrieved ObjectPaths. 526c34de48SEd Tanous for (const std::pair<std::string, 536c34de48SEd Tanous std::vector<std::pair< 546c34de48SEd Tanous std::string, std::vector<std::string>>>> 551abe55efSEd Tanous &object : subtree) 561abe55efSEd Tanous { 57c5b2abe0SLewanczyk, Dawid const std::string &path = object.first; 5855c7b7a2SEd Tanous BMCWEB_LOG_DEBUG << "Got path: " << path; 591abe55efSEd Tanous const std::vector< 601abe55efSEd Tanous std::pair<std::string, std::vector<std::string>>> 61c5b2abe0SLewanczyk, Dawid &connectionNames = object.second; 621abe55efSEd Tanous if (connectionNames.size() < 1) 631abe55efSEd Tanous { 64c5b2abe0SLewanczyk, Dawid continue; 65c5b2abe0SLewanczyk, Dawid } 66c5b2abe0SLewanczyk, Dawid // Check if computer system exist 671abe55efSEd Tanous if (boost::ends_with(path, name)) 681abe55efSEd Tanous { 69c5b2abe0SLewanczyk, Dawid foundName = true; 7055c7b7a2SEd Tanous BMCWEB_LOG_DEBUG << "Found name: " << name; 716c34de48SEd Tanous const std::string connectionName = connectionNames[0].first; 7255c7b7a2SEd Tanous crow::connections::systemBus->async_method_call( 73c5b2abe0SLewanczyk, Dawid [aResp, name(std::string(name))]( 74c5b2abe0SLewanczyk, Dawid const boost::system::error_code ec, 756c34de48SEd Tanous const std::vector<std::pair< 766c34de48SEd Tanous std::string, VariantType>> &propertiesList) { 771abe55efSEd Tanous if (ec) 781abe55efSEd Tanous { 791abe55efSEd Tanous BMCWEB_LOG_ERROR << "DBUS response error: " 801abe55efSEd Tanous << ec; 81f12894f8SJason M. Bills messages::internalError(aResp->res); 82c5b2abe0SLewanczyk, Dawid return; 83c5b2abe0SLewanczyk, Dawid } 846c34de48SEd Tanous BMCWEB_LOG_DEBUG << "Got " << propertiesList.size() 85c5b2abe0SLewanczyk, Dawid << "properties for system"; 861abe55efSEd Tanous for (const std::pair<std::string, VariantType> 871abe55efSEd Tanous &property : propertiesList) 881abe55efSEd Tanous { 89c5b2abe0SLewanczyk, Dawid const std::string *value = 90*1b6b96c5SEd Tanous sdbusplus::message::variant_ns::get_if< 91*1b6b96c5SEd Tanous std::string>(&property.second); 921abe55efSEd Tanous if (value != nullptr) 931abe55efSEd Tanous { 941abe55efSEd Tanous aResp->res.jsonValue[property.first] = 951abe55efSEd Tanous *value; 96c5b2abe0SLewanczyk, Dawid } 97c5b2abe0SLewanczyk, Dawid } 9855c7b7a2SEd Tanous aResp->res.jsonValue["Name"] = name; 9955c7b7a2SEd Tanous aResp->res.jsonValue["Id"] = 10055c7b7a2SEd Tanous aResp->res.jsonValue["SerialNumber"]; 101c5b2abe0SLewanczyk, Dawid }, 1026c34de48SEd Tanous connectionName, path, "org.freedesktop.DBus.Properties", 1036c34de48SEd Tanous "GetAll", 1041abe55efSEd Tanous "xyz.openbmc_project.Inventory.Decorator.Asset"); 1051abe55efSEd Tanous } 1061abe55efSEd Tanous else 1071abe55efSEd Tanous { 1086c34de48SEd Tanous // This is not system, so check if it's cpu, dimm, UUID or 1096c34de48SEd Tanous // BiosVer 11004a258f4SEd Tanous for (const auto &connection : connectionNames) 1111abe55efSEd Tanous { 11204a258f4SEd Tanous for (const auto &interfaceName : connection.second) 1131abe55efSEd Tanous { 11404a258f4SEd Tanous if (interfaceName == 11504a258f4SEd Tanous "xyz.openbmc_project.Inventory.Item.Dimm") 1161abe55efSEd Tanous { 1171abe55efSEd Tanous BMCWEB_LOG_DEBUG 11804a258f4SEd Tanous << "Found Dimm, now get its properties."; 11955c7b7a2SEd Tanous crow::connections::systemBus->async_method_call( 1206617338dSEd Tanous [aResp]( 1211abe55efSEd Tanous const boost::system::error_code ec, 1226c34de48SEd Tanous const std::vector< 1236c34de48SEd Tanous std::pair<std::string, VariantType>> 1241abe55efSEd Tanous &properties) { 1251abe55efSEd Tanous if (ec) 1261abe55efSEd Tanous { 1271abe55efSEd Tanous BMCWEB_LOG_ERROR 1286c34de48SEd Tanous << "DBUS response error " << ec; 129f12894f8SJason M. Bills messages::internalError(aResp->res); 130c5b2abe0SLewanczyk, Dawid return; 131c5b2abe0SLewanczyk, Dawid } 1326c34de48SEd Tanous BMCWEB_LOG_DEBUG << "Got " 1336c34de48SEd Tanous << properties.size() 134c5b2abe0SLewanczyk, Dawid << "Dimm properties."; 13504a258f4SEd Tanous for (const std::pair<std::string, 13604a258f4SEd Tanous VariantType> 13704a258f4SEd Tanous &property : properties) 1381abe55efSEd Tanous { 13904a258f4SEd Tanous if (property.first == 14004a258f4SEd Tanous "MemorySizeInKb") 1411abe55efSEd Tanous { 14204a258f4SEd Tanous const uint64_t *value = 143*1b6b96c5SEd Tanous sdbusplus::message:: 144*1b6b96c5SEd Tanous variant_ns::get_if< 145*1b6b96c5SEd Tanous uint64_t>( 146*1b6b96c5SEd Tanous &property.second); 14704a258f4SEd Tanous if (value != nullptr) 1481abe55efSEd Tanous { 1491abe55efSEd Tanous aResp->res.jsonValue 1506c34de48SEd Tanous ["TotalSystemMemoryGi" 1516c34de48SEd Tanous "B"] += 15204a258f4SEd Tanous *value / (1024 * 1024); 1531abe55efSEd Tanous aResp->res.jsonValue 1541abe55efSEd Tanous ["MemorySummary"] 1556c34de48SEd Tanous ["Status"]["State"] = 1561abe55efSEd Tanous "Enabled"; 157c5b2abe0SLewanczyk, Dawid } 158c5b2abe0SLewanczyk, Dawid } 159c5b2abe0SLewanczyk, Dawid } 160c5b2abe0SLewanczyk, Dawid }, 16104a258f4SEd Tanous connection.first, path, 1626c34de48SEd Tanous "org.freedesktop.DBus.Properties", "GetAll", 1636c34de48SEd Tanous "xyz.openbmc_project.Inventory.Item.Dimm"); 1641abe55efSEd Tanous } 16504a258f4SEd Tanous else if (interfaceName == 16604a258f4SEd Tanous "xyz.openbmc_project.Inventory.Item.Cpu") 1671abe55efSEd Tanous { 1681abe55efSEd Tanous BMCWEB_LOG_DEBUG 16904a258f4SEd Tanous << "Found Cpu, now get its properties."; 170a0803efaSEd Tanous crow::connections::systemBus->async_method_call( 1716617338dSEd Tanous [aResp]( 172a0803efaSEd Tanous const boost::system::error_code ec, 1736c34de48SEd Tanous const std::vector< 1746c34de48SEd Tanous std::pair<std::string, VariantType>> 1751abe55efSEd Tanous &properties) { 1761abe55efSEd Tanous if (ec) 1771abe55efSEd Tanous { 1781abe55efSEd Tanous BMCWEB_LOG_ERROR 1796c34de48SEd Tanous << "DBUS response error " << ec; 180f12894f8SJason M. Bills messages::internalError(aResp->res); 181c5b2abe0SLewanczyk, Dawid return; 182c5b2abe0SLewanczyk, Dawid } 1836c34de48SEd Tanous BMCWEB_LOG_DEBUG << "Got " 1846c34de48SEd Tanous << properties.size() 185c5b2abe0SLewanczyk, Dawid << "Cpu properties."; 18604a258f4SEd Tanous for (const auto &property : properties) 1871abe55efSEd Tanous { 18804a258f4SEd Tanous if (property.first == 18904a258f4SEd Tanous "ProcessorFamily") 1901abe55efSEd Tanous { 191a0803efaSEd Tanous const std::string *value = 192*1b6b96c5SEd Tanous sdbusplus::message:: 193*1b6b96c5SEd Tanous variant_ns::get_if< 194*1b6b96c5SEd Tanous std::string>( 195*1b6b96c5SEd Tanous &property.second); 1961abe55efSEd Tanous if (value != nullptr) 1971abe55efSEd Tanous { 19804a258f4SEd Tanous nlohmann::json 19904a258f4SEd Tanous &procSummary = 2001abe55efSEd Tanous aResp->res.jsonValue 2016c34de48SEd Tanous ["ProcessorSumm" 20204a258f4SEd Tanous "ary"]; 20304a258f4SEd Tanous nlohmann::json &procCount = 20404a258f4SEd Tanous procSummary["Count"]; 20504a258f4SEd Tanous 20604a258f4SEd Tanous procCount = 20704a258f4SEd Tanous procCount.get<int>() + 208c5b2abe0SLewanczyk, Dawid 1; 20904a258f4SEd Tanous procSummary["Status"] 21004a258f4SEd Tanous ["State"] = 211c5b2abe0SLewanczyk, Dawid "Enabled"; 21204a258f4SEd Tanous procSummary["Model"] = 21304a258f4SEd Tanous *value; 214c5b2abe0SLewanczyk, Dawid } 215c5b2abe0SLewanczyk, Dawid } 216c5b2abe0SLewanczyk, Dawid } 217c5b2abe0SLewanczyk, Dawid }, 21804a258f4SEd Tanous connection.first, path, 2196c34de48SEd Tanous "org.freedesktop.DBus.Properties", "GetAll", 2206c34de48SEd Tanous "xyz.openbmc_project.Inventory.Item.Cpu"); 2211abe55efSEd Tanous } 22204a258f4SEd Tanous else if (interfaceName == 22304a258f4SEd Tanous "xyz.openbmc_project.Common.UUID") 2241abe55efSEd Tanous { 2251abe55efSEd Tanous BMCWEB_LOG_DEBUG 22604a258f4SEd Tanous << "Found UUID, now get its properties."; 22755c7b7a2SEd Tanous crow::connections::systemBus->async_method_call( 2281abe55efSEd Tanous [aResp]( 2291abe55efSEd Tanous const boost::system::error_code ec, 2306c34de48SEd Tanous const std::vector< 2316c34de48SEd Tanous std::pair<std::string, VariantType>> 2321abe55efSEd Tanous &properties) { 2331abe55efSEd Tanous if (ec) 2341abe55efSEd Tanous { 2351abe55efSEd Tanous BMCWEB_LOG_DEBUG 2366c34de48SEd Tanous << "DBUS response error " << ec; 237f12894f8SJason M. Bills messages::internalError(aResp->res); 238c5b2abe0SLewanczyk, Dawid return; 239c5b2abe0SLewanczyk, Dawid } 2406c34de48SEd Tanous BMCWEB_LOG_DEBUG << "Got " 2416c34de48SEd Tanous << properties.size() 242c5b2abe0SLewanczyk, Dawid << "UUID properties."; 2431abe55efSEd Tanous for (const std::pair<std::string, 24404a258f4SEd Tanous VariantType> 24504a258f4SEd Tanous &property : properties) 2461abe55efSEd Tanous { 24704a258f4SEd Tanous if (property.first == "BIOSVer") 2481abe55efSEd Tanous { 249c5b2abe0SLewanczyk, Dawid const std::string *value = 250*1b6b96c5SEd Tanous sdbusplus::message:: 251*1b6b96c5SEd Tanous variant_ns::get_if< 252*1b6b96c5SEd Tanous std::string>( 253*1b6b96c5SEd Tanous &property.second); 2541abe55efSEd Tanous if (value != nullptr) 2551abe55efSEd Tanous { 2561abe55efSEd Tanous aResp->res.jsonValue 2571abe55efSEd Tanous ["BiosVersion"] = 2581abe55efSEd Tanous *value; 259c5b2abe0SLewanczyk, Dawid } 260c5b2abe0SLewanczyk, Dawid } 26104a258f4SEd Tanous if (property.first == "UUID") 2621abe55efSEd Tanous { 263c5b2abe0SLewanczyk, Dawid const std::string *value = 264*1b6b96c5SEd Tanous sdbusplus::message:: 265*1b6b96c5SEd Tanous variant_ns::get_if< 266*1b6b96c5SEd Tanous std::string>( 267*1b6b96c5SEd Tanous &property.second); 26804a258f4SEd Tanous 2691abe55efSEd Tanous if (value != nullptr) 2701abe55efSEd Tanous { 27104a258f4SEd Tanous std::string valueStr = 2721abe55efSEd Tanous *value; 27304a258f4SEd Tanous if (valueStr.size() == 32) 2741abe55efSEd Tanous { 27504a258f4SEd Tanous valueStr.insert(8, 1, 27604a258f4SEd Tanous '-'); 27704a258f4SEd Tanous valueStr.insert(13, 1, 27804a258f4SEd Tanous '-'); 27904a258f4SEd Tanous valueStr.insert(18, 1, 28004a258f4SEd Tanous '-'); 28104a258f4SEd Tanous valueStr.insert(23, 1, 28204a258f4SEd Tanous '-'); 28304a258f4SEd Tanous } 28404a258f4SEd Tanous BMCWEB_LOG_DEBUG 28504a258f4SEd Tanous << "UUID = " 28604a258f4SEd Tanous << valueStr; 2876c34de48SEd Tanous aResp->res 2886c34de48SEd Tanous .jsonValue["UUID"] = 28904a258f4SEd Tanous valueStr; 290c5b2abe0SLewanczyk, Dawid } 291c5b2abe0SLewanczyk, Dawid } 292c5b2abe0SLewanczyk, Dawid } 293c5b2abe0SLewanczyk, Dawid }, 29404a258f4SEd Tanous connection.first, path, 2956c34de48SEd Tanous "org.freedesktop.DBus.Properties", "GetAll", 2961abe55efSEd Tanous "xyz.openbmc_project.Common.UUID"); 297c5b2abe0SLewanczyk, Dawid } 298c5b2abe0SLewanczyk, Dawid } 299c5b2abe0SLewanczyk, Dawid } 300c5b2abe0SLewanczyk, Dawid } 301c5b2abe0SLewanczyk, Dawid } 3021abe55efSEd Tanous if (foundName == false) 3031abe55efSEd Tanous { 304f12894f8SJason M. Bills messages::internalError(aResp->res); 305c5b2abe0SLewanczyk, Dawid } 306c5b2abe0SLewanczyk, Dawid }, 307c5b2abe0SLewanczyk, Dawid "xyz.openbmc_project.ObjectMapper", 308c5b2abe0SLewanczyk, Dawid "/xyz/openbmc_project/object_mapper", 309c5b2abe0SLewanczyk, Dawid "xyz.openbmc_project.ObjectMapper", "GetSubTree", 3106617338dSEd Tanous "/xyz/openbmc_project/inventory", int32_t(0), 3116617338dSEd Tanous std::array<const char *, 5>{ 3126617338dSEd Tanous "xyz.openbmc_project.Inventory.Decorator.Asset", 3136617338dSEd Tanous "xyz.openbmc_project.Inventory.Item.Cpu", 3146617338dSEd Tanous "xyz.openbmc_project.Inventory.Item.Dimm", 3156617338dSEd Tanous "xyz.openbmc_project.Inventory.Item.System", 3166617338dSEd Tanous "xyz.openbmc_project.Common.UUID", 3176617338dSEd Tanous }); 318c5b2abe0SLewanczyk, Dawid } 319c5b2abe0SLewanczyk, Dawid 320c5b2abe0SLewanczyk, Dawid /** 321c5b2abe0SLewanczyk, Dawid * @brief Retrieves identify led group properties over dbus 322c5b2abe0SLewanczyk, Dawid * 323c5b2abe0SLewanczyk, Dawid * @param[in] aResp Shared pointer for completing asynchronous calls. 324c5b2abe0SLewanczyk, Dawid * @param[in] callback Callback for process retrieved data. 325c5b2abe0SLewanczyk, Dawid * 326c5b2abe0SLewanczyk, Dawid * @return None. 327c5b2abe0SLewanczyk, Dawid */ 328c5b2abe0SLewanczyk, Dawid template <typename CallbackFunc> 329a0803efaSEd Tanous void getLedGroupIdentify(std::shared_ptr<AsyncResp> aResp, 3301abe55efSEd Tanous CallbackFunc &&callback) 3311abe55efSEd Tanous { 33255c7b7a2SEd Tanous BMCWEB_LOG_DEBUG << "Get led groups"; 33355c7b7a2SEd Tanous crow::connections::systemBus->async_method_call( 3341abe55efSEd Tanous [aResp{std::move(aResp)}, 3356617338dSEd Tanous callback{std::move(callback)}](const boost::system::error_code &ec, 3361abe55efSEd Tanous const ManagedObjectsType &resp) { 3371abe55efSEd Tanous if (ec) 3381abe55efSEd Tanous { 33955c7b7a2SEd Tanous BMCWEB_LOG_DEBUG << "DBUS response error " << ec; 340f12894f8SJason M. Bills messages::internalError(aResp->res); 341c5b2abe0SLewanczyk, Dawid return; 342c5b2abe0SLewanczyk, Dawid } 3436c34de48SEd Tanous BMCWEB_LOG_DEBUG << "Got " << resp.size() << "led group objects."; 3441abe55efSEd Tanous for (const auto &objPath : resp) 3451abe55efSEd Tanous { 346c5b2abe0SLewanczyk, Dawid const std::string &path = objPath.first; 3471abe55efSEd Tanous if (path.rfind("enclosure_identify") != std::string::npos) 3481abe55efSEd Tanous { 3491abe55efSEd Tanous for (const auto &interface : objPath.second) 3501abe55efSEd Tanous { 3516c34de48SEd Tanous if (interface.first == "xyz.openbmc_project.Led.Group") 3521abe55efSEd Tanous { 3531abe55efSEd Tanous for (const auto &property : interface.second) 3541abe55efSEd Tanous { 3551abe55efSEd Tanous if (property.first == "Asserted") 3561abe55efSEd Tanous { 357c5b2abe0SLewanczyk, Dawid const bool *asserted = 358*1b6b96c5SEd Tanous sdbusplus::message::variant_ns::get_if< 359*1b6b96c5SEd Tanous bool>(&property.second); 3601abe55efSEd Tanous if (nullptr != asserted) 3611abe55efSEd Tanous { 362c5b2abe0SLewanczyk, Dawid callback(*asserted, aResp); 3631abe55efSEd Tanous } 3641abe55efSEd Tanous else 3651abe55efSEd Tanous { 366c5b2abe0SLewanczyk, Dawid callback(false, aResp); 367c5b2abe0SLewanczyk, Dawid } 368c5b2abe0SLewanczyk, Dawid } 369c5b2abe0SLewanczyk, Dawid } 370c5b2abe0SLewanczyk, Dawid } 371c5b2abe0SLewanczyk, Dawid } 372c5b2abe0SLewanczyk, Dawid } 373c5b2abe0SLewanczyk, Dawid } 374c5b2abe0SLewanczyk, Dawid }, 375c5b2abe0SLewanczyk, Dawid "xyz.openbmc_project.LED.GroupManager", 3766c34de48SEd Tanous "/xyz/openbmc_project/led/groups", "org.freedesktop.DBus.ObjectManager", 3776c34de48SEd Tanous "GetManagedObjects"); 378c5b2abe0SLewanczyk, Dawid } 379c5b2abe0SLewanczyk, Dawid 380c5b2abe0SLewanczyk, Dawid template <typename CallbackFunc> 3816c34de48SEd Tanous void getLedIdentify(std::shared_ptr<AsyncResp> aResp, CallbackFunc &&callback) 3821abe55efSEd Tanous { 38355c7b7a2SEd Tanous BMCWEB_LOG_DEBUG << "Get identify led properties"; 38455c7b7a2SEd Tanous crow::connections::systemBus->async_method_call( 3856617338dSEd Tanous [aResp, 3866617338dSEd Tanous callback{std::move(callback)}](const boost::system::error_code ec, 387c5b2abe0SLewanczyk, Dawid const PropertiesType &properties) { 3881abe55efSEd Tanous if (ec) 3891abe55efSEd Tanous { 39055c7b7a2SEd Tanous BMCWEB_LOG_DEBUG << "DBUS response error " << ec; 391f12894f8SJason M. Bills messages::internalError(aResp->res); 392c5b2abe0SLewanczyk, Dawid return; 393c5b2abe0SLewanczyk, Dawid } 3941abe55efSEd Tanous BMCWEB_LOG_DEBUG << "Got " << properties.size() 3951abe55efSEd Tanous << "led properties."; 396c5b2abe0SLewanczyk, Dawid std::string output; 3971abe55efSEd Tanous for (const auto &property : properties) 3981abe55efSEd Tanous { 3991abe55efSEd Tanous if (property.first == "State") 4001abe55efSEd Tanous { 401c5b2abe0SLewanczyk, Dawid const std::string *s = 402*1b6b96c5SEd Tanous sdbusplus::message::variant_ns::get_if<std::string>( 403*1b6b96c5SEd Tanous &property.second); 4041abe55efSEd Tanous if (nullptr != s) 4051abe55efSEd Tanous { 40655c7b7a2SEd Tanous BMCWEB_LOG_DEBUG << "Identify Led State: " << *s; 407c5b2abe0SLewanczyk, Dawid const auto pos = s->rfind('.'); 4081abe55efSEd Tanous if (pos != std::string::npos) 4091abe55efSEd Tanous { 410c5b2abe0SLewanczyk, Dawid auto led = s->substr(pos + 1); 4111abe55efSEd Tanous for (const std::pair<const char *, const char *> 4121abe55efSEd Tanous &p : 4131abe55efSEd Tanous std::array< 4146c34de48SEd Tanous std::pair<const char *, const char *>, 3>{ 4156c34de48SEd Tanous {{"On", "Lit"}, 416c5b2abe0SLewanczyk, Dawid {"Blink", "Blinking"}, 4171abe55efSEd Tanous {"Off", "Off"}}}) 4181abe55efSEd Tanous { 4191abe55efSEd Tanous if (led == p.first) 4201abe55efSEd Tanous { 421c5b2abe0SLewanczyk, Dawid output = p.second; 422c5b2abe0SLewanczyk, Dawid } 423c5b2abe0SLewanczyk, Dawid } 424c5b2abe0SLewanczyk, Dawid } 425c5b2abe0SLewanczyk, Dawid } 426c5b2abe0SLewanczyk, Dawid } 427c5b2abe0SLewanczyk, Dawid } 428c5b2abe0SLewanczyk, Dawid callback(output, aResp); 429c5b2abe0SLewanczyk, Dawid }, 430c5b2abe0SLewanczyk, Dawid "xyz.openbmc_project.LED.Controller.identify", 431c5b2abe0SLewanczyk, Dawid "/xyz/openbmc_project/led/physical/identify", 432c5b2abe0SLewanczyk, Dawid "org.freedesktop.DBus.Properties", "GetAll", 433c5b2abe0SLewanczyk, Dawid "xyz.openbmc_project.Led.Physical"); 434c5b2abe0SLewanczyk, Dawid } 435c5b2abe0SLewanczyk, Dawid 436c5b2abe0SLewanczyk, Dawid /** 437c5b2abe0SLewanczyk, Dawid * @brief Retrieves host state properties over dbus 438c5b2abe0SLewanczyk, Dawid * 439c5b2abe0SLewanczyk, Dawid * @param[in] aResp Shared pointer for completing asynchronous calls. 440c5b2abe0SLewanczyk, Dawid * 441c5b2abe0SLewanczyk, Dawid * @return None. 442c5b2abe0SLewanczyk, Dawid */ 443a0803efaSEd Tanous void getHostState(std::shared_ptr<AsyncResp> aResp) 4441abe55efSEd Tanous { 44555c7b7a2SEd Tanous BMCWEB_LOG_DEBUG << "Get host information."; 44655c7b7a2SEd Tanous crow::connections::systemBus->async_method_call( 4476617338dSEd Tanous [aResp{std::move(aResp)}]( 4486617338dSEd Tanous const boost::system::error_code ec, 4496617338dSEd Tanous const sdbusplus::message::variant<std::string> &hostState) { 4501abe55efSEd Tanous if (ec) 4511abe55efSEd Tanous { 45255c7b7a2SEd Tanous BMCWEB_LOG_DEBUG << "DBUS response error " << ec; 453f12894f8SJason M. Bills messages::internalError(aResp->res); 454c5b2abe0SLewanczyk, Dawid return; 455c5b2abe0SLewanczyk, Dawid } 4566617338dSEd Tanous 457*1b6b96c5SEd Tanous const std::string *s = 458*1b6b96c5SEd Tanous sdbusplus::message::variant_ns::get_if<std::string>(&hostState); 45955c7b7a2SEd Tanous BMCWEB_LOG_DEBUG << "Host state: " << *s; 4606617338dSEd Tanous if (s != nullptr) 4611abe55efSEd Tanous { 462c5b2abe0SLewanczyk, Dawid // Verify Host State 4636617338dSEd Tanous if (*s == "xyz.openbmc_project.State.Host.Running") 4641abe55efSEd Tanous { 46555c7b7a2SEd Tanous aResp->res.jsonValue["PowerState"] = "On"; 4666617338dSEd Tanous aResp->res.jsonValue["Status"]["State"] = "Enabled"; 4671abe55efSEd Tanous } 4681abe55efSEd Tanous else 4691abe55efSEd Tanous { 47055c7b7a2SEd Tanous aResp->res.jsonValue["PowerState"] = "Off"; 4716617338dSEd Tanous aResp->res.jsonValue["Status"]["State"] = "Disabled"; 472c5b2abe0SLewanczyk, Dawid } 473c5b2abe0SLewanczyk, Dawid } 474c5b2abe0SLewanczyk, Dawid }, 4756c34de48SEd Tanous "xyz.openbmc_project.State.Host", "/xyz/openbmc_project/state/host0", 4766617338dSEd Tanous "org.freedesktop.DBus.Properties", "Get", 4776617338dSEd Tanous "xyz.openbmc_project.State.Host", "CurrentHostState"); 478c5b2abe0SLewanczyk, Dawid } 479c5b2abe0SLewanczyk, Dawid 480c5b2abe0SLewanczyk, Dawid /** 481c5b2abe0SLewanczyk, Dawid * SystemsCollection derived class for delivering ComputerSystems Collection 482c5b2abe0SLewanczyk, Dawid * Schema 483c5b2abe0SLewanczyk, Dawid */ 4841abe55efSEd Tanous class SystemsCollection : public Node 4851abe55efSEd Tanous { 486c5b2abe0SLewanczyk, Dawid public: 4871abe55efSEd Tanous SystemsCollection(CrowApp &app) : Node(app, "/redfish/v1/Systems/") 4881abe55efSEd Tanous { 489c5b2abe0SLewanczyk, Dawid entityPrivileges = { 490c5b2abe0SLewanczyk, Dawid {boost::beast::http::verb::get, {{"Login"}}}, 491c5b2abe0SLewanczyk, Dawid {boost::beast::http::verb::head, {{"Login"}}}, 492c5b2abe0SLewanczyk, Dawid {boost::beast::http::verb::patch, {{"ConfigureComponents"}}}, 493c5b2abe0SLewanczyk, Dawid {boost::beast::http::verb::put, {{"ConfigureComponents"}}}, 494c5b2abe0SLewanczyk, Dawid {boost::beast::http::verb::delete_, {{"ConfigureComponents"}}}, 495c5b2abe0SLewanczyk, Dawid {boost::beast::http::verb::post, {{"ConfigureComponents"}}}}; 496c5b2abe0SLewanczyk, Dawid } 497c5b2abe0SLewanczyk, Dawid 498c5b2abe0SLewanczyk, Dawid private: 49955c7b7a2SEd Tanous void doGet(crow::Response &res, const crow::Request &req, 5001abe55efSEd Tanous const std::vector<std::string> ¶ms) override 5011abe55efSEd Tanous { 5026617338dSEd Tanous BMCWEB_LOG_DEBUG << "Get list of available boards."; 5036617338dSEd Tanous std::shared_ptr<AsyncResp> asyncResp = std::make_shared<AsyncResp>(res); 5040f74e643SEd Tanous res.jsonValue["@odata.type"] = 5050f74e643SEd Tanous "#ComputerSystemCollection.ComputerSystemCollection"; 5060f74e643SEd Tanous res.jsonValue["@odata.id"] = "/redfish/v1/Systems"; 5070f74e643SEd Tanous res.jsonValue["@odata.context"] = 5080f74e643SEd Tanous "/redfish/v1/" 5090f74e643SEd Tanous "$metadata#ComputerSystemCollection.ComputerSystemCollection"; 5100f74e643SEd Tanous res.jsonValue["Name"] = "Computer System Collection"; 5116617338dSEd Tanous crow::connections::systemBus->async_method_call( 5126617338dSEd Tanous [asyncResp](const boost::system::error_code ec, 5136617338dSEd Tanous const std::vector<std::string> &resp) { 5146617338dSEd Tanous if (ec) 5151abe55efSEd Tanous { 516f12894f8SJason M. Bills messages::internalError(asyncResp->res); 5176617338dSEd Tanous return; 5186617338dSEd Tanous } 5196617338dSEd Tanous BMCWEB_LOG_DEBUG << "Got " << resp.size() << " boards."; 5206617338dSEd Tanous 521c5b2abe0SLewanczyk, Dawid // ... prepare json array with appropriate @odata.id links 5226617338dSEd Tanous nlohmann::json &boardArray = 5236617338dSEd Tanous asyncResp->res.jsonValue["Members"]; 5246617338dSEd Tanous boardArray = nlohmann::json::array(); 5256617338dSEd Tanous 5266617338dSEd Tanous // Iterate over all retrieved ObjectPaths. 5276617338dSEd Tanous for (const std::string &objpath : resp) 5286617338dSEd Tanous { 5296617338dSEd Tanous std::size_t lastPos = objpath.rfind("/"); 5306617338dSEd Tanous if (lastPos != std::string::npos) 5311abe55efSEd Tanous { 532c5b2abe0SLewanczyk, Dawid boardArray.push_back( 5336617338dSEd Tanous {{"@odata.id", "/redfish/v1/Systems/" + 5346617338dSEd Tanous objpath.substr(lastPos + 1)}}); 535c5b2abe0SLewanczyk, Dawid } 5361abe55efSEd Tanous } 5376617338dSEd Tanous 5386617338dSEd Tanous asyncResp->res.jsonValue["Members@odata.count"] = 5396617338dSEd Tanous boardArray.size(); 5406617338dSEd Tanous }, 5416617338dSEd Tanous "xyz.openbmc_project.ObjectMapper", 5426617338dSEd Tanous "/xyz/openbmc_project/object_mapper", 5436617338dSEd Tanous "xyz.openbmc_project.ObjectMapper", "GetSubTreePaths", 5446617338dSEd Tanous "/xyz/openbmc_project/inventory", int32_t(0), 5456617338dSEd Tanous std::array<const char *, 1>{ 5466617338dSEd Tanous "xyz.openbmc_project.Inventory.Item.Board"}); 547c5b2abe0SLewanczyk, Dawid } 548c5b2abe0SLewanczyk, Dawid }; 549c5b2abe0SLewanczyk, Dawid 550c5b2abe0SLewanczyk, Dawid /** 551cc340dd9SEd Tanous * SystemActionsReset class supports handle POST method for Reset action. 552cc340dd9SEd Tanous * The class retrieves and sends data directly to D-Bus. 553cc340dd9SEd Tanous */ 554cc340dd9SEd Tanous class SystemActionsReset : public Node 555cc340dd9SEd Tanous { 556cc340dd9SEd Tanous public: 557cc340dd9SEd Tanous SystemActionsReset(CrowApp &app) : 558cc340dd9SEd Tanous Node(app, "/redfish/v1/Systems/<str>/Actions/ComputerSystem.Reset/", 559cc340dd9SEd Tanous std::string()) 560cc340dd9SEd Tanous { 561cc340dd9SEd Tanous entityPrivileges = { 562cc340dd9SEd Tanous {boost::beast::http::verb::post, {{"ConfigureComponents"}}}}; 563cc340dd9SEd Tanous } 564cc340dd9SEd Tanous 565cc340dd9SEd Tanous private: 566cc340dd9SEd Tanous /** 567cc340dd9SEd Tanous * Function handles POST method request. 568cc340dd9SEd Tanous * Analyzes POST body message before sends Reset request data to D-Bus. 569cc340dd9SEd Tanous */ 570cc340dd9SEd Tanous void doPost(crow::Response &res, const crow::Request &req, 571cc340dd9SEd Tanous const std::vector<std::string> ¶ms) override 572cc340dd9SEd Tanous { 573cc340dd9SEd Tanous auto asyncResp = std::make_shared<AsyncResp>(res); 574cc340dd9SEd Tanous 5759712f8acSEd Tanous std::string resetType; 5769712f8acSEd Tanous if (!json_util::readJson(req, res, "ResetType", resetType)) 577cc340dd9SEd Tanous { 578cc340dd9SEd Tanous return; 579cc340dd9SEd Tanous } 580cc340dd9SEd Tanous 5819712f8acSEd Tanous if (resetType == "ForceOff") 582cc340dd9SEd Tanous { 583cc340dd9SEd Tanous // Force off acts on the chassis 584cc340dd9SEd Tanous crow::connections::systemBus->async_method_call( 585cc340dd9SEd Tanous [asyncResp](const boost::system::error_code ec) { 586cc340dd9SEd Tanous if (ec) 587cc340dd9SEd Tanous { 5889712f8acSEd Tanous BMCWEB_LOG_ERROR << "D-Bus responses error: " << ec; 589f12894f8SJason M. Bills messages::internalError(asyncResp->res); 590cc340dd9SEd Tanous return; 591cc340dd9SEd Tanous } 592cc340dd9SEd Tanous // TODO Consider support polling mechanism to verify 593cc340dd9SEd Tanous // status of host and chassis after execute the 594cc340dd9SEd Tanous // requested action. 595f12894f8SJason M. Bills messages::success(asyncResp->res); 596cc340dd9SEd Tanous }, 597cc340dd9SEd Tanous "xyz.openbmc_project.State.Chassis", 598cc340dd9SEd Tanous "/xyz/openbmc_project/state/chassis0", 599cc340dd9SEd Tanous "org.freedesktop.DBus.Properties", "Set", 6009712f8acSEd Tanous "xyz.openbmc_project.State.Chassis", "RequestedPowerTransition", 601cc340dd9SEd Tanous sdbusplus::message::variant<std::string>{ 6029712f8acSEd Tanous "xyz.openbmc_project.State.Chassis.Transition.Off"}); 603cc340dd9SEd Tanous return; 604cc340dd9SEd Tanous } 605cc340dd9SEd Tanous // all other actions operate on the host 606cc340dd9SEd Tanous std::string command; 607cc340dd9SEd Tanous // Execute Reset Action regarding to each reset type. 6089712f8acSEd Tanous if (resetType == "On") 609cc340dd9SEd Tanous { 610cc340dd9SEd Tanous command = "xyz.openbmc_project.State.Host.Transition.On"; 611cc340dd9SEd Tanous } 6129712f8acSEd Tanous else if (resetType == "GracefulShutdown") 613cc340dd9SEd Tanous { 614cc340dd9SEd Tanous command = "xyz.openbmc_project.State.Host.Transition.Off"; 615cc340dd9SEd Tanous } 6169712f8acSEd Tanous else if (resetType == "GracefulRestart") 617cc340dd9SEd Tanous { 6189712f8acSEd Tanous command = "xyz.openbmc_project.State.Host.Transition.Reboot"; 619cc340dd9SEd Tanous } 620cc340dd9SEd Tanous else 621cc340dd9SEd Tanous { 622f12894f8SJason M. Bills messages::actionParameterUnknown(res, "Reset", resetType); 623cc340dd9SEd Tanous return; 624cc340dd9SEd Tanous } 625cc340dd9SEd Tanous 626cc340dd9SEd Tanous crow::connections::systemBus->async_method_call( 627cc340dd9SEd Tanous [asyncResp](const boost::system::error_code ec) { 628cc340dd9SEd Tanous if (ec) 629cc340dd9SEd Tanous { 630cc340dd9SEd Tanous BMCWEB_LOG_ERROR << "D-Bus responses error: " << ec; 631f12894f8SJason M. Bills messages::internalError(asyncResp->res); 632cc340dd9SEd Tanous return; 633cc340dd9SEd Tanous } 634cc340dd9SEd Tanous // TODO Consider support polling mechanism to verify 635cc340dd9SEd Tanous // status of host and chassis after execute the 636cc340dd9SEd Tanous // requested action. 637f12894f8SJason M. Bills messages::success(asyncResp->res); 638cc340dd9SEd Tanous }, 639cc340dd9SEd Tanous "xyz.openbmc_project.State.Host", 640cc340dd9SEd Tanous "/xyz/openbmc_project/state/host0", 641cc340dd9SEd Tanous "org.freedesktop.DBus.Properties", "Set", 6429712f8acSEd Tanous "xyz.openbmc_project.State.Host", "RequestedHostTransition", 643cc340dd9SEd Tanous sdbusplus::message::variant<std::string>{command}); 644cc340dd9SEd Tanous } 645cc340dd9SEd Tanous }; 646cc340dd9SEd Tanous 647cc340dd9SEd Tanous /** 6486617338dSEd Tanous * Systems derived class for delivering Computer Systems Schema. 649c5b2abe0SLewanczyk, Dawid */ 6501abe55efSEd Tanous class Systems : public Node 6511abe55efSEd Tanous { 652c5b2abe0SLewanczyk, Dawid public: 653c5b2abe0SLewanczyk, Dawid /* 654c5b2abe0SLewanczyk, Dawid * Default Constructor 655c5b2abe0SLewanczyk, Dawid */ 6561abe55efSEd Tanous Systems(CrowApp &app) : 6571abe55efSEd Tanous Node(app, "/redfish/v1/Systems/<str>/", std::string()) 6581abe55efSEd Tanous { 659c5b2abe0SLewanczyk, Dawid entityPrivileges = { 660c5b2abe0SLewanczyk, Dawid {boost::beast::http::verb::get, {{"Login"}}}, 661c5b2abe0SLewanczyk, Dawid {boost::beast::http::verb::head, {{"Login"}}}, 662c5b2abe0SLewanczyk, Dawid {boost::beast::http::verb::patch, {{"ConfigureComponents"}}}, 663c5b2abe0SLewanczyk, Dawid {boost::beast::http::verb::put, {{"ConfigureComponents"}}}, 664c5b2abe0SLewanczyk, Dawid {boost::beast::http::verb::delete_, {{"ConfigureComponents"}}}, 665c5b2abe0SLewanczyk, Dawid {boost::beast::http::verb::post, {{"ConfigureComponents"}}}}; 666c5b2abe0SLewanczyk, Dawid } 667c5b2abe0SLewanczyk, Dawid 668c5b2abe0SLewanczyk, Dawid private: 669c5b2abe0SLewanczyk, Dawid /** 670c5b2abe0SLewanczyk, Dawid * Functions triggers appropriate requests on DBus 671c5b2abe0SLewanczyk, Dawid */ 67255c7b7a2SEd Tanous void doGet(crow::Response &res, const crow::Request &req, 6731abe55efSEd Tanous const std::vector<std::string> ¶ms) override 6741abe55efSEd Tanous { 675c5b2abe0SLewanczyk, Dawid // Check if there is required param, truly entering this shall be 676c5b2abe0SLewanczyk, Dawid // impossible 6771abe55efSEd Tanous if (params.size() != 1) 6781abe55efSEd Tanous { 679f12894f8SJason M. Bills messages::internalError(res); 680c5b2abe0SLewanczyk, Dawid res.end(); 681c5b2abe0SLewanczyk, Dawid return; 682c5b2abe0SLewanczyk, Dawid } 683c5b2abe0SLewanczyk, Dawid 684c5b2abe0SLewanczyk, Dawid const std::string &name = params[0]; 685c5b2abe0SLewanczyk, Dawid 6860f74e643SEd Tanous res.jsonValue["@odata.type"] = "#ComputerSystem.v1_3_0.ComputerSystem"; 6870f74e643SEd Tanous res.jsonValue["@odata.context"] = 6880f74e643SEd Tanous "/redfish/v1/$metadata#ComputerSystem.ComputerSystem"; 6890f74e643SEd Tanous res.jsonValue["SystemType"] = "Physical"; 6900f74e643SEd Tanous res.jsonValue["Description"] = "Computer System"; 6910f74e643SEd Tanous res.jsonValue["Boot"]["BootSourceOverrideEnabled"] = 6920f74e643SEd Tanous "Disabled"; // TODO(Dawid), get real boot data 6930f74e643SEd Tanous res.jsonValue["Boot"]["BootSourceOverrideTarget"] = 6940f74e643SEd Tanous "None"; // TODO(Dawid), get real boot data 6950f74e643SEd Tanous res.jsonValue["Boot"]["BootSourceOverrideMode"] = 6960f74e643SEd Tanous "Legacy"; // TODO(Dawid), get real boot data 6970f74e643SEd Tanous res.jsonValue["Boot"] 6980f74e643SEd Tanous ["BootSourceOverrideTarget@Redfish.AllowableValues"] = { 6990f74e643SEd Tanous "None", "Pxe", "Hdd", "Cd", 7000f74e643SEd Tanous "BiosSetup", "UefiShell", "Usb"}; // TODO(Dawid), get real boot 7010f74e643SEd Tanous // data 7020f74e643SEd Tanous res.jsonValue["ProcessorSummary"]["Count"] = 0; 7030f74e643SEd Tanous res.jsonValue["ProcessorSummary"]["Status"]["State"] = "Disabled"; 7040f74e643SEd Tanous res.jsonValue["MemorySummary"]["TotalSystemMemoryGiB"] = int(0); 7050f74e643SEd Tanous res.jsonValue["MemorySummary"]["Status"]["State"] = "Disabled"; 70604a258f4SEd Tanous res.jsonValue["@odata.id"] = "/redfish/v1/Systems/" + name; 70704a258f4SEd Tanous 708443c2934SRapkiewicz, Pawel res.jsonValue["Processors"] = { 709443c2934SRapkiewicz, Pawel {"@odata.id", "/redfish/v1/Systems/" + name + "/Processors"}}; 710443c2934SRapkiewicz, Pawel res.jsonValue["Memory"] = { 711443c2934SRapkiewicz, Pawel {"@odata.id", "/redfish/v1/Systems/" + name + "/Memory"}}; 712cc340dd9SEd Tanous // TODO Need to support ForceRestart. 713cc340dd9SEd Tanous res.jsonValue["Actions"]["#ComputerSystem.Reset"] = { 714cc340dd9SEd Tanous {"target", 715cc340dd9SEd Tanous "/redfish/v1/Systems/" + name + "/Actions/ComputerSystem.Reset"}, 716cc340dd9SEd Tanous {"ResetType@Redfish.AllowableValues", 717cc340dd9SEd Tanous {"On", "ForceOff", "GracefulRestart", "GracefulShutdown"}}}; 718c5b2abe0SLewanczyk, Dawid 719c4bf6374SJason M. Bills res.jsonValue["LogServices"] = { 720c4bf6374SJason M. Bills {"@odata.id", "/redfish/v1/Systems/" + name + "/LogServices"}}; 721c4bf6374SJason M. Bills 722a0803efaSEd Tanous auto asyncResp = std::make_shared<AsyncResp>(res); 723c5b2abe0SLewanczyk, Dawid 7246c34de48SEd Tanous getLedGroupIdentify( 725a0803efaSEd Tanous asyncResp, 726a0803efaSEd Tanous [&](const bool &asserted, const std::shared_ptr<AsyncResp> &aResp) { 7271abe55efSEd Tanous if (asserted) 7281abe55efSEd Tanous { 729c5b2abe0SLewanczyk, Dawid // If led group is asserted, then another call is needed to 730c5b2abe0SLewanczyk, Dawid // get led status 7316c34de48SEd Tanous getLedIdentify( 732a0803efaSEd Tanous aResp, [](const std::string &ledStatus, 733a0803efaSEd Tanous const std::shared_ptr<AsyncResp> &aResp) { 7341abe55efSEd Tanous if (!ledStatus.empty()) 7351abe55efSEd Tanous { 7361abe55efSEd Tanous aResp->res.jsonValue["IndicatorLED"] = 7371abe55efSEd Tanous ledStatus; 738c5b2abe0SLewanczyk, Dawid } 739c5b2abe0SLewanczyk, Dawid }); 7401abe55efSEd Tanous } 7411abe55efSEd Tanous else 7421abe55efSEd Tanous { 74355c7b7a2SEd Tanous aResp->res.jsonValue["IndicatorLED"] = "Off"; 744c5b2abe0SLewanczyk, Dawid } 745c5b2abe0SLewanczyk, Dawid }); 7466c34de48SEd Tanous getComputerSystem(asyncResp, name); 7476c34de48SEd Tanous getHostState(asyncResp); 748c5b2abe0SLewanczyk, Dawid } 749c5b2abe0SLewanczyk, Dawid 75055c7b7a2SEd Tanous void doPatch(crow::Response &res, const crow::Request &req, 7511abe55efSEd Tanous const std::vector<std::string> ¶ms) override 7521abe55efSEd Tanous { 753c5b2abe0SLewanczyk, Dawid // Check if there is required param, truly entering this shall be 754c5b2abe0SLewanczyk, Dawid // impossible 7556617338dSEd Tanous auto asyncResp = std::make_shared<AsyncResp>(res); 7561abe55efSEd Tanous if (params.size() != 1) 7571abe55efSEd Tanous { 758f12894f8SJason M. Bills messages::internalError(asyncResp->res); 759c5b2abe0SLewanczyk, Dawid return; 760c5b2abe0SLewanczyk, Dawid } 761c5b2abe0SLewanczyk, Dawid 7626617338dSEd Tanous const std::string &name = params[0]; 7636617338dSEd Tanous 7640f74e643SEd Tanous messages::success(asyncResp->res); 765c5b2abe0SLewanczyk, Dawid 7669712f8acSEd Tanous std::string indicatorLedTemp; 7679712f8acSEd Tanous boost::optional<std::string> indicatorLed = indicatorLedTemp; 7689712f8acSEd Tanous if (!json_util::readJson(req, res, "IndicatorLed", indicatorLed)) 7696617338dSEd Tanous { 7706617338dSEd Tanous return; 7716617338dSEd Tanous } 7726617338dSEd Tanous 7739712f8acSEd Tanous if (indicatorLed) 7746617338dSEd Tanous { 7759712f8acSEd Tanous std::string dbusLedState; 7769712f8acSEd Tanous if (*indicatorLed == "On") 7779712f8acSEd Tanous { 7789712f8acSEd Tanous dbusLedState = "xyz.openbmc_project.Led.Physical.Action.Lit"; 7796617338dSEd Tanous } 7809712f8acSEd Tanous else if (*indicatorLed == "Blink") 7816617338dSEd Tanous { 7826617338dSEd Tanous dbusLedState = 7836617338dSEd Tanous "xyz.openbmc_project.Led.Physical.Action.Blinking"; 7846617338dSEd Tanous } 7859712f8acSEd Tanous else if (*indicatorLed == "Off") 7866617338dSEd Tanous { 7879712f8acSEd Tanous dbusLedState = "xyz.openbmc_project.Led.Physical.Action.Off"; 7886617338dSEd Tanous } 7896617338dSEd Tanous else 7906617338dSEd Tanous { 791a08b46ccSJason M. Bills messages::propertyValueNotInList(res, *indicatorLed, 792a08b46ccSJason M. Bills "IndicatorLED"); 7936617338dSEd Tanous return; 7946617338dSEd Tanous } 7956617338dSEd Tanous 7966c34de48SEd Tanous getHostState(asyncResp); 7976c34de48SEd Tanous getComputerSystem(asyncResp, name); 798c5b2abe0SLewanczyk, Dawid 799c5b2abe0SLewanczyk, Dawid // Update led group 80055c7b7a2SEd Tanous BMCWEB_LOG_DEBUG << "Update led group."; 80155c7b7a2SEd Tanous crow::connections::systemBus->async_method_call( 8026617338dSEd Tanous [asyncResp{std::move(asyncResp)}]( 803c5b2abe0SLewanczyk, Dawid const boost::system::error_code ec) { 8041abe55efSEd Tanous if (ec) 8051abe55efSEd Tanous { 80655c7b7a2SEd Tanous BMCWEB_LOG_DEBUG << "DBUS response error " << ec; 807f12894f8SJason M. Bills messages::internalError(asyncResp->res); 808c5b2abe0SLewanczyk, Dawid return; 809c5b2abe0SLewanczyk, Dawid } 81055c7b7a2SEd Tanous BMCWEB_LOG_DEBUG << "Led group update done."; 811c5b2abe0SLewanczyk, Dawid }, 812c5b2abe0SLewanczyk, Dawid "xyz.openbmc_project.LED.GroupManager", 813c5b2abe0SLewanczyk, Dawid "/xyz/openbmc_project/led/groups/enclosure_identify", 814c5b2abe0SLewanczyk, Dawid "org.freedesktop.DBus.Properties", "Set", 815c5b2abe0SLewanczyk, Dawid "xyz.openbmc_project.Led.Group", "Asserted", 816c5b2abe0SLewanczyk, Dawid sdbusplus::message::variant<bool>( 8176617338dSEd Tanous (dbusLedState == 8186617338dSEd Tanous "xyz.openbmc_project.Led.Physical.Action.Off" 8196617338dSEd Tanous ? false 8206617338dSEd Tanous : true))); 821c5b2abe0SLewanczyk, Dawid // Update identify led status 82255c7b7a2SEd Tanous BMCWEB_LOG_DEBUG << "Update led SoftwareInventoryCollection."; 82355c7b7a2SEd Tanous crow::connections::systemBus->async_method_call( 8246617338dSEd Tanous [asyncResp{std::move(asyncResp)}, 8259712f8acSEd Tanous indicatorLed{std::move(*indicatorLed)}]( 826c5b2abe0SLewanczyk, Dawid const boost::system::error_code ec) { 8271abe55efSEd Tanous if (ec) 8281abe55efSEd Tanous { 82955c7b7a2SEd Tanous BMCWEB_LOG_DEBUG << "DBUS response error " << ec; 830f12894f8SJason M. Bills messages::internalError(asyncResp->res); 831c5b2abe0SLewanczyk, Dawid return; 832c5b2abe0SLewanczyk, Dawid } 83355c7b7a2SEd Tanous BMCWEB_LOG_DEBUG << "Led state update done."; 834c5b2abe0SLewanczyk, Dawid }, 835c5b2abe0SLewanczyk, Dawid "xyz.openbmc_project.LED.Controller.identify", 836c5b2abe0SLewanczyk, Dawid "/xyz/openbmc_project/led/physical/identify", 837c5b2abe0SLewanczyk, Dawid "org.freedesktop.DBus.Properties", "Set", 838c5b2abe0SLewanczyk, Dawid "xyz.openbmc_project.Led.Physical", "State", 8396617338dSEd Tanous sdbusplus::message::variant<std::string>(dbusLedState)); 8406617338dSEd Tanous } 841c5b2abe0SLewanczyk, Dawid } 842c5b2abe0SLewanczyk, Dawid }; 843c5b2abe0SLewanczyk, Dawid } // namespace redfish 844