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"; 47*f12894f8SJason 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; 81*f12894f8SJason 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 = 901abe55efSEd Tanous mapbox::getPtr<const std::string>( 911abe55efSEd Tanous 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; 129*f12894f8SJason 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 = 1431abe55efSEd Tanous mapbox::getPtr< 14404a258f4SEd Tanous const uint64_t>( 14504a258f4SEd Tanous property.second); 14604a258f4SEd Tanous if (value != nullptr) 1471abe55efSEd Tanous { 1481abe55efSEd Tanous aResp->res.jsonValue 1496c34de48SEd Tanous ["TotalSystemMemoryGi" 1506c34de48SEd Tanous "B"] += 15104a258f4SEd Tanous *value / (1024 * 1024); 1521abe55efSEd Tanous aResp->res.jsonValue 1531abe55efSEd Tanous ["MemorySummary"] 1546c34de48SEd Tanous ["Status"]["State"] = 1551abe55efSEd Tanous "Enabled"; 156c5b2abe0SLewanczyk, Dawid } 157c5b2abe0SLewanczyk, Dawid } 158c5b2abe0SLewanczyk, Dawid } 159c5b2abe0SLewanczyk, Dawid }, 16004a258f4SEd Tanous connection.first, path, 1616c34de48SEd Tanous "org.freedesktop.DBus.Properties", "GetAll", 1626c34de48SEd Tanous "xyz.openbmc_project.Inventory.Item.Dimm"); 1631abe55efSEd Tanous } 16404a258f4SEd Tanous else if (interfaceName == 16504a258f4SEd Tanous "xyz.openbmc_project.Inventory.Item.Cpu") 1661abe55efSEd Tanous { 1671abe55efSEd Tanous BMCWEB_LOG_DEBUG 16804a258f4SEd Tanous << "Found Cpu, now get its properties."; 169a0803efaSEd Tanous crow::connections::systemBus->async_method_call( 1706617338dSEd Tanous [aResp]( 171a0803efaSEd Tanous const boost::system::error_code ec, 1726c34de48SEd Tanous const std::vector< 1736c34de48SEd Tanous std::pair<std::string, VariantType>> 1741abe55efSEd Tanous &properties) { 1751abe55efSEd Tanous if (ec) 1761abe55efSEd Tanous { 1771abe55efSEd Tanous BMCWEB_LOG_ERROR 1786c34de48SEd Tanous << "DBUS response error " << ec; 179*f12894f8SJason M. Bills messages::internalError(aResp->res); 180c5b2abe0SLewanczyk, Dawid return; 181c5b2abe0SLewanczyk, Dawid } 1826c34de48SEd Tanous BMCWEB_LOG_DEBUG << "Got " 1836c34de48SEd Tanous << properties.size() 184c5b2abe0SLewanczyk, Dawid << "Cpu properties."; 18504a258f4SEd Tanous for (const auto &property : properties) 1861abe55efSEd Tanous { 18704a258f4SEd Tanous if (property.first == 18804a258f4SEd Tanous "ProcessorFamily") 1891abe55efSEd Tanous { 190a0803efaSEd Tanous const std::string *value = 1911abe55efSEd Tanous mapbox::getPtr< 192a0803efaSEd Tanous const std::string>( 19304a258f4SEd Tanous property.second); 1941abe55efSEd Tanous if (value != nullptr) 1951abe55efSEd Tanous { 19604a258f4SEd Tanous nlohmann::json 19704a258f4SEd Tanous &procSummary = 1981abe55efSEd Tanous aResp->res.jsonValue 1996c34de48SEd Tanous ["ProcessorSumm" 20004a258f4SEd Tanous "ary"]; 20104a258f4SEd Tanous nlohmann::json &procCount = 20204a258f4SEd Tanous procSummary["Count"]; 20304a258f4SEd Tanous 20404a258f4SEd Tanous procCount = 20504a258f4SEd Tanous procCount.get<int>() + 206c5b2abe0SLewanczyk, Dawid 1; 20704a258f4SEd Tanous procSummary["Status"] 20804a258f4SEd Tanous ["State"] = 209c5b2abe0SLewanczyk, Dawid "Enabled"; 21004a258f4SEd Tanous procSummary["Model"] = 21104a258f4SEd Tanous *value; 212c5b2abe0SLewanczyk, Dawid } 213c5b2abe0SLewanczyk, Dawid } 214c5b2abe0SLewanczyk, Dawid } 215c5b2abe0SLewanczyk, Dawid }, 21604a258f4SEd Tanous connection.first, path, 2176c34de48SEd Tanous "org.freedesktop.DBus.Properties", "GetAll", 2186c34de48SEd Tanous "xyz.openbmc_project.Inventory.Item.Cpu"); 2191abe55efSEd Tanous } 22004a258f4SEd Tanous else if (interfaceName == 22104a258f4SEd Tanous "xyz.openbmc_project.Common.UUID") 2221abe55efSEd Tanous { 2231abe55efSEd Tanous BMCWEB_LOG_DEBUG 22404a258f4SEd Tanous << "Found UUID, now get its properties."; 22555c7b7a2SEd Tanous crow::connections::systemBus->async_method_call( 2261abe55efSEd Tanous [aResp]( 2271abe55efSEd Tanous const boost::system::error_code ec, 2286c34de48SEd Tanous const std::vector< 2296c34de48SEd Tanous std::pair<std::string, VariantType>> 2301abe55efSEd Tanous &properties) { 2311abe55efSEd Tanous if (ec) 2321abe55efSEd Tanous { 2331abe55efSEd Tanous BMCWEB_LOG_DEBUG 2346c34de48SEd Tanous << "DBUS response error " << ec; 235*f12894f8SJason M. Bills messages::internalError(aResp->res); 236c5b2abe0SLewanczyk, Dawid return; 237c5b2abe0SLewanczyk, Dawid } 2386c34de48SEd Tanous BMCWEB_LOG_DEBUG << "Got " 2396c34de48SEd Tanous << properties.size() 240c5b2abe0SLewanczyk, Dawid << "UUID properties."; 2411abe55efSEd Tanous for (const std::pair<std::string, 24204a258f4SEd Tanous VariantType> 24304a258f4SEd Tanous &property : properties) 2441abe55efSEd Tanous { 24504a258f4SEd Tanous if (property.first == "BIOSVer") 2461abe55efSEd Tanous { 247c5b2abe0SLewanczyk, Dawid const std::string *value = 2481abe55efSEd Tanous mapbox::getPtr< 2491abe55efSEd Tanous const std::string>( 25004a258f4SEd Tanous property.second); 2511abe55efSEd Tanous if (value != nullptr) 2521abe55efSEd Tanous { 2531abe55efSEd Tanous aResp->res.jsonValue 2541abe55efSEd Tanous ["BiosVersion"] = 2551abe55efSEd Tanous *value; 256c5b2abe0SLewanczyk, Dawid } 257c5b2abe0SLewanczyk, Dawid } 25804a258f4SEd Tanous if (property.first == "UUID") 2591abe55efSEd Tanous { 260c5b2abe0SLewanczyk, Dawid const std::string *value = 2611abe55efSEd Tanous mapbox::getPtr< 2621abe55efSEd Tanous const std::string>( 26304a258f4SEd Tanous property.second); 26404a258f4SEd Tanous 2651abe55efSEd Tanous if (value != nullptr) 2661abe55efSEd Tanous { 26704a258f4SEd Tanous std::string valueStr = 2681abe55efSEd Tanous *value; 26904a258f4SEd Tanous if (valueStr.size() == 32) 2701abe55efSEd Tanous { 27104a258f4SEd Tanous valueStr.insert(8, 1, 27204a258f4SEd Tanous '-'); 27304a258f4SEd Tanous valueStr.insert(13, 1, 27404a258f4SEd Tanous '-'); 27504a258f4SEd Tanous valueStr.insert(18, 1, 27604a258f4SEd Tanous '-'); 27704a258f4SEd Tanous valueStr.insert(23, 1, 27804a258f4SEd Tanous '-'); 27904a258f4SEd Tanous } 28004a258f4SEd Tanous BMCWEB_LOG_DEBUG 28104a258f4SEd Tanous << "UUID = " 28204a258f4SEd Tanous << valueStr; 2836c34de48SEd Tanous aResp->res 2846c34de48SEd Tanous .jsonValue["UUID"] = 28504a258f4SEd Tanous valueStr; 286c5b2abe0SLewanczyk, Dawid } 287c5b2abe0SLewanczyk, Dawid } 288c5b2abe0SLewanczyk, Dawid } 289c5b2abe0SLewanczyk, Dawid }, 29004a258f4SEd Tanous connection.first, path, 2916c34de48SEd Tanous "org.freedesktop.DBus.Properties", "GetAll", 2921abe55efSEd Tanous "xyz.openbmc_project.Common.UUID"); 293c5b2abe0SLewanczyk, Dawid } 294c5b2abe0SLewanczyk, Dawid } 295c5b2abe0SLewanczyk, Dawid } 296c5b2abe0SLewanczyk, Dawid } 297c5b2abe0SLewanczyk, Dawid } 2981abe55efSEd Tanous if (foundName == false) 2991abe55efSEd Tanous { 300*f12894f8SJason M. Bills messages::internalError(aResp->res); 301c5b2abe0SLewanczyk, Dawid } 302c5b2abe0SLewanczyk, Dawid }, 303c5b2abe0SLewanczyk, Dawid "xyz.openbmc_project.ObjectMapper", 304c5b2abe0SLewanczyk, Dawid "/xyz/openbmc_project/object_mapper", 305c5b2abe0SLewanczyk, Dawid "xyz.openbmc_project.ObjectMapper", "GetSubTree", 3066617338dSEd Tanous "/xyz/openbmc_project/inventory", int32_t(0), 3076617338dSEd Tanous std::array<const char *, 5>{ 3086617338dSEd Tanous "xyz.openbmc_project.Inventory.Decorator.Asset", 3096617338dSEd Tanous "xyz.openbmc_project.Inventory.Item.Cpu", 3106617338dSEd Tanous "xyz.openbmc_project.Inventory.Item.Dimm", 3116617338dSEd Tanous "xyz.openbmc_project.Inventory.Item.System", 3126617338dSEd Tanous "xyz.openbmc_project.Common.UUID", 3136617338dSEd Tanous }); 314c5b2abe0SLewanczyk, Dawid } 315c5b2abe0SLewanczyk, Dawid 316c5b2abe0SLewanczyk, Dawid /** 317c5b2abe0SLewanczyk, Dawid * @brief Retrieves identify led group properties over dbus 318c5b2abe0SLewanczyk, Dawid * 319c5b2abe0SLewanczyk, Dawid * @param[in] aResp Shared pointer for completing asynchronous calls. 320c5b2abe0SLewanczyk, Dawid * @param[in] callback Callback for process retrieved data. 321c5b2abe0SLewanczyk, Dawid * 322c5b2abe0SLewanczyk, Dawid * @return None. 323c5b2abe0SLewanczyk, Dawid */ 324c5b2abe0SLewanczyk, Dawid template <typename CallbackFunc> 325a0803efaSEd Tanous void getLedGroupIdentify(std::shared_ptr<AsyncResp> aResp, 3261abe55efSEd Tanous CallbackFunc &&callback) 3271abe55efSEd Tanous { 32855c7b7a2SEd Tanous BMCWEB_LOG_DEBUG << "Get led groups"; 32955c7b7a2SEd Tanous crow::connections::systemBus->async_method_call( 3301abe55efSEd Tanous [aResp{std::move(aResp)}, 3316617338dSEd Tanous callback{std::move(callback)}](const boost::system::error_code &ec, 3321abe55efSEd Tanous const ManagedObjectsType &resp) { 3331abe55efSEd Tanous if (ec) 3341abe55efSEd Tanous { 33555c7b7a2SEd Tanous BMCWEB_LOG_DEBUG << "DBUS response error " << ec; 336*f12894f8SJason M. Bills messages::internalError(aResp->res); 337c5b2abe0SLewanczyk, Dawid return; 338c5b2abe0SLewanczyk, Dawid } 3396c34de48SEd Tanous BMCWEB_LOG_DEBUG << "Got " << resp.size() << "led group objects."; 3401abe55efSEd Tanous for (const auto &objPath : resp) 3411abe55efSEd Tanous { 342c5b2abe0SLewanczyk, Dawid const std::string &path = objPath.first; 3431abe55efSEd Tanous if (path.rfind("enclosure_identify") != std::string::npos) 3441abe55efSEd Tanous { 3451abe55efSEd Tanous for (const auto &interface : objPath.second) 3461abe55efSEd Tanous { 3476c34de48SEd Tanous if (interface.first == "xyz.openbmc_project.Led.Group") 3481abe55efSEd Tanous { 3491abe55efSEd Tanous for (const auto &property : interface.second) 3501abe55efSEd Tanous { 3511abe55efSEd Tanous if (property.first == "Asserted") 3521abe55efSEd Tanous { 353c5b2abe0SLewanczyk, Dawid const bool *asserted = 3541abe55efSEd Tanous mapbox::getPtr<const bool>( 3551abe55efSEd Tanous property.second); 3561abe55efSEd Tanous if (nullptr != asserted) 3571abe55efSEd Tanous { 358c5b2abe0SLewanczyk, Dawid callback(*asserted, aResp); 3591abe55efSEd Tanous } 3601abe55efSEd Tanous else 3611abe55efSEd Tanous { 362c5b2abe0SLewanczyk, Dawid callback(false, aResp); 363c5b2abe0SLewanczyk, Dawid } 364c5b2abe0SLewanczyk, Dawid } 365c5b2abe0SLewanczyk, Dawid } 366c5b2abe0SLewanczyk, Dawid } 367c5b2abe0SLewanczyk, Dawid } 368c5b2abe0SLewanczyk, Dawid } 369c5b2abe0SLewanczyk, Dawid } 370c5b2abe0SLewanczyk, Dawid }, 371c5b2abe0SLewanczyk, Dawid "xyz.openbmc_project.LED.GroupManager", 3726c34de48SEd Tanous "/xyz/openbmc_project/led/groups", "org.freedesktop.DBus.ObjectManager", 3736c34de48SEd Tanous "GetManagedObjects"); 374c5b2abe0SLewanczyk, Dawid } 375c5b2abe0SLewanczyk, Dawid 376c5b2abe0SLewanczyk, Dawid template <typename CallbackFunc> 3776c34de48SEd Tanous void getLedIdentify(std::shared_ptr<AsyncResp> aResp, CallbackFunc &&callback) 3781abe55efSEd Tanous { 37955c7b7a2SEd Tanous BMCWEB_LOG_DEBUG << "Get identify led properties"; 38055c7b7a2SEd Tanous crow::connections::systemBus->async_method_call( 3816617338dSEd Tanous [aResp, 3826617338dSEd Tanous callback{std::move(callback)}](const boost::system::error_code ec, 383c5b2abe0SLewanczyk, Dawid const PropertiesType &properties) { 3841abe55efSEd Tanous if (ec) 3851abe55efSEd Tanous { 38655c7b7a2SEd Tanous BMCWEB_LOG_DEBUG << "DBUS response error " << ec; 387*f12894f8SJason M. Bills messages::internalError(aResp->res); 388c5b2abe0SLewanczyk, Dawid return; 389c5b2abe0SLewanczyk, Dawid } 3901abe55efSEd Tanous BMCWEB_LOG_DEBUG << "Got " << properties.size() 3911abe55efSEd Tanous << "led properties."; 392c5b2abe0SLewanczyk, Dawid std::string output; 3931abe55efSEd Tanous for (const auto &property : properties) 3941abe55efSEd Tanous { 3951abe55efSEd Tanous if (property.first == "State") 3961abe55efSEd Tanous { 397c5b2abe0SLewanczyk, Dawid const std::string *s = 39855c7b7a2SEd Tanous mapbox::getPtr<std::string>(property.second); 3991abe55efSEd Tanous if (nullptr != s) 4001abe55efSEd Tanous { 40155c7b7a2SEd Tanous BMCWEB_LOG_DEBUG << "Identify Led State: " << *s; 402c5b2abe0SLewanczyk, Dawid const auto pos = s->rfind('.'); 4031abe55efSEd Tanous if (pos != std::string::npos) 4041abe55efSEd Tanous { 405c5b2abe0SLewanczyk, Dawid auto led = s->substr(pos + 1); 4061abe55efSEd Tanous for (const std::pair<const char *, const char *> 4071abe55efSEd Tanous &p : 4081abe55efSEd Tanous std::array< 4096c34de48SEd Tanous std::pair<const char *, const char *>, 3>{ 4106c34de48SEd Tanous {{"On", "Lit"}, 411c5b2abe0SLewanczyk, Dawid {"Blink", "Blinking"}, 4121abe55efSEd Tanous {"Off", "Off"}}}) 4131abe55efSEd Tanous { 4141abe55efSEd Tanous if (led == p.first) 4151abe55efSEd Tanous { 416c5b2abe0SLewanczyk, Dawid output = p.second; 417c5b2abe0SLewanczyk, Dawid } 418c5b2abe0SLewanczyk, Dawid } 419c5b2abe0SLewanczyk, Dawid } 420c5b2abe0SLewanczyk, Dawid } 421c5b2abe0SLewanczyk, Dawid } 422c5b2abe0SLewanczyk, Dawid } 423c5b2abe0SLewanczyk, Dawid callback(output, aResp); 424c5b2abe0SLewanczyk, Dawid }, 425c5b2abe0SLewanczyk, Dawid "xyz.openbmc_project.LED.Controller.identify", 426c5b2abe0SLewanczyk, Dawid "/xyz/openbmc_project/led/physical/identify", 427c5b2abe0SLewanczyk, Dawid "org.freedesktop.DBus.Properties", "GetAll", 428c5b2abe0SLewanczyk, Dawid "xyz.openbmc_project.Led.Physical"); 429c5b2abe0SLewanczyk, Dawid } 430c5b2abe0SLewanczyk, Dawid 431c5b2abe0SLewanczyk, Dawid /** 432c5b2abe0SLewanczyk, Dawid * @brief Retrieves host state properties over dbus 433c5b2abe0SLewanczyk, Dawid * 434c5b2abe0SLewanczyk, Dawid * @param[in] aResp Shared pointer for completing asynchronous calls. 435c5b2abe0SLewanczyk, Dawid * 436c5b2abe0SLewanczyk, Dawid * @return None. 437c5b2abe0SLewanczyk, Dawid */ 438a0803efaSEd Tanous void getHostState(std::shared_ptr<AsyncResp> aResp) 4391abe55efSEd Tanous { 44055c7b7a2SEd Tanous BMCWEB_LOG_DEBUG << "Get host information."; 44155c7b7a2SEd Tanous crow::connections::systemBus->async_method_call( 4426617338dSEd Tanous [aResp{std::move(aResp)}]( 4436617338dSEd Tanous const boost::system::error_code ec, 4446617338dSEd Tanous const sdbusplus::message::variant<std::string> &hostState) { 4451abe55efSEd Tanous if (ec) 4461abe55efSEd Tanous { 44755c7b7a2SEd Tanous BMCWEB_LOG_DEBUG << "DBUS response error " << ec; 448*f12894f8SJason M. Bills messages::internalError(aResp->res); 449c5b2abe0SLewanczyk, Dawid return; 450c5b2abe0SLewanczyk, Dawid } 4516617338dSEd Tanous 4526617338dSEd Tanous const std::string *s = mapbox::getPtr<const std::string>(hostState); 45355c7b7a2SEd Tanous BMCWEB_LOG_DEBUG << "Host state: " << *s; 4546617338dSEd Tanous if (s != nullptr) 4551abe55efSEd Tanous { 456c5b2abe0SLewanczyk, Dawid // Verify Host State 4576617338dSEd Tanous if (*s == "xyz.openbmc_project.State.Host.Running") 4581abe55efSEd Tanous { 45955c7b7a2SEd Tanous aResp->res.jsonValue["PowerState"] = "On"; 4606617338dSEd Tanous aResp->res.jsonValue["Status"]["State"] = "Enabled"; 4611abe55efSEd Tanous } 4621abe55efSEd Tanous else 4631abe55efSEd Tanous { 46455c7b7a2SEd Tanous aResp->res.jsonValue["PowerState"] = "Off"; 4656617338dSEd Tanous aResp->res.jsonValue["Status"]["State"] = "Disabled"; 466c5b2abe0SLewanczyk, Dawid } 467c5b2abe0SLewanczyk, Dawid } 468c5b2abe0SLewanczyk, Dawid }, 4696c34de48SEd Tanous "xyz.openbmc_project.State.Host", "/xyz/openbmc_project/state/host0", 4706617338dSEd Tanous "org.freedesktop.DBus.Properties", "Get", 4716617338dSEd Tanous "xyz.openbmc_project.State.Host", "CurrentHostState"); 472c5b2abe0SLewanczyk, Dawid } 473c5b2abe0SLewanczyk, Dawid 474c5b2abe0SLewanczyk, Dawid /** 475c5b2abe0SLewanczyk, Dawid * SystemsCollection derived class for delivering ComputerSystems Collection 476c5b2abe0SLewanczyk, Dawid * Schema 477c5b2abe0SLewanczyk, Dawid */ 4781abe55efSEd Tanous class SystemsCollection : public Node 4791abe55efSEd Tanous { 480c5b2abe0SLewanczyk, Dawid public: 4811abe55efSEd Tanous SystemsCollection(CrowApp &app) : Node(app, "/redfish/v1/Systems/") 4821abe55efSEd Tanous { 483c5b2abe0SLewanczyk, Dawid Node::json["@odata.type"] = 484c5b2abe0SLewanczyk, Dawid "#ComputerSystemCollection.ComputerSystemCollection"; 485c5b2abe0SLewanczyk, Dawid Node::json["@odata.id"] = "/redfish/v1/Systems"; 486c5b2abe0SLewanczyk, Dawid Node::json["@odata.context"] = 487c5b2abe0SLewanczyk, Dawid "/redfish/v1/" 488c5b2abe0SLewanczyk, Dawid "$metadata#ComputerSystemCollection.ComputerSystemCollection"; 489c5b2abe0SLewanczyk, Dawid Node::json["Name"] = "Computer System Collection"; 490c5b2abe0SLewanczyk, Dawid 491c5b2abe0SLewanczyk, Dawid entityPrivileges = { 492c5b2abe0SLewanczyk, Dawid {boost::beast::http::verb::get, {{"Login"}}}, 493c5b2abe0SLewanczyk, Dawid {boost::beast::http::verb::head, {{"Login"}}}, 494c5b2abe0SLewanczyk, Dawid {boost::beast::http::verb::patch, {{"ConfigureComponents"}}}, 495c5b2abe0SLewanczyk, Dawid {boost::beast::http::verb::put, {{"ConfigureComponents"}}}, 496c5b2abe0SLewanczyk, Dawid {boost::beast::http::verb::delete_, {{"ConfigureComponents"}}}, 497c5b2abe0SLewanczyk, Dawid {boost::beast::http::verb::post, {{"ConfigureComponents"}}}}; 498c5b2abe0SLewanczyk, Dawid } 499c5b2abe0SLewanczyk, Dawid 500c5b2abe0SLewanczyk, Dawid private: 50155c7b7a2SEd Tanous void doGet(crow::Response &res, const crow::Request &req, 5021abe55efSEd Tanous const std::vector<std::string> ¶ms) override 5031abe55efSEd Tanous { 5046617338dSEd Tanous BMCWEB_LOG_DEBUG << "Get list of available boards."; 5056617338dSEd Tanous std::shared_ptr<AsyncResp> asyncResp = std::make_shared<AsyncResp>(res); 5066617338dSEd Tanous res.jsonValue = Node::json; 5076617338dSEd Tanous crow::connections::systemBus->async_method_call( 5086617338dSEd Tanous [asyncResp](const boost::system::error_code ec, 5096617338dSEd Tanous const std::vector<std::string> &resp) { 5106617338dSEd Tanous if (ec) 5111abe55efSEd Tanous { 512*f12894f8SJason M. Bills messages::internalError(asyncResp->res); 5136617338dSEd Tanous return; 5146617338dSEd Tanous } 5156617338dSEd Tanous BMCWEB_LOG_DEBUG << "Got " << resp.size() << " boards."; 5166617338dSEd Tanous 517c5b2abe0SLewanczyk, Dawid // ... prepare json array with appropriate @odata.id links 5186617338dSEd Tanous nlohmann::json &boardArray = 5196617338dSEd Tanous asyncResp->res.jsonValue["Members"]; 5206617338dSEd Tanous boardArray = nlohmann::json::array(); 5216617338dSEd Tanous 5226617338dSEd Tanous // Iterate over all retrieved ObjectPaths. 5236617338dSEd Tanous for (const std::string &objpath : resp) 5246617338dSEd Tanous { 5256617338dSEd Tanous std::size_t lastPos = objpath.rfind("/"); 5266617338dSEd Tanous if (lastPos != std::string::npos) 5271abe55efSEd Tanous { 528c5b2abe0SLewanczyk, Dawid boardArray.push_back( 5296617338dSEd Tanous {{"@odata.id", "/redfish/v1/Systems/" + 5306617338dSEd Tanous objpath.substr(lastPos + 1)}}); 531c5b2abe0SLewanczyk, Dawid } 5321abe55efSEd Tanous } 5336617338dSEd Tanous 5346617338dSEd Tanous asyncResp->res.jsonValue["Members@odata.count"] = 5356617338dSEd Tanous boardArray.size(); 5366617338dSEd Tanous }, 5376617338dSEd Tanous "xyz.openbmc_project.ObjectMapper", 5386617338dSEd Tanous "/xyz/openbmc_project/object_mapper", 5396617338dSEd Tanous "xyz.openbmc_project.ObjectMapper", "GetSubTreePaths", 5406617338dSEd Tanous "/xyz/openbmc_project/inventory", int32_t(0), 5416617338dSEd Tanous std::array<const char *, 1>{ 5426617338dSEd Tanous "xyz.openbmc_project.Inventory.Item.Board"}); 543c5b2abe0SLewanczyk, Dawid } 544c5b2abe0SLewanczyk, Dawid }; 545c5b2abe0SLewanczyk, Dawid 546c5b2abe0SLewanczyk, Dawid /** 547cc340dd9SEd Tanous * SystemActionsReset class supports handle POST method for Reset action. 548cc340dd9SEd Tanous * The class retrieves and sends data directly to D-Bus. 549cc340dd9SEd Tanous */ 550cc340dd9SEd Tanous class SystemActionsReset : public Node 551cc340dd9SEd Tanous { 552cc340dd9SEd Tanous public: 553cc340dd9SEd Tanous SystemActionsReset(CrowApp &app) : 554cc340dd9SEd Tanous Node(app, "/redfish/v1/Systems/<str>/Actions/ComputerSystem.Reset/", 555cc340dd9SEd Tanous std::string()) 556cc340dd9SEd Tanous { 557cc340dd9SEd Tanous entityPrivileges = { 558cc340dd9SEd Tanous {boost::beast::http::verb::post, {{"ConfigureComponents"}}}}; 559cc340dd9SEd Tanous } 560cc340dd9SEd Tanous 561cc340dd9SEd Tanous private: 562cc340dd9SEd Tanous /** 563cc340dd9SEd Tanous * Function handles POST method request. 564cc340dd9SEd Tanous * Analyzes POST body message before sends Reset request data to D-Bus. 565cc340dd9SEd Tanous */ 566cc340dd9SEd Tanous void doPost(crow::Response &res, const crow::Request &req, 567cc340dd9SEd Tanous const std::vector<std::string> ¶ms) override 568cc340dd9SEd Tanous { 569cc340dd9SEd Tanous auto asyncResp = std::make_shared<AsyncResp>(res); 570cc340dd9SEd Tanous 5719712f8acSEd Tanous std::string resetType; 5729712f8acSEd Tanous if (!json_util::readJson(req, res, "ResetType", resetType)) 573cc340dd9SEd Tanous { 574cc340dd9SEd Tanous return; 575cc340dd9SEd Tanous } 576cc340dd9SEd Tanous 5779712f8acSEd Tanous if (resetType == "ForceOff") 578cc340dd9SEd Tanous { 579cc340dd9SEd Tanous // Force off acts on the chassis 580cc340dd9SEd Tanous crow::connections::systemBus->async_method_call( 581cc340dd9SEd Tanous [asyncResp](const boost::system::error_code ec) { 582cc340dd9SEd Tanous if (ec) 583cc340dd9SEd Tanous { 5849712f8acSEd Tanous BMCWEB_LOG_ERROR << "D-Bus responses error: " << ec; 585*f12894f8SJason M. Bills messages::internalError(asyncResp->res); 586cc340dd9SEd Tanous return; 587cc340dd9SEd Tanous } 588cc340dd9SEd Tanous // TODO Consider support polling mechanism to verify 589cc340dd9SEd Tanous // status of host and chassis after execute the 590cc340dd9SEd Tanous // requested action. 591*f12894f8SJason M. Bills messages::success(asyncResp->res); 592cc340dd9SEd Tanous }, 593cc340dd9SEd Tanous "xyz.openbmc_project.State.Chassis", 594cc340dd9SEd Tanous "/xyz/openbmc_project/state/chassis0", 595cc340dd9SEd Tanous "org.freedesktop.DBus.Properties", "Set", 5969712f8acSEd Tanous "xyz.openbmc_project.State.Chassis", "RequestedPowerTransition", 597cc340dd9SEd Tanous sdbusplus::message::variant<std::string>{ 5989712f8acSEd Tanous "xyz.openbmc_project.State.Chassis.Transition.Off"}); 599cc340dd9SEd Tanous return; 600cc340dd9SEd Tanous } 601cc340dd9SEd Tanous // all other actions operate on the host 602cc340dd9SEd Tanous std::string command; 603cc340dd9SEd Tanous // Execute Reset Action regarding to each reset type. 6049712f8acSEd Tanous if (resetType == "On") 605cc340dd9SEd Tanous { 606cc340dd9SEd Tanous command = "xyz.openbmc_project.State.Host.Transition.On"; 607cc340dd9SEd Tanous } 6089712f8acSEd Tanous else if (resetType == "GracefulShutdown") 609cc340dd9SEd Tanous { 610cc340dd9SEd Tanous command = "xyz.openbmc_project.State.Host.Transition.Off"; 611cc340dd9SEd Tanous } 6129712f8acSEd Tanous else if (resetType == "GracefulRestart") 613cc340dd9SEd Tanous { 6149712f8acSEd Tanous command = "xyz.openbmc_project.State.Host.Transition.Reboot"; 615cc340dd9SEd Tanous } 616cc340dd9SEd Tanous else 617cc340dd9SEd Tanous { 618*f12894f8SJason M. Bills messages::actionParameterUnknown(res, "Reset", resetType); 619cc340dd9SEd Tanous return; 620cc340dd9SEd Tanous } 621cc340dd9SEd Tanous 622cc340dd9SEd Tanous crow::connections::systemBus->async_method_call( 623cc340dd9SEd Tanous [asyncResp](const boost::system::error_code ec) { 624cc340dd9SEd Tanous if (ec) 625cc340dd9SEd Tanous { 626cc340dd9SEd Tanous BMCWEB_LOG_ERROR << "D-Bus responses error: " << ec; 627*f12894f8SJason M. Bills messages::internalError(asyncResp->res); 628cc340dd9SEd Tanous return; 629cc340dd9SEd Tanous } 630cc340dd9SEd Tanous // TODO Consider support polling mechanism to verify 631cc340dd9SEd Tanous // status of host and chassis after execute the 632cc340dd9SEd Tanous // requested action. 633*f12894f8SJason M. Bills messages::success(asyncResp->res); 634cc340dd9SEd Tanous }, 635cc340dd9SEd Tanous "xyz.openbmc_project.State.Host", 636cc340dd9SEd Tanous "/xyz/openbmc_project/state/host0", 637cc340dd9SEd Tanous "org.freedesktop.DBus.Properties", "Set", 6389712f8acSEd Tanous "xyz.openbmc_project.State.Host", "RequestedHostTransition", 639cc340dd9SEd Tanous sdbusplus::message::variant<std::string>{command}); 640cc340dd9SEd Tanous } 641cc340dd9SEd Tanous }; 642cc340dd9SEd Tanous 643cc340dd9SEd Tanous /** 6446617338dSEd Tanous * Systems derived class for delivering Computer Systems Schema. 645c5b2abe0SLewanczyk, Dawid */ 6461abe55efSEd Tanous class Systems : public Node 6471abe55efSEd Tanous { 648c5b2abe0SLewanczyk, Dawid public: 649c5b2abe0SLewanczyk, Dawid /* 650c5b2abe0SLewanczyk, Dawid * Default Constructor 651c5b2abe0SLewanczyk, Dawid */ 6521abe55efSEd Tanous Systems(CrowApp &app) : 6531abe55efSEd Tanous Node(app, "/redfish/v1/Systems/<str>/", std::string()) 6541abe55efSEd Tanous { 655c5b2abe0SLewanczyk, Dawid Node::json["@odata.type"] = "#ComputerSystem.v1_3_0.ComputerSystem"; 656c5b2abe0SLewanczyk, Dawid Node::json["@odata.context"] = 657c5b2abe0SLewanczyk, Dawid "/redfish/v1/$metadata#ComputerSystem.ComputerSystem"; 658c5b2abe0SLewanczyk, Dawid Node::json["SystemType"] = "Physical"; 659c5b2abe0SLewanczyk, Dawid Node::json["Description"] = "Computer System"; 660c5b2abe0SLewanczyk, Dawid Node::json["Boot"]["BootSourceOverrideEnabled"] = 661c5b2abe0SLewanczyk, Dawid "Disabled"; // TODO(Dawid), get real boot data 662c5b2abe0SLewanczyk, Dawid Node::json["Boot"]["BootSourceOverrideTarget"] = 663c5b2abe0SLewanczyk, Dawid "None"; // TODO(Dawid), get real boot data 664c5b2abe0SLewanczyk, Dawid Node::json["Boot"]["BootSourceOverrideMode"] = 665c5b2abe0SLewanczyk, Dawid "Legacy"; // TODO(Dawid), get real boot data 6661abe55efSEd Tanous Node::json["Boot"]["BootSourceOverrideTarget@Redfish.AllowableValues"] = 6671abe55efSEd Tanous {"None", "Pxe", "Hdd", "Cd", 6681abe55efSEd Tanous "BiosSetup", "UefiShell", "Usb"}; // TODO(Dawid), get real boot 6691abe55efSEd Tanous // data 67004a258f4SEd Tanous Node::json["ProcessorSummary"]["Count"] = 0; 671c5b2abe0SLewanczyk, Dawid Node::json["ProcessorSummary"]["Status"]["State"] = "Disabled"; 672c5b2abe0SLewanczyk, Dawid Node::json["MemorySummary"]["TotalSystemMemoryGiB"] = int(0); 673c5b2abe0SLewanczyk, Dawid Node::json["MemorySummary"]["Status"]["State"] = "Disabled"; 674c5b2abe0SLewanczyk, Dawid entityPrivileges = { 675c5b2abe0SLewanczyk, Dawid {boost::beast::http::verb::get, {{"Login"}}}, 676c5b2abe0SLewanczyk, Dawid {boost::beast::http::verb::head, {{"Login"}}}, 677c5b2abe0SLewanczyk, Dawid {boost::beast::http::verb::patch, {{"ConfigureComponents"}}}, 678c5b2abe0SLewanczyk, Dawid {boost::beast::http::verb::put, {{"ConfigureComponents"}}}, 679c5b2abe0SLewanczyk, Dawid {boost::beast::http::verb::delete_, {{"ConfigureComponents"}}}, 680c5b2abe0SLewanczyk, Dawid {boost::beast::http::verb::post, {{"ConfigureComponents"}}}}; 681c5b2abe0SLewanczyk, Dawid } 682c5b2abe0SLewanczyk, Dawid 683c5b2abe0SLewanczyk, Dawid private: 684c5b2abe0SLewanczyk, Dawid /** 685c5b2abe0SLewanczyk, Dawid * Functions triggers appropriate requests on DBus 686c5b2abe0SLewanczyk, Dawid */ 68755c7b7a2SEd Tanous void doGet(crow::Response &res, const crow::Request &req, 6881abe55efSEd Tanous const std::vector<std::string> ¶ms) override 6891abe55efSEd Tanous { 690c5b2abe0SLewanczyk, Dawid // Check if there is required param, truly entering this shall be 691c5b2abe0SLewanczyk, Dawid // impossible 6921abe55efSEd Tanous if (params.size() != 1) 6931abe55efSEd Tanous { 694*f12894f8SJason M. Bills messages::internalError(res); 695c5b2abe0SLewanczyk, Dawid res.end(); 696c5b2abe0SLewanczyk, Dawid return; 697c5b2abe0SLewanczyk, Dawid } 698c5b2abe0SLewanczyk, Dawid 699c5b2abe0SLewanczyk, Dawid const std::string &name = params[0]; 700c5b2abe0SLewanczyk, Dawid 70104a258f4SEd Tanous res.jsonValue = Node::json; 70204a258f4SEd Tanous res.jsonValue["@odata.id"] = "/redfish/v1/Systems/" + name; 70304a258f4SEd Tanous 704cc340dd9SEd Tanous // TODO Need to support ForceRestart. 705cc340dd9SEd Tanous res.jsonValue["Actions"]["#ComputerSystem.Reset"] = { 706cc340dd9SEd Tanous {"target", 707cc340dd9SEd Tanous "/redfish/v1/Systems/" + name + "/Actions/ComputerSystem.Reset"}, 708cc340dd9SEd Tanous {"ResetType@Redfish.AllowableValues", 709cc340dd9SEd Tanous {"On", "ForceOff", "GracefulRestart", "GracefulShutdown"}}}; 710c5b2abe0SLewanczyk, Dawid 711a0803efaSEd Tanous auto asyncResp = std::make_shared<AsyncResp>(res); 712c5b2abe0SLewanczyk, Dawid 7136c34de48SEd Tanous getLedGroupIdentify( 714a0803efaSEd Tanous asyncResp, 715a0803efaSEd Tanous [&](const bool &asserted, const std::shared_ptr<AsyncResp> &aResp) { 7161abe55efSEd Tanous if (asserted) 7171abe55efSEd Tanous { 718c5b2abe0SLewanczyk, Dawid // If led group is asserted, then another call is needed to 719c5b2abe0SLewanczyk, Dawid // get led status 7206c34de48SEd Tanous getLedIdentify( 721a0803efaSEd Tanous aResp, [](const std::string &ledStatus, 722a0803efaSEd Tanous const std::shared_ptr<AsyncResp> &aResp) { 7231abe55efSEd Tanous if (!ledStatus.empty()) 7241abe55efSEd Tanous { 7251abe55efSEd Tanous aResp->res.jsonValue["IndicatorLED"] = 7261abe55efSEd Tanous ledStatus; 727c5b2abe0SLewanczyk, Dawid } 728c5b2abe0SLewanczyk, Dawid }); 7291abe55efSEd Tanous } 7301abe55efSEd Tanous else 7311abe55efSEd Tanous { 73255c7b7a2SEd Tanous aResp->res.jsonValue["IndicatorLED"] = "Off"; 733c5b2abe0SLewanczyk, Dawid } 734c5b2abe0SLewanczyk, Dawid }); 7356c34de48SEd Tanous getComputerSystem(asyncResp, name); 7366c34de48SEd Tanous getHostState(asyncResp); 737c5b2abe0SLewanczyk, Dawid } 738c5b2abe0SLewanczyk, Dawid 73955c7b7a2SEd Tanous void doPatch(crow::Response &res, const crow::Request &req, 7401abe55efSEd Tanous const std::vector<std::string> ¶ms) override 7411abe55efSEd Tanous { 742c5b2abe0SLewanczyk, Dawid // Check if there is required param, truly entering this shall be 743c5b2abe0SLewanczyk, Dawid // impossible 7446617338dSEd Tanous auto asyncResp = std::make_shared<AsyncResp>(res); 7451abe55efSEd Tanous if (params.size() != 1) 7461abe55efSEd Tanous { 747*f12894f8SJason M. Bills messages::internalError(asyncResp->res); 748c5b2abe0SLewanczyk, Dawid return; 749c5b2abe0SLewanczyk, Dawid } 750c5b2abe0SLewanczyk, Dawid 7516617338dSEd Tanous const std::string &name = params[0]; 7526617338dSEd Tanous 75355c7b7a2SEd Tanous res.jsonValue = Node::json; 75455c7b7a2SEd Tanous res.jsonValue["@odata.id"] = "/redfish/v1/Systems/" + name; 755c5b2abe0SLewanczyk, Dawid 7569712f8acSEd Tanous std::string indicatorLedTemp; 7579712f8acSEd Tanous boost::optional<std::string> indicatorLed = indicatorLedTemp; 7589712f8acSEd Tanous if (!json_util::readJson(req, res, "IndicatorLed", indicatorLed)) 7596617338dSEd Tanous { 7606617338dSEd Tanous return; 7616617338dSEd Tanous } 7626617338dSEd Tanous 7639712f8acSEd Tanous if (indicatorLed) 7646617338dSEd Tanous { 7659712f8acSEd Tanous std::string dbusLedState; 7669712f8acSEd Tanous if (*indicatorLed == "On") 7679712f8acSEd Tanous { 7689712f8acSEd Tanous dbusLedState = "xyz.openbmc_project.Led.Physical.Action.Lit"; 7696617338dSEd Tanous } 7709712f8acSEd Tanous else if (*indicatorLed == "Blink") 7716617338dSEd Tanous { 7726617338dSEd Tanous dbusLedState = 7736617338dSEd Tanous "xyz.openbmc_project.Led.Physical.Action.Blinking"; 7746617338dSEd Tanous } 7759712f8acSEd Tanous else if (*indicatorLed == "Off") 7766617338dSEd Tanous { 7779712f8acSEd Tanous dbusLedState = "xyz.openbmc_project.Led.Physical.Action.Off"; 7786617338dSEd Tanous } 7796617338dSEd Tanous else 7806617338dSEd Tanous { 781*f12894f8SJason M. Bills messages::propertyValueNotInList( 782*f12894f8SJason M. Bills res, *indicatorLed, "IndicatorLED", "IndicatorLED"); 7836617338dSEd Tanous return; 7846617338dSEd Tanous } 7856617338dSEd Tanous 7866c34de48SEd Tanous getHostState(asyncResp); 7876c34de48SEd Tanous getComputerSystem(asyncResp, name); 788c5b2abe0SLewanczyk, Dawid 789c5b2abe0SLewanczyk, Dawid // Update led group 79055c7b7a2SEd Tanous BMCWEB_LOG_DEBUG << "Update led group."; 79155c7b7a2SEd Tanous crow::connections::systemBus->async_method_call( 7926617338dSEd Tanous [asyncResp{std::move(asyncResp)}]( 793c5b2abe0SLewanczyk, Dawid const boost::system::error_code ec) { 7941abe55efSEd Tanous if (ec) 7951abe55efSEd Tanous { 79655c7b7a2SEd Tanous BMCWEB_LOG_DEBUG << "DBUS response error " << ec; 797*f12894f8SJason M. Bills messages::internalError(asyncResp->res); 798c5b2abe0SLewanczyk, Dawid return; 799c5b2abe0SLewanczyk, Dawid } 80055c7b7a2SEd Tanous BMCWEB_LOG_DEBUG << "Led group update done."; 801c5b2abe0SLewanczyk, Dawid }, 802c5b2abe0SLewanczyk, Dawid "xyz.openbmc_project.LED.GroupManager", 803c5b2abe0SLewanczyk, Dawid "/xyz/openbmc_project/led/groups/enclosure_identify", 804c5b2abe0SLewanczyk, Dawid "org.freedesktop.DBus.Properties", "Set", 805c5b2abe0SLewanczyk, Dawid "xyz.openbmc_project.Led.Group", "Asserted", 806c5b2abe0SLewanczyk, Dawid sdbusplus::message::variant<bool>( 8076617338dSEd Tanous (dbusLedState == 8086617338dSEd Tanous "xyz.openbmc_project.Led.Physical.Action.Off" 8096617338dSEd Tanous ? false 8106617338dSEd Tanous : true))); 811c5b2abe0SLewanczyk, Dawid // Update identify led status 81255c7b7a2SEd Tanous BMCWEB_LOG_DEBUG << "Update led SoftwareInventoryCollection."; 81355c7b7a2SEd Tanous crow::connections::systemBus->async_method_call( 8146617338dSEd Tanous [asyncResp{std::move(asyncResp)}, 8159712f8acSEd Tanous indicatorLed{std::move(*indicatorLed)}]( 816c5b2abe0SLewanczyk, Dawid const boost::system::error_code ec) { 8171abe55efSEd Tanous if (ec) 8181abe55efSEd Tanous { 81955c7b7a2SEd Tanous BMCWEB_LOG_DEBUG << "DBUS response error " << ec; 820*f12894f8SJason M. Bills messages::internalError(asyncResp->res); 821c5b2abe0SLewanczyk, Dawid return; 822c5b2abe0SLewanczyk, Dawid } 82355c7b7a2SEd Tanous BMCWEB_LOG_DEBUG << "Led state update done."; 8246617338dSEd Tanous asyncResp->res.jsonValue["IndicatorLED"] = 8259712f8acSEd Tanous std::move(indicatorLed); 826c5b2abe0SLewanczyk, Dawid }, 827c5b2abe0SLewanczyk, Dawid "xyz.openbmc_project.LED.Controller.identify", 828c5b2abe0SLewanczyk, Dawid "/xyz/openbmc_project/led/physical/identify", 829c5b2abe0SLewanczyk, Dawid "org.freedesktop.DBus.Properties", "Set", 830c5b2abe0SLewanczyk, Dawid "xyz.openbmc_project.Led.Physical", "State", 8316617338dSEd Tanous sdbusplus::message::variant<std::string>(dbusLedState)); 8326617338dSEd Tanous } 833c5b2abe0SLewanczyk, Dawid } 834c5b2abe0SLewanczyk, Dawid }; 835c5b2abe0SLewanczyk, Dawid } // namespace redfish 836