1 #pragma once
2 
3 #include "elog_entry.hpp"
4 #include "log_manager.hpp"
5 
6 #include <functional>
7 #include <vector>
8 
9 namespace phosphor
10 {
11 namespace logging
12 {
13 
14 /**
15  * @brief The function type that will be called on start up.
16  * @param[in] internal::Manager& - A reference to the Manager class.
17  */
18 using StartupFunction = std::function<void(internal::Manager&)>;
19 
20 using AdditionalDataArg = std::vector<std::string>;
21 using AssociationEndpointsArg = std::vector<std::string>;
22 using FFDCArg = FFDCEntries;
23 
24 /**
25  *  @brief The function type that will be called after an event log
26  *         is created.
27  * @param[in] const std::string& - The Message property
28  * @param[in] uin32_t - The event log ID
29  * @param[in] uint64_t - The event log timestamp
30  * @param[in] Level - The event level
31  * @param[in] const AdditionalDataArg&) - the additional data
32  * @param[in] const AssociationEndpoints& - Association endpoints (callouts)
33  * @param[in] const FFDCArg& - A vector of FFDC file info.
34  */
35 using CreateFunction = std::function<void(
36     const std::string&, uint32_t, uint64_t, Entry::Level,
37     const AdditionalDataArg&, const AssociationEndpointsArg&, const FFDCArg&)>;
38 
39 /**
40  * @brief The function type that will be called after an event log is deleted.
41  * @param[in] uint32_t - The event log ID
42  */
43 using DeleteFunction = std::function<void(uint32_t)>;
44 
45 /**
46  * @brief The function type that will to check if an event log is prohibited
47  *        from being deleted.
48  * @param[in] uint32_t - The event log ID
49  * @param[out] bool - set to true if the delete is prohibited
50  */
51 using DeleteProhibitedFunction = std::function<void(uint32_t, bool&)>;
52 
53 using StartupFunctions = std::vector<StartupFunction>;
54 using CreateFunctions = std::vector<CreateFunction>;
55 using DeleteFunctions = std::vector<DeleteFunction>;
56 using DeleteProhibitedFunctions = std::vector<DeleteProhibitedFunction>;
57 
58 /**
59  * @brief Register an extension hook function
60  *
61  * Call this macro at global scope to register a hook to call.
62  * Each hook point has a unique function prototype.
63  */
64 #define REGISTER_EXTENSION_FUNCTION(func)                                      \
65     namespace func##_ns                                                        \
66     {                                                                          \
67         Extensions e{func};                                                    \
68     }
69 
70 /**
71  * @brief Disable default error log capping
72  *
73  * Call this macro at global scope to tell phosphor-logging to disable its
74  * default error log capping algorithm, so that an extension can use its own
75  * instead.
76  */
77 #define DISABLE_LOG_ENTRY_CAPS()                                               \
78     namespace disable_caps##_ns                                                \
79     {                                                                          \
80         Extensions e{Extensions::DefaultErrorCaps::disable};                   \
81     }
82 
83 /**
84  * @class Extensions
85  *
86  * This class manages any error log extensions.  Extensions can register
87  * their hook functions with this class with the provided macros so that they
88  * are then able to create their own types of logs based on the native logs.
89  *
90  * The class should only be constructed at a global scope via the macros.
91  */
92 class Extensions
93 {
94   public:
95     Extensions() = delete;
96     ~Extensions() = default;
97     Extensions(const Extensions&) = delete;
98     Extensions& operator=(const Extensions&) = delete;
99     Extensions(Extensions&&) = delete;
100     Extensions& operator=(Extensions&&) = delete;
101 
102     enum class DefaultErrorCaps
103     {
104         disable,
105         enable
106     };
107 
108     /**
109      * @brief Constructor to register a startup function
110      *
111      * Functions registered with this contructor will be called
112      * when phosphor-log-manager starts up.
113      *
114      * @param[in] func - The startup function to register
115      */
116     explicit Extensions(StartupFunction func)
117     {
118         startupFunctions.push_back(func);
119     }
120 
121     /**
122      * @brief Constructor to register a create function
123      *
124      * Functions registered with this contructor will be called
125      * after phosphor-log-manager creates an event log.
126      *
127      * @param[in] func - The create function to register
128      */
129     explicit Extensions(CreateFunction func)
130     {
131         createFunctions.push_back(func);
132     }
133 
134     /**
135      * @brief Constructor to register a delete function
136      *
137      * Functions registered with this contructor will be called
138      * after phosphor-log-manager deletes an event log.
139      *
140      * @param[in] func - The delete function to register
141      */
142     explicit Extensions(DeleteFunction func)
143     {
144         deleteFunctions.push_back(func);
145     }
146 
147     /**
148      * @brief Constructor to register a delete prohibition function
149      *
150      * Functions registered with this contructor will be called
151      * before phosphor-log-manager deletes an event log to ensure
152      * deleting the log is allowed.
153      *
154      * @param[in] func - The function to register
155      */
156     explicit Extensions(DeleteProhibitedFunction func)
157     {
158         deleteProhibitedFunctions.push_back(func);
159     }
160 
161     /**
162      * @brief Constructor to disable event log capping
163      *
164      * This constructor should only be called by the
165      * DISABLE_LOG_ENTRY_CAPS macro to disable the default
166      * event log capping so that the extension can use their own.
167      *
168      * @param[in] defaultCaps - Enable or disable default capping.
169      */
170     explicit Extensions(DefaultErrorCaps defaultCaps)
171     {
172         defaultErrorCaps = defaultCaps;
173     }
174 
175     /**
176      * @brief Returns the Startup functions
177      * @return StartupFunctions - the Startup functions
178      */
179     static StartupFunctions& getStartupFunctions()
180     {
181         return startupFunctions;
182     }
183 
184     /**
185      * @brief Returns the Create functions
186      * @return CreateFunctions - the Create functions
187      */
188     static CreateFunctions& getCreateFunctions()
189     {
190         return createFunctions;
191     }
192 
193     /**
194      * @brief Returns the Delete functions
195      * @return DeleteFunctions - the Delete functions
196      */
197     static DeleteFunctions& getDeleteFunctions()
198     {
199         return deleteFunctions;
200     }
201 
202     /**
203      * @brief Returns the DeleteProhibited functions
204      * @return DeleteProhibitedFunctions - the DeleteProhibited functions
205      */
206     static DeleteProhibitedFunctions& getDeleteProhibitedFunctions()
207     {
208         return deleteProhibitedFunctions;
209     }
210 
211     /**
212      * @brief Say if the default log capping policy should be disabled
213      * @return bool - true if it should be disabled
214      */
215     static bool disableDefaultLogCaps()
216     {
217         return defaultErrorCaps == DefaultErrorCaps::disable;
218     }
219 
220   private:
221     /**
222      * @brief Vector of functions to call on app startup.
223      */
224     static StartupFunctions startupFunctions;
225 
226     /**
227      * @brief Vector of functions to call after creating an event log.
228      */
229     static CreateFunctions createFunctions;
230 
231     /**
232      * @brief Vector of functions to call after deleting an event log.
233      */
234     static DeleteFunctions deleteFunctions;
235 
236     /**
237      * @brief Vector of functions to call to check if deleting a
238      *        particular event log is prohibited.
239      */
240     static DeleteProhibitedFunctions deleteProhibitedFunctions;
241 
242     /**
243      * @brief If default log capping should be disabled.
244      */
245     static DefaultErrorCaps defaultErrorCaps;
246 };
247 
248 } // namespace logging
249 } // namespace phosphor
250