diff options
Diffstat (limited to 'meta-openbmc-mods/meta-common/recipes-phosphor/interfaces/bmcweb/0025-Revert-Support-new-boot-override-setting-design.patch')
-rw-r--r-- | meta-openbmc-mods/meta-common/recipes-phosphor/interfaces/bmcweb/0025-Revert-Support-new-boot-override-setting-design.patch | 723 |
1 files changed, 723 insertions, 0 deletions
diff --git a/meta-openbmc-mods/meta-common/recipes-phosphor/interfaces/bmcweb/0025-Revert-Support-new-boot-override-setting-design.patch b/meta-openbmc-mods/meta-common/recipes-phosphor/interfaces/bmcweb/0025-Revert-Support-new-boot-override-setting-design.patch new file mode 100644 index 000000000..e0664a350 --- /dev/null +++ b/meta-openbmc-mods/meta-common/recipes-phosphor/interfaces/bmcweb/0025-Revert-Support-new-boot-override-setting-design.patch @@ -0,0 +1,723 @@ +From c6ed122a09b1e41b9eab0032ff428b8b1a999534 Mon Sep 17 00:00:00 2001 +From: Jae Hyun Yoo <jae.hyun.yoo@linux.intel.com> +Date: Wed, 4 Aug 2021 15:50:34 -0700 +Subject: [PATCH] Revert "Support new boot override setting design" + +This reverts commit c21865c469cfc9dffdc15d87710293115cf6d9e4. + +Change-Id: Icfd03551dd9ea2fb216519d8ab05b92521838542 +Signed-off-by: Jae Hyun Yoo <jae.hyun.yoo@linux.intel.com> +--- + redfish-core/lib/systems.hpp | 493 +++++++++++++++++------------------ + 1 file changed, 245 insertions(+), 248 deletions(-) + +diff --git a/redfish-core/lib/systems.hpp b/redfish-core/lib/systems.hpp +index fc6e2c78fd1f..5ad065b3518a 100644 +--- a/redfish-core/lib/systems.hpp ++++ b/redfish-core/lib/systems.hpp +@@ -769,8 +769,11 @@ inline int assignBootParameters(const std::shared_ptr<bmcweb::AsyncResp>& aResp, + const std::string& rfSource, + std::string& bootSource, std::string& bootMode) + { +- bootSource = "xyz.openbmc_project.Control.Boot.Source.Sources.Default"; +- bootMode = "xyz.openbmc_project.Control.Boot.Mode.Modes.Regular"; ++ // The caller has initialized the bootSource and bootMode to: ++ // bootMode = "xyz.openbmc_project.Control.Boot.Mode.Modes.Regular"; ++ // bootSource = "xyz.openbmc_project.Control.Boot.Source.Sources.Default"; ++ // Only modify the bootSource/bootMode variable needed to achieve the ++ // desired boot action. + + if (rfSource == "None") + { +@@ -917,14 +920,45 @@ inline void getBootProgress(const std::shared_ptr<bmcweb::AsyncResp>& aResp) + } + + /** +- * @brief Retrieves boot override type over DBUS and fills out the response ++ * @brief Checks if the current boot override state can be considered as ++ * Disabled + * + * @param[in] aResp Shared pointer for generating response message. + * + * @return None. + */ ++inline void ++ checkIfOverrideIsDisabled(const std::shared_ptr<bmcweb::AsyncResp>& aResp) ++{ ++ // If the BootSourceOverrideTarget is still "None" at the end, ++ // reset the BootSourceOverrideEnabled to indicate that ++ // overrides are disabled ++ if (aResp->res.jsonValue["Boot"]["BootSourceOverrideTarget"] == "None") ++ { ++ // If the BootSourceOverrideMode is supported we should ++ // check if it is still "UEFI" too ++ if (aResp->res.jsonValue["Boot"].contains("BootSourceOverrideMode")) ++ { ++ if (aResp->res.jsonValue["Boot"]["BootSourceOverrideMode"] != ++ "UEFI") ++ { ++ return; ++ } ++ } ++ aResp->res.jsonValue["Boot"]["BootSourceOverrideEnabled"] = "Disabled"; ++ } ++} + +-inline void getBootOverrideType(const std::shared_ptr<bmcweb::AsyncResp>& aResp) ++/** ++ * @brief Retrieves boot type over DBUS and fills out the response ++ * ++ * @param[in] aResp Shared pointer for generating response message. ++ * @param[in] bootDbusObj The dbus object to query for boot properties. ++ * ++ * @return None. ++ */ ++inline void getBootType(const std::shared_ptr<bmcweb::AsyncResp>& aResp, ++ const std::string& bootDbusObj) + { + crow::connections::systemBus->async_method_call( + [aResp](const boost::system::error_code ec, +@@ -932,6 +966,12 @@ inline void getBootOverrideType(const std::shared_ptr<bmcweb::AsyncResp>& aResp) + if (ec) + { + // not an error, don't have to have the interface ++ ++ // Support Disabled override state in a way: ++ // "BootSourceOverrideEnabled=Disabled" = ++ // "BootSourceOverrideMode=UEFI" + ++ // "BootSourceOverrideTarget=None" ++ checkIfOverrideIsDisabled(aResp); + return; + } + +@@ -958,26 +998,31 @@ inline void getBootOverrideType(const std::shared_ptr<bmcweb::AsyncResp>& aResp) + } + + aResp->res.jsonValue["Boot"]["BootSourceOverrideMode"] = rfType; ++ ++ // Support Disabled override state in a way: ++ // "BootSourceOverrideEnabled=Disabled" = ++ // "BootSourceOverrideMode=UEFI" + "BootSourceOverrideTarget=None" ++ checkIfOverrideIsDisabled(aResp); + }, +- "xyz.openbmc_project.Settings", +- "/xyz/openbmc_project/control/host0/boot", ++ "xyz.openbmc_project.Settings", bootDbusObj, + "org.freedesktop.DBus.Properties", "Get", + "xyz.openbmc_project.Control.Boot.Type", "BootType"); + } + + /** +- * @brief Retrieves boot override mode over DBUS and fills out the response ++ * @brief Retrieves boot mode over DBUS and fills out the response + * + * @param[in] aResp Shared pointer for generating response message. ++ * @param[in] bootDbusObj The dbus object to query for boot properties. + * + * @return None. + */ +- +-inline void getBootOverrideMode(const std::shared_ptr<bmcweb::AsyncResp>& aResp) ++inline void getBootMode(const std::shared_ptr<bmcweb::AsyncResp>& aResp, ++ const std::string& bootDbusObj) + { + crow::connections::systemBus->async_method_call( +- [aResp](const boost::system::error_code ec, +- const std::variant<std::string>& bootMode) { ++ [aResp, bootDbusObj](const boost::system::error_code ec, ++ const std::variant<std::string>& bootMode) { + if (ec) + { + BMCWEB_LOG_DEBUG << "DBUS response error " << ec; +@@ -1010,27 +1055,39 @@ inline void getBootOverrideMode(const std::shared_ptr<bmcweb::AsyncResp>& aResp) + rfMode; + } + } ++ ++ // Get BootType inside this async call as we need all of the ++ // BootSource/BootMode/BootType to support ++ // "BootSourceOverrideEnabled"="Disabled" state. ++ getBootType(aResp, bootDbusObj); + }, +- "xyz.openbmc_project.Settings", +- "/xyz/openbmc_project/control/host0/boot", ++ "xyz.openbmc_project.Settings", bootDbusObj, + "org.freedesktop.DBus.Properties", "Get", + "xyz.openbmc_project.Control.Boot.Mode", "BootMode"); + } + + /** +- * @brief Retrieves boot override source over DBUS ++ * @brief Retrieves boot source over DBUS + * + * @param[in] aResp Shared pointer for generating response message. ++ * @param[in] oneTimeEnable Boolean to indicate boot properties are one-time. + * + * @return None. + */ +- +-inline void +- getBootOverrideSource(const std::shared_ptr<bmcweb::AsyncResp>& aResp) ++inline void getBootSource(const std::shared_ptr<bmcweb::AsyncResp>& aResp, ++ bool oneTimeEnabled) + { ++ std::string bootDbusObj = ++ oneTimeEnabled ? "/xyz/openbmc_project/control/host0/boot/one_time" ++ : "/xyz/openbmc_project/control/host0/boot"; ++ ++ BMCWEB_LOG_DEBUG << "Is one time: " << oneTimeEnabled; ++ aResp->res.jsonValue["Boot"]["BootSourceOverrideEnabled"] = ++ (oneTimeEnabled) ? "Once" : "Continuous"; ++ + crow::connections::systemBus->async_method_call( +- [aResp](const boost::system::error_code ec, +- const std::variant<std::string>& bootSource) { ++ [aResp, bootDbusObj](const boost::system::error_code ec, ++ const std::variant<std::string>& bootSource) { + if (ec) + { + BMCWEB_LOG_DEBUG << "DBUS response error " << ec; +@@ -1057,43 +1114,32 @@ inline void + + // Get BootMode as BootSourceOverrideTarget is constructed + // from both BootSource and BootMode +- getBootOverrideMode(aResp); ++ getBootMode(aResp, bootDbusObj); + }, +- "xyz.openbmc_project.Settings", +- "/xyz/openbmc_project/control/host0/boot", ++ "xyz.openbmc_project.Settings", bootDbusObj, + "org.freedesktop.DBus.Properties", "Get", + "xyz.openbmc_project.Control.Boot.Source", "BootSource"); + } + + /** +- * @brief This functions abstracts all the logic behind getting a +- * "BootSourceOverrideEnabled" property from an overall boot override enable +- * state ++ * @brief Retrieves "One time" enabled setting over DBUS and calls function to ++ * get boot source and boot mode. + * + * @param[in] aResp Shared pointer for generating response message. + * + * @return None. + */ +- +-inline void +- processBootOverrideEnable(const std::shared_ptr<bmcweb::AsyncResp>& aResp, +- const bool bootOverrideEnableSetting) ++inline void getBootProperties(const std::shared_ptr<bmcweb::AsyncResp>& aResp) + { +- if (!bootOverrideEnableSetting) +- { +- aResp->res.jsonValue["Boot"]["BootSourceOverrideEnabled"] = "Disabled"; +- return; +- } ++ BMCWEB_LOG_DEBUG << "Get boot information."; + +- // If boot source override is enabled, we need to check 'one_time' +- // property to set a correct value for the "BootSourceOverrideEnabled" + crow::connections::systemBus->async_method_call( + [aResp](const boost::system::error_code ec, + const std::variant<bool>& oneTime) { + if (ec) + { + BMCWEB_LOG_DEBUG << "DBUS response error " << ec; +- messages::internalError(aResp->res); ++ // not an error, don't have to have the interface + return; + } + +@@ -1104,19 +1150,7 @@ inline void + messages::internalError(aResp->res); + return; + } +- +- bool oneTimeSetting = *oneTimePtr; +- +- if (oneTimeSetting) +- { +- aResp->res.jsonValue["Boot"]["BootSourceOverrideEnabled"] = +- "Once"; +- } +- else +- { +- aResp->res.jsonValue["Boot"]["BootSourceOverrideEnabled"] = +- "Continuous"; +- } ++ getBootSource(aResp, *oneTimePtr); + }, + "xyz.openbmc_project.Settings", + "/xyz/openbmc_project/control/host0/boot/one_time", +@@ -1124,60 +1158,6 @@ inline void + "xyz.openbmc_project.Object.Enable", "Enabled"); + } + +-/** +- * @brief Retrieves boot override enable over DBUS +- * +- * @param[in] aResp Shared pointer for generating response message. +- * +- * @return None. +- */ +- +-inline void +- getBootOverrideEnable(const std::shared_ptr<bmcweb::AsyncResp>& aResp) +-{ +- crow::connections::systemBus->async_method_call( +- [aResp](const boost::system::error_code ec, +- const std::variant<bool>& bootOverrideEnable) { +- if (ec) +- { +- BMCWEB_LOG_DEBUG << "DBUS response error " << ec; +- messages::internalError(aResp->res); +- return; +- } +- +- const bool* bootOverrideEnablePtr = +- std::get_if<bool>(&bootOverrideEnable); +- +- if (!bootOverrideEnablePtr) +- { +- messages::internalError(aResp->res); +- return; +- } +- +- processBootOverrideEnable(aResp, *bootOverrideEnablePtr); +- }, +- "xyz.openbmc_project.Settings", +- "/xyz/openbmc_project/control/host0/boot", +- "org.freedesktop.DBus.Properties", "Get", +- "xyz.openbmc_project.Object.Enable", "Enabled"); +-} +- +-/** +- * @brief Retrieves boot source override properties +- * +- * @param[in] aResp Shared pointer for generating response message. +- * +- * @return None. +- */ +-inline void getBootProperties(const std::shared_ptr<bmcweb::AsyncResp>& aResp) +-{ +- BMCWEB_LOG_DEBUG << "Get boot information."; +- +- getBootOverrideSource(aResp); +- getBootOverrideType(aResp); +- getBootOverrideEnable(aResp); +-} +- + /** + * @brief Retrieves the Last Reset Time + * +@@ -1479,47 +1459,59 @@ inline void getTrustedModuleRequiredToBoot( + * @brief Sets boot properties into DBUS object(s). + * + * @param[in] aResp Shared pointer for generating response message. ++ * @param[in] overrideEnabled The source override "enable". ++ * @param[in] bootObj Path to the DBUS object. + * @param[in] bootType The boot type to set. + * @return Integer error code. + */ + inline void setBootType(const std::shared_ptr<bmcweb::AsyncResp>& aResp, ++ const bool overrideEnabled, const std::string& bootObj, + const std::optional<std::string>& bootType) + { +- std::string bootTypeStr; +- +- if (!bootType) +- { +- return; +- } ++ std::string bootTypeStr = "xyz.openbmc_project.Control.Boot.Type.Types.EFI"; + +- // Source target specified +- BMCWEB_LOG_DEBUG << "Boot type: " << *bootType; +- // Figure out which DBUS interface and property to use +- if (*bootType == "Legacy") +- { +- bootTypeStr = "xyz.openbmc_project.Control.Boot.Type.Types.Legacy"; +- } +- else if (*bootType == "UEFI") ++ if (bootType && overrideEnabled) + { +- bootTypeStr = "xyz.openbmc_project.Control.Boot.Type.Types.EFI"; +- } +- else +- { +- BMCWEB_LOG_DEBUG << "Invalid property value for " +- "BootSourceOverrideMode: " +- << *bootType; +- messages::propertyValueNotInList(aResp->res, *bootType, +- "BootSourceOverrideMode"); +- return; ++ // Source target specified ++ BMCWEB_LOG_DEBUG << "Boot type: " << *bootType; ++ // Figure out which DBUS interface and property to use ++ if (*bootType == "Legacy") ++ { ++ bootTypeStr = "xyz.openbmc_project.Control.Boot.Type.Types.Legacy"; ++ } ++ else if (*bootType == "UEFI") ++ { ++ bootTypeStr = "xyz.openbmc_project.Control.Boot.Type.Types.EFI"; ++ } ++ else ++ { ++ BMCWEB_LOG_DEBUG << "Invalid property value for " ++ "BootSourceOverrideMode: " ++ << *bootType; ++ messages::propertyValueNotInList(aResp->res, *bootType, ++ "BootSourceOverrideMode"); ++ return; ++ } + } + + // Act on validated parameters + BMCWEB_LOG_DEBUG << "DBUS boot type: " << bootTypeStr; + + crow::connections::systemBus->async_method_call( +- [aResp](const boost::system::error_code ec) { ++ [aResp, bootType](const boost::system::error_code ec) { + if (ec) + { ++ if (!bootType) ++ { ++ // If bootType wasn't explicitly present in the incoming ++ // message don't output error. The error could come from a ++ // fact that the BootType interface may be not present in ++ // the settings object. It could happen because this ++ // interface is not relevant for some Host architectures ++ // (for example POWER). ++ return; ++ } ++ + BMCWEB_LOG_DEBUG << "DBUS response error " << ec; + if (ec.value() == boost::asio::error::host_unreachable) + { +@@ -1531,8 +1523,7 @@ inline void setBootType(const std::shared_ptr<bmcweb::AsyncResp>& aResp, + } + BMCWEB_LOG_DEBUG << "Boot type update done."; + }, +- "xyz.openbmc_project.Settings", +- "/xyz/openbmc_project/control/host0/boot", ++ "xyz.openbmc_project.Settings", bootObj, + "org.freedesktop.DBus.Properties", "Set", + "xyz.openbmc_project.Control.Boot.Type", "BootType", + std::variant<std::string>(bootTypeStr)); +@@ -1542,48 +1533,42 @@ inline void setBootType(const std::shared_ptr<bmcweb::AsyncResp>& aResp, + * @brief Sets boot properties into DBUS object(s). + * + * @param[in] aResp Shared pointer for generating response message. +- * @param[in] bootType The boot type to set. ++ * @param[in] overrideEnabled The source override "enable". ++ * @param[in] bootObj Path to the DBUS object. ++ * @param[in] bootSource The boot source to set. ++ * + * @return Integer error code. + */ +-inline void setBootEnable(const std::shared_ptr<bmcweb::AsyncResp>& aResp, +- const std::optional<std::string>& bootEnable) ++inline void setBootModeOrSource(const std::shared_ptr<bmcweb::AsyncResp>& aResp, ++ const bool overrideEnabled, ++ const std::string& bootObj, ++ const std::optional<std::string>& bootSource) + { +- if (!bootEnable) +- { +- return; +- } +- // Source target specified +- BMCWEB_LOG_DEBUG << "Boot enable: " << *bootEnable; ++ std::string bootSourceStr = ++ "xyz.openbmc_project.Control.Boot.Source.Sources.Default"; ++ std::string bootModeStr = ++ "xyz.openbmc_project.Control.Boot.Mode.Modes.Regular"; + +- bool bootOverrideEnable = false; +- bool bootOverridePersistent = false; +- // Figure out which DBUS interface and property to use +- if (*bootEnable == "Disabled") +- { +- bootOverrideEnable = false; +- } +- else if (*bootEnable == "Once") +- { +- bootOverrideEnable = true; +- bootOverridePersistent = false; +- } +- else if (*bootEnable == "Continuous") ++ if (bootSource && overrideEnabled) + { +- bootOverrideEnable = true; +- bootOverridePersistent = true; +- } +- else +- { +- BMCWEB_LOG_DEBUG << "Invalid property value for " +- "BootSourceOverrideEnabled: " +- << *bootEnable; +- messages::propertyValueNotInList(aResp->res, *bootEnable, +- "BootSourceOverrideEnabled"); +- return; ++ // Source target specified ++ BMCWEB_LOG_DEBUG << "Boot source: " << *bootSource; ++ // Figure out which DBUS interface and property to use ++ if (assignBootParameters(aResp, *bootSource, bootSourceStr, ++ bootModeStr)) ++ { ++ BMCWEB_LOG_DEBUG ++ << "Invalid property value for BootSourceOverrideTarget: " ++ << *bootSource; ++ messages::propertyValueNotInList(aResp->res, *bootSource, ++ "BootSourceTargetOverride"); ++ return; ++ } + } + + // Act on validated parameters +- BMCWEB_LOG_DEBUG << "DBUS boot override enable: " << bootOverrideEnable; ++ BMCWEB_LOG_DEBUG << "DBUS boot source: " << bootSourceStr; ++ BMCWEB_LOG_DEBUG << "DBUS boot mode: " << bootModeStr; + + crow::connections::systemBus->async_method_call( + [aResp](const boost::system::error_code ec) { +@@ -1593,23 +1578,12 @@ inline void setBootEnable(const std::shared_ptr<bmcweb::AsyncResp>& aResp, + messages::internalError(aResp->res); + return; + } +- BMCWEB_LOG_DEBUG << "Boot override enable update done."; ++ BMCWEB_LOG_DEBUG << "Boot source update done."; + }, +- "xyz.openbmc_project.Settings", +- "/xyz/openbmc_project/control/host0/boot", ++ "xyz.openbmc_project.Settings", bootObj, + "org.freedesktop.DBus.Properties", "Set", +- "xyz.openbmc_project.Object.Enable", "Enabled", +- std::variant<bool>(bootOverrideEnable)); +- +- if (!bootOverrideEnable) +- { +- return; +- } +- +- // In case boot override is enabled we need to set correct value for the +- // 'one_time' enable DBus interface +- BMCWEB_LOG_DEBUG << "DBUS boot override persistent: " +- << bootOverridePersistent; ++ "xyz.openbmc_project.Control.Boot.Source", "BootSource", ++ std::variant<std::string>(bootSourceStr)); + + crow::connections::systemBus->async_method_call( + [aResp](const boost::system::error_code ec) { +@@ -1619,86 +1593,45 @@ inline void setBootEnable(const std::shared_ptr<bmcweb::AsyncResp>& aResp, + messages::internalError(aResp->res); + return; + } +- BMCWEB_LOG_DEBUG << "Boot one_time update done."; ++ BMCWEB_LOG_DEBUG << "Boot mode update done."; + }, +- "xyz.openbmc_project.Settings", +- "/xyz/openbmc_project/control/host0/boot/one_time", ++ "xyz.openbmc_project.Settings", bootObj, + "org.freedesktop.DBus.Properties", "Set", +- "xyz.openbmc_project.Object.Enable", "Enabled", +- std::variant<bool>(!bootOverridePersistent)); ++ "xyz.openbmc_project.Control.Boot.Mode", "BootMode", ++ std::variant<std::string>(bootModeStr)); + } + + /** +- * @brief Sets boot properties into DBUS object(s). ++ * @brief Sets "One time" enabled setting into DBUS object + * +- * @param[in] aResp Shared pointer for generating response message. +- * @param[in] bootSource The boot source to set. ++ * @param[in] aResp Shared pointer for generating response message. ++ * @param[in] oneTime Enable property for one-time object + * + * @return Integer error code. + */ +-inline void setBootModeOrSource(const std::shared_ptr<bmcweb::AsyncResp>& aResp, +- const std::optional<std::string>& bootSource) ++inline void setOneTime(const std::shared_ptr<bmcweb::AsyncResp>& aResp, ++ bool oneTime) + { +- std::string bootSourceStr; +- std::string bootModeStr; +- +- if (!bootSource) +- { +- return; +- } +- +- // Source target specified +- BMCWEB_LOG_DEBUG << "Boot source: " << *bootSource; +- // Figure out which DBUS interface and property to use +- if (assignBootParameters(aResp, *bootSource, bootSourceStr, bootModeStr)) +- { +- BMCWEB_LOG_DEBUG +- << "Invalid property value for BootSourceOverrideTarget: " +- << *bootSource; +- messages::propertyValueNotInList(aResp->res, *bootSource, +- "BootSourceTargetOverride"); +- return; +- } +- +- // Act on validated parameters +- BMCWEB_LOG_DEBUG << "DBUS boot source: " << bootSourceStr; +- BMCWEB_LOG_DEBUG << "DBUS boot mode: " << bootModeStr; +- + crow::connections::systemBus->async_method_call( +- [aResp](const boost::system::error_code ec) { ++ [aResp{aResp}](const boost::system::error_code ec) { + if (ec) + { + BMCWEB_LOG_DEBUG << "DBUS response error " << ec; + messages::internalError(aResp->res); + return; + } +- BMCWEB_LOG_DEBUG << "Boot source update done."; ++ BMCWEB_LOG_DEBUG << "Boot enable update done."; + }, + "xyz.openbmc_project.Settings", +- "/xyz/openbmc_project/control/host0/boot", +- "org.freedesktop.DBus.Properties", "Set", +- "xyz.openbmc_project.Control.Boot.Source", "BootSource", +- std::variant<std::string>(bootSourceStr)); +- +- crow::connections::systemBus->async_method_call( +- [aResp](const boost::system::error_code ec) { +- if (ec) +- { +- BMCWEB_LOG_DEBUG << "DBUS response error " << ec; +- messages::internalError(aResp->res); +- return; +- } +- BMCWEB_LOG_DEBUG << "Boot mode update done."; +- }, +- "xyz.openbmc_project.Settings", +- "/xyz/openbmc_project/control/host0/boot", ++ "/xyz/openbmc_project/control/host0/boot/one_time", + "org.freedesktop.DBus.Properties", "Set", +- "xyz.openbmc_project.Control.Boot.Mode", "BootMode", +- std::variant<std::string>(bootModeStr)); ++ "xyz.openbmc_project.Object.Enable", "Enabled", ++ std::variant<bool>(oneTime)); + } + + /** +- * @brief Sets Boot source override properties. ++ * @brief Retrieves "One time" enabled setting over DBUS and calls function to ++ * set boot source/boot mode properties. + * + * @param[in] aResp Shared pointer for generating response message. + * @param[in] bootSource The boot source from incoming RF request. +@@ -1707,17 +1640,81 @@ inline void setBootModeOrSource(const std::shared_ptr<bmcweb::AsyncResp>& aResp, + * + * @return Integer error code. + */ +- +-inline void setBootProperties(const std::shared_ptr<bmcweb::AsyncResp>& aResp, +- const std::optional<std::string>& bootSource, +- const std::optional<std::string>& bootType, +- const std::optional<std::string>& bootEnable) ++inline void ++ setBootSourceProperties(const std::shared_ptr<bmcweb::AsyncResp>& aResp, ++ std::optional<std::string> bootSource, ++ std::optional<std::string> bootType, ++ std::optional<std::string> bootEnable) + { + BMCWEB_LOG_DEBUG << "Set boot information."; + +- setBootModeOrSource(aResp, bootSource); +- setBootType(aResp, bootType); +- setBootEnable(aResp, bootEnable); ++ crow::connections::systemBus->async_method_call( ++ [aResp, bootSource{std::move(bootSource)}, ++ bootType{std::move(bootType)}, ++ bootEnable{std::move(bootEnable)}](const boost::system::error_code ec, ++ const std::variant<bool>& oneTime) { ++ if (ec) ++ { ++ BMCWEB_LOG_DEBUG << "DBUS response error " << ec; ++ messages::internalError(aResp->res); ++ return; ++ } ++ ++ const bool* oneTimePtr = std::get_if<bool>(&oneTime); ++ ++ if (!oneTimePtr) ++ { ++ messages::internalError(aResp->res); ++ return; ++ } ++ ++ BMCWEB_LOG_DEBUG << "Got one time: " << *oneTimePtr; ++ ++ bool oneTimeSetting = *oneTimePtr; ++ bool overrideEnabled = true; ++ ++ // Validate incoming parameters ++ if (bootEnable) ++ { ++ if (*bootEnable == "Once") ++ { ++ oneTimeSetting = true; ++ } ++ else if (*bootEnable == "Continuous") ++ { ++ oneTimeSetting = false; ++ } ++ else if (*bootEnable == "Disabled") ++ { ++ BMCWEB_LOG_DEBUG << "Boot source override will be disabled"; ++ oneTimeSetting = false; ++ overrideEnabled = false; ++ } ++ else ++ { ++ BMCWEB_LOG_DEBUG << "Unsupported value for " ++ "BootSourceOverrideEnabled: " ++ << *bootEnable; ++ messages::propertyValueNotInList( ++ aResp->res, *bootEnable, "BootSourceOverrideEnabled"); ++ return; ++ } ++ } ++ ++ std::string bootObj = "/xyz/openbmc_project/control/host0/boot"; ++ if (oneTimeSetting) ++ { ++ bootObj += "/one_time"; ++ } ++ ++ setBootModeOrSource(aResp, overrideEnabled, bootObj, bootSource); ++ setBootType(aResp, overrideEnabled, bootObj, bootType); ++ setOneTime(aResp, oneTimeSetting); ++ }, ++ "xyz.openbmc_project.Settings", ++ "/xyz/openbmc_project/control/host0/boot/one_time", ++ "org.freedesktop.DBus.Properties", "Get", ++ "xyz.openbmc_project.Object.Enable", "Enabled"); + } + + /** +@@ -2806,11 +2803,11 @@ inline void requestRoutesSystems(App& app) + { + return; + } +- + if (bootSource || bootType || bootEnable) + { +- setBootProperties(asyncResp, bootSource, bootType, +- bootEnable); ++ setBootSourceProperties( ++ asyncResp, std::move(bootSource), ++ std::move(bootType), std::move(bootEnable)); + } + if (automaticRetryConfig) + { +-- +2.17.1 + |