summaryrefslogtreecommitdiffstats
path: root/extensions.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'extensions.hpp')
-rw-r--r--extensions.hpp246
1 files changed, 246 insertions, 0 deletions
diff --git a/extensions.hpp b/extensions.hpp
new file mode 100644
index 0000000..3897894
--- /dev/null
+++ b/extensions.hpp
@@ -0,0 +1,246 @@
+#pragma once
+
+#include "elog_entry.hpp"
+#include "log_manager.hpp"
+
+#include <functional>
+#include <vector>
+
+namespace phosphor
+{
+namespace logging
+{
+
+/**
+ * @brief The function type that will be called on start up.
+ * @param[in] internal::Manager& - A reference to the Manager class.
+ */
+using StartupFunction = std::function<void(internal::Manager&)>;
+
+using AdditionalDataArg = std::vector<std::string>;
+using AssociationEndpointsArg = std::vector<std::string>;
+/**
+ * @brief The function type that will be called after an event log
+ * is created.
+ * @param[in] const std::string& - The Message property
+ * @param[in] uin32_t - The event log ID
+ * @param[in] uint64_t - The event log timestamp
+ * @param[in] Level - The event level
+ * @param[in] const AdditionalDataArg&) - the additional data
+ * @param[in] const AssociationEndpoints& - Association endpoints (callouts)
+ */
+using CreateFunction = std::function<void(
+ const std::string&, uint32_t, uint64_t, Entry::Level,
+ const AdditionalDataArg&, const AssociationEndpointsArg&)>;
+
+/**
+ * @brief The function type that will be called after an event log is deleted.
+ * @param[in] uint32_t - The event log ID
+ */
+using DeleteFunction = std::function<void(uint32_t)>;
+
+/**
+ * @brief The function type that will to check if an event log is prohibited
+ * from being deleted.
+ * @param[in] uint32_t - The event log ID
+ * @param[out] bool - set to true if the delete is prohibited
+ */
+using DeleteProhibitedFunction = std::function<void(uint32_t, bool&)>;
+
+using StartupFunctions = std::vector<StartupFunction>;
+using CreateFunctions = std::vector<CreateFunction>;
+using DeleteFunctions = std::vector<DeleteFunction>;
+using DeleteProhibitedFunctions = std::vector<DeleteProhibitedFunction>;
+
+/**
+ * @brief Register an extension hook function
+ *
+ * Call this macro at global scope to register a hook to call.
+ * Each hook point has a unique function prototype.
+ */
+#define REGISTER_EXTENSION_FUNCTION(func) \
+ namespace func##_ns \
+ { \
+ Extensions e{func}; \
+ }
+
+/**
+ * @brief Disable default error log capping
+ *
+ * Call this macro at global scope to tell phosphor-logging to disable its
+ * default error log capping algorithm, so that an extension can use its own
+ * instead.
+ */
+#define DISABLE_LOG_ENTRY_CAPS() \
+ namespace disable_caps##_ns \
+ { \
+ Extensions e{Extensions::DefaultErrorCaps::disable}; \
+ }
+
+/**
+ * @class Extensions
+ *
+ * This class manages any error log extensions. Extensions can register
+ * their hook functions with this class with the provided macros so that they
+ * are then able to create their own types of logs based on the native logs.
+ *
+ * The class should only be constructed at a global scope via the macros.
+ */
+class Extensions
+{
+ public:
+ Extensions() = delete;
+ ~Extensions() = default;
+ Extensions(const Extensions&) = delete;
+ Extensions& operator=(const Extensions&) = delete;
+ Extensions(Extensions&&) = delete;
+ Extensions& operator=(Extensions&&) = delete;
+
+ enum class DefaultErrorCaps
+ {
+ disable,
+ enable
+ };
+
+ /**
+ * @brief Constructor to register a startup function
+ *
+ * Functions registered with this contructor will be called
+ * when phosphor-log-manager starts up.
+ *
+ * @param[in] func - The startup function to register
+ */
+ explicit Extensions(StartupFunction func)
+ {
+ startupFunctions.push_back(func);
+ }
+
+ /**
+ * @brief Constructor to register a create function
+ *
+ * Functions registered with this contructor will be called
+ * after phosphor-log-manager creates an event log.
+ *
+ * @param[in] func - The create function to register
+ */
+ explicit Extensions(CreateFunction func)
+ {
+ createFunctions.push_back(func);
+ }
+
+ /**
+ * @brief Constructor to register a delete function
+ *
+ * Functions registered with this contructor will be called
+ * after phosphor-log-manager deletes an event log.
+ *
+ * @param[in] func - The delete function to register
+ */
+ explicit Extensions(DeleteFunction func)
+ {
+ deleteFunctions.push_back(func);
+ }
+
+ /**
+ * @brief Constructor to register a delete prohibition function
+ *
+ * Functions registered with this contructor will be called
+ * before phosphor-log-manager deletes an event log to ensure
+ * deleting the log is allowed.
+ *
+ * @param[in] func - The function to register
+ */
+ explicit Extensions(DeleteProhibitedFunction func)
+ {
+ deleteProhibitedFunctions.push_back(func);
+ }
+
+ /**
+ * @brief Constructor to disable event log capping
+ *
+ * This constructor should only be called by the
+ * DISABLE_LOG_ENTRY_CAPS macro to disable the default
+ * event log capping so that the extension can use their own.
+ *
+ * @param[in] defaultCaps - Enable or disable default capping.
+ */
+ explicit Extensions(DefaultErrorCaps defaultCaps)
+ {
+ defaultErrorCaps = defaultCaps;
+ }
+
+ /**
+ * @brief Returns the Startup functions
+ * @return StartupFunctions - the Startup functions
+ */
+ static StartupFunctions& getStartupFunctions()
+ {
+ return startupFunctions;
+ }
+
+ /**
+ * @brief Returns the Create functions
+ * @return CreateFunctions - the Create functions
+ */
+ static CreateFunctions& getCreateFunctions()
+ {
+ return createFunctions;
+ }
+
+ /**
+ * @brief Returns the Delete functions
+ * @return DeleteFunctions - the Delete functions
+ */
+ static DeleteFunctions& getDeleteFunctions()
+ {
+ return deleteFunctions;
+ }
+
+ /**
+ * @brief Returns the DeleteProhibited functions
+ * @return DeleteProhibitedFunctions - the DeleteProhibited functions
+ */
+ static DeleteProhibitedFunctions& getDeleteProhibitedFunctions()
+ {
+ return deleteProhibitedFunctions;
+ }
+
+ /**
+ * @brief Say if the default log capping policy should be disabled
+ * @return bool - true if it should be disabled
+ */
+ static bool disableDefaultLogCaps()
+ {
+ return defaultErrorCaps == DefaultErrorCaps::disable;
+ }
+
+ private:
+ /**
+ * @brief Vector of functions to call on app startup.
+ */
+ static StartupFunctions startupFunctions;
+
+ /**
+ * @brief Vector of functions to call after creating an event log.
+ */
+ static CreateFunctions createFunctions;
+
+ /**
+ * @brief Vector of functions to call after deleting an event log.
+ */
+ static DeleteFunctions deleteFunctions;
+
+ /**
+ * @brief Vector of functions to call to check if deleting a
+ * particular event log is prohibited.
+ */
+ static DeleteProhibitedFunctions deleteProhibitedFunctions;
+
+ /**
+ * @brief If default log capping should be disabled.
+ */
+ static DefaultErrorCaps defaultErrorCaps;
+};
+
+} // namespace logging
+} // namespace phosphor
OpenPOWER on IntegriCloud