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 181abe55efSEd Tanous #include "boost/container/flat_map.hpp" 191abe55efSEd Tanous #include "node.hpp" 201abe55efSEd Tanous 21c5b2abe0SLewanczyk, Dawid #include <utils/json_utils.hpp> 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 */ 34a0803efaSEd Tanous void getComputerSystem(std::shared_ptr<AsyncResp> aResp, 351abe55efSEd Tanous const std::string &name) 361abe55efSEd Tanous { 3755c7b7a2SEd Tanous BMCWEB_LOG_DEBUG << "Get available system components."; 3855c7b7a2SEd Tanous crow::connections::systemBus->async_method_call( 39c5b2abe0SLewanczyk, Dawid [name, aResp{std::move(aResp)}]( 40c5b2abe0SLewanczyk, Dawid const boost::system::error_code ec, 41c5b2abe0SLewanczyk, Dawid const std::vector<std::pair< 426c34de48SEd Tanous std::string, 436c34de48SEd Tanous std::vector<std::pair<std::string, std::vector<std::string>>>>> 44c5b2abe0SLewanczyk, Dawid &subtree) { 451abe55efSEd Tanous if (ec) 461abe55efSEd Tanous { 4755c7b7a2SEd Tanous BMCWEB_LOG_DEBUG << "DBUS response error"; 48a0803efaSEd Tanous aResp->res.result( 49a0803efaSEd Tanous boost::beast::http::status::internal_server_error); 50c5b2abe0SLewanczyk, Dawid return; 51c5b2abe0SLewanczyk, Dawid } 52c5b2abe0SLewanczyk, Dawid bool foundName = false; 53c5b2abe0SLewanczyk, Dawid // Iterate over all retrieved ObjectPaths. 546c34de48SEd Tanous for (const std::pair<std::string, 556c34de48SEd Tanous std::vector<std::pair< 566c34de48SEd Tanous std::string, std::vector<std::string>>>> 571abe55efSEd Tanous &object : subtree) 581abe55efSEd Tanous { 59c5b2abe0SLewanczyk, Dawid const std::string &path = object.first; 6055c7b7a2SEd Tanous BMCWEB_LOG_DEBUG << "Got path: " << path; 611abe55efSEd Tanous const std::vector< 621abe55efSEd Tanous std::pair<std::string, std::vector<std::string>>> 63c5b2abe0SLewanczyk, Dawid &connectionNames = object.second; 641abe55efSEd Tanous if (connectionNames.size() < 1) 651abe55efSEd Tanous { 66c5b2abe0SLewanczyk, Dawid continue; 67c5b2abe0SLewanczyk, Dawid } 68c5b2abe0SLewanczyk, Dawid // Check if computer system exist 691abe55efSEd Tanous if (boost::ends_with(path, name)) 701abe55efSEd Tanous { 71c5b2abe0SLewanczyk, Dawid foundName = true; 7255c7b7a2SEd Tanous BMCWEB_LOG_DEBUG << "Found name: " << name; 736c34de48SEd Tanous const std::string connectionName = connectionNames[0].first; 7455c7b7a2SEd Tanous crow::connections::systemBus->async_method_call( 75c5b2abe0SLewanczyk, Dawid [aResp, name(std::string(name))]( 76c5b2abe0SLewanczyk, Dawid const boost::system::error_code ec, 776c34de48SEd Tanous const std::vector<std::pair< 786c34de48SEd Tanous std::string, VariantType>> &propertiesList) { 791abe55efSEd Tanous if (ec) 801abe55efSEd Tanous { 811abe55efSEd Tanous BMCWEB_LOG_ERROR << "DBUS response error: " 821abe55efSEd Tanous << ec; 836c34de48SEd Tanous aResp->res.result(boost::beast::http::status:: 84a0803efaSEd Tanous internal_server_error); 85c5b2abe0SLewanczyk, Dawid return; 86c5b2abe0SLewanczyk, Dawid } 876c34de48SEd Tanous BMCWEB_LOG_DEBUG << "Got " << propertiesList.size() 88c5b2abe0SLewanczyk, Dawid << "properties for system"; 891abe55efSEd Tanous for (const std::pair<std::string, VariantType> 901abe55efSEd Tanous &property : propertiesList) 911abe55efSEd Tanous { 92c5b2abe0SLewanczyk, Dawid const std::string *value = 931abe55efSEd Tanous mapbox::getPtr<const std::string>( 941abe55efSEd Tanous property.second); 951abe55efSEd Tanous if (value != nullptr) 961abe55efSEd Tanous { 971abe55efSEd Tanous aResp->res.jsonValue[property.first] = 981abe55efSEd Tanous *value; 99c5b2abe0SLewanczyk, Dawid } 100c5b2abe0SLewanczyk, Dawid } 10155c7b7a2SEd Tanous aResp->res.jsonValue["Name"] = name; 10255c7b7a2SEd Tanous aResp->res.jsonValue["Id"] = 10355c7b7a2SEd Tanous aResp->res.jsonValue["SerialNumber"]; 104c5b2abe0SLewanczyk, Dawid }, 1056c34de48SEd Tanous connectionName, path, "org.freedesktop.DBus.Properties", 1066c34de48SEd Tanous "GetAll", 1071abe55efSEd Tanous "xyz.openbmc_project.Inventory.Decorator.Asset"); 1081abe55efSEd Tanous } 1091abe55efSEd Tanous else 1101abe55efSEd Tanous { 1116c34de48SEd Tanous // This is not system, so check if it's cpu, dimm, UUID or 1126c34de48SEd Tanous // BiosVer 1131abe55efSEd Tanous for (auto const &s : connectionNames) 1141abe55efSEd Tanous { 1151abe55efSEd Tanous for (auto const &i : s.second) 1161abe55efSEd Tanous { 1171abe55efSEd Tanous if (boost::ends_with(i, "Dimm")) 1181abe55efSEd Tanous { 1191abe55efSEd Tanous BMCWEB_LOG_DEBUG 1201abe55efSEd Tanous << "Found Dimm, now get it properties."; 12155c7b7a2SEd Tanous crow::connections::systemBus->async_method_call( 122*6617338dSEd Tanous [aResp]( 1231abe55efSEd Tanous const boost::system::error_code ec, 1246c34de48SEd Tanous const std::vector< 1256c34de48SEd Tanous std::pair<std::string, VariantType>> 1261abe55efSEd Tanous &properties) { 1271abe55efSEd Tanous if (ec) 1281abe55efSEd Tanous { 1291abe55efSEd Tanous BMCWEB_LOG_ERROR 1306c34de48SEd Tanous << "DBUS response error " << ec; 131a0803efaSEd Tanous aResp->res.result( 132a0803efaSEd Tanous boost::beast::http::status:: 133a0803efaSEd Tanous internal_server_error); 134c5b2abe0SLewanczyk, Dawid return; 135c5b2abe0SLewanczyk, Dawid } 1366c34de48SEd Tanous BMCWEB_LOG_DEBUG << "Got " 1376c34de48SEd Tanous << properties.size() 138c5b2abe0SLewanczyk, Dawid << "Dimm properties."; 1391abe55efSEd Tanous for (const auto &p : properties) 1401abe55efSEd Tanous { 1411abe55efSEd Tanous if (p.first == "MemorySize") 1421abe55efSEd Tanous { 143c5b2abe0SLewanczyk, Dawid const std::string *value = 1441abe55efSEd Tanous mapbox::getPtr< 1451abe55efSEd Tanous const std::string>( 1461abe55efSEd Tanous p.second); 1471abe55efSEd Tanous if ((value != nullptr) && 1481abe55efSEd Tanous (*value != "NULL")) 1491abe55efSEd Tanous { 150c5b2abe0SLewanczyk, Dawid // Remove units char 151c5b2abe0SLewanczyk, Dawid int32_t unitCoeff; 1526c34de48SEd Tanous if (boost::ends_with(*value, 1536c34de48SEd Tanous "MB")) 1541abe55efSEd Tanous { 155c5b2abe0SLewanczyk, Dawid unitCoeff = 1000; 1561abe55efSEd Tanous } 1576c34de48SEd Tanous else if (boost::ends_with( 1586c34de48SEd Tanous *value, "KB")) 1591abe55efSEd Tanous { 160c5b2abe0SLewanczyk, Dawid unitCoeff = 1000000; 1611abe55efSEd Tanous } 1621abe55efSEd Tanous else 1631abe55efSEd Tanous { 164a434f2bdSEd Tanous BMCWEB_LOG_ERROR 1651abe55efSEd Tanous << "Unsupported " 1666c34de48SEd Tanous "memory units"; 167a0803efaSEd Tanous aResp->res.result( 1686c34de48SEd Tanous boost::beast::http:: 1696c34de48SEd Tanous status:: 170a0803efaSEd Tanous internal_server_error); 171c5b2abe0SLewanczyk, Dawid return; 172c5b2abe0SLewanczyk, Dawid } 173c5b2abe0SLewanczyk, Dawid 1741abe55efSEd Tanous auto memSize = 1751abe55efSEd Tanous boost::lexical_cast< 1761abe55efSEd Tanous int>(value->substr( 1776c34de48SEd Tanous 0, value->length() - 1781abe55efSEd Tanous 2)); 1791abe55efSEd Tanous aResp->res.jsonValue 1806c34de48SEd Tanous ["TotalSystemMemoryGi" 1816c34de48SEd Tanous "B"] += 182c5b2abe0SLewanczyk, Dawid memSize * unitCoeff; 1831abe55efSEd Tanous aResp->res.jsonValue 1841abe55efSEd Tanous ["MemorySummary"] 1856c34de48SEd Tanous ["Status"]["State"] = 1861abe55efSEd Tanous "Enabled"; 187c5b2abe0SLewanczyk, Dawid } 188c5b2abe0SLewanczyk, Dawid } 189c5b2abe0SLewanczyk, Dawid } 190c5b2abe0SLewanczyk, Dawid }, 1911abe55efSEd Tanous s.first, path, 1926c34de48SEd Tanous "org.freedesktop.DBus.Properties", "GetAll", 1936c34de48SEd Tanous "xyz.openbmc_project.Inventory.Item.Dimm"); 1941abe55efSEd Tanous } 1951abe55efSEd Tanous else if (boost::ends_with(i, "Cpu")) 1961abe55efSEd Tanous { 1971abe55efSEd Tanous BMCWEB_LOG_DEBUG 1981abe55efSEd Tanous << "Found Cpu, now get it properties."; 199a0803efaSEd Tanous crow::connections::systemBus->async_method_call( 200*6617338dSEd Tanous [aResp]( 201a0803efaSEd Tanous const boost::system::error_code ec, 2026c34de48SEd Tanous const std::vector< 2036c34de48SEd Tanous std::pair<std::string, VariantType>> 2041abe55efSEd Tanous &properties) { 2051abe55efSEd Tanous if (ec) 2061abe55efSEd Tanous { 2071abe55efSEd Tanous BMCWEB_LOG_ERROR 2086c34de48SEd Tanous << "DBUS response error " << ec; 209a0803efaSEd Tanous aResp->res.result( 210a0803efaSEd Tanous boost::beast::http::status:: 211a0803efaSEd Tanous internal_server_error); 212c5b2abe0SLewanczyk, Dawid return; 213c5b2abe0SLewanczyk, Dawid } 2146c34de48SEd Tanous BMCWEB_LOG_DEBUG << "Got " 2156c34de48SEd Tanous << properties.size() 216c5b2abe0SLewanczyk, Dawid << "Cpu properties."; 2171abe55efSEd Tanous for (const auto &p : properties) 2181abe55efSEd Tanous { 2196c34de48SEd Tanous if (p.first == "ProcessorFamily") 2201abe55efSEd Tanous { 221a0803efaSEd Tanous const std::string *value = 2221abe55efSEd Tanous mapbox::getPtr< 223a0803efaSEd Tanous const std::string>( 2241abe55efSEd Tanous p.second); 2251abe55efSEd Tanous if (value != nullptr) 2261abe55efSEd Tanous { 2271abe55efSEd Tanous aResp->res.jsonValue 228a0803efaSEd Tanous ["ProcessorSummary"] 2291abe55efSEd Tanous ["Count"] = 230c5b2abe0SLewanczyk, Dawid aResp->res 2311abe55efSEd Tanous .jsonValue 2326c34de48SEd Tanous ["ProcessorSumm" 2336c34de48SEd Tanous "ary"]["Count"] 234a0803efaSEd Tanous .get<int>() + 235c5b2abe0SLewanczyk, Dawid 1; 2361abe55efSEd Tanous aResp->res.jsonValue 237a0803efaSEd Tanous ["ProcessorSummary"] 2386c34de48SEd Tanous ["Status"]["State"] = 239c5b2abe0SLewanczyk, Dawid "Enabled"; 2401abe55efSEd Tanous aResp->res.jsonValue 241a0803efaSEd Tanous ["ProcessorSummary"] 242a0803efaSEd Tanous ["Model"] = *value; 243c5b2abe0SLewanczyk, Dawid } 244c5b2abe0SLewanczyk, Dawid } 245c5b2abe0SLewanczyk, Dawid } 246c5b2abe0SLewanczyk, Dawid }, 2471abe55efSEd Tanous s.first, path, 2486c34de48SEd Tanous "org.freedesktop.DBus.Properties", "GetAll", 2496c34de48SEd Tanous "xyz.openbmc_project.Inventory.Item.Cpu"); 2501abe55efSEd Tanous } 2511abe55efSEd Tanous else if (boost::ends_with(i, "UUID")) 2521abe55efSEd Tanous { 2531abe55efSEd Tanous BMCWEB_LOG_DEBUG 2541abe55efSEd Tanous << "Found UUID, now get it properties."; 25555c7b7a2SEd Tanous crow::connections::systemBus->async_method_call( 2561abe55efSEd Tanous [aResp]( 2571abe55efSEd Tanous const boost::system::error_code ec, 2586c34de48SEd Tanous const std::vector< 2596c34de48SEd Tanous std::pair<std::string, VariantType>> 2601abe55efSEd Tanous &properties) { 2611abe55efSEd Tanous if (ec) 2621abe55efSEd Tanous { 2631abe55efSEd Tanous BMCWEB_LOG_DEBUG 2646c34de48SEd Tanous << "DBUS response error " << ec; 265a0803efaSEd Tanous aResp->res.result( 266a0803efaSEd Tanous boost::beast::http::status:: 267a0803efaSEd Tanous internal_server_error); 268c5b2abe0SLewanczyk, Dawid return; 269c5b2abe0SLewanczyk, Dawid } 2706c34de48SEd Tanous BMCWEB_LOG_DEBUG << "Got " 2716c34de48SEd Tanous << properties.size() 272c5b2abe0SLewanczyk, Dawid << "UUID properties."; 2731abe55efSEd Tanous for (const std::pair<std::string, 2746c34de48SEd Tanous VariantType> &p : 2756c34de48SEd Tanous properties) 2761abe55efSEd Tanous { 2771abe55efSEd Tanous if (p.first == "BIOSVer") 2781abe55efSEd Tanous { 279c5b2abe0SLewanczyk, Dawid const std::string *value = 2801abe55efSEd Tanous mapbox::getPtr< 2811abe55efSEd Tanous const std::string>( 2821abe55efSEd Tanous p.second); 2831abe55efSEd Tanous if (value != nullptr) 2841abe55efSEd Tanous { 2851abe55efSEd Tanous aResp->res.jsonValue 2861abe55efSEd Tanous ["BiosVersion"] = 2871abe55efSEd Tanous *value; 288c5b2abe0SLewanczyk, Dawid } 289c5b2abe0SLewanczyk, Dawid } 2901abe55efSEd Tanous if (p.first == "UUID") 2911abe55efSEd Tanous { 292c5b2abe0SLewanczyk, Dawid const std::string *value = 2931abe55efSEd Tanous mapbox::getPtr< 2941abe55efSEd Tanous const std::string>( 2951abe55efSEd Tanous p.second); 2961abe55efSEd Tanous BMCWEB_LOG_DEBUG 2971abe55efSEd Tanous << "UUID = " << *value 2981abe55efSEd Tanous << " length " 2991abe55efSEd Tanous << value->length(); 3001abe55efSEd Tanous if (value != nullptr) 3011abe55efSEd Tanous { 3026c34de48SEd Tanous // Workaround for to short 3036c34de48SEd Tanous // return str in smbios demo 3046c34de48SEd Tanous // app, 32 bytes are 3056c34de48SEd Tanous // described by spec 3066c34de48SEd Tanous if (value->length() > 0 && 3076c34de48SEd Tanous value->length() < 32) 3081abe55efSEd Tanous { 3091abe55efSEd Tanous std::string 3101abe55efSEd Tanous correctedValue = 3111abe55efSEd Tanous *value; 3121abe55efSEd Tanous correctedValue.append( 3131abe55efSEd Tanous 32 - 3146c34de48SEd Tanous value->length(), 315c5b2abe0SLewanczyk, Dawid '0'); 3166c34de48SEd Tanous value = &correctedValue; 3171abe55efSEd Tanous } 3186c34de48SEd Tanous else if (value->length() == 3191abe55efSEd Tanous 32) 3201abe55efSEd Tanous { 3216c34de48SEd Tanous aResp->res 3226c34de48SEd Tanous .jsonValue["UUID"] = 3236c34de48SEd Tanous value->substr(0, 3246c34de48SEd Tanous 8) + 3251abe55efSEd Tanous "-" + 3266c34de48SEd Tanous value->substr(8, 3276c34de48SEd Tanous 4) + 3281abe55efSEd Tanous "-" + 3296c34de48SEd Tanous value->substr(12, 3306c34de48SEd Tanous 4) + 3311abe55efSEd Tanous "-" + 3326c34de48SEd Tanous value->substr(16, 3336c34de48SEd Tanous 4) + 3341abe55efSEd Tanous "-" + 3356c34de48SEd Tanous value->substr(20, 3366c34de48SEd Tanous 12); 337c5b2abe0SLewanczyk, Dawid } 338c5b2abe0SLewanczyk, Dawid } 339c5b2abe0SLewanczyk, Dawid } 340c5b2abe0SLewanczyk, Dawid } 341c5b2abe0SLewanczyk, Dawid }, 3421abe55efSEd Tanous s.first, path, 3436c34de48SEd Tanous "org.freedesktop.DBus.Properties", "GetAll", 3441abe55efSEd Tanous "xyz.openbmc_project.Common.UUID"); 345c5b2abe0SLewanczyk, Dawid } 346c5b2abe0SLewanczyk, Dawid } 347c5b2abe0SLewanczyk, Dawid } 348c5b2abe0SLewanczyk, Dawid } 349c5b2abe0SLewanczyk, Dawid } 3501abe55efSEd Tanous if (foundName == false) 3511abe55efSEd Tanous { 352a0803efaSEd Tanous aResp->res.result( 353a0803efaSEd Tanous boost::beast::http::status::internal_server_error); 354c5b2abe0SLewanczyk, Dawid } 355c5b2abe0SLewanczyk, Dawid }, 356c5b2abe0SLewanczyk, Dawid "xyz.openbmc_project.ObjectMapper", 357c5b2abe0SLewanczyk, Dawid "/xyz/openbmc_project/object_mapper", 358c5b2abe0SLewanczyk, Dawid "xyz.openbmc_project.ObjectMapper", "GetSubTree", 359*6617338dSEd Tanous "/xyz/openbmc_project/inventory", int32_t(0), 360*6617338dSEd Tanous std::array<const char *, 5>{ 361*6617338dSEd Tanous "xyz.openbmc_project.Inventory.Decorator.Asset", 362*6617338dSEd Tanous "xyz.openbmc_project.Inventory.Item.Cpu", 363*6617338dSEd Tanous "xyz.openbmc_project.Inventory.Item.Dimm", 364*6617338dSEd Tanous "xyz.openbmc_project.Inventory.Item.System", 365*6617338dSEd Tanous "xyz.openbmc_project.Common.UUID", 366*6617338dSEd Tanous }); 367c5b2abe0SLewanczyk, Dawid } 368c5b2abe0SLewanczyk, Dawid 369c5b2abe0SLewanczyk, Dawid /** 370c5b2abe0SLewanczyk, Dawid * @brief Retrieves identify led group properties over dbus 371c5b2abe0SLewanczyk, Dawid * 372c5b2abe0SLewanczyk, Dawid * @param[in] aResp Shared pointer for completing asynchronous calls. 373c5b2abe0SLewanczyk, Dawid * @param[in] callback Callback for process retrieved data. 374c5b2abe0SLewanczyk, Dawid * 375c5b2abe0SLewanczyk, Dawid * @return None. 376c5b2abe0SLewanczyk, Dawid */ 377c5b2abe0SLewanczyk, Dawid template <typename CallbackFunc> 378a0803efaSEd Tanous void getLedGroupIdentify(std::shared_ptr<AsyncResp> aResp, 3791abe55efSEd Tanous CallbackFunc &&callback) 3801abe55efSEd Tanous { 38155c7b7a2SEd Tanous BMCWEB_LOG_DEBUG << "Get led groups"; 38255c7b7a2SEd Tanous crow::connections::systemBus->async_method_call( 3831abe55efSEd Tanous [aResp{std::move(aResp)}, 384*6617338dSEd Tanous callback{std::move(callback)}](const boost::system::error_code &ec, 3851abe55efSEd Tanous const ManagedObjectsType &resp) { 3861abe55efSEd Tanous if (ec) 3871abe55efSEd Tanous { 38855c7b7a2SEd Tanous BMCWEB_LOG_DEBUG << "DBUS response error " << ec; 389a0803efaSEd Tanous aResp->res.result( 390a0803efaSEd Tanous boost::beast::http::status::internal_server_error); 391c5b2abe0SLewanczyk, Dawid return; 392c5b2abe0SLewanczyk, Dawid } 3936c34de48SEd Tanous BMCWEB_LOG_DEBUG << "Got " << resp.size() << "led group objects."; 3941abe55efSEd Tanous for (const auto &objPath : resp) 3951abe55efSEd Tanous { 396c5b2abe0SLewanczyk, Dawid const std::string &path = objPath.first; 3971abe55efSEd Tanous if (path.rfind("enclosure_identify") != std::string::npos) 3981abe55efSEd Tanous { 3991abe55efSEd Tanous for (const auto &interface : objPath.second) 4001abe55efSEd Tanous { 4016c34de48SEd Tanous if (interface.first == "xyz.openbmc_project.Led.Group") 4021abe55efSEd Tanous { 4031abe55efSEd Tanous for (const auto &property : interface.second) 4041abe55efSEd Tanous { 4051abe55efSEd Tanous if (property.first == "Asserted") 4061abe55efSEd Tanous { 407c5b2abe0SLewanczyk, Dawid const bool *asserted = 4081abe55efSEd Tanous mapbox::getPtr<const bool>( 4091abe55efSEd Tanous property.second); 4101abe55efSEd Tanous if (nullptr != asserted) 4111abe55efSEd Tanous { 412c5b2abe0SLewanczyk, Dawid callback(*asserted, aResp); 4131abe55efSEd Tanous } 4141abe55efSEd Tanous else 4151abe55efSEd Tanous { 416c5b2abe0SLewanczyk, Dawid callback(false, aResp); 417c5b2abe0SLewanczyk, Dawid } 418c5b2abe0SLewanczyk, Dawid } 419c5b2abe0SLewanczyk, Dawid } 420c5b2abe0SLewanczyk, Dawid } 421c5b2abe0SLewanczyk, Dawid } 422c5b2abe0SLewanczyk, Dawid } 423c5b2abe0SLewanczyk, Dawid } 424c5b2abe0SLewanczyk, Dawid }, 425c5b2abe0SLewanczyk, Dawid "xyz.openbmc_project.LED.GroupManager", 4266c34de48SEd Tanous "/xyz/openbmc_project/led/groups", "org.freedesktop.DBus.ObjectManager", 4276c34de48SEd Tanous "GetManagedObjects"); 428c5b2abe0SLewanczyk, Dawid } 429c5b2abe0SLewanczyk, Dawid 430c5b2abe0SLewanczyk, Dawid template <typename CallbackFunc> 4316c34de48SEd Tanous void getLedIdentify(std::shared_ptr<AsyncResp> aResp, CallbackFunc &&callback) 4321abe55efSEd Tanous { 43355c7b7a2SEd Tanous BMCWEB_LOG_DEBUG << "Get identify led properties"; 43455c7b7a2SEd Tanous crow::connections::systemBus->async_method_call( 435*6617338dSEd Tanous [aResp, 436*6617338dSEd Tanous callback{std::move(callback)}](const boost::system::error_code ec, 437c5b2abe0SLewanczyk, Dawid const PropertiesType &properties) { 4381abe55efSEd Tanous if (ec) 4391abe55efSEd Tanous { 44055c7b7a2SEd Tanous BMCWEB_LOG_DEBUG << "DBUS response error " << ec; 441a0803efaSEd Tanous aResp->res.result( 442a0803efaSEd Tanous boost::beast::http::status::internal_server_error); 443c5b2abe0SLewanczyk, Dawid return; 444c5b2abe0SLewanczyk, Dawid } 4451abe55efSEd Tanous BMCWEB_LOG_DEBUG << "Got " << properties.size() 4461abe55efSEd Tanous << "led properties."; 447c5b2abe0SLewanczyk, Dawid std::string output; 4481abe55efSEd Tanous for (const auto &property : properties) 4491abe55efSEd Tanous { 4501abe55efSEd Tanous if (property.first == "State") 4511abe55efSEd Tanous { 452c5b2abe0SLewanczyk, Dawid const std::string *s = 45355c7b7a2SEd Tanous mapbox::getPtr<std::string>(property.second); 4541abe55efSEd Tanous if (nullptr != s) 4551abe55efSEd Tanous { 45655c7b7a2SEd Tanous BMCWEB_LOG_DEBUG << "Identify Led State: " << *s; 457c5b2abe0SLewanczyk, Dawid const auto pos = s->rfind('.'); 4581abe55efSEd Tanous if (pos != std::string::npos) 4591abe55efSEd Tanous { 460c5b2abe0SLewanczyk, Dawid auto led = s->substr(pos + 1); 4611abe55efSEd Tanous for (const std::pair<const char *, const char *> 4621abe55efSEd Tanous &p : 4631abe55efSEd Tanous std::array< 4646c34de48SEd Tanous std::pair<const char *, const char *>, 3>{ 4656c34de48SEd Tanous {{"On", "Lit"}, 466c5b2abe0SLewanczyk, Dawid {"Blink", "Blinking"}, 4671abe55efSEd Tanous {"Off", "Off"}}}) 4681abe55efSEd Tanous { 4691abe55efSEd Tanous if (led == p.first) 4701abe55efSEd Tanous { 471c5b2abe0SLewanczyk, Dawid output = p.second; 472c5b2abe0SLewanczyk, Dawid } 473c5b2abe0SLewanczyk, Dawid } 474c5b2abe0SLewanczyk, Dawid } 475c5b2abe0SLewanczyk, Dawid } 476c5b2abe0SLewanczyk, Dawid } 477c5b2abe0SLewanczyk, Dawid } 478c5b2abe0SLewanczyk, Dawid callback(output, aResp); 479c5b2abe0SLewanczyk, Dawid }, 480c5b2abe0SLewanczyk, Dawid "xyz.openbmc_project.LED.Controller.identify", 481c5b2abe0SLewanczyk, Dawid "/xyz/openbmc_project/led/physical/identify", 482c5b2abe0SLewanczyk, Dawid "org.freedesktop.DBus.Properties", "GetAll", 483c5b2abe0SLewanczyk, Dawid "xyz.openbmc_project.Led.Physical"); 484c5b2abe0SLewanczyk, Dawid } 485c5b2abe0SLewanczyk, Dawid 486c5b2abe0SLewanczyk, Dawid /** 487c5b2abe0SLewanczyk, Dawid * @brief Retrieves host state properties over dbus 488c5b2abe0SLewanczyk, Dawid * 489c5b2abe0SLewanczyk, Dawid * @param[in] aResp Shared pointer for completing asynchronous calls. 490c5b2abe0SLewanczyk, Dawid * 491c5b2abe0SLewanczyk, Dawid * @return None. 492c5b2abe0SLewanczyk, Dawid */ 493a0803efaSEd Tanous void getHostState(std::shared_ptr<AsyncResp> aResp) 4941abe55efSEd Tanous { 49555c7b7a2SEd Tanous BMCWEB_LOG_DEBUG << "Get host information."; 49655c7b7a2SEd Tanous crow::connections::systemBus->async_method_call( 497*6617338dSEd Tanous [aResp{std::move(aResp)}]( 498*6617338dSEd Tanous const boost::system::error_code ec, 499*6617338dSEd Tanous const sdbusplus::message::variant<std::string> &hostState) { 5001abe55efSEd Tanous if (ec) 5011abe55efSEd Tanous { 50255c7b7a2SEd Tanous BMCWEB_LOG_DEBUG << "DBUS response error " << ec; 503a0803efaSEd Tanous aResp->res.result( 504a0803efaSEd Tanous boost::beast::http::status::internal_server_error); 505c5b2abe0SLewanczyk, Dawid return; 506c5b2abe0SLewanczyk, Dawid } 507*6617338dSEd Tanous 508*6617338dSEd Tanous const std::string *s = mapbox::getPtr<const std::string>(hostState); 50955c7b7a2SEd Tanous BMCWEB_LOG_DEBUG << "Host state: " << *s; 510*6617338dSEd Tanous if (s != nullptr) 5111abe55efSEd Tanous { 512c5b2abe0SLewanczyk, Dawid // Verify Host State 513*6617338dSEd Tanous if (*s == "xyz.openbmc_project.State.Host.Running") 5141abe55efSEd Tanous { 51555c7b7a2SEd Tanous aResp->res.jsonValue["PowerState"] = "On"; 516*6617338dSEd Tanous aResp->res.jsonValue["Status"]["State"] = "Enabled"; 5171abe55efSEd Tanous } 5181abe55efSEd Tanous else 5191abe55efSEd Tanous { 52055c7b7a2SEd Tanous aResp->res.jsonValue["PowerState"] = "Off"; 521*6617338dSEd Tanous aResp->res.jsonValue["Status"]["State"] = "Disabled"; 522c5b2abe0SLewanczyk, Dawid } 523c5b2abe0SLewanczyk, Dawid } 524c5b2abe0SLewanczyk, Dawid }, 5256c34de48SEd Tanous "xyz.openbmc_project.State.Host", "/xyz/openbmc_project/state/host0", 526*6617338dSEd Tanous "org.freedesktop.DBus.Properties", "Get", 527*6617338dSEd Tanous "xyz.openbmc_project.State.Host", "CurrentHostState"); 528c5b2abe0SLewanczyk, Dawid } 529c5b2abe0SLewanczyk, Dawid 530c5b2abe0SLewanczyk, Dawid /** 531c5b2abe0SLewanczyk, Dawid * SystemsCollection derived class for delivering ComputerSystems Collection 532c5b2abe0SLewanczyk, Dawid * Schema 533c5b2abe0SLewanczyk, Dawid */ 5341abe55efSEd Tanous class SystemsCollection : public Node 5351abe55efSEd Tanous { 536c5b2abe0SLewanczyk, Dawid public: 5371abe55efSEd Tanous SystemsCollection(CrowApp &app) : Node(app, "/redfish/v1/Systems/") 5381abe55efSEd Tanous { 539c5b2abe0SLewanczyk, Dawid Node::json["@odata.type"] = 540c5b2abe0SLewanczyk, Dawid "#ComputerSystemCollection.ComputerSystemCollection"; 541c5b2abe0SLewanczyk, Dawid Node::json["@odata.id"] = "/redfish/v1/Systems"; 542c5b2abe0SLewanczyk, Dawid Node::json["@odata.context"] = 543c5b2abe0SLewanczyk, Dawid "/redfish/v1/" 544c5b2abe0SLewanczyk, Dawid "$metadata#ComputerSystemCollection.ComputerSystemCollection"; 545c5b2abe0SLewanczyk, Dawid Node::json["Name"] = "Computer System Collection"; 546c5b2abe0SLewanczyk, Dawid 547c5b2abe0SLewanczyk, Dawid entityPrivileges = { 548c5b2abe0SLewanczyk, Dawid {boost::beast::http::verb::get, {{"Login"}}}, 549c5b2abe0SLewanczyk, Dawid {boost::beast::http::verb::head, {{"Login"}}}, 550c5b2abe0SLewanczyk, Dawid {boost::beast::http::verb::patch, {{"ConfigureComponents"}}}, 551c5b2abe0SLewanczyk, Dawid {boost::beast::http::verb::put, {{"ConfigureComponents"}}}, 552c5b2abe0SLewanczyk, Dawid {boost::beast::http::verb::delete_, {{"ConfigureComponents"}}}, 553c5b2abe0SLewanczyk, Dawid {boost::beast::http::verb::post, {{"ConfigureComponents"}}}}; 554c5b2abe0SLewanczyk, Dawid } 555c5b2abe0SLewanczyk, Dawid 556c5b2abe0SLewanczyk, Dawid private: 55755c7b7a2SEd Tanous void doGet(crow::Response &res, const crow::Request &req, 5581abe55efSEd Tanous const std::vector<std::string> ¶ms) override 5591abe55efSEd Tanous { 560*6617338dSEd Tanous BMCWEB_LOG_DEBUG << "Get list of available boards."; 561*6617338dSEd Tanous std::shared_ptr<AsyncResp> asyncResp = std::make_shared<AsyncResp>(res); 562*6617338dSEd Tanous res.jsonValue = Node::json; 563*6617338dSEd Tanous crow::connections::systemBus->async_method_call( 564*6617338dSEd Tanous [asyncResp](const boost::system::error_code ec, 565*6617338dSEd Tanous const std::vector<std::string> &resp) { 566*6617338dSEd Tanous if (ec) 5671abe55efSEd Tanous { 568*6617338dSEd Tanous asyncResp->res.result( 569*6617338dSEd Tanous boost::beast::http::status::internal_server_error); 570*6617338dSEd Tanous return; 571*6617338dSEd Tanous } 572*6617338dSEd Tanous BMCWEB_LOG_DEBUG << "Got " << resp.size() << " boards."; 573*6617338dSEd Tanous 574c5b2abe0SLewanczyk, Dawid // ... prepare json array with appropriate @odata.id links 575*6617338dSEd Tanous nlohmann::json &boardArray = 576*6617338dSEd Tanous asyncResp->res.jsonValue["Members"]; 577*6617338dSEd Tanous boardArray = nlohmann::json::array(); 578*6617338dSEd Tanous 579*6617338dSEd Tanous // Iterate over all retrieved ObjectPaths. 580*6617338dSEd Tanous for (const std::string &objpath : resp) 581*6617338dSEd Tanous { 582*6617338dSEd Tanous std::size_t lastPos = objpath.rfind("/"); 583*6617338dSEd Tanous if (lastPos != std::string::npos) 5841abe55efSEd Tanous { 585c5b2abe0SLewanczyk, Dawid boardArray.push_back( 586*6617338dSEd Tanous {{"@odata.id", "/redfish/v1/Systems/" + 587*6617338dSEd Tanous objpath.substr(lastPos + 1)}}); 588c5b2abe0SLewanczyk, Dawid } 5891abe55efSEd Tanous } 590*6617338dSEd Tanous 591*6617338dSEd Tanous asyncResp->res.jsonValue["Members@odata.count"] = 592*6617338dSEd Tanous boardArray.size(); 593*6617338dSEd Tanous }, 594*6617338dSEd Tanous "xyz.openbmc_project.ObjectMapper", 595*6617338dSEd Tanous "/xyz/openbmc_project/object_mapper", 596*6617338dSEd Tanous "xyz.openbmc_project.ObjectMapper", "GetSubTreePaths", 597*6617338dSEd Tanous "/xyz/openbmc_project/inventory", int32_t(0), 598*6617338dSEd Tanous std::array<const char *, 1>{ 599*6617338dSEd Tanous "xyz.openbmc_project.Inventory.Item.Board"}); 600c5b2abe0SLewanczyk, Dawid } 601c5b2abe0SLewanczyk, Dawid }; 602c5b2abe0SLewanczyk, Dawid 603c5b2abe0SLewanczyk, Dawid /** 604*6617338dSEd Tanous * Systems derived class for delivering Computer Systems Schema. 605c5b2abe0SLewanczyk, Dawid */ 6061abe55efSEd Tanous class Systems : public Node 6071abe55efSEd Tanous { 608c5b2abe0SLewanczyk, Dawid public: 609c5b2abe0SLewanczyk, Dawid /* 610c5b2abe0SLewanczyk, Dawid * Default Constructor 611c5b2abe0SLewanczyk, Dawid */ 6121abe55efSEd Tanous Systems(CrowApp &app) : 6131abe55efSEd Tanous Node(app, "/redfish/v1/Systems/<str>/", std::string()) 6141abe55efSEd Tanous { 615c5b2abe0SLewanczyk, Dawid Node::json["@odata.type"] = "#ComputerSystem.v1_3_0.ComputerSystem"; 616c5b2abe0SLewanczyk, Dawid Node::json["@odata.context"] = 617c5b2abe0SLewanczyk, Dawid "/redfish/v1/$metadata#ComputerSystem.ComputerSystem"; 618c5b2abe0SLewanczyk, Dawid Node::json["SystemType"] = "Physical"; 619c5b2abe0SLewanczyk, Dawid Node::json["Description"] = "Computer System"; 620c5b2abe0SLewanczyk, Dawid Node::json["Boot"]["BootSourceOverrideEnabled"] = 621c5b2abe0SLewanczyk, Dawid "Disabled"; // TODO(Dawid), get real boot data 622c5b2abe0SLewanczyk, Dawid Node::json["Boot"]["BootSourceOverrideTarget"] = 623c5b2abe0SLewanczyk, Dawid "None"; // TODO(Dawid), get real boot data 624c5b2abe0SLewanczyk, Dawid Node::json["Boot"]["BootSourceOverrideMode"] = 625c5b2abe0SLewanczyk, Dawid "Legacy"; // TODO(Dawid), get real boot data 6261abe55efSEd Tanous Node::json["Boot"]["BootSourceOverrideTarget@Redfish.AllowableValues"] = 6271abe55efSEd Tanous {"None", "Pxe", "Hdd", "Cd", 6281abe55efSEd Tanous "BiosSetup", "UefiShell", "Usb"}; // TODO(Dawid), get real boot 6291abe55efSEd Tanous // data 630c5b2abe0SLewanczyk, Dawid Node::json["ProcessorSummary"]["Count"] = int(0); 631c5b2abe0SLewanczyk, Dawid Node::json["ProcessorSummary"]["Status"]["State"] = "Disabled"; 632c5b2abe0SLewanczyk, Dawid Node::json["MemorySummary"]["TotalSystemMemoryGiB"] = int(0); 633c5b2abe0SLewanczyk, Dawid Node::json["MemorySummary"]["Status"]["State"] = "Disabled"; 634c5b2abe0SLewanczyk, Dawid entityPrivileges = { 635c5b2abe0SLewanczyk, Dawid {boost::beast::http::verb::get, {{"Login"}}}, 636c5b2abe0SLewanczyk, Dawid {boost::beast::http::verb::head, {{"Login"}}}, 637c5b2abe0SLewanczyk, Dawid {boost::beast::http::verb::patch, {{"ConfigureComponents"}}}, 638c5b2abe0SLewanczyk, Dawid {boost::beast::http::verb::put, {{"ConfigureComponents"}}}, 639c5b2abe0SLewanczyk, Dawid {boost::beast::http::verb::delete_, {{"ConfigureComponents"}}}, 640c5b2abe0SLewanczyk, Dawid {boost::beast::http::verb::post, {{"ConfigureComponents"}}}}; 641c5b2abe0SLewanczyk, Dawid } 642c5b2abe0SLewanczyk, Dawid 643c5b2abe0SLewanczyk, Dawid private: 644c5b2abe0SLewanczyk, Dawid /** 645c5b2abe0SLewanczyk, Dawid * Functions triggers appropriate requests on DBus 646c5b2abe0SLewanczyk, Dawid */ 64755c7b7a2SEd Tanous void doGet(crow::Response &res, const crow::Request &req, 6481abe55efSEd Tanous const std::vector<std::string> ¶ms) override 6491abe55efSEd Tanous { 650c5b2abe0SLewanczyk, Dawid // Check if there is required param, truly entering this shall be 651c5b2abe0SLewanczyk, Dawid // impossible 6521abe55efSEd Tanous if (params.size() != 1) 6531abe55efSEd Tanous { 654c5b2abe0SLewanczyk, Dawid res.result(boost::beast::http::status::internal_server_error); 655c5b2abe0SLewanczyk, Dawid res.end(); 656c5b2abe0SLewanczyk, Dawid return; 657c5b2abe0SLewanczyk, Dawid } 658c5b2abe0SLewanczyk, Dawid 659c5b2abe0SLewanczyk, Dawid const std::string &name = params[0]; 660c5b2abe0SLewanczyk, Dawid 66155c7b7a2SEd Tanous res.jsonValue = Node::json; 66255c7b7a2SEd Tanous res.jsonValue["@odata.id"] = "/redfish/v1/Systems/" + name; 663c5b2abe0SLewanczyk, Dawid 664a0803efaSEd Tanous auto asyncResp = std::make_shared<AsyncResp>(res); 665c5b2abe0SLewanczyk, Dawid 6666c34de48SEd Tanous getLedGroupIdentify( 667a0803efaSEd Tanous asyncResp, 668a0803efaSEd Tanous [&](const bool &asserted, const std::shared_ptr<AsyncResp> &aResp) { 6691abe55efSEd Tanous if (asserted) 6701abe55efSEd Tanous { 671c5b2abe0SLewanczyk, Dawid // If led group is asserted, then another call is needed to 672c5b2abe0SLewanczyk, Dawid // get led status 6736c34de48SEd Tanous getLedIdentify( 674a0803efaSEd Tanous aResp, [](const std::string &ledStatus, 675a0803efaSEd Tanous const std::shared_ptr<AsyncResp> &aResp) { 6761abe55efSEd Tanous if (!ledStatus.empty()) 6771abe55efSEd Tanous { 6781abe55efSEd Tanous aResp->res.jsonValue["IndicatorLED"] = 6791abe55efSEd Tanous ledStatus; 680c5b2abe0SLewanczyk, Dawid } 681c5b2abe0SLewanczyk, Dawid }); 6821abe55efSEd Tanous } 6831abe55efSEd Tanous else 6841abe55efSEd Tanous { 68555c7b7a2SEd Tanous aResp->res.jsonValue["IndicatorLED"] = "Off"; 686c5b2abe0SLewanczyk, Dawid } 687c5b2abe0SLewanczyk, Dawid }); 6886c34de48SEd Tanous getComputerSystem(asyncResp, name); 6896c34de48SEd Tanous getHostState(asyncResp); 690c5b2abe0SLewanczyk, Dawid } 691c5b2abe0SLewanczyk, Dawid 69255c7b7a2SEd Tanous void doPatch(crow::Response &res, const crow::Request &req, 6931abe55efSEd Tanous const std::vector<std::string> ¶ms) override 6941abe55efSEd Tanous { 695c5b2abe0SLewanczyk, Dawid // Check if there is required param, truly entering this shall be 696c5b2abe0SLewanczyk, Dawid // impossible 697*6617338dSEd Tanous auto asyncResp = std::make_shared<AsyncResp>(res); 6981abe55efSEd Tanous if (params.size() != 1) 6991abe55efSEd Tanous { 700c5b2abe0SLewanczyk, Dawid res.result(boost::beast::http::status::internal_server_error); 701c5b2abe0SLewanczyk, Dawid return; 702c5b2abe0SLewanczyk, Dawid } 703c5b2abe0SLewanczyk, Dawid // Parse JSON request body 704c5b2abe0SLewanczyk, Dawid nlohmann::json patch; 7051abe55efSEd Tanous if (!json_util::processJsonFromRequest(res, req, patch)) 7061abe55efSEd Tanous { 707c5b2abe0SLewanczyk, Dawid return; 708c5b2abe0SLewanczyk, Dawid } 709c5b2abe0SLewanczyk, Dawid 710*6617338dSEd Tanous const std::string &name = params[0]; 711*6617338dSEd Tanous 71255c7b7a2SEd Tanous res.jsonValue = Node::json; 71355c7b7a2SEd Tanous res.jsonValue["@odata.id"] = "/redfish/v1/Systems/" + name; 714c5b2abe0SLewanczyk, Dawid 715*6617338dSEd Tanous for (const auto &item : patch.items()) 716*6617338dSEd Tanous { 717*6617338dSEd Tanous if (item.key() == "IndicatorLed") 718*6617338dSEd Tanous { 719*6617338dSEd Tanous const std::string *reqLedState = 720*6617338dSEd Tanous item.value().get_ptr<const std::string *>(); 721*6617338dSEd Tanous if (reqLedState == nullptr) 722*6617338dSEd Tanous { 723*6617338dSEd Tanous messages::addMessageToErrorJson( 724*6617338dSEd Tanous asyncResp->res.jsonValue, 725*6617338dSEd Tanous messages::propertyValueFormatError(item.value().dump(), 726*6617338dSEd Tanous item.key())); 727*6617338dSEd Tanous return; 728*6617338dSEd Tanous } 729*6617338dSEd Tanous 730*6617338dSEd Tanous // Verify key value 731*6617338dSEd Tanous std::string dbusLedState; 732*6617338dSEd Tanous if (*reqLedState == "On") 733*6617338dSEd Tanous { 734*6617338dSEd Tanous dbusLedState = 735*6617338dSEd Tanous "xyz.openbmc_project.Led.Physical.Action.Lit"; 736*6617338dSEd Tanous } 737*6617338dSEd Tanous else if (*reqLedState == "Blink") 738*6617338dSEd Tanous { 739*6617338dSEd Tanous dbusLedState = 740*6617338dSEd Tanous "xyz.openbmc_project.Led.Physical.Action.Blinking"; 741*6617338dSEd Tanous } 742*6617338dSEd Tanous else if (*reqLedState == "Off") 743*6617338dSEd Tanous { 744*6617338dSEd Tanous dbusLedState = 745*6617338dSEd Tanous "xyz.openbmc_project.Led.Physical.Action.Off"; 746*6617338dSEd Tanous } 747*6617338dSEd Tanous else 748*6617338dSEd Tanous { 749*6617338dSEd Tanous messages::addMessageToJsonRoot( 750*6617338dSEd Tanous res.jsonValue, messages::propertyValueNotInList( 751*6617338dSEd Tanous *reqLedState, "IndicatorLED")); 752*6617338dSEd Tanous return; 753*6617338dSEd Tanous } 754*6617338dSEd Tanous 7556c34de48SEd Tanous getHostState(asyncResp); 7566c34de48SEd Tanous getComputerSystem(asyncResp, name); 757c5b2abe0SLewanczyk, Dawid 758c5b2abe0SLewanczyk, Dawid // Update led group 75955c7b7a2SEd Tanous BMCWEB_LOG_DEBUG << "Update led group."; 76055c7b7a2SEd Tanous crow::connections::systemBus->async_method_call( 761*6617338dSEd Tanous [asyncResp{std::move(asyncResp)}]( 762c5b2abe0SLewanczyk, Dawid const boost::system::error_code ec) { 7631abe55efSEd Tanous if (ec) 7641abe55efSEd Tanous { 76555c7b7a2SEd Tanous BMCWEB_LOG_DEBUG << "DBUS response error " << ec; 766*6617338dSEd Tanous asyncResp->res.result(boost::beast::http::status:: 767*6617338dSEd Tanous internal_server_error); 768c5b2abe0SLewanczyk, Dawid return; 769c5b2abe0SLewanczyk, Dawid } 77055c7b7a2SEd Tanous BMCWEB_LOG_DEBUG << "Led group update done."; 771c5b2abe0SLewanczyk, Dawid }, 772c5b2abe0SLewanczyk, Dawid "xyz.openbmc_project.LED.GroupManager", 773c5b2abe0SLewanczyk, Dawid "/xyz/openbmc_project/led/groups/enclosure_identify", 774c5b2abe0SLewanczyk, Dawid "org.freedesktop.DBus.Properties", "Set", 775c5b2abe0SLewanczyk, Dawid "xyz.openbmc_project.Led.Group", "Asserted", 776c5b2abe0SLewanczyk, Dawid sdbusplus::message::variant<bool>( 777*6617338dSEd Tanous (dbusLedState == 778*6617338dSEd Tanous "xyz.openbmc_project.Led.Physical.Action.Off" 779*6617338dSEd Tanous ? false 780*6617338dSEd Tanous : true))); 781c5b2abe0SLewanczyk, Dawid // Update identify led status 78255c7b7a2SEd Tanous BMCWEB_LOG_DEBUG << "Update led SoftwareInventoryCollection."; 78355c7b7a2SEd Tanous crow::connections::systemBus->async_method_call( 784*6617338dSEd Tanous [asyncResp{std::move(asyncResp)}, 785*6617338dSEd Tanous reqLedState{std::move(*reqLedState)}]( 786c5b2abe0SLewanczyk, Dawid const boost::system::error_code ec) { 7871abe55efSEd Tanous if (ec) 7881abe55efSEd Tanous { 78955c7b7a2SEd Tanous BMCWEB_LOG_DEBUG << "DBUS response error " << ec; 790*6617338dSEd Tanous asyncResp->res.result(boost::beast::http::status:: 791*6617338dSEd Tanous internal_server_error); 792c5b2abe0SLewanczyk, Dawid return; 793c5b2abe0SLewanczyk, Dawid } 79455c7b7a2SEd Tanous BMCWEB_LOG_DEBUG << "Led state update done."; 795*6617338dSEd Tanous asyncResp->res.jsonValue["IndicatorLED"] = 796*6617338dSEd Tanous std::move(reqLedState); 797c5b2abe0SLewanczyk, Dawid }, 798c5b2abe0SLewanczyk, Dawid "xyz.openbmc_project.LED.Controller.identify", 799c5b2abe0SLewanczyk, Dawid "/xyz/openbmc_project/led/physical/identify", 800c5b2abe0SLewanczyk, Dawid "org.freedesktop.DBus.Properties", "Set", 801c5b2abe0SLewanczyk, Dawid "xyz.openbmc_project.Led.Physical", "State", 802*6617338dSEd Tanous sdbusplus::message::variant<std::string>(dbusLedState)); 803*6617338dSEd Tanous } 804*6617338dSEd Tanous else 805*6617338dSEd Tanous { 806*6617338dSEd Tanous messages::addMessageToErrorJson( 807*6617338dSEd Tanous asyncResp->res.jsonValue, 808*6617338dSEd Tanous messages::propertyNotWritable(item.key())); 809*6617338dSEd Tanous return; 810*6617338dSEd Tanous } 811c5b2abe0SLewanczyk, Dawid } 812c5b2abe0SLewanczyk, Dawid } 813c5b2abe0SLewanczyk, Dawid }; 814c5b2abe0SLewanczyk, Dawid } // namespace redfish 815