#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; using FFDCArg = FFDCEntries; /** * @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) * @param[in] const FFDCArg& - A vector of FFDC file info. */ 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. * The same function is used to check if an event log is prohibited from * setting Resolved flag, as Resolve is prohibited as long as Delete is * prohibited. * * @param[in] uint32_t - The event log ID * @param[out] bool - set to true if the delete is prohibited */ using DeleteProhibitedFunction = std::function; /** * @brief The function type that will return list of Hw Isolated * log IDs * @param[out] std::vector& - Hw Isolated log IDs */ using LogIDWithHwIsolationFunction = std::function&)>; using LogIDsWithHwIsolationFunctions = std::vector; 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) { getStartupFunctions().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) { getCreateFunctions().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) { getDeleteFunctions().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) { getDeleteProhibitedFunctions().push_back(func); } /** * @brief Constructor to register a LogID with HwIsolation function * * Functions registered with this contructor will be called * before phosphor-log-manager deletes all event log. * * @param[in] func - The function to register */ explicit Extensions(LogIDWithHwIsolationFunction func) { getLogIDWithHwIsolationFunctions().emplace_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) { getDefaultErrorCaps() = defaultCaps; } /** * @brief Returns the Startup functions * @return StartupFunctions - the Startup functions */ static StartupFunctions& getStartupFunctions(); /** * @brief Returns the Create functions * @return CreateFunctions - the Create functions */ static CreateFunctions& getCreateFunctions(); /** * @brief Returns the Delete functions * @return DeleteFunctions - the Delete functions */ static DeleteFunctions& getDeleteFunctions(); /** * @brief Returns the DeleteProhibited functions * @return DeleteProhibitedFunctions - the DeleteProhibited functions */ static DeleteProhibitedFunctions& getDeleteProhibitedFunctions(); /** * @brief Returns the LogIDWithHwIsolationFunction functions * @return LogIDsWithHwIsolationFunctions - the LogIDWithHwIsolationFunction * functions */ static LogIDsWithHwIsolationFunctions& getLogIDWithHwIsolationFunctions(); /** * @brief Returns the DefaultErrorCaps value * @return DefaultErrorCaps - the DefaultErrorCaps value */ static DefaultErrorCaps& getDefaultErrorCaps(); /** * @brief Say if the default log capping policy should be disabled * @return bool - true if it should be disabled */ static bool disableDefaultLogCaps() { return getDefaultErrorCaps() == DefaultErrorCaps::disable; } }; } // namespace logging } // namespace phosphor