blob: ca7f12eddf4589879a82b132517dd0f9a7704dd3 [file] [log] [blame]
Matt Spinler4e8078c2019-07-09 13:22:32 -05001#pragma once
2
Matt Spinlera34ab722019-12-16 10:39:32 -06003#include "config.h"
4
Matt Spinlerc8705e22019-09-11 12:36:07 -05005#include "data_interface.hpp"
Matt Spinlerf682b402019-12-18 13:48:08 -06006#include "event_logger.hpp"
Matt Spinlerf60ac272019-12-11 13:47:50 -06007#include "host_notifier.hpp"
Matt Spinlerd96fa602022-12-15 11:11:26 -06008#include "journal.hpp"
Matt Spinler4e8078c2019-07-09 13:22:32 -05009#include "log_manager.hpp"
Matt Spinler89fa0822019-07-17 13:54:30 -050010#include "paths.hpp"
Matt Spinler56ad2a02020-03-26 14:00:52 -050011#include "pel.hpp"
Matt Spinler367144c2019-09-19 15:33:52 -050012#include "registry.hpp"
Matt Spinler89fa0822019-07-17 13:54:30 -050013#include "repository.hpp"
Matt Spinler4e8078c2019-07-09 13:22:32 -050014
Vijay Loboafb1b462021-07-21 23:29:13 -050015#include <org/open_power/Logging/PEL/Entry/server.hpp>
Matt Spinlera34ab722019-12-16 10:39:32 -060016#include <org/open_power/Logging/PEL/server.hpp>
17#include <sdbusplus/server.hpp>
Matt Spinler6b1a5c82020-01-07 08:48:53 -060018#include <sdeventplus/event.hpp>
19#include <sdeventplus/source/event.hpp>
Matt Spinler44893cc2020-08-26 11:34:17 -050020#include <xyz/openbmc_project/Logging/Create/server.hpp>
Matt Spinlera34ab722019-12-16 10:39:32 -060021
Matt Spinler4e8078c2019-07-09 13:22:32 -050022namespace openpower
23{
24namespace pels
25{
26
Patrick Williams45e83522022-07-22 19:26:52 -050027using PELInterface = sdbusplus::server::object_t<
Matt Spinlera34ab722019-12-16 10:39:32 -060028 sdbusplus::org::open_power::Logging::server::PEL>;
29
Matt Spinler4e8078c2019-07-09 13:22:32 -050030/**
31 * @brief PEL manager object
32 */
Matt Spinlera34ab722019-12-16 10:39:32 -060033class Manager : public PELInterface
Matt Spinler4e8078c2019-07-09 13:22:32 -050034{
35 public:
36 Manager() = delete;
Matt Spinler4e8078c2019-07-09 13:22:32 -050037 Manager(const Manager&) = default;
38 Manager& operator=(const Manager&) = default;
39 Manager(Manager&&) = default;
40 Manager& operator=(Manager&&) = default;
41
42 /**
43 * @brief constructor
44 *
45 * @param[in] logManager - internal::Manager object
Matt Spinlerf60ac272019-12-11 13:47:50 -060046 * @param[in] dataIface - The data interface object
Matt Spinlerf682b402019-12-18 13:48:08 -060047 * @param[in] creatorFunc - The function that EventLogger will
48 * use for creating event logs
Matt Spinler4e8078c2019-07-09 13:22:32 -050049 */
Matt Spinlerf60ac272019-12-11 13:47:50 -060050 Manager(phosphor::logging::internal::Manager& logManager,
Matt Spinlerf682b402019-12-18 13:48:08 -060051 std::unique_ptr<DataInterfaceBase> dataIface,
Matt Spinlerd96fa602022-12-15 11:11:26 -060052 EventLogger::LogFunction creatorFunc,
53 std::unique_ptr<JournalBase> journal) :
Matt Spinlera34ab722019-12-16 10:39:32 -060054 PELInterface(logManager.getBus(), OBJ_LOGGING),
Matt Spinler104e9362020-04-02 09:34:41 -050055 _logManager(logManager), _eventLogger(std::move(creatorFunc)),
Matt Spinlerf682b402019-12-18 13:48:08 -060056 _repo(getPELRepoPath()),
Matt Spinler0d804ef2020-05-12 16:16:26 -050057 _registry(getPELReadOnlyDataPath() / message::registryFileName),
Matt Spinlerff9cec22020-07-15 13:06:35 -050058 _event(sdeventplus::Event::get_default()),
Matt Spinlerd96fa602022-12-15 11:11:26 -060059 _dataIface(std::move(dataIface)), _journal(std::move(journal))
Matt Spinler4e8078c2019-07-09 13:22:32 -050060 {
Adriana Kobylake7d271a2020-12-07 14:32:44 -060061 for (const auto& entry : _logManager.entries)
62 {
63 setEntryPath(entry.first);
Vijay Lobocbc93a42021-05-20 19:04:07 -050064 setServiceProviderNotifyFlag(entry.first);
Vijay Loboafb1b462021-07-21 23:29:13 -050065 // Create PELEntry interface and setup properties with their values
Matt Spinler734ed2b2022-01-21 09:31:46 -060066 createPELEntry(entry.first, true);
Adriana Kobylake7d271a2020-12-07 14:32:44 -060067 }
Matt Spinler28d6ae22022-03-18 11:18:27 -050068
69 _repo.for_each(
70 std::bind(&Manager::updateResolution, this, std::placeholders::_1));
71
Matt Spinlerff9cec22020-07-15 13:06:35 -050072 setupPELDeleteWatch();
Matt Spinler0dd22c82023-05-04 15:28:12 -050073
74 _dataIface->subscribeToFruPresent(
75 "Manager",
76 std::bind(&Manager::hardwarePresent, this, std::placeholders::_1));
Matt Spinler4e8078c2019-07-09 13:22:32 -050077 }
78
79 /**
Matt Spinlerf60ac272019-12-11 13:47:50 -060080 * @brief constructor that enables host notification
81 *
82 * @param[in] logManager - internal::Manager object
83 * @param[in] dataIface - The data interface object
Matt Spinlerf682b402019-12-18 13:48:08 -060084 * @param[in] creatorFunc - The function that EventLogger will
85 * use for creating event logs
Matt Spinlerf60ac272019-12-11 13:47:50 -060086 * @param[in] hostIface - The hostInterface object
87 */
88 Manager(phosphor::logging::internal::Manager& logManager,
89 std::unique_ptr<DataInterfaceBase> dataIface,
Matt Spinlerf682b402019-12-18 13:48:08 -060090 EventLogger::LogFunction creatorFunc,
Matt Spinlerd96fa602022-12-15 11:11:26 -060091 std::unique_ptr<JournalBase> journal,
Matt Spinlerf60ac272019-12-11 13:47:50 -060092 std::unique_ptr<HostInterface> hostIface) :
Matt Spinlerd96fa602022-12-15 11:11:26 -060093 Manager(logManager, std::move(dataIface), std::move(creatorFunc),
94 std::move(journal))
Matt Spinlerf60ac272019-12-11 13:47:50 -060095 {
96 _hostNotifier = std::make_unique<HostNotifier>(
97 _repo, *(_dataIface.get()), std::move(hostIface));
98 }
99
100 /**
Matt Spinlerff9cec22020-07-15 13:06:35 -0500101 * @brief Destructor
102 */
103 ~Manager();
104
105 /**
Matt Spinler4e8078c2019-07-09 13:22:32 -0500106 * @brief Creates a PEL based on the OpenBMC event log contents. If
107 * a PEL was passed in via the RAWPEL specifier in the
108 * additionalData parameter, use that instead.
109 *
110 * @param[in] message - the event log message property
111 * @param[in] obmcLogID - the corresponding OpenBMC event log id
112 * @param[in] timestamp - the Timestamp property
113 * @param[in] severity - the event log severity
114 * @param[in] additionalData - the AdditionalData property
115 * @param[in] associations - the Associations property
Matt Spinler56ad2a02020-03-26 14:00:52 -0500116 * @param[in] ffdc - A vector of FFDC file information
Matt Spinler4e8078c2019-07-09 13:22:32 -0500117 */
118 void create(const std::string& message, uint32_t obmcLogID,
Matt Spinler367144c2019-09-19 15:33:52 -0500119 uint64_t timestamp, phosphor::logging::Entry::Level severity,
Matt Spinler4e8078c2019-07-09 13:22:32 -0500120 const std::vector<std::string>& additionalData,
Matt Spinler56ad2a02020-03-26 14:00:52 -0500121 const std::vector<std::string>& associations,
122 const phosphor::logging::FFDCEntries& ffdc =
123 phosphor::logging::FFDCEntries{});
Matt Spinler4e8078c2019-07-09 13:22:32 -0500124
125 /**
126 * @brief Erase a PEL based on its OpenBMC event log ID
127 *
128 * @param[in] obmcLogID - the corresponding OpenBMC event log id
129 */
130 void erase(uint32_t obmcLogID);
131
132 /** @brief Says if an OpenBMC event log may not be manually deleted at this
133 * time because its corresponding PEL cannot be.
134 *
135 * There are PEL retention policies that can prohibit the manual deletion
136 * of PELs (and therefore OpenBMC event logs).
137 *
138 * @param[in] obmcLogID - the OpenBMC event log ID
139 * @return bool - true if prohibited
140 */
141 bool isDeleteProhibited(uint32_t obmcLogID);
142
Matt Spinlera34ab722019-12-16 10:39:32 -0600143 /**
144 * @brief Return a file descriptor to the raw PEL data
145 *
146 * Throws InvalidArgument if the PEL ID isn't found,
147 * and InternalFailure if anything else fails.
148 *
149 * @param[in] pelID - The PEL ID to get the data for
150 *
151 * @return unix_fd - File descriptor to the file that contains the PEL
152 */
153 sdbusplus::message::unix_fd getPEL(uint32_t pelID) override;
154
155 /**
156 * @brief Returns data for the PEL corresponding to an OpenBMC
157 * event log.
158 *
159 * @param[in] obmcLogID - The OpenBMC event log ID
160 *
161 * @return vector<uint8_t> - The raw PEL data
162 */
163 std::vector<uint8_t> getPELFromOBMCID(uint32_t obmcLogID) override;
164
165 /**
166 * @brief The D-Bus method called when a host successfully processes
167 * a PEL.
168 *
169 * This D-Bus method is called from the PLDM daemon when they get an
170 * 'Ack PEL' PLDM message from the host, which indicates the host
171 * firmware successfully sent it to the OS and this code doesn't need
172 * to send it to the host again.
173 *
174 * @param[in] pelID - The PEL ID
175 */
176 void hostAck(uint32_t pelID) override;
177
178 /**
179 * @brief D-Bus method called when the host rejects a PEL.
180 *
181 * This D-Bus method is called from the PLDM daemon when they get an
182 * 'Ack PEL' PLDM message from the host with a payload that says
183 * something when wrong.
184 *
185 * The choices are either:
186 * * Host Full - The host's staging area is full - try again later
187 * * Malrformed PEL - The host received an invalid PEL
188 *
189 * @param[in] pelID - The PEL ID
190 * @param[in] reason - One of the above two reasons
191 */
192 void hostReject(uint32_t pelID, RejectionReason reason) override;
193
Matt Spinler44893cc2020-08-26 11:34:17 -0500194 /**
195 * @brief D-Bus method to create a PEL/OpenBMC event log and
196 * return the created OpenBMC and PEL log IDs.
197 *
198 * The same as the CreateWithFFDCFiles method on the
199 * xyz.openbmc_project.Logging.Create interface, except for
200 * the return values.
201 *
202 * @param[in] message - The event log message property
203 * @param[in] severity - The event log severity
204 * @param[in] additionalData - The AdditionalData property
205 * @param[in] ffdc - A vector of FFDC file information
206 */
Matt Spinler9cc30072020-09-16 15:39:34 -0500207 std::tuple<uint32_t, uint32_t> createPELWithFFDCFiles(
208 std::string message, phosphor::logging::Entry::Level severity,
209 std::map<std::string, std::string> additionalData,
210 std::vector<std::tuple<sdbusplus::xyz::openbmc_project::Logging::
211 server::Create::FFDCFormat,
212 uint8_t, uint8_t, sdbusplus::message::unix_fd>>
Matt Spinler44893cc2020-08-26 11:34:17 -0500213 fFDC) override;
Matt Spinler9cc30072020-09-16 15:39:34 -0500214
Matt Spinler19e72902020-01-24 11:05:20 -0600215 /**
Matt Spinleraa85a072022-03-23 11:26:41 -0500216 * @brief D-Bus method to return the PEL in JSON format
217 *
218 * @param[in] obmcLogID - The OpenBMC entry log ID
219 *
220 * @return std::string - The fully parsed PEL in JSON
221 */
Matt Spinler8bd4ca42022-04-01 16:06:06 -0500222 std::string getPELJSON(uint32_t obmcLogID) override;
Matt Spinleraa85a072022-03-23 11:26:41 -0500223
224 /**
Matt Spinler19e72902020-01-24 11:05:20 -0600225 * @brief Converts the ESEL field in an OpenBMC event log to a
226 * vector of uint8_ts that just contains the PEL data.
227 *
228 * That data string looks like: "50 48 00 ab ..."
229 *
230 * Throws an exception on any failures.
231 *
232 * @param[in] esel - The ESEL string
233 *
234 * @return std::vector<uint8_t> - The contained PEL data
235 */
236 static std::vector<uint8_t> eselToRawData(const std::string& esel);
237
Vijay Lobod354a392021-06-01 16:21:02 -0500238 /**
Vijay Lobo593a4c62021-06-16 14:25:26 -0500239 * @brief Generate resolution string from the PEL
240 *
241 * @param[in] pel - The PEL to use
242 */
243 std::string getResolution(const openpower::pels::PEL& pel) const;
244
245 /**
Vijay Lobod354a392021-06-01 16:21:02 -0500246 * @brief Generate event ID from the PEL
247 *
248 * @param[in] pel - The PEL to use
249 */
250 std::string getEventId(const openpower::pels::PEL& pel) const;
251
Ramesh Iyyarf4203c42021-06-24 06:09:23 -0500252 /** @brief Implementation for GetPELIdFromBMCLogId
253 *
254 * Returns the PEL Id (aka Entry ID (EID)) based on the given
255 * BMC event log id.
256 *
257 * @param[in] bmcLogId - The BMC event log id of the PEL to retrieve
258 * the PEL id.
259 *
260 * @return uint32_t - The Id of the PEL.
261 * Throw "InvalidArgument" if not found.
262 */
263 uint32_t getPELIdFromBMCLogId(uint32_t bmcLogId) override;
264
Ramesh Iyyar530efbf2021-06-24 06:22:22 -0500265 /** @brief Implementation for GetBMCLogIdFromPELId
266 *
267 * Returns the BMC event log id based on the given PEL id
268 * (aka Entry ID (EID)).
269 *
270 * @param[in] pelId - The PEL id to retrieve the BMC event log id.
271 *
272 * @return uint32_t - The BMC event log id of the PEL.
273 * Throw "InvalidArgument" if not found.
274 */
275 uint32_t getBMCLogIdFromPELId(uint32_t pelId) override;
276
Sumit Kumar3e274432021-09-14 06:37:56 -0500277 /**
278 * @brief Update boot progress SRC based on severity 0x51, critical error
279 *
280 * @param[in] pel - The PEL to use
281 */
282 void updateProgressSRC(std::unique_ptr<openpower::pels::PEL>& pel) const;
283
Matt Spinler0003af12022-06-08 10:46:17 -0500284 /**
285 * @brief Converts unprintable characters from the passed
286 * in string to spaces so they won't crash D-Bus when
287 * used as a property value.
288 *
289 * @param[in] field - The field to fix
290 *
291 * @return std::string - The string without non printable characters.
292 */
293 static std::string sanitizeFieldForDBus(std::string field);
294
Matt Spinler4e8078c2019-07-09 13:22:32 -0500295 private:
296 /**
297 * @brief Adds a received raw PEL to the PEL repository
298 *
299 * @param[in] rawPelPath - The path to the file that contains the
300 * raw PEL.
301 * @param[in] obmcLogID - the corresponding OpenBMC event log id
302 */
303 void addRawPEL(const std::string& rawPelPath, uint32_t obmcLogID);
304
305 /**
306 * @brief Creates a PEL based on the OpenBMC event log contents.
307 *
308 * @param[in] message - The event log message property
309 * @param[in] obmcLogID - the corresponding OpenBMC event log id
310 * @param[in] timestamp - The timestamp property
311 * @param[in] severity - The event log severity
312 * @param[in] additionalData - The AdditionalData property
313 * @param[in] associations - The associations property
Matt Spinler56ad2a02020-03-26 14:00:52 -0500314 * @param[in] ffdc - A vector of FFDC file information
Matt Spinler4e8078c2019-07-09 13:22:32 -0500315 */
316 void createPEL(const std::string& message, uint32_t obmcLogID,
Matt Spinler367144c2019-09-19 15:33:52 -0500317 uint64_t timestamp, phosphor::logging::Entry::Level severity,
Matt Spinler4e8078c2019-07-09 13:22:32 -0500318 const std::vector<std::string>& additionalData,
Matt Spinler56ad2a02020-03-26 14:00:52 -0500319 const std::vector<std::string>& associations,
320 const phosphor::logging::FFDCEntries& ffdc);
Matt Spinler4e8078c2019-07-09 13:22:32 -0500321
322 /**
Matt Spinler6b1a5c82020-01-07 08:48:53 -0600323 * @brief Schedules a close of the file descriptor to occur from
324 * the event loop.
325 *
326 * Uses sd_event_add_defer
327 *
328 * @param[in] fd - The file descriptor to close
329 */
330 void scheduleFDClose(int fd);
331
332 /**
333 * @brief Closes the file descriptor passed in.
334 *
335 * This is called from the event loop to close FDs returned
336 * from getPEL().
337 *
338 * @param[in] fd - The file descriptor to close
339 * @param[in] source - The event source object used
340 */
341 void closeFD(int fd, sdeventplus::source::EventBase& source);
342
343 /**
Matt Spinler19e72902020-01-24 11:05:20 -0600344 * @brief Adds a PEL to the repository given its data
345 *
346 * @param[in] pelData - The PEL to add as a vector of uint8_ts
347 * @param[in] obmcLogID - the OpenBMC event log ID
348 */
349 void addPEL(std::vector<uint8_t>& pelData, uint32_t obmcLogID);
350
351 /**
352 * @brief Adds the PEL stored in the ESEL field of the AdditionalData
353 * property of an OpenBMC event log to the repository.
354 *
355 * @param[in] esel - The ESEL AdditionalData contents
356 * @param[in] obmcLogID - The OpenBMC event log ID
357 */
358 void addESELPEL(const std::string& esel, uint32_t obmcLogID);
359
360 /**
Matt Spinler56ad2a02020-03-26 14:00:52 -0500361 * @brief Converts the D-Bus FFDC method argument into a data
362 * structure understood by the PEL code.
363 *
364 * @param[in] ffdc - A vector of FFDC file information
365 *
366 * @return PelFFDC - The PEL FFDC data structure
367 */
368 PelFFDC convertToPelFFDC(const phosphor::logging::FFDCEntries& ffdc);
369
370 /**
Matt Spinler7e727a32020-07-07 15:00:17 -0500371 * @brief Schedules a PEL repository prune to occur from
372 * the event loop.
373 *
374 * Uses sd_event_add_defer
375 */
376 void scheduleRepoPrune();
377
378 /**
379 * @brief Prunes old PELs out of the repository to save space.
380 *
381 * This is called from the event loop.
382 *
383 * @param[in] source - The event source object used
384 */
385 void pruneRepo(sdeventplus::source::EventBase& source);
386
387 /**
Matt Spinlerff9cec22020-07-15 13:06:35 -0500388 * @brief Sets up an inotify watch to watch for deleted PEL
389 * files. Calls pelFileDeleted() when that occurs.
390 */
391 void setupPELDeleteWatch();
392
393 /**
394 * @brief Called when the inotify watch put on the repository directory
395 * detects a PEL file was deleted.
396 *
397 * Will tell the Repository class about the deleted PEL, and then tell
398 * the log manager class to delete the corresponding OpenBMC event log.
399 */
400 void pelFileDeleted(sdeventplus::source::IO& io, int fd, uint32_t revents);
401
402 /**
Andrew Geissler44fc3162020-07-09 09:21:31 -0500403 * @brief Check if the input PEL should cause a quiesce of the system
404 *
405 * If QuiesceOnHwError is enabled within phosphor-settings and the PEL
Matt Spinlerb2abc042021-05-17 15:32:50 -0600406 * from the host has a severity which is not SeverityType::nonError or
407 * recovered then execute the quiesce and boot block logic.
Andrew Geissler44fc3162020-07-09 09:21:31 -0500408 *
409 * @param[in] pel - The PEL to check
410 */
411 void checkPelAndQuiesce(std::unique_ptr<openpower::pels::PEL>& pel);
412
413 /**
Vijay Lobod354a392021-06-01 16:21:02 -0500414 * @brief Update eventId D-bus property for this error log
415 *
416 * Update the eventId property of D-bus with SRC and hexwords from the
417 * PEL created
418 *
419 * @param[in] pel - The PEL to use
420 */
421 void updateEventId(std::unique_ptr<openpower::pels::PEL>& pel);
422
423 /**
Adriana Kobylake7d271a2020-12-07 14:32:44 -0600424 * @brief Sets the FilePath of the specified error log entry to the PEL file
425 * path.
426 *
427 * @param[in] obmcLogID - The OpenBMC entry log ID
428 */
429 void setEntryPath(uint32_t obmcLogID);
430
431 /**
Vijay Lobocbc93a42021-05-20 19:04:07 -0500432 * @brief Sets the serviceProviderNotify D-bus property of PEL.
433 *
434 * @param[in] obmcLogID - The OpenBMC entry log ID
435 */
436 void setServiceProviderNotifyFlag(uint32_t obmcLogID);
437
438 /**
Vijay Lobo593a4c62021-06-16 14:25:26 -0500439 * @brief Update resolution D-bus property for this error log
440 *
441 * Update the resolution property of D-bus with callouts extracted from PEL
442 *
443 * @param[in] pel - The PEL to use
Matt Spinler28d6ae22022-03-18 11:18:27 -0500444 *
445 * @return bool - false for Repositor::for_each().
Vijay Lobo593a4c62021-06-16 14:25:26 -0500446 */
Matt Spinler28d6ae22022-03-18 11:18:27 -0500447 bool updateResolution(const openpower::pels::PEL& pel);
Vijay Lobo593a4c62021-06-16 14:25:26 -0500448
449 /**
Matt Spinler8b81ec02022-07-12 13:25:37 -0500450 * @brief Check if the D-Bus severity property for the event log
451 * needs to be updated based on the final PEL severity,
452 * and update the property accordingly.
453 *
454 * @param[in] pel - The PEL to operate on.
455 */
456 void updateDBusSeverity(const openpower::pels::PEL& pel);
457
458 /**
Vijay Loboafb1b462021-07-21 23:29:13 -0500459 * @brief Create PELEntry Interface with supported properties
460 *
461 * Create PELEntry Interface and update all the properties which are
462 * supported
463 *
464 * @param[in] obmcLogID - The OpenBMC entry log ID
Matt Spinler734ed2b2022-01-21 09:31:46 -0600465 * @param[in] skipIaSignal - If The InterfacesAdded signal should be
466 * skipped after creating the interfaces.
Vijay Loboafb1b462021-07-21 23:29:13 -0500467 */
Matt Spinler734ed2b2022-01-21 09:31:46 -0600468 void createPELEntry(uint32_t obmcLogID, bool skipIaSignal = false);
Vijay Loboafb1b462021-07-21 23:29:13 -0500469
470 /**
Matt Spinlerd8fb5ba2022-01-25 13:01:14 -0600471 * @brief Schedules the delete of the OpenBMC event log for when
472 * execution gets back to the event loop (uses sd_event_add_defer).
473 *
474 * @param[in] obmcLogID - The OpenBMC entry log ID
475 */
476 void scheduleObmcLogDelete(uint32_t obmcLogID);
477
478 /**
479 * @brief SD event callback to delete an OpenBMC event log
480 *
481 * @param[in] obmcLogID - The OpenBMC entry log ID
482 */
483 void deleteObmcLog(sdeventplus::source::EventBase&, uint32_t obmcLogID);
484
485 /**
Matt Spinler0dd22c82023-05-04 15:28:12 -0500486 * @brief Clears the deconfig flag in the PEL if necessary.
487 *
488 * If the passed in location code is in a callout and it's a PEL with
489 * the BMC power/thermal or fans component ID, clear the deconfig flag.
490 *
491 * @param[in] locationCode - The location code to look for
492 * @param[inout] pel - The PEL to check and modify.
493 * @return bool - true if the flag was cleared for this PEL
494 */
495 static bool clearPowerThermalDeconfigFlag(const std::string& locationCode,
496 openpower::pels::PEL& pel);
497
498 /**
499 * @brief Called by DataInterface when the presence of hotpluggable
500 * hardware is detected.
501 *
502 * Clears the 'Deconfig' flag in any PEL that has the location code
503 * of the hardware in a callout.
504 *
505 * @param[in] locationCode - The location code of the hardware.
506 */
507 void hardwarePresent(const std::string& locationCode);
508
509 /**
Matt Spinler4e8078c2019-07-09 13:22:32 -0500510 * @brief Reference to phosphor-logging's Manager class
511 */
Matt Spinler367144c2019-09-19 15:33:52 -0500512 phosphor::logging::internal::Manager& _logManager;
Matt Spinler89fa0822019-07-17 13:54:30 -0500513
514 /**
Matt Spinlerf682b402019-12-18 13:48:08 -0600515 * @brief Handles creating event logs/PELs from within
516 * the PEL extension code
517 */
518 EventLogger _eventLogger;
519
520 /**
Matt Spinler89fa0822019-07-17 13:54:30 -0500521 * @brief The PEL repository object
522 */
523 Repository _repo;
Matt Spinlerc8705e22019-09-11 12:36:07 -0500524
525 /**
Matt Spinler367144c2019-09-19 15:33:52 -0500526 * @brief The PEL message registry object
527 */
528 message::Registry _registry;
529
530 /**
Matt Spinlerff9cec22020-07-15 13:06:35 -0500531 * @brief The Event object this class uses
532 */
533 sdeventplus::Event _event;
534
535 /**
Matt Spinlerc8705e22019-09-11 12:36:07 -0500536 * @brief The API the PEL sections use to gather data
537 */
538 std::unique_ptr<DataInterfaceBase> _dataIface;
Matt Spinlerf60ac272019-12-11 13:47:50 -0600539
540 /**
Matt Spinlerd96fa602022-12-15 11:11:26 -0600541 * @brief Object used to read from the journal
542 */
543 std::unique_ptr<JournalBase> _journal;
544
545 /**
Vijay Loboafb1b462021-07-21 23:29:13 -0500546 * @brief The map used to keep track of PEL entry pointer associated with
547 * event log.
548 */
549 std::map<std::string,
550 std::unique_ptr<
551 sdbusplus::org::open_power::Logging::PEL::server::Entry>>
552 _pelEntries;
553
554 /**
Matt Spinlerf60ac272019-12-11 13:47:50 -0600555 * @brief The HostNotifier object used for telling the
556 * host about new PELs
557 */
558 std::unique_ptr<HostNotifier> _hostNotifier;
Matt Spinler6b1a5c82020-01-07 08:48:53 -0600559
560 /**
561 * @brief The event source for closing a PEL file descriptor after
562 * it has been returned from the getPEL D-Bus method.
563 */
564 std::unique_ptr<sdeventplus::source::Defer> _fdCloserEventSource;
Matt Spinler7e727a32020-07-07 15:00:17 -0500565
566 /**
567 * @brief The even source for removing old PELs when the repo is
568 * running out of space to make room for new ones.
569 */
570 std::unique_ptr<sdeventplus::source::Defer> _repoPrunerEventSource;
Matt Spinlerff9cec22020-07-15 13:06:35 -0500571
572 /**
Matt Spinlerd8fb5ba2022-01-25 13:01:14 -0600573 * @brief The event source for deleting an OpenBMC event log.
574 * Used when its corresponding PEL is invalid.
575 */
576 std::unique_ptr<sdeventplus::source::Defer> _obmcLogDeleteEventSource;
577
578 /**
Matt Spinlerff9cec22020-07-15 13:06:35 -0500579 * @brief The even source for watching for deleted PEL files.
580 */
581 std::unique_ptr<sdeventplus::source::IO> _pelFileDeleteEventSource;
582
583 /**
584 * @brief The file descriptor returned by inotify_init1() used
585 * for watching for deleted PEL files.
586 */
587 int _pelFileDeleteFD = -1;
588
589 /**
590 * @brief The file descriptor returned by inotify_add_watch().
591 */
592 int _pelFileDeleteWatchFD = -1;
Matt Spinler4e8078c2019-07-09 13:22:32 -0500593};
594
595} // namespace pels
596} // namespace openpower