18f7941edSAdriana Kobylak #pragma once
28f7941edSAdriana Kobylak 
3f8a5a797SNagaraju Goruganti #include <list>
4f477fe29SAdriana Kobylak #include <sdbusplus/bus.hpp>
5d722b3aaSAdriana Kobylak #include <phosphor-logging/log.hpp>
6df995fafSAdriana Kobylak #include "elog_entry.hpp"
78f7941edSAdriana Kobylak #include "xyz/openbmc_project/Logging/Internal/Manager/server.hpp"
805aae8bcSNagaraju Goruganti #include "xyz/openbmc_project/Collection/DeleteAll/server.hpp"
98f7941edSAdriana Kobylak 
108f7941edSAdriana Kobylak namespace phosphor
118f7941edSAdriana Kobylak {
128f7941edSAdriana Kobylak namespace logging
138f7941edSAdriana Kobylak {
14d722b3aaSAdriana Kobylak 
15d722b3aaSAdriana Kobylak extern const std::map<std::string,std::vector<std::string>> g_errMetaMap;
16d722b3aaSAdriana Kobylak extern const std::map<std::string,level> g_errLevelMap;
17d722b3aaSAdriana Kobylak 
1805aae8bcSNagaraju Goruganti using DeleteAllIface = sdbusplus::server::object::object <
1905aae8bcSNagaraju Goruganti                        sdbusplus::xyz::openbmc_project::Collection::server::DeleteAll >;
2005aae8bcSNagaraju Goruganti 
218f7941edSAdriana Kobylak namespace details
228f7941edSAdriana Kobylak {
238f7941edSAdriana Kobylak 
248f7941edSAdriana Kobylak template <typename T>
258f7941edSAdriana Kobylak using ServerObject = typename sdbusplus::server::object::object<T>;
268f7941edSAdriana Kobylak 
278f7941edSAdriana Kobylak using ManagerIface =
288f7941edSAdriana Kobylak     sdbusplus::xyz::openbmc_project::Logging::Internal::server::Manager;
298f7941edSAdriana Kobylak 
308f7941edSAdriana Kobylak } // namespace details
318f7941edSAdriana Kobylak 
3205aae8bcSNagaraju Goruganti namespace internal
3305aae8bcSNagaraju Goruganti {
3405aae8bcSNagaraju Goruganti 
358f7941edSAdriana Kobylak /** @class Manager
368f7941edSAdriana Kobylak  *  @brief OpenBMC logging manager implementation.
378f7941edSAdriana Kobylak  *  @details A concrete implementation for the
388f7941edSAdriana Kobylak  *  xyz.openbmc_project.Logging.Internal.Manager DBus API.
398f7941edSAdriana Kobylak  */
40f477fe29SAdriana Kobylak class Manager : public details::ServerObject<details::ManagerIface>
418f7941edSAdriana Kobylak {
428f7941edSAdriana Kobylak     public:
438f7941edSAdriana Kobylak         Manager() = delete;
448f7941edSAdriana Kobylak         Manager(const Manager&) = delete;
458f7941edSAdriana Kobylak         Manager& operator=(const Manager&) = delete;
46f477fe29SAdriana Kobylak         Manager(Manager&&) = delete;
47f477fe29SAdriana Kobylak         Manager& operator=(Manager&&) = delete;
48f477fe29SAdriana Kobylak         virtual ~Manager() = default;
498f7941edSAdriana Kobylak 
50f477fe29SAdriana Kobylak         /** @brief Constructor to put object onto bus at a dbus path.
51f477fe29SAdriana Kobylak          *  @param[in] bus - Bus to attach to.
52f477fe29SAdriana Kobylak          *  @param[in] path - Path to attach at.
538f7941edSAdriana Kobylak          */
544ea7f312SAdriana Kobylak         Manager(sdbusplus::bus::bus& bus, const char* objPath) :
554ea7f312SAdriana Kobylak                 details::ServerObject<details::ManagerIface>(bus, objPath),
564ea7f312SAdriana Kobylak                 busLog(bus),
571275bd13SMatt Spinler                 entryId(0),
581275bd13SMatt Spinler                 fwVersion(readFWVersion()) {};
598f7941edSAdriana Kobylak 
608f7941edSAdriana Kobylak         /*
618f7941edSAdriana Kobylak          * @fn commit()
628f7941edSAdriana Kobylak          * @brief sd_bus Commit method implementation callback.
638f7941edSAdriana Kobylak          * @details Create an error/event log based on transaction id and
648f7941edSAdriana Kobylak          *          error message.
658f7941edSAdriana Kobylak          * @param[in] transactionId - Unique identifier of the journal entries
668f7941edSAdriana Kobylak          *                            to be committed.
678f7941edSAdriana Kobylak          * @param[in] errMsg - The error exception message associated with the
688f7941edSAdriana Kobylak          *                     error log to be committed.
698f7941edSAdriana Kobylak          */
708f7941edSAdriana Kobylak         void commit(uint64_t transactionId, std::string errMsg) override;
71df995fafSAdriana Kobylak 
726fd9dc48SDeepak Kodihalli         /*
736fd9dc48SDeepak Kodihalli          * @fn commit()
746fd9dc48SDeepak Kodihalli          * @brief sd_bus CommitWithLvl method implementation callback.
756fd9dc48SDeepak Kodihalli          * @details Create an error/event log based on transaction id and
766fd9dc48SDeepak Kodihalli          *          error message.
776fd9dc48SDeepak Kodihalli          * @param[in] transactionId - Unique identifier of the journal entries
786fd9dc48SDeepak Kodihalli          *                            to be committed.
796fd9dc48SDeepak Kodihalli          * @param[in] errMsg - The error exception message associated with the
806fd9dc48SDeepak Kodihalli          *                     error log to be committed.
816fd9dc48SDeepak Kodihalli          * @param[in] errLvl - level of the error
826fd9dc48SDeepak Kodihalli          */
836fd9dc48SDeepak Kodihalli         void commitWithLvl(uint64_t transactionId, std::string errMsg,
846fd9dc48SDeepak Kodihalli                            uint32_t errLvl) override;
85df995fafSAdriana Kobylak 
8699a8549eSDeepak Kodihalli         /** @brief Erase specified entry d-bus object
8799a8549eSDeepak Kodihalli          *
8899a8549eSDeepak Kodihalli          * @param[in] entryId - unique identifier of the entry
8999a8549eSDeepak Kodihalli          */
9099a8549eSDeepak Kodihalli         void erase(uint32_t entryId);
9199a8549eSDeepak Kodihalli 
9272654f10SDeepak Kodihalli         /** @brief Construct error d-bus objects from their persisted
9372654f10SDeepak Kodihalli          *         representations.
9472654f10SDeepak Kodihalli          */
9572654f10SDeepak Kodihalli         void restore();
9672654f10SDeepak Kodihalli 
9705aae8bcSNagaraju Goruganti         /** @brief  Erase all error log entries
9805aae8bcSNagaraju Goruganti          *
9905aae8bcSNagaraju Goruganti          */
10005aae8bcSNagaraju Goruganti         void eraseAll()
10105aae8bcSNagaraju Goruganti         {
10205aae8bcSNagaraju Goruganti             auto iter = entries.begin();
10305aae8bcSNagaraju Goruganti             while (iter != entries.end())
10405aae8bcSNagaraju Goruganti             {
10505aae8bcSNagaraju Goruganti                 auto entry = iter->first;
10605aae8bcSNagaraju Goruganti                 ++iter;
10705aae8bcSNagaraju Goruganti                 erase(entry);
10805aae8bcSNagaraju Goruganti             }
10905aae8bcSNagaraju Goruganti         }
11005aae8bcSNagaraju Goruganti 
111*477b731aSNagaraju Goruganti         /** @brief Returns the count of high severity errors
112*477b731aSNagaraju Goruganti          *
113*477b731aSNagaraju Goruganti          *  @return int - count of real errors
114*477b731aSNagaraju Goruganti          */
115*477b731aSNagaraju Goruganti         int getRealErrSize();
116*477b731aSNagaraju Goruganti 
117*477b731aSNagaraju Goruganti         /** @brief Returns the count of Info errors
118*477b731aSNagaraju Goruganti          *
119*477b731aSNagaraju Goruganti          *  @return int - count of info errors
120*477b731aSNagaraju Goruganti          */
121*477b731aSNagaraju Goruganti         int getInfoErrSize();
122*477b731aSNagaraju Goruganti 
123df995fafSAdriana Kobylak     private:
1246fd9dc48SDeepak Kodihalli         /*
1256fd9dc48SDeepak Kodihalli          * @fn _commit()
1266fd9dc48SDeepak Kodihalli          * @brief commit() helper
1276fd9dc48SDeepak Kodihalli          * @param[in] transactionId - Unique identifier of the journal entries
1286fd9dc48SDeepak Kodihalli          *                            to be committed.
1296fd9dc48SDeepak Kodihalli          * @param[in] errMsg - The error exception message associated with the
1306fd9dc48SDeepak Kodihalli          *                     error log to be committed.
1316fd9dc48SDeepak Kodihalli          * @param[in] errLvl - level of the error
1326fd9dc48SDeepak Kodihalli          */
1336fd9dc48SDeepak Kodihalli         void _commit(uint64_t transactionId, std::string&& errMsg,
1346fd9dc48SDeepak Kodihalli                      Entry::Level errLvl);
1356fd9dc48SDeepak Kodihalli 
136a87c157cSDeepak Kodihalli         /** @brief Call metadata handler(s), if any. Handlers may create
137a87c157cSDeepak Kodihalli          *         associations.
138a87c157cSDeepak Kodihalli          *  @param[in] errorName - name of the error
139a87c157cSDeepak Kodihalli          *  @param[in] additionalData - list of metadata (in key=value format)
140a87c157cSDeepak Kodihalli          *  @param[out] objects - list of error's association objects
141a87c157cSDeepak Kodihalli          */
142a87c157cSDeepak Kodihalli         void processMetadata(const std::string& errorName,
143a87c157cSDeepak Kodihalli                              const std::vector<std::string>& additionalData,
144a87c157cSDeepak Kodihalli                              AssociationList& objects) const;
145a87c157cSDeepak Kodihalli 
1465f4247f0SAdriana Kobylak         /** @brief Synchronize unwritten journal messages to disk.
1475f4247f0SAdriana Kobylak          *  @details This is the same implementation as the systemd command
1485f4247f0SAdriana Kobylak          *  "journalctl --sync".
1495f4247f0SAdriana Kobylak          */
1505f4247f0SAdriana Kobylak         void journalSync();
1515f4247f0SAdriana Kobylak 
1521275bd13SMatt Spinler         /** @brief Reads the BMC code level
1531275bd13SMatt Spinler          *
1541275bd13SMatt Spinler          *  @return std::string - the version string
1551275bd13SMatt Spinler          */
1561275bd13SMatt Spinler         static std::string readFWVersion();
1571275bd13SMatt Spinler 
158df995fafSAdriana Kobylak         /** @brief Persistent sdbusplus DBus bus connection. */
159df995fafSAdriana Kobylak         sdbusplus::bus::bus& busLog;
160df995fafSAdriana Kobylak 
161df995fafSAdriana Kobylak         /** @brief Persistent map of Entry dbus objects and their ID */
162df995fafSAdriana Kobylak         std::map<uint32_t, std::unique_ptr<Entry>> entries;
1634ea7f312SAdriana Kobylak 
164e4b0b771SNagaraju Goruganti         /** @brief List of error ids for high severity errors */
165e4b0b771SNagaraju Goruganti         std::list<uint32_t> realErrors;
166e4b0b771SNagaraju Goruganti 
167f8a5a797SNagaraju Goruganti         /** @brief List of error ids for Info(and below) severity */
168f8a5a797SNagaraju Goruganti         std::list<uint32_t> infoErrors;
169f8a5a797SNagaraju Goruganti 
1704ea7f312SAdriana Kobylak         /** @brief Id of last error log entry */
1714ea7f312SAdriana Kobylak         uint32_t entryId;
1721275bd13SMatt Spinler 
1731275bd13SMatt Spinler         /** @brief The BMC firmware version */
1741275bd13SMatt Spinler         const std::string fwVersion;
1758f7941edSAdriana Kobylak };
1768f7941edSAdriana Kobylak 
17705aae8bcSNagaraju Goruganti } //namespace internal
17805aae8bcSNagaraju Goruganti 
17905aae8bcSNagaraju Goruganti /** @class Manager
18005aae8bcSNagaraju Goruganti  *  @brief Implementation for delete all error log entries.
18105aae8bcSNagaraju Goruganti  *  @details A concrete implementation for the
18205aae8bcSNagaraju Goruganti  *  xyz.openbmc_project.Collection.DeleteAll
18305aae8bcSNagaraju Goruganti  */
18405aae8bcSNagaraju Goruganti class Manager : public DeleteAllIface
18505aae8bcSNagaraju Goruganti {
18605aae8bcSNagaraju Goruganti     public:
18705aae8bcSNagaraju Goruganti         Manager() = delete;
18805aae8bcSNagaraju Goruganti         Manager(const Manager&) = delete;
18905aae8bcSNagaraju Goruganti         Manager& operator=(const Manager&) = delete;
19005aae8bcSNagaraju Goruganti         Manager(Manager&&) = delete;
19105aae8bcSNagaraju Goruganti         Manager& operator=(Manager&&) = delete;
19205aae8bcSNagaraju Goruganti         virtual ~Manager() = default;
19305aae8bcSNagaraju Goruganti 
19405aae8bcSNagaraju Goruganti         /** @brief Constructor to put object onto bus at a dbus path.
19505aae8bcSNagaraju Goruganti          *         Defer signal registration (pass true for deferSignal to the
19605aae8bcSNagaraju Goruganti          *         base class) until after the properties are set.
19705aae8bcSNagaraju Goruganti          *  @param[in] bus - Bus to attach to.
19805aae8bcSNagaraju Goruganti          *  @param[in] path - Path to attach at.
19905aae8bcSNagaraju Goruganti          *  @param[in] manager - Reference to internal manager object.
20005aae8bcSNagaraju Goruganti          */
20105aae8bcSNagaraju Goruganti         Manager(sdbusplus::bus::bus& bus,
20205aae8bcSNagaraju Goruganti                    const std::string& path,
20305aae8bcSNagaraju Goruganti                    internal::Manager& manager) :
20405aae8bcSNagaraju Goruganti             DeleteAllIface(bus, path.c_str(), true),
20505aae8bcSNagaraju Goruganti             manager(manager) {};
20605aae8bcSNagaraju Goruganti 
20705aae8bcSNagaraju Goruganti         /** @brief Delete all d-bus objects.
20805aae8bcSNagaraju Goruganti          */
20905aae8bcSNagaraju Goruganti         void deleteAll()
21005aae8bcSNagaraju Goruganti         {
21105aae8bcSNagaraju Goruganti             manager.eraseAll();
21205aae8bcSNagaraju Goruganti         }
21305aae8bcSNagaraju Goruganti     private:
21405aae8bcSNagaraju Goruganti         /** @brief This is a reference to manager object */
21505aae8bcSNagaraju Goruganti         internal::Manager& manager;
21605aae8bcSNagaraju Goruganti };
21705aae8bcSNagaraju Goruganti 
2188f7941edSAdriana Kobylak } // namespace logging
2198f7941edSAdriana Kobylak } // namespace phosphor
220