network_manager: Add reload hooking
This changes no functionality currently, but it makes it possible to
defer actions until just before the systemd reload would occur.
Change-Id: I434b83fe5ad8b2596de162b6a74eefcba4ecc71a
Signed-off-by: William A. Kennington III <wak@google.com>
diff --git a/src/network_manager.cpp b/src/network_manager.cpp
index 8b4c5c2..b8fcaab 100644
--- a/src/network_manager.cpp
+++ b/src/network_manager.cpp
@@ -255,6 +255,19 @@
void Manager::reloadConfigs()
{
+ for (auto& hook : reloadPreHooks)
+ {
+ try
+ {
+ hook();
+ }
+ catch (const std::exception& ex)
+ {
+ log<level::ERR>("Failed executing reload hook, ignoring",
+ entry("ERR=%s", ex.what()));
+ }
+ }
+ reloadPreHooks.clear();
try
{
auto method = bus.new_method_call(NETWORKD_BUSNAME, NETWORKD_PATH,
diff --git a/src/network_manager.hpp b/src/network_manager.hpp
index fb3cc32..332971b 100644
--- a/src/network_manager.hpp
+++ b/src/network_manager.hpp
@@ -8,10 +8,11 @@
#include "xyz/openbmc_project/Network/VLAN/Create/server.hpp"
#include <filesystem>
-#include <list>
+#include <function2/function2.hpp>
#include <memory>
#include <sdbusplus/bus.hpp>
#include <string>
+#include <utility>
#include <vector>
#include <xyz/openbmc_project/Common/FactoryReset/server.hpp>
@@ -156,6 +157,15 @@
return routeTable;
}
+ /** @brief Adds a hook that runs immediately prior to reloading
+ *
+ * @param[in] hook - The hook to execute before reloading
+ */
+ inline void addReloadPreHook(fu2::unique_function<void()>&& hook)
+ {
+ reloadPreHooks.push_back(std::move(hook));
+ }
+
protected:
/** @brief Persistent sdbusplus DBus bus connection. */
sdbusplus::bus::bus& bus;
@@ -181,6 +191,9 @@
/** @brief The routing table */
route::Table routeTable;
+
+ /** @brief List of hooks to execute during the next reload */
+ std::vector<fu2::unique_function<void()>> reloadPreHooks;
};
} // namespace network