From 235618c7396902842906bc3a8c90a3320aeeaeba Mon Sep 17 00:00:00 2001 From: "Jason M. Bills" Date: Tue, 7 Apr 2020 15:43:15 -0700 Subject: Update to internal 0.47 Signed-off-by: Jason M. Bills --- ...-Firmware-update-support-for-StandBySpare.patch | 120 +++----- ...b-crashdump-to-the-D-Bus-interface-provid.patch | 331 +++++++++++++++++++++ .../recipes-phosphor/interfaces/bmcweb_%.bbappend | 12 +- 3 files changed, 390 insertions(+), 73 deletions(-) create mode 100644 meta-openbmc-mods/meta-common/recipes-phosphor/interfaces/bmcweb/0002-Match-BMCWeb-crashdump-to-the-D-Bus-interface-provid.patch (limited to 'meta-openbmc-mods/meta-common/recipes-phosphor/interfaces') diff --git a/meta-openbmc-mods/meta-common/recipes-phosphor/interfaces/bmcweb/0001-Firmware-update-support-for-StandBySpare.patch b/meta-openbmc-mods/meta-common/recipes-phosphor/interfaces/bmcweb/0001-Firmware-update-support-for-StandBySpare.patch index dc3ec060e..46e94e339 100644 --- a/meta-openbmc-mods/meta-common/recipes-phosphor/interfaces/bmcweb/0001-Firmware-update-support-for-StandBySpare.patch +++ b/meta-openbmc-mods/meta-common/recipes-phosphor/interfaces/bmcweb/0001-Firmware-update-support-for-StandBySpare.patch @@ -1,6 +1,6 @@ -From 17caf10b048450979dcd95a9f9333bbaa8c307ec Mon Sep 17 00:00:00 2001 -From: AppaRao Puli -Date: Fri, 10 Jan 2020 08:16:10 +0530 +From 461da7ec950704a1f5bcc7f6527ed8ca119cfaf9 Mon Sep 17 00:00:00 2001 +From: Vikram Bodireddy +Date: Tue, 24 Mar 2020 16:05:32 +0530 Subject: [PATCH] Firmware update support for StandBySpare Firmware update support for StandBySpare. This will @@ -26,15 +26,13 @@ Tested: - Successfully ran redfish validater with no new errors. -Change-Id: I59f317ac001ebf56bbf30e7f43dbec5d69fa249a -Signed-off-by: Vikram Bodireddy -Signed-off-by: AppaRao Puli +Signed-off-by: Vikram Bodireddy --- - redfish-core/lib/update_service.hpp | 284 ++++++++++++++++++++++++++++++------ - 1 file changed, 241 insertions(+), 43 deletions(-) + redfish-core/lib/update_service.hpp | 274 +++++++++++++++++++++++++++++++----- + 1 file changed, 241 insertions(+), 33 deletions(-) diff --git a/redfish-core/lib/update_service.hpp b/redfish-core/lib/update_service.hpp -index ec9600e..9daf6ce 100644 +index e9793eb..a913bac 100644 --- a/redfish-core/lib/update_service.hpp +++ b/redfish-core/lib/update_service.hpp @@ -30,6 +30,17 @@ static std::unique_ptr fwUpdateMatcher; @@ -55,7 +53,7 @@ index ec9600e..9daf6ce 100644 static void cleanUp() { -@@ -37,27 +48,118 @@ static void cleanUp() +@@ -37,27 +48,119 @@ static void cleanUp() fwUpdateMatcher = nullptr; } static void activateImage(const std::string &objPath, @@ -64,7 +62,6 @@ index ec9600e..9daf6ce 100644 + const std::vector &imgUriTargets) { BMCWEB_LOG_DEBUG << "Activate image for " << objPath << " " << service; -+ + // If targets is empty, it will apply to the active. + if (imgUriTargets.size() == 0) + { @@ -72,8 +69,10 @@ index ec9600e..9daf6ce 100644 + [](const boost::system::error_code error_code) { + if (error_code) + { -+ BMCWEB_LOG_DEBUG << "RequestedActivation failed: ec = " -+ << error_code; ++ BMCWEB_LOG_DEBUG ++ << "RequestedActivation failed: error_code = " ++ << error_code; ++ BMCWEB_LOG_DEBUG << "error msg = " << error_code.message(); + } + }, + service, objPath, "org.freedesktop.DBus.Properties", "Set", @@ -181,54 +180,51 @@ index ec9600e..9daf6ce 100644 // then no asyncResp updates will occur static void softwareInterfaceAdded(std::shared_ptr asyncResp, + const std::vector imgUriTargets, - sdbusplus::message::message &m) + sdbusplus::message::message &m, + const crow::Request &req) { - std::vector asyncResp, +@@ -70,25 +173,27 @@ static void softwareInterfaceAdded(std::shared_ptr asyncResp, m.read(objPath, interfacesProperties); - BMCWEB_LOG_DEBUG << "obj path = " << objPath.str; -+ BMCWEB_LOG_DEBUG << "Software Interface Added. objPath = " << objPath.str; ++ BMCWEB_LOG_DEBUG << "Software Interface Added. obj path = " << objPath.str; for (auto &interface : interfacesProperties) { -- BMCWEB_LOG_DEBUG << "interface = " << interface.first; -- + BMCWEB_LOG_DEBUG << "interface = " << interface.first; + - if (interface.first == "xyz.openbmc_project.Software.Activation") + if (interface.first == activationIntf) { // Found our interface, disable callbacks fwUpdateMatcher = nullptr; -- + // Retrieve service and activate crow::connections::systemBus->async_method_call( -- [objPath, asyncResp]( -+ [objPath, asyncResp, imgTargets{imgUriTargets}]( - const boost::system::error_code error_code, - const std::vector>> &objInfo) { +- [objPath, asyncResp, ++ [objPath, asyncResp, imgTargets{imgUriTargets}, + req](const boost::system::error_code error_code, + const std::vector>> &objInfo) { if (error_code) { - BMCWEB_LOG_DEBUG << "error_code = " << error_code; -- BMCWEB_LOG_DEBUG << "error msg = " -- << error_code.message(); + BMCWEB_LOG_DEBUG -+ << "GetSoftwareObject path failed: ec = " ++ << "GetSoftwareObject path failed: error_code = " + << error_code; + BMCWEB_LOG_DEBUG << "error msg = " + << error_code.message(); if (asyncResp) - { - messages::internalError(asyncResp->res); -@@ -113,8 +212,7 @@ static void softwareInterfaceAdded(std::shared_ptr asyncResp, - // xyz.openbmc_project.Software.Activation interface +@@ -115,7 +220,7 @@ static void softwareInterfaceAdded(std::shared_ptr asyncResp, // is added fwAvailableTimer = nullptr; -- + - activateImage(objPath.str, objInfo[0].first); + activateImage(objPath.str, objInfo[0].first, imgTargets); if (asyncResp) { - redfish::messages::success(asyncResp->res); -@@ -124,17 +222,16 @@ static void softwareInterfaceAdded(std::shared_ptr asyncResp, + std::shared_ptr task = +@@ -196,17 +301,16 @@ static void softwareInterfaceAdded(std::shared_ptr asyncResp, "xyz.openbmc_project.ObjectMapper", "/xyz/openbmc_project/object_mapper", "xyz.openbmc_project.ObjectMapper", "GetObject", objPath.str, @@ -250,30 +246,20 @@ index ec9600e..9daf6ce 100644 { // Only allow one FW update at a time if (fwUpdateInProgress != false) -@@ -145,7 +242,6 @@ static void monitorForSoftwareAvailable(std::shared_ptr asyncResp, - } - return; - } -- - fwAvailableTimer = - std::make_unique(*req.ioService); - -@@ -174,10 +270,10 @@ static void monitorForSoftwareAvailable(std::shared_ptr asyncResp, +@@ -246,9 +350,10 @@ static void monitorForSoftwareAvailable(std::shared_ptr asyncResp, } }); -- auto callback = [asyncResp](sdbusplus::message::message &m) { -- BMCWEB_LOG_DEBUG << "Match fired"; -- softwareInterfaceAdded(asyncResp, m); -- }; -+ auto callback = -+ [asyncResp, imgTargets{imgUriTargets}](sdbusplus::message::message &m) { -+ softwareInterfaceAdded(asyncResp, imgTargets, m); -+ }; +- auto callback = [asyncResp, req](sdbusplus::message::message &m) { ++ auto callback = [asyncResp, imgTargets{imgUriTargets}, ++ req](sdbusplus::message::message &m) { + BMCWEB_LOG_DEBUG << "Match fired"; +- softwareInterfaceAdded(asyncResp, m, req); ++ softwareInterfaceAdded(asyncResp, imgTargets, m, req); + }; fwUpdateInProgress = true; - -@@ -286,9 +382,12 @@ class UpdateServiceActionsSimpleUpdate : public Node +@@ -358,9 +463,12 @@ class UpdateServiceActionsSimpleUpdate : public Node std::string fwFile = imageURI.substr(separator + 1); BMCWEB_LOG_DEBUG << "Server: " << tftpServer + " File: " << fwFile; @@ -287,7 +273,7 @@ index ec9600e..9daf6ce 100644 // TFTP can take up to 2 minutes depending on image size and // connection speed. Return to caller as soon as the TFTP operation -@@ -322,7 +421,8 @@ class UpdateServiceActionsSimpleUpdate : public Node +@@ -394,7 +502,8 @@ class UpdateServiceActionsSimpleUpdate : public Node class UpdateService : public Node { public: @@ -297,7 +283,7 @@ index ec9600e..9daf6ce 100644 { entityPrivileges = { {boost::beast::http::verb::get, {{"Login"}}}, -@@ -334,6 +434,9 @@ class UpdateService : public Node +@@ -406,6 +515,9 @@ class UpdateService : public Node } private: @@ -307,7 +293,7 @@ index ec9600e..9daf6ce 100644 void doGet(crow::Response &res, const crow::Request &req, const std::vector ¶ms) override { -@@ -346,6 +449,8 @@ class UpdateService : public Node +@@ -416,6 +528,8 @@ class UpdateService : public Node res.jsonValue["Description"] = "Service for Software Update"; res.jsonValue["Name"] = "Update Service"; res.jsonValue["HttpPushUri"] = "/redfish/v1/UpdateService"; @@ -316,7 +302,7 @@ index ec9600e..9daf6ce 100644 // UpdateService cannot be disabled res.jsonValue["ServiceEnabled"] = true; res.jsonValue["FirmwareInventory"] = { -@@ -405,9 +510,14 @@ class UpdateService : public Node +@@ -475,9 +589,14 @@ class UpdateService : public Node std::shared_ptr asyncResp = std::make_shared(res); std::optional pushUriOptions; @@ -333,15 +319,7 @@ index ec9600e..9daf6ce 100644 return; } -@@ -464,7 +574,6 @@ class UpdateService : public Node - messages::internalError(asyncResp->res); - return; - } -- messages::success(asyncResp->res); - }, - "xyz.openbmc_project.Settings", - "/xyz/openbmc_project/software/apply_time", -@@ -475,6 +584,98 @@ class UpdateService : public Node +@@ -545,6 +664,98 @@ class UpdateService : public Node } } } @@ -440,7 +418,7 @@ index ec9600e..9daf6ce 100644 } void doPost(crow::Response &res, const crow::Request &req, -@@ -485,7 +686,7 @@ class UpdateService : public Node +@@ -555,7 +766,7 @@ class UpdateService : public Node std::shared_ptr asyncResp = std::make_shared(res); // Setup callback for when new software detected @@ -449,7 +427,7 @@ index ec9600e..9daf6ce 100644 std::string filepath( "/tmp/images/" + -@@ -574,8 +775,7 @@ class SoftwareInventoryCollection : public Node +@@ -641,8 +852,7 @@ class SoftwareInventoryCollection : public Node "/xyz/openbmc_project/object_mapper", "xyz.openbmc_project.ObjectMapper", "GetSubTree", "/xyz/openbmc_project/software", static_cast(0), @@ -459,7 +437,7 @@ index ec9600e..9daf6ce 100644 } }; -@@ -760,7 +960,7 @@ class SoftwareInventory : public Node +@@ -825,7 +1035,7 @@ class SoftwareInventory : public Node }, obj.second[0].first, obj.first, "org.freedesktop.DBus.Properties", "GetAll", @@ -468,7 +446,7 @@ index ec9600e..9daf6ce 100644 } if (!found) { -@@ -781,9 +981,7 @@ class SoftwareInventory : public Node +@@ -846,9 +1056,7 @@ class SoftwareInventory : public Node "xyz.openbmc_project.ObjectMapper", "/xyz/openbmc_project/object_mapper", "xyz.openbmc_project.ObjectMapper", "GetSubTree", "/", diff --git a/meta-openbmc-mods/meta-common/recipes-phosphor/interfaces/bmcweb/0002-Match-BMCWeb-crashdump-to-the-D-Bus-interface-provid.patch b/meta-openbmc-mods/meta-common/recipes-phosphor/interfaces/bmcweb/0002-Match-BMCWeb-crashdump-to-the-D-Bus-interface-provid.patch new file mode 100644 index 000000000..995b62750 --- /dev/null +++ b/meta-openbmc-mods/meta-common/recipes-phosphor/interfaces/bmcweb/0002-Match-BMCWeb-crashdump-to-the-D-Bus-interface-provid.patch @@ -0,0 +1,331 @@ +From 7c55dfb33e035f8a31f11fd3e047a4b674f392ac Mon Sep 17 00:00:00 2001 +From: Johnathan Mantey +Date: Tue, 10 Mar 2020 17:15:28 -0700 +Subject: [PATCH] Match BMCWeb crashdump to the D-Bus interface provided by + crashdump + +The crashdump service changed to eliminate hangs, and failures to +retrieve the crashdump data. The BMCWeb crashdump handling code has to +be aligned with the server. + +Tested: +Confirmed each of the primary functions operates as expected. +Getting the collection +Getting the entries +Forcing an on demand capture +Polling for the on demand capture to complete +Retrieving the creashdump data +Clearing all of the crashdump content + +Change-Id: Ie8fb48369a782d905b942c1f9bef11f387f6463e +Signed-off-by: Johnathan Mantey +--- + redfish-core/lib/log_services.hpp | 268 +++++++++++++++++------------- + 1 file changed, 150 insertions(+), 118 deletions(-) + +diff --git a/redfish-core/lib/log_services.hpp b/redfish-core/lib/log_services.hpp +index f864007..4b13897 100644 +--- a/redfish-core/lib/log_services.hpp ++++ b/redfish-core/lib/log_services.hpp +@@ -1575,109 +1575,80 @@ class CrashdumpClear : public Node + } + }; + +-std::string getLogCreatedTime(const std::string &crashdump) +-{ +- nlohmann::json crashdumpJson = +- nlohmann::json::parse(crashdump, nullptr, false); +- if (crashdumpJson.is_discarded()) +- { +- return std::string(); +- } +- +- nlohmann::json::const_iterator cdIt = crashdumpJson.find("crash_data"); +- if (cdIt == crashdumpJson.end()) +- { +- return std::string(); +- } +- +- nlohmann::json::const_iterator siIt = cdIt->find("METADATA"); +- if (siIt == cdIt->end()) +- { +- return std::string(); +- } +- +- nlohmann::json::const_iterator tsIt = siIt->find("timestamp"); +- if (tsIt == siIt->end()) +- { +- return std::string(); +- } +- +- const std::string *logTime = tsIt->get_ptr(); +- if (logTime == nullptr) +- { +- return std::string(); +- } +- +- std::string redfishDateTime = *logTime; +- if (redfishDateTime.length() > 2) +- { +- redfishDateTime.insert(redfishDateTime.end() - 2, ':'); +- } +- +- return redfishDateTime; +-} +- +-std::string getLogFileName(const std::string &logTime) +-{ +- // Set the crashdump file name to "crashdump_.json" using the +- // created time without the timezone info +- std::string fileTime = logTime; +- size_t plusPos = fileTime.rfind('+'); +- if (plusPos != std::string::npos) +- { +- fileTime.erase(plusPos); +- } +- return "crashdump_" + fileTime + ".json"; +-} +- + static void logCrashdumpEntry(std::shared_ptr asyncResp, + const std::string &logID, + nlohmann::json &logEntryJson) + { +- auto getStoredLogCallback = [asyncResp, logID, &logEntryJson]( +- const boost::system::error_code ec, +- const std::variant &resp) { +- if (ec) +- { +- BMCWEB_LOG_DEBUG << "failed to get log ec: " << ec.message(); +- if (ec.value() == +- boost::system::linux_error::bad_request_descriptor) ++ auto getStoredLogCallback = ++ [asyncResp, logID, &logEntryJson]( ++ const boost::system::error_code ec, ++ const std::vector> ¶ms) { ++ if (ec) + { +- messages::resourceNotFound(asyncResp->res, "LogEntry", logID); ++ BMCWEB_LOG_DEBUG << "failed to get log ec: " << ec.message(); ++ if (ec.value() == ++ boost::system::linux_error::bad_request_descriptor) ++ { ++ messages::resourceNotFound(asyncResp->res, "LogEntry", ++ logID); ++ } ++ else ++ { ++ messages::internalError(asyncResp->res); ++ } ++ return; + } +- else ++ ++ std::string timestamp{}; ++ std::string filename{}; ++ for (auto property : params) + { +- messages::internalError(asyncResp->res); ++ if (property.first == "Timestamp") ++ { ++ const std::string *value = ++ sdbusplus::message::variant_ns::get_if( ++ &property.second); ++ if (value != nullptr) ++ { ++ timestamp = *value; ++ } ++ } ++ else if (property.first == "Filename") ++ { ++ const std::string *value = ++ sdbusplus::message::variant_ns::get_if( ++ &property.second); ++ if (value != nullptr) ++ { ++ filename = *value; ++ } ++ } + } +- return; +- } +- const std::string *log = std::get_if(&resp); +- if (log == nullptr) +- { +- messages::internalError(asyncResp->res); +- return; +- } +- std::string logTime = getLogCreatedTime(*log); +- std::string fileName = getLogFileName(logTime); + +- logEntryJson = { +- {"@odata.type", "#LogEntry.v1_4_0.LogEntry"}, +- {"@odata.id", +- "/redfish/v1/Systems/system/LogServices/Crashdump/Entries/" + +- logID}, +- {"Name", "CPU Crashdump"}, +- {"Id", logID}, +- {"EntryType", "Oem"}, +- {"OemRecordFormat", "Crashdump URI"}, +- {"Message", +- "/redfish/v1/Systems/system/LogServices/Crashdump/Entries/" + +- logID + "/" + fileName}, +- {"Created", std::move(logTime)}}; +- }; ++ if (filename.empty() || timestamp.empty()) ++ { ++ messages::resourceMissingAtURI(asyncResp->res, logID); ++ return; ++ } ++ ++ std::string crashdumpURI = ++ "/redfish/v1/Systems/system/LogServices/Crashdump/Entries/" + ++ logID + "/" + filename; ++ logEntryJson = {{"@odata.type", "#LogEntry.v1_4_0.LogEntry"}, ++ {"@odata.id", "/redfish/v1/Systems/system/" ++ "LogServices/Crashdump/Entries/" + ++ logID}, ++ {"Name", "CPU Crashdump"}, ++ {"Id", logID}, ++ {"EntryType", "Oem"}, ++ {"OemRecordFormat", "Crashdump URI"}, ++ {"Message", std::move(crashdumpURI)}, ++ {"Created", std::move(timestamp)}}; ++ }; + crow::connections::systemBus->async_method_call( + std::move(getStoredLogCallback), crashdumpObject, + crashdumpPath + std::string("/") + logID, +- "org.freedesktop.DBus.Properties", "Get", crashdumpInterface, "Log"); ++ "org.freedesktop.DBus.Properties", "GetAll", crashdumpInterface); + } + + class CrashdumpEntryCollection : public Node +@@ -1827,38 +1798,99 @@ class CrashdumpFile : public Node + const std::string &logID = params[0]; + const std::string &fileName = params[1]; + +- auto getStoredLogCallback = [asyncResp, logID, fileName]( +- const boost::system::error_code ec, +- const std::variant &resp) { +- if (ec) +- { +- BMCWEB_LOG_DEBUG << "failed to get log ec: " << ec.message(); +- messages::internalError(asyncResp->res); +- return; +- } +- const std::string *log = std::get_if(&resp); +- if (log == nullptr) +- { +- messages::internalError(asyncResp->res); +- return; +- } ++ auto getStoredLogCallback = ++ [asyncResp, logID, fileName]( ++ const boost::system::error_code ec, ++ const std::vector> &resp) { ++ if (ec) ++ { ++ BMCWEB_LOG_DEBUG << "failed to get log ec: " ++ << ec.message(); ++ messages::internalError(asyncResp->res); ++ return; ++ } + +- // Verify the file name parameter is correct +- if (fileName != getLogFileName(getLogCreatedTime(*log))) +- { +- messages::resourceMissingAtURI(asyncResp->res, fileName); +- return; +- } ++ std::string dbusFilename{}; ++ std::string dbusTimestamp{}; ++ std::string dbusFilepath{}; + +- // Configure this to be a file download when accessed from a browser +- asyncResp->res.addHeader("Content-Disposition", "attachment"); +- asyncResp->res.body() = *log; +- }; ++ for (auto property : resp) ++ { ++ if (property.first == "Timestamp") ++ { ++ const std::string *value = ++ sdbusplus::message::variant_ns::get_if( ++ &property.second); ++ if (value != nullptr) ++ { ++ dbusTimestamp = *value; ++ } ++ } ++ else if (property.first == "Filename") ++ { ++ const std::string *value = ++ sdbusplus::message::variant_ns::get_if( ++ &property.second); ++ if (value != nullptr) ++ { ++ dbusFilename = *value; ++ } ++ } ++ else if (property.first == "Log") ++ { ++ const std::string *value = ++ sdbusplus::message::variant_ns::get_if( ++ &property.second); ++ if (value != nullptr) ++ { ++ dbusFilepath = *value; ++ } ++ } ++ } ++ ++ if (dbusFilename.empty() || dbusTimestamp.empty() || ++ dbusFilepath.empty()) ++ { ++ messages::resourceMissingAtURI(asyncResp->res, fileName); ++ return; ++ } ++ ++ // Verify the file name parameter is correct ++ if (fileName != dbusFilename) ++ { ++ messages::resourceMissingAtURI(asyncResp->res, fileName); ++ return; ++ } ++ ++ if (!std::filesystem::exists(dbusFilepath)) ++ { ++ messages::resourceMissingAtURI(asyncResp->res, fileName); ++ return; ++ } ++ std::ifstream ifs(dbusFilepath, std::ios::in | ++ std::ios::binary | ++ std::ios::ate); ++ std::ifstream::pos_type fileSize = ifs.tellg(); ++ if (fileSize < 0) ++ { ++ messages::generalError(asyncResp->res); ++ return; ++ } ++ ifs.seekg(0, std::ios::beg); ++ ++ std::string dumpData; ++ dumpData.reserve(static_cast(fileSize)); ++ ifs.read(dumpData.data(), static_cast(fileSize)); ++ ++ // Configure this to be a file download when accessed from ++ // a browser ++ asyncResp->res.addHeader("Content-Disposition", "attachment"); ++ asyncResp->res.body() = dumpData.data(); ++ }; + crow::connections::systemBus->async_method_call( + std::move(getStoredLogCallback), crashdumpObject, + crashdumpPath + std::string("/") + logID, +- "org.freedesktop.DBus.Properties", "Get", crashdumpInterface, +- "Log"); ++ "org.freedesktop.DBus.Properties", "GetAll", crashdumpInterface); + } + }; + +-- +2.25.1 + diff --git a/meta-openbmc-mods/meta-common/recipes-phosphor/interfaces/bmcweb_%.bbappend b/meta-openbmc-mods/meta-common/recipes-phosphor/interfaces/bmcweb_%.bbappend index 54b4e1b6b..8caee0933 100644 --- a/meta-openbmc-mods/meta-common/recipes-phosphor/interfaces/bmcweb_%.bbappend +++ b/meta-openbmc-mods/meta-common/recipes-phosphor/interfaces/bmcweb_%.bbappend @@ -1,5 +1,5 @@ SRC_URI = "git://github.com/openbmc/bmcweb.git" -SRCREV = "363c23022eb3fb0cde577405e8a084a2e819b642" +SRCREV = "12c7f4388b58a974265827ab62d3981ba98ed8f2" FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:" @@ -9,8 +9,16 @@ USERADD_PARAM_${PN} = "-r -s /usr/sbin/nologin -d /home/bmcweb -m -G shadow bmcw GROUPADD_PARAM_${PN} = "web; redfish " -SRC_URI += "file://0001-Firmware-update-support-for-StandBySpare.patch" +SRC_URI += "file://0001-Firmware-update-support-for-StandBySpare.patch \ + file://0002-Match-BMCWeb-crashdump-to-the-D-Bus-interface-provid.patch \ +" # Enable PFR support EXTRA_OECMAKE += "${@bb.utils.contains('IMAGE_FSTYPES', 'intel-pfr', '-DBMCWEB_ENABLE_REDFISH_PROVISIONING_FEATURE=ON', '', d)}" +# Enable NBD_PROXY +EXTRA_OECMAKE += " -DBMCWEB_ENABLE_VM_NBDPROXY=ON" + +# Enable Validation unsecure based on IMAGE_FEATURES +EXTRA_OECMAKE += "${@bb.utils.contains('EXTRA_IMAGE_FEATURES', 'validation-unsecure', '-DBMCWEB_ENABLE_VALIDATION_UNSECURE_FEATURE=ON', '', d)}" + -- cgit v1.2.3