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 18c5d03ff4SJennifer Lee #include "redfish_util.hpp" 19c5d03ff4SJennifer Lee 209712f8acSEd Tanous #include <boost/container/flat_map.hpp> 219712f8acSEd Tanous #include <node.hpp> 22cb7e1e7bSAndrew Geissler #include <utils/fw_utils.hpp> 23c5b2abe0SLewanczyk, Dawid #include <utils/json_utils.hpp> 24abf2add6SEd Tanous #include <variant> 25c5b2abe0SLewanczyk, Dawid 261abe55efSEd Tanous namespace redfish 271abe55efSEd Tanous { 28c5b2abe0SLewanczyk, Dawid 29c5b2abe0SLewanczyk, Dawid /** 30c5b2abe0SLewanczyk, Dawid * @brief Retrieves computer system properties over dbus 31c5b2abe0SLewanczyk, Dawid * 32c5b2abe0SLewanczyk, Dawid * @param[in] aResp Shared pointer for completing asynchronous calls 33c5b2abe0SLewanczyk, Dawid * @param[in] name Computer system name from request 34c5b2abe0SLewanczyk, Dawid * 35c5b2abe0SLewanczyk, Dawid * @return None. 36c5b2abe0SLewanczyk, Dawid */ 37029573d4SEd Tanous void getComputerSystem(std::shared_ptr<AsyncResp> aResp) 381abe55efSEd Tanous { 3955c7b7a2SEd Tanous BMCWEB_LOG_DEBUG << "Get available system components."; 4055c7b7a2SEd Tanous crow::connections::systemBus->async_method_call( 41c5d03ff4SJennifer Lee [aResp]( 42c5b2abe0SLewanczyk, Dawid const boost::system::error_code ec, 43c5b2abe0SLewanczyk, Dawid const std::vector<std::pair< 446c34de48SEd Tanous std::string, 456c34de48SEd Tanous std::vector<std::pair<std::string, std::vector<std::string>>>>> 46c5b2abe0SLewanczyk, Dawid &subtree) { 471abe55efSEd Tanous if (ec) 481abe55efSEd Tanous { 4955c7b7a2SEd Tanous BMCWEB_LOG_DEBUG << "DBUS response error"; 50f12894f8SJason M. Bills messages::internalError(aResp->res); 51c5b2abe0SLewanczyk, Dawid return; 52c5b2abe0SLewanczyk, Dawid } 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 } 68029573d4SEd Tanous 696c34de48SEd Tanous // This is not system, so check if it's cpu, dimm, UUID or 706c34de48SEd Tanous // BiosVer 7104a258f4SEd Tanous for (const auto &connection : connectionNames) 721abe55efSEd Tanous { 7304a258f4SEd Tanous for (const auto &interfaceName : connection.second) 741abe55efSEd Tanous { 7504a258f4SEd Tanous if (interfaceName == 7604a258f4SEd Tanous "xyz.openbmc_project.Inventory.Item.Dimm") 771abe55efSEd Tanous { 781abe55efSEd Tanous BMCWEB_LOG_DEBUG 7904a258f4SEd Tanous << "Found Dimm, now get its properties."; 8055c7b7a2SEd Tanous crow::connections::systemBus->async_method_call( 81029573d4SEd Tanous [aResp](const boost::system::error_code ec, 826c34de48SEd Tanous const std::vector< 836c34de48SEd Tanous std::pair<std::string, VariantType>> 841abe55efSEd Tanous &properties) { 851abe55efSEd Tanous if (ec) 861abe55efSEd Tanous { 871abe55efSEd Tanous BMCWEB_LOG_ERROR 886c34de48SEd Tanous << "DBUS response error " << ec; 89f12894f8SJason M. Bills messages::internalError(aResp->res); 90c5b2abe0SLewanczyk, Dawid return; 91c5b2abe0SLewanczyk, Dawid } 926c34de48SEd Tanous BMCWEB_LOG_DEBUG << "Got " 936c34de48SEd Tanous << properties.size() 94c5b2abe0SLewanczyk, Dawid << "Dimm properties."; 9504a258f4SEd Tanous for (const std::pair<std::string, 9604a258f4SEd Tanous VariantType> 9704a258f4SEd Tanous &property : properties) 981abe55efSEd Tanous { 99029573d4SEd Tanous if (property.first == "MemorySizeInKb") 1001abe55efSEd Tanous { 10104a258f4SEd Tanous const uint64_t *value = 102029573d4SEd Tanous sdbusplus::message::variant_ns:: 103029573d4SEd Tanous get_if<uint64_t>( 1041b6b96c5SEd Tanous &property.second); 10504a258f4SEd Tanous if (value != nullptr) 1061abe55efSEd Tanous { 1071abe55efSEd Tanous aResp->res.jsonValue 1086c34de48SEd Tanous ["TotalSystemMemoryGi" 1096c34de48SEd Tanous "B"] += 11004a258f4SEd Tanous *value / (1024 * 1024); 111029573d4SEd Tanous aResp->res 112029573d4SEd Tanous .jsonValue["MemorySummary"] 113029573d4SEd Tanous ["Status"] 114029573d4SEd Tanous ["State"] = 1151abe55efSEd Tanous "Enabled"; 116c5b2abe0SLewanczyk, Dawid } 117c5b2abe0SLewanczyk, Dawid } 118c5b2abe0SLewanczyk, Dawid } 119c5b2abe0SLewanczyk, Dawid }, 12004a258f4SEd Tanous connection.first, path, 1216c34de48SEd Tanous "org.freedesktop.DBus.Properties", "GetAll", 1226c34de48SEd Tanous "xyz.openbmc_project.Inventory.Item.Dimm"); 1231abe55efSEd Tanous } 12404a258f4SEd Tanous else if (interfaceName == 12504a258f4SEd Tanous "xyz.openbmc_project.Inventory.Item.Cpu") 1261abe55efSEd Tanous { 1271abe55efSEd Tanous BMCWEB_LOG_DEBUG 12804a258f4SEd Tanous << "Found Cpu, now get its properties."; 129a0803efaSEd Tanous crow::connections::systemBus->async_method_call( 130029573d4SEd Tanous [aResp](const boost::system::error_code ec, 1316c34de48SEd Tanous const std::vector< 1326c34de48SEd Tanous std::pair<std::string, VariantType>> 1331abe55efSEd Tanous &properties) { 1341abe55efSEd Tanous if (ec) 1351abe55efSEd Tanous { 1361abe55efSEd Tanous BMCWEB_LOG_ERROR 1376c34de48SEd Tanous << "DBUS response error " << ec; 138f12894f8SJason M. Bills messages::internalError(aResp->res); 139c5b2abe0SLewanczyk, Dawid return; 140c5b2abe0SLewanczyk, Dawid } 1416c34de48SEd Tanous BMCWEB_LOG_DEBUG << "Got " 1426c34de48SEd Tanous << properties.size() 143c5b2abe0SLewanczyk, Dawid << "Cpu properties."; 14404a258f4SEd Tanous for (const auto &property : properties) 1451abe55efSEd Tanous { 146029573d4SEd Tanous if (property.first == "ProcessorFamily") 1471abe55efSEd Tanous { 148a0803efaSEd Tanous const std::string *value = 149029573d4SEd Tanous sdbusplus::message::variant_ns:: 150029573d4SEd Tanous get_if<std::string>( 1511b6b96c5SEd Tanous &property.second); 1521abe55efSEd Tanous if (value != nullptr) 1531abe55efSEd Tanous { 154029573d4SEd Tanous nlohmann::json &procSummary = 1551abe55efSEd Tanous aResp->res.jsonValue 1566c34de48SEd Tanous ["ProcessorSumm" 15704a258f4SEd Tanous "ary"]; 15804a258f4SEd Tanous nlohmann::json &procCount = 15904a258f4SEd Tanous procSummary["Count"]; 16004a258f4SEd Tanous 16104a258f4SEd Tanous procCount = 162029573d4SEd Tanous procCount.get<int>() + 1; 163029573d4SEd Tanous procSummary["Status"]["State"] = 164c5b2abe0SLewanczyk, Dawid "Enabled"; 165029573d4SEd Tanous procSummary["Model"] = *value; 166c5b2abe0SLewanczyk, Dawid } 167c5b2abe0SLewanczyk, Dawid } 168c5b2abe0SLewanczyk, Dawid } 169c5b2abe0SLewanczyk, Dawid }, 17004a258f4SEd Tanous connection.first, path, 1716c34de48SEd Tanous "org.freedesktop.DBus.Properties", "GetAll", 1726c34de48SEd Tanous "xyz.openbmc_project.Inventory.Item.Cpu"); 1731abe55efSEd Tanous } 17404a258f4SEd Tanous else if (interfaceName == 17504a258f4SEd Tanous "xyz.openbmc_project.Common.UUID") 1761abe55efSEd Tanous { 1771abe55efSEd Tanous BMCWEB_LOG_DEBUG 17804a258f4SEd Tanous << "Found UUID, now get its properties."; 17955c7b7a2SEd Tanous crow::connections::systemBus->async_method_call( 180029573d4SEd Tanous [aResp](const boost::system::error_code ec, 1816c34de48SEd Tanous const std::vector< 1826c34de48SEd Tanous std::pair<std::string, VariantType>> 1831abe55efSEd Tanous &properties) { 1841abe55efSEd Tanous if (ec) 1851abe55efSEd Tanous { 1861abe55efSEd Tanous BMCWEB_LOG_DEBUG 1876c34de48SEd Tanous << "DBUS response error " << ec; 188f12894f8SJason M. Bills messages::internalError(aResp->res); 189c5b2abe0SLewanczyk, Dawid return; 190c5b2abe0SLewanczyk, Dawid } 1916c34de48SEd Tanous BMCWEB_LOG_DEBUG << "Got " 1926c34de48SEd Tanous << properties.size() 193c5b2abe0SLewanczyk, Dawid << "UUID properties."; 1941abe55efSEd Tanous for (const std::pair<std::string, 19504a258f4SEd Tanous VariantType> 19604a258f4SEd Tanous &property : properties) 1971abe55efSEd Tanous { 19804a258f4SEd Tanous if (property.first == "UUID") 1991abe55efSEd Tanous { 200c5b2abe0SLewanczyk, Dawid const std::string *value = 201029573d4SEd Tanous sdbusplus::message::variant_ns:: 202029573d4SEd Tanous get_if<std::string>( 2031b6b96c5SEd Tanous &property.second); 20404a258f4SEd Tanous 2051abe55efSEd Tanous if (value != nullptr) 2061abe55efSEd Tanous { 207029573d4SEd Tanous std::string valueStr = *value; 20804a258f4SEd Tanous if (valueStr.size() == 32) 2091abe55efSEd Tanous { 210029573d4SEd Tanous valueStr.insert(8, 1, '-'); 211029573d4SEd Tanous valueStr.insert(13, 1, '-'); 212029573d4SEd Tanous valueStr.insert(18, 1, '-'); 213029573d4SEd Tanous valueStr.insert(23, 1, '-'); 21404a258f4SEd Tanous } 215029573d4SEd Tanous BMCWEB_LOG_DEBUG << "UUID = " 21604a258f4SEd Tanous << valueStr; 217029573d4SEd Tanous aResp->res.jsonValue["UUID"] = 21804a258f4SEd Tanous valueStr; 219c5b2abe0SLewanczyk, Dawid } 220c5b2abe0SLewanczyk, Dawid } 221c5b2abe0SLewanczyk, Dawid } 222c5b2abe0SLewanczyk, Dawid }, 22304a258f4SEd Tanous connection.first, path, 2246c34de48SEd Tanous "org.freedesktop.DBus.Properties", "GetAll", 2251abe55efSEd Tanous "xyz.openbmc_project.Common.UUID"); 226c5b2abe0SLewanczyk, Dawid } 227029573d4SEd Tanous else if (interfaceName == 228029573d4SEd Tanous "xyz.openbmc_project.Inventory.Item.System") 2291abe55efSEd Tanous { 230029573d4SEd Tanous crow::connections::systemBus->async_method_call( 231029573d4SEd Tanous [aResp](const boost::system::error_code ec, 232029573d4SEd Tanous const std::vector< 233029573d4SEd Tanous std::pair<std::string, VariantType>> 234029573d4SEd Tanous &propertiesList) { 235029573d4SEd Tanous if (ec) 236029573d4SEd Tanous { 237*e4a4b9a9SJames Feist // doesn't have to include this 238*e4a4b9a9SJames Feist // interface 239029573d4SEd Tanous return; 240029573d4SEd Tanous } 241029573d4SEd Tanous BMCWEB_LOG_DEBUG << "Got " 242029573d4SEd Tanous << propertiesList.size() 243029573d4SEd Tanous << "properties for system"; 244029573d4SEd Tanous for (const std::pair<std::string, 245029573d4SEd Tanous VariantType> 246029573d4SEd Tanous &property : propertiesList) 247029573d4SEd Tanous { 248fc5afcf9Sbeccabroek const std::string &propertyName = 249fc5afcf9Sbeccabroek property.first; 250fc5afcf9Sbeccabroek if ((propertyName == "PartNumber") || 251fc5afcf9Sbeccabroek (propertyName == "SerialNumber") || 252fc5afcf9Sbeccabroek (propertyName == "Manufacturer") || 253fc5afcf9Sbeccabroek (propertyName == "Model")) 254fc5afcf9Sbeccabroek { 255029573d4SEd Tanous const std::string *value = 256fc5afcf9Sbeccabroek std::get_if<std::string>( 257029573d4SEd Tanous &property.second); 258029573d4SEd Tanous if (value != nullptr) 259029573d4SEd Tanous { 260029573d4SEd Tanous aResp->res 261fc5afcf9Sbeccabroek .jsonValue[propertyName] = 262029573d4SEd Tanous *value; 263029573d4SEd Tanous } 264029573d4SEd Tanous } 265fc5afcf9Sbeccabroek } 266029573d4SEd Tanous aResp->res.jsonValue["Name"] = "system"; 267029573d4SEd Tanous aResp->res.jsonValue["Id"] = 268029573d4SEd Tanous aResp->res.jsonValue["SerialNumber"]; 269cb7e1e7bSAndrew Geissler // Grab the bios version 270cb7e1e7bSAndrew Geissler fw_util::getActiveFwVersion( 271cb7e1e7bSAndrew Geissler aResp, fw_util::biosPurpose, 272cb7e1e7bSAndrew Geissler "BiosVersion"); 273029573d4SEd Tanous }, 274029573d4SEd Tanous connection.first, path, 275029573d4SEd Tanous "org.freedesktop.DBus.Properties", "GetAll", 276029573d4SEd Tanous "xyz.openbmc_project.Inventory.Decorator." 277029573d4SEd Tanous "Asset"); 278*e4a4b9a9SJames Feist 279*e4a4b9a9SJames Feist crow::connections::systemBus->async_method_call( 280*e4a4b9a9SJames Feist [aResp]( 281*e4a4b9a9SJames Feist const boost::system::error_code ec, 282*e4a4b9a9SJames Feist const std::variant<std::string> &property) { 283*e4a4b9a9SJames Feist if (ec) 284*e4a4b9a9SJames Feist { 285*e4a4b9a9SJames Feist // doesn't have to include this 286*e4a4b9a9SJames Feist // interface 287*e4a4b9a9SJames Feist return; 288*e4a4b9a9SJames Feist } 289*e4a4b9a9SJames Feist 290*e4a4b9a9SJames Feist const std::string *value = 291*e4a4b9a9SJames Feist std::get_if<std::string>(&property); 292*e4a4b9a9SJames Feist if (value != nullptr) 293*e4a4b9a9SJames Feist { 294*e4a4b9a9SJames Feist aResp->res.jsonValue["AssetTag"] = 295*e4a4b9a9SJames Feist *value; 296*e4a4b9a9SJames Feist } 297*e4a4b9a9SJames Feist }, 298*e4a4b9a9SJames Feist connection.first, path, 299*e4a4b9a9SJames Feist "org.freedesktop.DBus.Properties", "Get", 300*e4a4b9a9SJames Feist "xyz.openbmc_project.Inventory.Decorator." 301*e4a4b9a9SJames Feist "AssetTag", 302*e4a4b9a9SJames Feist "AssetTag"); 303029573d4SEd Tanous } 304029573d4SEd Tanous } 305029573d4SEd Tanous } 306c5b2abe0SLewanczyk, Dawid } 307c5b2abe0SLewanczyk, Dawid }, 308c5b2abe0SLewanczyk, Dawid "xyz.openbmc_project.ObjectMapper", 309c5b2abe0SLewanczyk, Dawid "/xyz/openbmc_project/object_mapper", 310c5b2abe0SLewanczyk, Dawid "xyz.openbmc_project.ObjectMapper", "GetSubTree", 3116617338dSEd Tanous "/xyz/openbmc_project/inventory", int32_t(0), 3126617338dSEd Tanous std::array<const char *, 5>{ 3136617338dSEd Tanous "xyz.openbmc_project.Inventory.Decorator.Asset", 3146617338dSEd Tanous "xyz.openbmc_project.Inventory.Item.Cpu", 3156617338dSEd Tanous "xyz.openbmc_project.Inventory.Item.Dimm", 3166617338dSEd Tanous "xyz.openbmc_project.Inventory.Item.System", 3176617338dSEd Tanous "xyz.openbmc_project.Common.UUID", 3186617338dSEd Tanous }); 319c5b2abe0SLewanczyk, Dawid } 320c5b2abe0SLewanczyk, Dawid 321c5b2abe0SLewanczyk, Dawid /** 322c5b2abe0SLewanczyk, Dawid * @brief Retrieves identify led group properties over dbus 323c5b2abe0SLewanczyk, Dawid * 324491d8ee7SSantosh Puranik * @param[in] aResp Shared pointer for generating response message. 325c5b2abe0SLewanczyk, Dawid * @param[in] callback Callback for process retrieved data. 326c5b2abe0SLewanczyk, Dawid * 327c5b2abe0SLewanczyk, Dawid * @return None. 328c5b2abe0SLewanczyk, Dawid */ 329c5b2abe0SLewanczyk, Dawid template <typename CallbackFunc> 330a0803efaSEd Tanous void getLedGroupIdentify(std::shared_ptr<AsyncResp> aResp, 3311abe55efSEd Tanous CallbackFunc &&callback) 3321abe55efSEd Tanous { 33355c7b7a2SEd Tanous BMCWEB_LOG_DEBUG << "Get led groups"; 33455c7b7a2SEd Tanous crow::connections::systemBus->async_method_call( 335c5d03ff4SJennifer Lee [aResp, 3366617338dSEd Tanous callback{std::move(callback)}](const boost::system::error_code &ec, 3371abe55efSEd Tanous const ManagedObjectsType &resp) { 3381abe55efSEd Tanous if (ec) 3391abe55efSEd Tanous { 34055c7b7a2SEd Tanous BMCWEB_LOG_DEBUG << "DBUS response error " << ec; 341f12894f8SJason M. Bills messages::internalError(aResp->res); 342c5b2abe0SLewanczyk, Dawid return; 343c5b2abe0SLewanczyk, Dawid } 3446c34de48SEd Tanous BMCWEB_LOG_DEBUG << "Got " << resp.size() << "led group objects."; 3451abe55efSEd Tanous for (const auto &objPath : resp) 3461abe55efSEd Tanous { 347c5b2abe0SLewanczyk, Dawid const std::string &path = objPath.first; 3481abe55efSEd Tanous if (path.rfind("enclosure_identify") != std::string::npos) 3491abe55efSEd Tanous { 3501abe55efSEd Tanous for (const auto &interface : objPath.second) 3511abe55efSEd Tanous { 3526c34de48SEd Tanous if (interface.first == "xyz.openbmc_project.Led.Group") 3531abe55efSEd Tanous { 3541abe55efSEd Tanous for (const auto &property : interface.second) 3551abe55efSEd Tanous { 3561abe55efSEd Tanous if (property.first == "Asserted") 3571abe55efSEd Tanous { 358c5b2abe0SLewanczyk, Dawid const bool *asserted = 359abf2add6SEd Tanous std::get_if<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 = 402abf2add6SEd Tanous std::get_if<std::string>(&property.second); 4031abe55efSEd Tanous if (nullptr != s) 4041abe55efSEd Tanous { 40555c7b7a2SEd Tanous BMCWEB_LOG_DEBUG << "Identify Led State: " << *s; 406c5b2abe0SLewanczyk, Dawid const auto pos = s->rfind('.'); 4071abe55efSEd Tanous if (pos != std::string::npos) 4081abe55efSEd Tanous { 409c5b2abe0SLewanczyk, Dawid auto led = s->substr(pos + 1); 4101abe55efSEd Tanous for (const std::pair<const char *, const char *> 4111abe55efSEd Tanous &p : 4121abe55efSEd Tanous std::array< 4136c34de48SEd Tanous std::pair<const char *, const char *>, 3>{ 4146c34de48SEd Tanous {{"On", "Lit"}, 415c5b2abe0SLewanczyk, Dawid {"Blink", "Blinking"}, 4161abe55efSEd Tanous {"Off", "Off"}}}) 4171abe55efSEd Tanous { 4181abe55efSEd Tanous if (led == p.first) 4191abe55efSEd Tanous { 420c5b2abe0SLewanczyk, Dawid output = p.second; 421c5b2abe0SLewanczyk, Dawid } 422c5b2abe0SLewanczyk, Dawid } 423c5b2abe0SLewanczyk, Dawid } 424c5b2abe0SLewanczyk, Dawid } 425c5b2abe0SLewanczyk, Dawid } 426c5b2abe0SLewanczyk, Dawid } 427c5b2abe0SLewanczyk, Dawid callback(output, aResp); 428c5b2abe0SLewanczyk, Dawid }, 429c5b2abe0SLewanczyk, Dawid "xyz.openbmc_project.LED.Controller.identify", 430c5b2abe0SLewanczyk, Dawid "/xyz/openbmc_project/led/physical/identify", 431c5b2abe0SLewanczyk, Dawid "org.freedesktop.DBus.Properties", "GetAll", 432c5b2abe0SLewanczyk, Dawid "xyz.openbmc_project.Led.Physical"); 433c5b2abe0SLewanczyk, Dawid } 434c5b2abe0SLewanczyk, Dawid /** 435c5b2abe0SLewanczyk, Dawid * @brief Retrieves host state properties over dbus 436c5b2abe0SLewanczyk, Dawid * 437c5b2abe0SLewanczyk, Dawid * @param[in] aResp Shared pointer for completing asynchronous calls. 438c5b2abe0SLewanczyk, Dawid * 439c5b2abe0SLewanczyk, Dawid * @return None. 440c5b2abe0SLewanczyk, Dawid */ 441a0803efaSEd Tanous void getHostState(std::shared_ptr<AsyncResp> aResp) 4421abe55efSEd Tanous { 44355c7b7a2SEd Tanous BMCWEB_LOG_DEBUG << "Get host information."; 44455c7b7a2SEd Tanous crow::connections::systemBus->async_method_call( 445c5d03ff4SJennifer Lee [aResp](const boost::system::error_code ec, 446abf2add6SEd Tanous const std::variant<std::string> &hostState) { 4471abe55efSEd Tanous if (ec) 4481abe55efSEd Tanous { 44955c7b7a2SEd Tanous BMCWEB_LOG_DEBUG << "DBUS response error " << ec; 450f12894f8SJason M. Bills messages::internalError(aResp->res); 451c5b2abe0SLewanczyk, Dawid return; 452c5b2abe0SLewanczyk, Dawid } 4536617338dSEd Tanous 454abf2add6SEd Tanous const std::string *s = std::get_if<std::string>(&hostState); 45555c7b7a2SEd Tanous BMCWEB_LOG_DEBUG << "Host state: " << *s; 4566617338dSEd Tanous if (s != nullptr) 4571abe55efSEd Tanous { 458c5b2abe0SLewanczyk, Dawid // Verify Host State 45994732661SAndrew Geissler if (*s == "xyz.openbmc_project.State.Host.HostState.Running") 4601abe55efSEd Tanous { 46155c7b7a2SEd Tanous aResp->res.jsonValue["PowerState"] = "On"; 4626617338dSEd Tanous aResp->res.jsonValue["Status"]["State"] = "Enabled"; 4631abe55efSEd Tanous } 4641abe55efSEd Tanous else 4651abe55efSEd Tanous { 46655c7b7a2SEd Tanous aResp->res.jsonValue["PowerState"] = "Off"; 4676617338dSEd Tanous aResp->res.jsonValue["Status"]["State"] = "Disabled"; 468c5b2abe0SLewanczyk, Dawid } 469c5b2abe0SLewanczyk, Dawid } 470c5b2abe0SLewanczyk, Dawid }, 4716c34de48SEd Tanous "xyz.openbmc_project.State.Host", "/xyz/openbmc_project/state/host0", 4726617338dSEd Tanous "org.freedesktop.DBus.Properties", "Get", 4736617338dSEd Tanous "xyz.openbmc_project.State.Host", "CurrentHostState"); 474c5b2abe0SLewanczyk, Dawid } 475c5b2abe0SLewanczyk, Dawid 476c5b2abe0SLewanczyk, Dawid /** 477491d8ee7SSantosh Puranik * @brief Traslates boot source DBUS property value to redfish. 478491d8ee7SSantosh Puranik * 479491d8ee7SSantosh Puranik * @param[in] dbusSource The boot source in DBUS speak. 480491d8ee7SSantosh Puranik * 481491d8ee7SSantosh Puranik * @return Returns as a string, the boot source in Redfish terms. If translation 482491d8ee7SSantosh Puranik * cannot be done, returns an empty string. 483491d8ee7SSantosh Puranik */ 484491d8ee7SSantosh Puranik static std::string dbusToRfBootSource(const std::string &dbusSource) 485491d8ee7SSantosh Puranik { 486491d8ee7SSantosh Puranik if (dbusSource == "xyz.openbmc_project.Control.Boot.Source.Sources.Default") 487491d8ee7SSantosh Puranik { 488491d8ee7SSantosh Puranik return "None"; 489491d8ee7SSantosh Puranik } 490491d8ee7SSantosh Puranik else if (dbusSource == 491491d8ee7SSantosh Puranik "xyz.openbmc_project.Control.Boot.Source.Sources.Disk") 492491d8ee7SSantosh Puranik { 493491d8ee7SSantosh Puranik return "Hdd"; 494491d8ee7SSantosh Puranik } 495491d8ee7SSantosh Puranik else if (dbusSource == 496a71dc0b7SSantosh Puranik "xyz.openbmc_project.Control.Boot.Source.Sources.ExternalMedia") 497491d8ee7SSantosh Puranik { 498491d8ee7SSantosh Puranik return "Cd"; 499491d8ee7SSantosh Puranik } 500491d8ee7SSantosh Puranik else if (dbusSource == 501491d8ee7SSantosh Puranik "xyz.openbmc_project.Control.Boot.Source.Sources.Network") 502491d8ee7SSantosh Puranik { 503491d8ee7SSantosh Puranik return "Pxe"; 504491d8ee7SSantosh Puranik } 5059f16b2c1SJennifer Lee else if (dbusSource == 5069f16b2c1SJennifer Lee "xyz.openbmc_project.Control.Boot.Source.Sources.Removable") 5079f16b2c1SJennifer Lee { 5089f16b2c1SJennifer Lee return "Usb"; 5099f16b2c1SJennifer Lee } 510491d8ee7SSantosh Puranik else 511491d8ee7SSantosh Puranik { 512491d8ee7SSantosh Puranik return ""; 513491d8ee7SSantosh Puranik } 514491d8ee7SSantosh Puranik } 515491d8ee7SSantosh Puranik 516491d8ee7SSantosh Puranik /** 517491d8ee7SSantosh Puranik * @brief Traslates boot mode DBUS property value to redfish. 518491d8ee7SSantosh Puranik * 519491d8ee7SSantosh Puranik * @param[in] dbusMode The boot mode in DBUS speak. 520491d8ee7SSantosh Puranik * 521491d8ee7SSantosh Puranik * @return Returns as a string, the boot mode in Redfish terms. If translation 522491d8ee7SSantosh Puranik * cannot be done, returns an empty string. 523491d8ee7SSantosh Puranik */ 524491d8ee7SSantosh Puranik static std::string dbusToRfBootMode(const std::string &dbusMode) 525491d8ee7SSantosh Puranik { 526491d8ee7SSantosh Puranik if (dbusMode == "xyz.openbmc_project.Control.Boot.Mode.Modes.Regular") 527491d8ee7SSantosh Puranik { 528491d8ee7SSantosh Puranik return "None"; 529491d8ee7SSantosh Puranik } 530491d8ee7SSantosh Puranik else if (dbusMode == "xyz.openbmc_project.Control.Boot.Mode.Modes.Safe") 531491d8ee7SSantosh Puranik { 532491d8ee7SSantosh Puranik return "Diags"; 533491d8ee7SSantosh Puranik } 534491d8ee7SSantosh Puranik else if (dbusMode == "xyz.openbmc_project.Control.Boot.Mode.Modes.Setup") 535491d8ee7SSantosh Puranik { 536491d8ee7SSantosh Puranik return "BiosSetup"; 537491d8ee7SSantosh Puranik } 538491d8ee7SSantosh Puranik else 539491d8ee7SSantosh Puranik { 540491d8ee7SSantosh Puranik return ""; 541491d8ee7SSantosh Puranik } 542491d8ee7SSantosh Puranik } 543491d8ee7SSantosh Puranik 544491d8ee7SSantosh Puranik /** 545491d8ee7SSantosh Puranik * @brief Traslates boot source from Redfish to DBUS property value. 546491d8ee7SSantosh Puranik * 547491d8ee7SSantosh Puranik * @param[in] rfSource The boot source in Redfish. 548491d8ee7SSantosh Puranik * 549491d8ee7SSantosh Puranik * @return Returns as a string, the boot source as expected by DBUS. 550491d8ee7SSantosh Puranik * If translation cannot be done, returns an empty string. 551491d8ee7SSantosh Puranik */ 552491d8ee7SSantosh Puranik static std::string rfToDbusBootSource(const std::string &rfSource) 553491d8ee7SSantosh Puranik { 554491d8ee7SSantosh Puranik if (rfSource == "None") 555491d8ee7SSantosh Puranik { 556491d8ee7SSantosh Puranik return "xyz.openbmc_project.Control.Boot.Source.Sources.Default"; 557491d8ee7SSantosh Puranik } 558491d8ee7SSantosh Puranik else if (rfSource == "Hdd") 559491d8ee7SSantosh Puranik { 560491d8ee7SSantosh Puranik return "xyz.openbmc_project.Control.Boot.Source.Sources.Disk"; 561491d8ee7SSantosh Puranik } 562491d8ee7SSantosh Puranik else if (rfSource == "Cd") 563491d8ee7SSantosh Puranik { 564a71dc0b7SSantosh Puranik return "xyz.openbmc_project.Control.Boot.Source.Sources.ExternalMedia"; 565491d8ee7SSantosh Puranik } 566491d8ee7SSantosh Puranik else if (rfSource == "Pxe") 567491d8ee7SSantosh Puranik { 568491d8ee7SSantosh Puranik return "xyz.openbmc_project.Control.Boot.Source.Sources.Network"; 569491d8ee7SSantosh Puranik } 5709f16b2c1SJennifer Lee else if (rfSource == "Usb") 5719f16b2c1SJennifer Lee { 5729f16b2c1SJennifer Lee return "xyz.openbmc_project.Control.Boot.Source.Sources.Removable"; 5739f16b2c1SJennifer Lee } 574491d8ee7SSantosh Puranik else 575491d8ee7SSantosh Puranik { 576491d8ee7SSantosh Puranik return ""; 577491d8ee7SSantosh Puranik } 578491d8ee7SSantosh Puranik } 579491d8ee7SSantosh Puranik 580491d8ee7SSantosh Puranik /** 581491d8ee7SSantosh Puranik * @brief Traslates boot mode from Redfish to DBUS property value. 582491d8ee7SSantosh Puranik * 583491d8ee7SSantosh Puranik * @param[in] rfMode The boot mode in Redfish. 584491d8ee7SSantosh Puranik * 585491d8ee7SSantosh Puranik * @return Returns as a string, the boot mode as expected by DBUS. 586491d8ee7SSantosh Puranik * If translation cannot be done, returns an empty string. 587491d8ee7SSantosh Puranik */ 588491d8ee7SSantosh Puranik static std::string rfToDbusBootMode(const std::string &rfMode) 589491d8ee7SSantosh Puranik { 590491d8ee7SSantosh Puranik if (rfMode == "None") 591491d8ee7SSantosh Puranik { 592491d8ee7SSantosh Puranik return "xyz.openbmc_project.Control.Boot.Mode.Modes.Regular"; 593491d8ee7SSantosh Puranik } 594491d8ee7SSantosh Puranik else if (rfMode == "Diags") 595491d8ee7SSantosh Puranik { 596491d8ee7SSantosh Puranik return "xyz.openbmc_project.Control.Boot.Mode.Modes.Safe"; 597491d8ee7SSantosh Puranik } 598491d8ee7SSantosh Puranik else if (rfMode == "BiosSetup") 599491d8ee7SSantosh Puranik { 600491d8ee7SSantosh Puranik return "xyz.openbmc_project.Control.Boot.Mode.Modes.Setup"; 601491d8ee7SSantosh Puranik } 602491d8ee7SSantosh Puranik else 603491d8ee7SSantosh Puranik { 604491d8ee7SSantosh Puranik return ""; 605491d8ee7SSantosh Puranik } 606491d8ee7SSantosh Puranik } 607491d8ee7SSantosh Puranik 608491d8ee7SSantosh Puranik /** 609491d8ee7SSantosh Puranik * @brief Retrieves boot mode over DBUS and fills out the response 610491d8ee7SSantosh Puranik * 611491d8ee7SSantosh Puranik * @param[in] aResp Shared pointer for generating response message. 612491d8ee7SSantosh Puranik * @param[in] bootDbusObj The dbus object to query for boot properties. 613491d8ee7SSantosh Puranik * 614491d8ee7SSantosh Puranik * @return None. 615491d8ee7SSantosh Puranik */ 616491d8ee7SSantosh Puranik static void getBootMode(std::shared_ptr<AsyncResp> aResp, 617491d8ee7SSantosh Puranik std::string bootDbusObj) 618491d8ee7SSantosh Puranik { 619491d8ee7SSantosh Puranik crow::connections::systemBus->async_method_call( 620491d8ee7SSantosh Puranik [aResp](const boost::system::error_code ec, 621491d8ee7SSantosh Puranik const std::variant<std::string> &bootMode) { 622491d8ee7SSantosh Puranik if (ec) 623491d8ee7SSantosh Puranik { 624491d8ee7SSantosh Puranik BMCWEB_LOG_DEBUG << "DBUS response error " << ec; 625491d8ee7SSantosh Puranik messages::internalError(aResp->res); 626491d8ee7SSantosh Puranik return; 627491d8ee7SSantosh Puranik } 628491d8ee7SSantosh Puranik 629491d8ee7SSantosh Puranik const std::string *bootModeStr = 630491d8ee7SSantosh Puranik std::get_if<std::string>(&bootMode); 631491d8ee7SSantosh Puranik 632491d8ee7SSantosh Puranik if (!bootModeStr) 633491d8ee7SSantosh Puranik { 634491d8ee7SSantosh Puranik messages::internalError(aResp->res); 635491d8ee7SSantosh Puranik return; 636491d8ee7SSantosh Puranik } 637491d8ee7SSantosh Puranik 638491d8ee7SSantosh Puranik BMCWEB_LOG_DEBUG << "Boot mode: " << *bootModeStr; 639491d8ee7SSantosh Puranik 640491d8ee7SSantosh Puranik // TODO (Santosh): Do we need to support override mode? 641491d8ee7SSantosh Puranik aResp->res.jsonValue["Boot"]["BootSourceOverrideMode"] = "Legacy"; 642491d8ee7SSantosh Puranik aResp->res.jsonValue["Boot"]["BootSourceOverrideTarget@Redfish." 643491d8ee7SSantosh Puranik "AllowableValues"] = { 644491d8ee7SSantosh Puranik "None", "Pxe", "Hdd", "Cd", "Diags", "BiosSetup"}; 645491d8ee7SSantosh Puranik 646491d8ee7SSantosh Puranik if (*bootModeStr != 647491d8ee7SSantosh Puranik "xyz.openbmc_project.Control.Boot.Mode.Modes.Regular") 648491d8ee7SSantosh Puranik { 649491d8ee7SSantosh Puranik auto rfMode = dbusToRfBootMode(*bootModeStr); 650491d8ee7SSantosh Puranik if (!rfMode.empty()) 651491d8ee7SSantosh Puranik { 652491d8ee7SSantosh Puranik aResp->res.jsonValue["Boot"]["BootSourceOverrideTarget"] = 653491d8ee7SSantosh Puranik rfMode; 654491d8ee7SSantosh Puranik } 655491d8ee7SSantosh Puranik } 656491d8ee7SSantosh Puranik 657491d8ee7SSantosh Puranik // If the BootSourceOverrideTarget is still "None" at the end, 658491d8ee7SSantosh Puranik // reset the BootSourceOverrideEnabled to indicate that 659491d8ee7SSantosh Puranik // overrides are disabled 660491d8ee7SSantosh Puranik if (aResp->res.jsonValue["Boot"]["BootSourceOverrideTarget"] == 661491d8ee7SSantosh Puranik "None") 662491d8ee7SSantosh Puranik { 663491d8ee7SSantosh Puranik aResp->res.jsonValue["Boot"]["BootSourceOverrideEnabled"] = 664491d8ee7SSantosh Puranik "Disabled"; 665491d8ee7SSantosh Puranik } 666491d8ee7SSantosh Puranik }, 667491d8ee7SSantosh Puranik "xyz.openbmc_project.Settings", bootDbusObj, 668491d8ee7SSantosh Puranik "org.freedesktop.DBus.Properties", "Get", 669491d8ee7SSantosh Puranik "xyz.openbmc_project.Control.Boot.Mode", "BootMode"); 670491d8ee7SSantosh Puranik } 671491d8ee7SSantosh Puranik 672491d8ee7SSantosh Puranik /** 673491d8ee7SSantosh Puranik * @brief Retrieves boot source over DBUS 674491d8ee7SSantosh Puranik * 675491d8ee7SSantosh Puranik * @param[in] aResp Shared pointer for generating response message. 676491d8ee7SSantosh Puranik * @param[in] oneTimeEnable Boolean to indicate boot properties are one-time. 677491d8ee7SSantosh Puranik * 678491d8ee7SSantosh Puranik * @return None. 679491d8ee7SSantosh Puranik */ 680491d8ee7SSantosh Puranik static void getBootSource(std::shared_ptr<AsyncResp> aResp, bool oneTimeEnabled) 681491d8ee7SSantosh Puranik { 682491d8ee7SSantosh Puranik std::string bootDbusObj = 683491d8ee7SSantosh Puranik oneTimeEnabled ? "/xyz/openbmc_project/control/host0/boot/one_time" 684491d8ee7SSantosh Puranik : "/xyz/openbmc_project/control/host0/boot"; 685491d8ee7SSantosh Puranik 686491d8ee7SSantosh Puranik BMCWEB_LOG_DEBUG << "Is one time: " << oneTimeEnabled; 687491d8ee7SSantosh Puranik aResp->res.jsonValue["Boot"]["BootSourceOverrideEnabled"] = 688491d8ee7SSantosh Puranik (oneTimeEnabled) ? "Once" : "Continuous"; 689491d8ee7SSantosh Puranik 690491d8ee7SSantosh Puranik crow::connections::systemBus->async_method_call( 691491d8ee7SSantosh Puranik [aResp, bootDbusObj](const boost::system::error_code ec, 692491d8ee7SSantosh Puranik const std::variant<std::string> &bootSource) { 693491d8ee7SSantosh Puranik if (ec) 694491d8ee7SSantosh Puranik { 695491d8ee7SSantosh Puranik BMCWEB_LOG_DEBUG << "DBUS response error " << ec; 696491d8ee7SSantosh Puranik messages::internalError(aResp->res); 697491d8ee7SSantosh Puranik return; 698491d8ee7SSantosh Puranik } 699491d8ee7SSantosh Puranik 700491d8ee7SSantosh Puranik const std::string *bootSourceStr = 701491d8ee7SSantosh Puranik std::get_if<std::string>(&bootSource); 702491d8ee7SSantosh Puranik 703491d8ee7SSantosh Puranik if (!bootSourceStr) 704491d8ee7SSantosh Puranik { 705491d8ee7SSantosh Puranik messages::internalError(aResp->res); 706491d8ee7SSantosh Puranik return; 707491d8ee7SSantosh Puranik } 708491d8ee7SSantosh Puranik BMCWEB_LOG_DEBUG << "Boot source: " << *bootSourceStr; 709491d8ee7SSantosh Puranik 710491d8ee7SSantosh Puranik auto rfSource = dbusToRfBootSource(*bootSourceStr); 711491d8ee7SSantosh Puranik if (!rfSource.empty()) 712491d8ee7SSantosh Puranik { 713491d8ee7SSantosh Puranik aResp->res.jsonValue["Boot"]["BootSourceOverrideTarget"] = 714491d8ee7SSantosh Puranik rfSource; 715491d8ee7SSantosh Puranik } 716491d8ee7SSantosh Puranik }, 717491d8ee7SSantosh Puranik "xyz.openbmc_project.Settings", bootDbusObj, 718491d8ee7SSantosh Puranik "org.freedesktop.DBus.Properties", "Get", 719491d8ee7SSantosh Puranik "xyz.openbmc_project.Control.Boot.Source", "BootSource"); 720491d8ee7SSantosh Puranik getBootMode(std::move(aResp), std::move(bootDbusObj)); 721491d8ee7SSantosh Puranik } 722491d8ee7SSantosh Puranik 723491d8ee7SSantosh Puranik /** 724491d8ee7SSantosh Puranik * @brief Retrieves "One time" enabled setting over DBUS and calls function to 725491d8ee7SSantosh Puranik * get boot source and boot mode. 726491d8ee7SSantosh Puranik * 727491d8ee7SSantosh Puranik * @param[in] aResp Shared pointer for generating response message. 728491d8ee7SSantosh Puranik * 729491d8ee7SSantosh Puranik * @return None. 730491d8ee7SSantosh Puranik */ 731491d8ee7SSantosh Puranik static void getBootProperties(std::shared_ptr<AsyncResp> aResp) 732491d8ee7SSantosh Puranik { 733491d8ee7SSantosh Puranik BMCWEB_LOG_DEBUG << "Get boot information."; 734491d8ee7SSantosh Puranik 735491d8ee7SSantosh Puranik crow::connections::systemBus->async_method_call( 736c5d03ff4SJennifer Lee [aResp](const boost::system::error_code ec, 737491d8ee7SSantosh Puranik const sdbusplus::message::variant<bool> &oneTime) { 738491d8ee7SSantosh Puranik if (ec) 739491d8ee7SSantosh Puranik { 740491d8ee7SSantosh Puranik BMCWEB_LOG_DEBUG << "DBUS response error " << ec; 741491d8ee7SSantosh Puranik messages::internalError(aResp->res); 742491d8ee7SSantosh Puranik return; 743491d8ee7SSantosh Puranik } 744491d8ee7SSantosh Puranik 745491d8ee7SSantosh Puranik const bool *oneTimePtr = std::get_if<bool>(&oneTime); 746491d8ee7SSantosh Puranik 747491d8ee7SSantosh Puranik if (!oneTimePtr) 748491d8ee7SSantosh Puranik { 749491d8ee7SSantosh Puranik messages::internalError(aResp->res); 750491d8ee7SSantosh Puranik return; 751491d8ee7SSantosh Puranik } 752491d8ee7SSantosh Puranik getBootSource(aResp, *oneTimePtr); 753491d8ee7SSantosh Puranik }, 754491d8ee7SSantosh Puranik "xyz.openbmc_project.Settings", 755491d8ee7SSantosh Puranik "/xyz/openbmc_project/control/host0/boot/one_time", 756491d8ee7SSantosh Puranik "org.freedesktop.DBus.Properties", "Get", 757491d8ee7SSantosh Puranik "xyz.openbmc_project.Object.Enable", "Enabled"); 758491d8ee7SSantosh Puranik } 759491d8ee7SSantosh Puranik 760491d8ee7SSantosh Puranik /** 761491d8ee7SSantosh Puranik * @brief Sets boot properties into DBUS object(s). 762491d8ee7SSantosh Puranik * 763491d8ee7SSantosh Puranik * @param[in] aResp Shared pointer for generating response message. 764491d8ee7SSantosh Puranik * @param[in] oneTimeEnabled Is "one-time" setting already enabled. 765491d8ee7SSantosh Puranik * @param[in] bootSource The boot source to set. 766491d8ee7SSantosh Puranik * @param[in] bootEnable The source override "enable" to set. 767491d8ee7SSantosh Puranik * 768491d8ee7SSantosh Puranik * @return None. 769491d8ee7SSantosh Puranik */ 770491d8ee7SSantosh Puranik static void setBootModeOrSource(std::shared_ptr<AsyncResp> aResp, 771491d8ee7SSantosh Puranik bool oneTimeEnabled, 772491d8ee7SSantosh Puranik std::optional<std::string> bootSource, 773491d8ee7SSantosh Puranik std::optional<std::string> bootEnable) 774491d8ee7SSantosh Puranik { 775491d8ee7SSantosh Puranik if (bootEnable && (bootEnable != "Once") && (bootEnable != "Continuous") && 776491d8ee7SSantosh Puranik (bootEnable != "Disabled")) 777491d8ee7SSantosh Puranik { 778491d8ee7SSantosh Puranik BMCWEB_LOG_DEBUG << "Unsupported value for BootSourceOverrideEnabled: " 779491d8ee7SSantosh Puranik << *bootEnable; 780491d8ee7SSantosh Puranik messages::propertyValueNotInList(aResp->res, *bootEnable, 781491d8ee7SSantosh Puranik "BootSourceOverrideEnabled"); 782491d8ee7SSantosh Puranik return; 783491d8ee7SSantosh Puranik } 784491d8ee7SSantosh Puranik 785491d8ee7SSantosh Puranik bool oneTimeSetting = oneTimeEnabled; 786491d8ee7SSantosh Puranik // Validate incoming parameters 787491d8ee7SSantosh Puranik if (bootEnable) 788491d8ee7SSantosh Puranik { 789491d8ee7SSantosh Puranik if (*bootEnable == "Once") 790491d8ee7SSantosh Puranik { 791491d8ee7SSantosh Puranik oneTimeSetting = true; 792491d8ee7SSantosh Puranik } 793491d8ee7SSantosh Puranik else if (*bootEnable == "Continuous") 794491d8ee7SSantosh Puranik { 795491d8ee7SSantosh Puranik oneTimeSetting = false; 796491d8ee7SSantosh Puranik } 797491d8ee7SSantosh Puranik else if (*bootEnable == "Disabled") 798491d8ee7SSantosh Puranik { 799491d8ee7SSantosh Puranik oneTimeSetting = false; 800491d8ee7SSantosh Puranik } 801491d8ee7SSantosh Puranik else 802491d8ee7SSantosh Puranik { 803491d8ee7SSantosh Puranik 804491d8ee7SSantosh Puranik BMCWEB_LOG_DEBUG << "Unsupported value for " 805491d8ee7SSantosh Puranik "BootSourceOverrideEnabled: " 806491d8ee7SSantosh Puranik << *bootEnable; 807491d8ee7SSantosh Puranik messages::propertyValueNotInList(aResp->res, *bootEnable, 808491d8ee7SSantosh Puranik "BootSourceOverrideEnabled"); 809491d8ee7SSantosh Puranik return; 810491d8ee7SSantosh Puranik } 811491d8ee7SSantosh Puranik } 812491d8ee7SSantosh Puranik std::string bootSourceStr; 813491d8ee7SSantosh Puranik std::string bootModeStr; 814491d8ee7SSantosh Puranik if (bootSource) 815491d8ee7SSantosh Puranik { 816491d8ee7SSantosh Puranik bootSourceStr = rfToDbusBootSource(*bootSource); 817491d8ee7SSantosh Puranik bootModeStr = rfToDbusBootMode(*bootSource); 818491d8ee7SSantosh Puranik 819491d8ee7SSantosh Puranik BMCWEB_LOG_DEBUG << "DBUS boot source: " << bootSourceStr; 820491d8ee7SSantosh Puranik BMCWEB_LOG_DEBUG << "DBUS boot mode: " << bootModeStr; 821491d8ee7SSantosh Puranik 822491d8ee7SSantosh Puranik if (bootSourceStr.empty() && bootModeStr.empty()) 823491d8ee7SSantosh Puranik { 824491d8ee7SSantosh Puranik BMCWEB_LOG_DEBUG << "Invalid property value for " 825491d8ee7SSantosh Puranik "BootSourceOverrideTarget: " 826491d8ee7SSantosh Puranik << *bootSource; 827491d8ee7SSantosh Puranik messages::propertyValueNotInList(aResp->res, *bootSource, 828491d8ee7SSantosh Puranik "BootSourceTargetOverride"); 829491d8ee7SSantosh Puranik return; 830491d8ee7SSantosh Puranik } 831491d8ee7SSantosh Puranik } 832491d8ee7SSantosh Puranik const char *bootObj = 833491d8ee7SSantosh Puranik oneTimeSetting ? "/xyz/openbmc_project/control/host0/boot/one_time" 834491d8ee7SSantosh Puranik : "/xyz/openbmc_project/control/host0/boot"; 835491d8ee7SSantosh Puranik // Figure out what properties to set 836491d8ee7SSantosh Puranik if (bootEnable && (*bootEnable == "Disabled")) 837491d8ee7SSantosh Puranik { 838491d8ee7SSantosh Puranik BMCWEB_LOG_DEBUG << "Boot source override will be disabled"; 839491d8ee7SSantosh Puranik // Request to only turn OFF/ON enabled, if turning enabled OFF, need 840491d8ee7SSantosh Puranik // to reset the source and mode too. If turning it ON, we only need 841491d8ee7SSantosh Puranik // to set the enabled property 842491d8ee7SSantosh Puranik bootSourceStr = 843491d8ee7SSantosh Puranik "xyz.openbmc_project.Control.Boot.Source.Sources.Default"; 844491d8ee7SSantosh Puranik bootModeStr = "xyz.openbmc_project.Control.Boot.Mode.Modes.Regular"; 845491d8ee7SSantosh Puranik } 846491d8ee7SSantosh Puranik else if (bootSource) 847491d8ee7SSantosh Puranik { 848491d8ee7SSantosh Puranik // Source target specified 849491d8ee7SSantosh Puranik BMCWEB_LOG_DEBUG << "Boot source: " << *bootSource; 850491d8ee7SSantosh Puranik // Figure out which DBUS interface and property to use 851491d8ee7SSantosh Puranik bootSourceStr = rfToDbusBootSource(*bootSource); 852491d8ee7SSantosh Puranik bootModeStr = rfToDbusBootMode(*bootSource); 853491d8ee7SSantosh Puranik 854491d8ee7SSantosh Puranik BMCWEB_LOG_DEBUG << "DBUS boot source: " << bootSourceStr; 855491d8ee7SSantosh Puranik BMCWEB_LOG_DEBUG << "DBUS boot mode: " << bootModeStr; 856491d8ee7SSantosh Puranik 857491d8ee7SSantosh Puranik if (bootSourceStr.empty() && bootModeStr.empty()) 858491d8ee7SSantosh Puranik { 859491d8ee7SSantosh Puranik BMCWEB_LOG_DEBUG << "Invalid property value for " 860491d8ee7SSantosh Puranik "BootSourceOverrideTarget: " 861491d8ee7SSantosh Puranik << *bootSource; 862491d8ee7SSantosh Puranik messages::propertyValueNotInList(aResp->res, *bootSource, 863491d8ee7SSantosh Puranik "BootSourceTargetOverride"); 864491d8ee7SSantosh Puranik return; 865491d8ee7SSantosh Puranik } 866491d8ee7SSantosh Puranik 867491d8ee7SSantosh Puranik if (!bootSourceStr.empty()) 868491d8ee7SSantosh Puranik { 869491d8ee7SSantosh Puranik // If setting to anything other than default, also reset boot 870491d8ee7SSantosh Puranik // mode property 871491d8ee7SSantosh Puranik if (bootSourceStr != 872491d8ee7SSantosh Puranik "xyz.openbmc_project.Control.Boot.Source.Sources.Default") 873491d8ee7SSantosh Puranik { 874491d8ee7SSantosh Puranik bootModeStr = 875491d8ee7SSantosh Puranik "xyz.openbmc_project.Control.Boot.Mode.Modes.Regular"; 876491d8ee7SSantosh Puranik } 877491d8ee7SSantosh Puranik } 878491d8ee7SSantosh Puranik else // if (!bootModeStr.empty()) 879491d8ee7SSantosh Puranik { 880491d8ee7SSantosh Puranik // If setting to anything other than default, also reset boot 881491d8ee7SSantosh Puranik // source property 882491d8ee7SSantosh Puranik if (bootModeStr != 883491d8ee7SSantosh Puranik "xyz.openbmc_project.Control.Boot.Mode.Modes.Regular") 884491d8ee7SSantosh Puranik { 885491d8ee7SSantosh Puranik bootSourceStr = 886491d8ee7SSantosh Puranik "xyz.openbmc_project.Control.Boot.Source.Sources.Default"; 887491d8ee7SSantosh Puranik } 888491d8ee7SSantosh Puranik } 889491d8ee7SSantosh Puranik } 890491d8ee7SSantosh Puranik if (!bootSourceStr.empty()) 891491d8ee7SSantosh Puranik { 892491d8ee7SSantosh Puranik crow::connections::systemBus->async_method_call( 893491d8ee7SSantosh Puranik [aResp](const boost::system::error_code ec) { 894491d8ee7SSantosh Puranik if (ec) 895491d8ee7SSantosh Puranik { 896491d8ee7SSantosh Puranik BMCWEB_LOG_DEBUG << "DBUS response error " << ec; 897491d8ee7SSantosh Puranik messages::internalError(aResp->res); 898491d8ee7SSantosh Puranik return; 899491d8ee7SSantosh Puranik } 900491d8ee7SSantosh Puranik BMCWEB_LOG_DEBUG << "Boot source update done."; 901491d8ee7SSantosh Puranik }, 902491d8ee7SSantosh Puranik "xyz.openbmc_project.Settings", bootObj, 903491d8ee7SSantosh Puranik "org.freedesktop.DBus.Properties", "Set", 904491d8ee7SSantosh Puranik "xyz.openbmc_project.Control.Boot.Source", "BootSource", 905491d8ee7SSantosh Puranik std::variant<std::string>(bootSourceStr)); 906491d8ee7SSantosh Puranik } 907491d8ee7SSantosh Puranik if (!bootModeStr.empty()) 908491d8ee7SSantosh Puranik { 909491d8ee7SSantosh Puranik crow::connections::systemBus->async_method_call( 910491d8ee7SSantosh Puranik [aResp](const boost::system::error_code ec) { 911491d8ee7SSantosh Puranik if (ec) 912491d8ee7SSantosh Puranik { 913491d8ee7SSantosh Puranik BMCWEB_LOG_DEBUG << "DBUS response error " << ec; 914491d8ee7SSantosh Puranik messages::internalError(aResp->res); 915491d8ee7SSantosh Puranik return; 916491d8ee7SSantosh Puranik } 917491d8ee7SSantosh Puranik BMCWEB_LOG_DEBUG << "Boot mode update done."; 918491d8ee7SSantosh Puranik }, 919491d8ee7SSantosh Puranik "xyz.openbmc_project.Settings", bootObj, 920491d8ee7SSantosh Puranik "org.freedesktop.DBus.Properties", "Set", 921491d8ee7SSantosh Puranik "xyz.openbmc_project.Control.Boot.Mode", "BootMode", 922491d8ee7SSantosh Puranik std::variant<std::string>(bootModeStr)); 923491d8ee7SSantosh Puranik } 924491d8ee7SSantosh Puranik crow::connections::systemBus->async_method_call( 925491d8ee7SSantosh Puranik [aResp{std::move(aResp)}](const boost::system::error_code ec) { 926491d8ee7SSantosh Puranik if (ec) 927491d8ee7SSantosh Puranik { 928491d8ee7SSantosh Puranik BMCWEB_LOG_DEBUG << "DBUS response error " << ec; 929491d8ee7SSantosh Puranik messages::internalError(aResp->res); 930491d8ee7SSantosh Puranik return; 931491d8ee7SSantosh Puranik } 932491d8ee7SSantosh Puranik BMCWEB_LOG_DEBUG << "Boot enable update done."; 933491d8ee7SSantosh Puranik }, 934491d8ee7SSantosh Puranik "xyz.openbmc_project.Settings", 935491d8ee7SSantosh Puranik "/xyz/openbmc_project/control/host0/boot/one_time", 936491d8ee7SSantosh Puranik "org.freedesktop.DBus.Properties", "Set", 937491d8ee7SSantosh Puranik "xyz.openbmc_project.Object.Enable", "Enabled", 938491d8ee7SSantosh Puranik std::variant<bool>(oneTimeSetting)); 939491d8ee7SSantosh Puranik } 940491d8ee7SSantosh Puranik 941491d8ee7SSantosh Puranik /** 942491d8ee7SSantosh Puranik * @brief Retrieves "One time" enabled setting over DBUS and calls function to 943491d8ee7SSantosh Puranik * set boot source/boot mode properties. 944491d8ee7SSantosh Puranik * 945491d8ee7SSantosh Puranik * @param[in] aResp Shared pointer for generating response message. 946491d8ee7SSantosh Puranik * @param[in] bootSource The boot source from incoming RF request. 947491d8ee7SSantosh Puranik * @param[in] bootEnable The boot override enable from incoming RF request. 948491d8ee7SSantosh Puranik * 949491d8ee7SSantosh Puranik * @return None. 950491d8ee7SSantosh Puranik */ 951491d8ee7SSantosh Puranik static void setBootProperties(std::shared_ptr<AsyncResp> aResp, 952491d8ee7SSantosh Puranik std::optional<std::string> bootSource, 953491d8ee7SSantosh Puranik std::optional<std::string> bootEnable) 954491d8ee7SSantosh Puranik { 955491d8ee7SSantosh Puranik BMCWEB_LOG_DEBUG << "Set boot information."; 956491d8ee7SSantosh Puranik 957491d8ee7SSantosh Puranik crow::connections::systemBus->async_method_call( 958491d8ee7SSantosh Puranik [aResp{std::move(aResp)}, bootSource{std::move(bootSource)}, 959491d8ee7SSantosh Puranik bootEnable{std::move(bootEnable)}]( 960491d8ee7SSantosh Puranik const boost::system::error_code ec, 961491d8ee7SSantosh Puranik const sdbusplus::message::variant<bool> &oneTime) { 962491d8ee7SSantosh Puranik if (ec) 963491d8ee7SSantosh Puranik { 964491d8ee7SSantosh Puranik BMCWEB_LOG_DEBUG << "DBUS response error " << ec; 965491d8ee7SSantosh Puranik messages::internalError(aResp->res); 966491d8ee7SSantosh Puranik return; 967491d8ee7SSantosh Puranik } 968491d8ee7SSantosh Puranik 969491d8ee7SSantosh Puranik const bool *oneTimePtr = std::get_if<bool>(&oneTime); 970491d8ee7SSantosh Puranik 971491d8ee7SSantosh Puranik if (!oneTimePtr) 972491d8ee7SSantosh Puranik { 973491d8ee7SSantosh Puranik messages::internalError(aResp->res); 974491d8ee7SSantosh Puranik return; 975491d8ee7SSantosh Puranik } 976491d8ee7SSantosh Puranik 977491d8ee7SSantosh Puranik BMCWEB_LOG_DEBUG << "Got one time: " << *oneTimePtr; 978491d8ee7SSantosh Puranik 979491d8ee7SSantosh Puranik setBootModeOrSource(aResp, *oneTimePtr, std::move(bootSource), 980491d8ee7SSantosh Puranik std::move(bootEnable)); 981491d8ee7SSantosh Puranik }, 982491d8ee7SSantosh Puranik "xyz.openbmc_project.Settings", 983491d8ee7SSantosh Puranik "/xyz/openbmc_project/control/host0/boot/one_time", 984491d8ee7SSantosh Puranik "org.freedesktop.DBus.Properties", "Get", 985491d8ee7SSantosh Puranik "xyz.openbmc_project.Object.Enable", "Enabled"); 986491d8ee7SSantosh Puranik } 987491d8ee7SSantosh Puranik 988491d8ee7SSantosh Puranik /** 989c5b2abe0SLewanczyk, Dawid * SystemsCollection derived class for delivering ComputerSystems Collection 990c5b2abe0SLewanczyk, Dawid * Schema 991c5b2abe0SLewanczyk, Dawid */ 9921abe55efSEd Tanous class SystemsCollection : public Node 9931abe55efSEd Tanous { 994c5b2abe0SLewanczyk, Dawid public: 9951abe55efSEd Tanous SystemsCollection(CrowApp &app) : Node(app, "/redfish/v1/Systems/") 9961abe55efSEd Tanous { 997c5b2abe0SLewanczyk, Dawid entityPrivileges = { 998c5b2abe0SLewanczyk, Dawid {boost::beast::http::verb::get, {{"Login"}}}, 999c5b2abe0SLewanczyk, Dawid {boost::beast::http::verb::head, {{"Login"}}}, 1000c5b2abe0SLewanczyk, Dawid {boost::beast::http::verb::patch, {{"ConfigureComponents"}}}, 1001c5b2abe0SLewanczyk, Dawid {boost::beast::http::verb::put, {{"ConfigureComponents"}}}, 1002c5b2abe0SLewanczyk, Dawid {boost::beast::http::verb::delete_, {{"ConfigureComponents"}}}, 1003c5b2abe0SLewanczyk, Dawid {boost::beast::http::verb::post, {{"ConfigureComponents"}}}}; 1004c5b2abe0SLewanczyk, Dawid } 1005c5b2abe0SLewanczyk, Dawid 1006c5b2abe0SLewanczyk, Dawid private: 100755c7b7a2SEd Tanous void doGet(crow::Response &res, const crow::Request &req, 10081abe55efSEd Tanous const std::vector<std::string> ¶ms) override 10091abe55efSEd Tanous { 10100f74e643SEd Tanous res.jsonValue["@odata.type"] = 10110f74e643SEd Tanous "#ComputerSystemCollection.ComputerSystemCollection"; 10120f74e643SEd Tanous res.jsonValue["@odata.id"] = "/redfish/v1/Systems"; 10130f74e643SEd Tanous res.jsonValue["@odata.context"] = 10140f74e643SEd Tanous "/redfish/v1/" 10150f74e643SEd Tanous "$metadata#ComputerSystemCollection.ComputerSystemCollection"; 10160f74e643SEd Tanous res.jsonValue["Name"] = "Computer System Collection"; 1017029573d4SEd Tanous res.jsonValue["Members"] = { 1018029573d4SEd Tanous {{"@odata.id", "/redfish/v1/Systems/system"}}}; 1019029573d4SEd Tanous res.jsonValue["Members@odata.count"] = 1; 1020029573d4SEd Tanous res.end(); 1021c5b2abe0SLewanczyk, Dawid } 1022c5b2abe0SLewanczyk, Dawid }; 1023c5b2abe0SLewanczyk, Dawid 1024c5b2abe0SLewanczyk, Dawid /** 1025cc340dd9SEd Tanous * SystemActionsReset class supports handle POST method for Reset action. 1026cc340dd9SEd Tanous * The class retrieves and sends data directly to D-Bus. 1027cc340dd9SEd Tanous */ 1028cc340dd9SEd Tanous class SystemActionsReset : public Node 1029cc340dd9SEd Tanous { 1030cc340dd9SEd Tanous public: 1031cc340dd9SEd Tanous SystemActionsReset(CrowApp &app) : 1032029573d4SEd Tanous Node(app, "/redfish/v1/Systems/system/Actions/ComputerSystem.Reset/") 1033cc340dd9SEd Tanous { 1034cc340dd9SEd Tanous entityPrivileges = { 1035cc340dd9SEd Tanous {boost::beast::http::verb::post, {{"ConfigureComponents"}}}}; 1036cc340dd9SEd Tanous } 1037cc340dd9SEd Tanous 1038cc340dd9SEd Tanous private: 1039cc340dd9SEd Tanous /** 1040cc340dd9SEd Tanous * Function handles POST method request. 1041cc340dd9SEd Tanous * Analyzes POST body message before sends Reset request data to D-Bus. 1042cc340dd9SEd Tanous */ 1043cc340dd9SEd Tanous void doPost(crow::Response &res, const crow::Request &req, 1044cc340dd9SEd Tanous const std::vector<std::string> ¶ms) override 1045cc340dd9SEd Tanous { 1046cc340dd9SEd Tanous auto asyncResp = std::make_shared<AsyncResp>(res); 1047cc340dd9SEd Tanous 10489712f8acSEd Tanous std::string resetType; 10499712f8acSEd Tanous if (!json_util::readJson(req, res, "ResetType", resetType)) 1050cc340dd9SEd Tanous { 1051cc340dd9SEd Tanous return; 1052cc340dd9SEd Tanous } 1053cc340dd9SEd Tanous 1054d22c8396SJason M. Bills // Get the command and host vs. chassis 1055cc340dd9SEd Tanous std::string command; 1056d22c8396SJason M. Bills bool hostCommand; 10579712f8acSEd Tanous if (resetType == "On") 1058cc340dd9SEd Tanous { 1059cc340dd9SEd Tanous command = "xyz.openbmc_project.State.Host.Transition.On"; 1060d22c8396SJason M. Bills hostCommand = true; 1061d22c8396SJason M. Bills } 1062d22c8396SJason M. Bills else if (resetType == "ForceOff") 1063d22c8396SJason M. Bills { 1064d22c8396SJason M. Bills command = "xyz.openbmc_project.State.Chassis.Transition.Off"; 1065d22c8396SJason M. Bills hostCommand = false; 1066d22c8396SJason M. Bills } 1067d22c8396SJason M. Bills else if (resetType == "ForceOn") 1068d22c8396SJason M. Bills { 1069d22c8396SJason M. Bills command = "xyz.openbmc_project.State.Host.Transition.On"; 1070d22c8396SJason M. Bills hostCommand = true; 1071d22c8396SJason M. Bills } 1072d22c8396SJason M. Bills else if (resetType == "ForceRestart") 1073d22c8396SJason M. Bills { 1074d22c8396SJason M. Bills command = "xyz.openbmc_project.State.Chassis.Transition.Reset"; 1075d22c8396SJason M. Bills hostCommand = false; 1076cc340dd9SEd Tanous } 10779712f8acSEd Tanous else if (resetType == "GracefulShutdown") 1078cc340dd9SEd Tanous { 1079cc340dd9SEd Tanous command = "xyz.openbmc_project.State.Host.Transition.Off"; 1080d22c8396SJason M. Bills hostCommand = true; 1081cc340dd9SEd Tanous } 10829712f8acSEd Tanous else if (resetType == "GracefulRestart") 1083cc340dd9SEd Tanous { 10849712f8acSEd Tanous command = "xyz.openbmc_project.State.Host.Transition.Reboot"; 1085d22c8396SJason M. Bills hostCommand = true; 1086d22c8396SJason M. Bills } 1087d22c8396SJason M. Bills else if (resetType == "PowerCycle") 1088d22c8396SJason M. Bills { 1089d22c8396SJason M. Bills command = "xyz.openbmc_project.State.Chassis.Transition.PowerCycle"; 1090d22c8396SJason M. Bills hostCommand = false; 1091cc340dd9SEd Tanous } 1092cc340dd9SEd Tanous else 1093cc340dd9SEd Tanous { 1094f12894f8SJason M. Bills messages::actionParameterUnknown(res, "Reset", resetType); 1095cc340dd9SEd Tanous return; 1096cc340dd9SEd Tanous } 1097cc340dd9SEd Tanous 1098d22c8396SJason M. Bills if (hostCommand) 1099d22c8396SJason M. Bills { 1100cc340dd9SEd Tanous crow::connections::systemBus->async_method_call( 1101d22c8396SJason M. Bills [asyncResp, resetType](const boost::system::error_code ec) { 1102cc340dd9SEd Tanous if (ec) 1103cc340dd9SEd Tanous { 1104cc340dd9SEd Tanous BMCWEB_LOG_ERROR << "D-Bus responses error: " << ec; 1105d22c8396SJason M. Bills if (ec.value() == boost::asio::error::invalid_argument) 1106d22c8396SJason M. Bills { 1107d22c8396SJason M. Bills messages::actionParameterNotSupported( 1108d22c8396SJason M. Bills asyncResp->res, resetType, "Reset"); 1109d22c8396SJason M. Bills } 1110d22c8396SJason M. Bills else 1111d22c8396SJason M. Bills { 1112f12894f8SJason M. Bills messages::internalError(asyncResp->res); 1113d22c8396SJason M. Bills } 1114cc340dd9SEd Tanous return; 1115cc340dd9SEd Tanous } 1116f12894f8SJason M. Bills messages::success(asyncResp->res); 1117cc340dd9SEd Tanous }, 1118cc340dd9SEd Tanous "xyz.openbmc_project.State.Host", 1119cc340dd9SEd Tanous "/xyz/openbmc_project/state/host0", 1120cc340dd9SEd Tanous "org.freedesktop.DBus.Properties", "Set", 11219712f8acSEd Tanous "xyz.openbmc_project.State.Host", "RequestedHostTransition", 1122abf2add6SEd Tanous std::variant<std::string>{command}); 1123cc340dd9SEd Tanous } 1124d22c8396SJason M. Bills else 1125d22c8396SJason M. Bills { 1126d22c8396SJason M. Bills crow::connections::systemBus->async_method_call( 1127d22c8396SJason M. Bills [asyncResp, resetType](const boost::system::error_code ec) { 1128d22c8396SJason M. Bills if (ec) 1129d22c8396SJason M. Bills { 1130d22c8396SJason M. Bills BMCWEB_LOG_ERROR << "D-Bus responses error: " << ec; 1131d22c8396SJason M. Bills if (ec.value() == boost::asio::error::invalid_argument) 1132d22c8396SJason M. Bills { 1133d22c8396SJason M. Bills messages::actionParameterNotSupported( 1134d22c8396SJason M. Bills asyncResp->res, resetType, "Reset"); 1135d22c8396SJason M. Bills } 1136d22c8396SJason M. Bills else 1137d22c8396SJason M. Bills { 1138d22c8396SJason M. Bills messages::internalError(asyncResp->res); 1139d22c8396SJason M. Bills } 1140d22c8396SJason M. Bills return; 1141d22c8396SJason M. Bills } 1142d22c8396SJason M. Bills messages::success(asyncResp->res); 1143d22c8396SJason M. Bills }, 1144d22c8396SJason M. Bills "xyz.openbmc_project.State.Chassis", 1145d22c8396SJason M. Bills "/xyz/openbmc_project/state/chassis0", 1146d22c8396SJason M. Bills "org.freedesktop.DBus.Properties", "Set", 1147d22c8396SJason M. Bills "xyz.openbmc_project.State.Chassis", "RequestedPowerTransition", 1148d22c8396SJason M. Bills std::variant<std::string>{command}); 1149d22c8396SJason M. Bills } 1150d22c8396SJason M. Bills } 1151cc340dd9SEd Tanous }; 1152cc340dd9SEd Tanous 1153cc340dd9SEd Tanous /** 11546617338dSEd Tanous * Systems derived class for delivering Computer Systems Schema. 1155c5b2abe0SLewanczyk, Dawid */ 11561abe55efSEd Tanous class Systems : public Node 11571abe55efSEd Tanous { 1158c5b2abe0SLewanczyk, Dawid public: 1159c5b2abe0SLewanczyk, Dawid /* 1160c5b2abe0SLewanczyk, Dawid * Default Constructor 1161c5b2abe0SLewanczyk, Dawid */ 1162029573d4SEd Tanous Systems(CrowApp &app) : Node(app, "/redfish/v1/Systems/system/") 11631abe55efSEd Tanous { 1164c5b2abe0SLewanczyk, Dawid entityPrivileges = { 1165c5b2abe0SLewanczyk, Dawid {boost::beast::http::verb::get, {{"Login"}}}, 1166c5b2abe0SLewanczyk, Dawid {boost::beast::http::verb::head, {{"Login"}}}, 1167c5b2abe0SLewanczyk, Dawid {boost::beast::http::verb::patch, {{"ConfigureComponents"}}}, 1168c5b2abe0SLewanczyk, Dawid {boost::beast::http::verb::put, {{"ConfigureComponents"}}}, 1169c5b2abe0SLewanczyk, Dawid {boost::beast::http::verb::delete_, {{"ConfigureComponents"}}}, 1170c5b2abe0SLewanczyk, Dawid {boost::beast::http::verb::post, {{"ConfigureComponents"}}}}; 1171c5b2abe0SLewanczyk, Dawid } 1172c5b2abe0SLewanczyk, Dawid 1173c5b2abe0SLewanczyk, Dawid private: 1174c5b2abe0SLewanczyk, Dawid /** 1175c5b2abe0SLewanczyk, Dawid * Functions triggers appropriate requests on DBus 1176c5b2abe0SLewanczyk, Dawid */ 117755c7b7a2SEd Tanous void doGet(crow::Response &res, const crow::Request &req, 11781abe55efSEd Tanous const std::vector<std::string> ¶ms) override 11791abe55efSEd Tanous { 1180491d8ee7SSantosh Puranik res.jsonValue["@odata.type"] = "#ComputerSystem.v1_6_0.ComputerSystem"; 11810f74e643SEd Tanous res.jsonValue["@odata.context"] = 11820f74e643SEd Tanous "/redfish/v1/$metadata#ComputerSystem.ComputerSystem"; 1183029573d4SEd Tanous res.jsonValue["Name"] = "Computer System"; 1184029573d4SEd Tanous res.jsonValue["Id"] = "system"; 11850f74e643SEd Tanous res.jsonValue["SystemType"] = "Physical"; 11860f74e643SEd Tanous res.jsonValue["Description"] = "Computer System"; 11870f74e643SEd Tanous res.jsonValue["ProcessorSummary"]["Count"] = 0; 11880f74e643SEd Tanous res.jsonValue["ProcessorSummary"]["Status"]["State"] = "Disabled"; 11890f74e643SEd Tanous res.jsonValue["MemorySummary"]["TotalSystemMemoryGiB"] = int(0); 11900f74e643SEd Tanous res.jsonValue["MemorySummary"]["Status"]["State"] = "Disabled"; 1191029573d4SEd Tanous res.jsonValue["@odata.id"] = "/redfish/v1/Systems/system"; 119204a258f4SEd Tanous 1193443c2934SRapkiewicz, Pawel res.jsonValue["Processors"] = { 1194029573d4SEd Tanous {"@odata.id", "/redfish/v1/Systems/system/Processors"}}; 1195443c2934SRapkiewicz, Pawel res.jsonValue["Memory"] = { 1196029573d4SEd Tanous {"@odata.id", "/redfish/v1/Systems/system/Memory"}}; 1197029573d4SEd Tanous 1198cc340dd9SEd Tanous // TODO Need to support ForceRestart. 1199cc340dd9SEd Tanous res.jsonValue["Actions"]["#ComputerSystem.Reset"] = { 1200cc340dd9SEd Tanous {"target", 1201029573d4SEd Tanous "/redfish/v1/Systems/system/Actions/ComputerSystem.Reset"}, 1202cc340dd9SEd Tanous {"ResetType@Redfish.AllowableValues", 1203d22c8396SJason M. Bills {"On", "ForceOff", "ForceOn", "ForceRestart", "GracefulRestart", 1204d22c8396SJason M. Bills "GracefulShutdown", "PowerCycle"}}}; 1205c5b2abe0SLewanczyk, Dawid 1206c4bf6374SJason M. Bills res.jsonValue["LogServices"] = { 1207029573d4SEd Tanous {"@odata.id", "/redfish/v1/Systems/system/LogServices"}}; 1208c4bf6374SJason M. Bills 1209c5d03ff4SJennifer Lee res.jsonValue["Links"]["ManagedBy"] = { 1210c5d03ff4SJennifer Lee {{"@odata.id", "/redfish/v1/Managers/bmc"}}}; 1211c5d03ff4SJennifer Lee 1212c5d03ff4SJennifer Lee res.jsonValue["Status"] = { 1213c5d03ff4SJennifer Lee {"Health", "OK"}, 1214c5d03ff4SJennifer Lee {"State", "Enabled"}, 1215c5d03ff4SJennifer Lee }; 1216a0803efaSEd Tanous auto asyncResp = std::make_shared<AsyncResp>(res); 1217c5b2abe0SLewanczyk, Dawid 1218c5d03ff4SJennifer Lee getMainChassisId(asyncResp, [](const std::string &chassisId, 1219c5d03ff4SJennifer Lee std::shared_ptr<AsyncResp> aRsp) { 1220c5d03ff4SJennifer Lee aRsp->res.jsonValue["Links"]["Chassis"] = { 1221c5d03ff4SJennifer Lee {{"@odata.id", "/redfish/v1/Chassis/" + chassisId}}}; 1222c5d03ff4SJennifer Lee }); 12236c34de48SEd Tanous getLedGroupIdentify( 1224a0803efaSEd Tanous asyncResp, 1225c5d03ff4SJennifer Lee [](const bool &asserted, const std::shared_ptr<AsyncResp> aRsp) { 12261abe55efSEd Tanous if (asserted) 12271abe55efSEd Tanous { 1228c5b2abe0SLewanczyk, Dawid // If led group is asserted, then another call is needed to 1229c5b2abe0SLewanczyk, Dawid // get led status 12306c34de48SEd Tanous getLedIdentify( 1231c5d03ff4SJennifer Lee aRsp, [](const std::string &ledStatus, 1232c5d03ff4SJennifer Lee const std::shared_ptr<AsyncResp> aRsp) { 12331abe55efSEd Tanous if (!ledStatus.empty()) 12341abe55efSEd Tanous { 1235c5d03ff4SJennifer Lee aRsp->res.jsonValue["IndicatorLED"] = ledStatus; 1236c5b2abe0SLewanczyk, Dawid } 1237c5b2abe0SLewanczyk, Dawid }); 12381abe55efSEd Tanous } 12391abe55efSEd Tanous else 12401abe55efSEd Tanous { 1241c5d03ff4SJennifer Lee aRsp->res.jsonValue["IndicatorLED"] = "Off"; 1242c5b2abe0SLewanczyk, Dawid } 1243c5b2abe0SLewanczyk, Dawid }); 1244029573d4SEd Tanous getComputerSystem(asyncResp); 12456c34de48SEd Tanous getHostState(asyncResp); 1246491d8ee7SSantosh Puranik getBootProperties(asyncResp); 1247c5b2abe0SLewanczyk, Dawid } 1248c5b2abe0SLewanczyk, Dawid 124955c7b7a2SEd Tanous void doPatch(crow::Response &res, const crow::Request &req, 12501abe55efSEd Tanous const std::vector<std::string> ¶ms) override 12511abe55efSEd Tanous { 1252cde19e5fSSantosh Puranik std::optional<std::string> indicatorLed; 1253491d8ee7SSantosh Puranik std::optional<nlohmann::json> bootProps; 1254491d8ee7SSantosh Puranik if (!json_util::readJson(req, res, "IndicatorLED", indicatorLed, "Boot", 1255491d8ee7SSantosh Puranik bootProps)) 12566617338dSEd Tanous { 12576617338dSEd Tanous return; 12586617338dSEd Tanous } 1259491d8ee7SSantosh Puranik 1260029573d4SEd Tanous auto asyncResp = std::make_shared<AsyncResp>(res); 1261d573bb2aSJennifer Lee asyncResp->res.result(boost::beast::http::status::no_content); 1262491d8ee7SSantosh Puranik 1263491d8ee7SSantosh Puranik if (bootProps) 1264491d8ee7SSantosh Puranik { 1265491d8ee7SSantosh Puranik std::optional<std::string> bootSource; 1266491d8ee7SSantosh Puranik std::optional<std::string> bootEnable; 1267491d8ee7SSantosh Puranik 1268491d8ee7SSantosh Puranik if (!json_util::readJson(*bootProps, asyncResp->res, 1269491d8ee7SSantosh Puranik "BootSourceOverrideTarget", bootSource, 1270491d8ee7SSantosh Puranik "BootSourceOverrideEnabled", bootEnable)) 1271491d8ee7SSantosh Puranik { 1272491d8ee7SSantosh Puranik return; 1273491d8ee7SSantosh Puranik } 1274491d8ee7SSantosh Puranik setBootProperties(asyncResp, std::move(bootSource), 1275491d8ee7SSantosh Puranik std::move(bootEnable)); 1276491d8ee7SSantosh Puranik } 12779712f8acSEd Tanous if (indicatorLed) 12786617338dSEd Tanous { 12799712f8acSEd Tanous std::string dbusLedState; 1280d573bb2aSJennifer Lee if (*indicatorLed == "Lit") 12819712f8acSEd Tanous { 1282d573bb2aSJennifer Lee dbusLedState = "xyz.openbmc_project.Led.Physical.Action.On"; 12836617338dSEd Tanous } 12845c6221acSGunnar Mills else if (*indicatorLed == "Blinking") 12856617338dSEd Tanous { 12865c6221acSGunnar Mills dbusLedState = "xyz.openbmc_project.Led.Physical.Action.Blink"; 12876617338dSEd Tanous } 12889712f8acSEd Tanous else if (*indicatorLed == "Off") 12896617338dSEd Tanous { 12909712f8acSEd Tanous dbusLedState = "xyz.openbmc_project.Led.Physical.Action.Off"; 12916617338dSEd Tanous } 12926617338dSEd Tanous else 12936617338dSEd Tanous { 1294a08b46ccSJason M. Bills messages::propertyValueNotInList(res, *indicatorLed, 1295a08b46ccSJason M. Bills "IndicatorLED"); 12966617338dSEd Tanous return; 12976617338dSEd Tanous } 12986617338dSEd Tanous 1299c5b2abe0SLewanczyk, Dawid // Update led group 130055c7b7a2SEd Tanous BMCWEB_LOG_DEBUG << "Update led group."; 130155c7b7a2SEd Tanous crow::connections::systemBus->async_method_call( 1302cde19e5fSSantosh Puranik [asyncResp](const boost::system::error_code ec) { 13031abe55efSEd Tanous if (ec) 13041abe55efSEd Tanous { 130555c7b7a2SEd Tanous BMCWEB_LOG_DEBUG << "DBUS response error " << ec; 1306f12894f8SJason M. Bills messages::internalError(asyncResp->res); 1307c5b2abe0SLewanczyk, Dawid return; 1308c5b2abe0SLewanczyk, Dawid } 130955c7b7a2SEd Tanous BMCWEB_LOG_DEBUG << "Led group update done."; 1310c5b2abe0SLewanczyk, Dawid }, 1311c5b2abe0SLewanczyk, Dawid "xyz.openbmc_project.LED.GroupManager", 1312c5b2abe0SLewanczyk, Dawid "/xyz/openbmc_project/led/groups/enclosure_identify", 1313c5b2abe0SLewanczyk, Dawid "org.freedesktop.DBus.Properties", "Set", 1314c5b2abe0SLewanczyk, Dawid "xyz.openbmc_project.Led.Group", "Asserted", 1315abf2add6SEd Tanous std::variant<bool>( 13166617338dSEd Tanous (dbusLedState == 13176617338dSEd Tanous "xyz.openbmc_project.Led.Physical.Action.Off" 13186617338dSEd Tanous ? false 13196617338dSEd Tanous : true))); 1320c5b2abe0SLewanczyk, Dawid // Update identify led status 132155c7b7a2SEd Tanous BMCWEB_LOG_DEBUG << "Update led SoftwareInventoryCollection."; 132255c7b7a2SEd Tanous crow::connections::systemBus->async_method_call( 13236617338dSEd Tanous [asyncResp{std::move(asyncResp)}, 13249712f8acSEd Tanous indicatorLed{std::move(*indicatorLed)}]( 1325c5b2abe0SLewanczyk, Dawid const boost::system::error_code ec) { 13261abe55efSEd Tanous if (ec) 13271abe55efSEd Tanous { 132855c7b7a2SEd Tanous BMCWEB_LOG_DEBUG << "DBUS response error " << ec; 1329f12894f8SJason M. Bills messages::internalError(asyncResp->res); 1330c5b2abe0SLewanczyk, Dawid return; 1331c5b2abe0SLewanczyk, Dawid } 133255c7b7a2SEd Tanous BMCWEB_LOG_DEBUG << "Led state update done."; 1333c5b2abe0SLewanczyk, Dawid }, 1334c5b2abe0SLewanczyk, Dawid "xyz.openbmc_project.LED.Controller.identify", 1335c5b2abe0SLewanczyk, Dawid "/xyz/openbmc_project/led/physical/identify", 1336c5b2abe0SLewanczyk, Dawid "org.freedesktop.DBus.Properties", "Set", 1337c5b2abe0SLewanczyk, Dawid "xyz.openbmc_project.Led.Physical", "State", 1338abf2add6SEd Tanous std::variant<std::string>(dbusLedState)); 13396617338dSEd Tanous } 1340c5b2abe0SLewanczyk, Dawid } 1341c5b2abe0SLewanczyk, Dawid }; 1342c5b2abe0SLewanczyk, Dawid } // namespace redfish 1343