#pragma once #include "elog_entry.hpp" #include "log_manager.hpp" #include #include 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; using AdditionalDataArg = std::vector; using AssociationEndpointsArg = std::vector; /** * @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; /** * @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; /** * @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; using StartupFunctions = std::vector; using CreateFunctions = std::vector; using DeleteFunctions = std::vector; using DeleteProhibitedFunctions = std::vector; /** * @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