blob: 4b5005d2522258abbb50ca6e9b4dc1d54231d109 [file] [log] [blame]
Jayanth Othayotha320c7c2017-06-14 07:17:21 -05001#pragma once
2
Jayanth Othayothcb65ffc2018-10-16 08:29:32 -05003#include "config.h"
Jayanth Othayoth671fc7f2017-06-14 08:01:41 -05004
Jayanth Othayotha320c7c2017-06-14 07:17:21 -05005#include "dump_entry.hpp"
Jayanth Othayoth671fc7f2017-06-14 08:01:41 -05006#include "dump_utils.hpp"
Jayanth Othayothbcb174b2017-07-02 06:29:24 -05007#include "watch.hpp"
Jayanth Othayothcb65ffc2018-10-16 08:29:32 -05008#include "xyz/openbmc_project/Collection/DeleteAll/server.hpp"
9#include "xyz/openbmc_project/Dump/Internal/Create/server.hpp"
Dhruvaraj Subhashchandran33df5072020-01-30 01:48:02 -060010#include "xyz/openbmc_project/Dump/NewDump/server.hpp"
Jayanth Othayothcb65ffc2018-10-16 08:29:32 -050011
12#include <experimental/filesystem>
13#include <sdbusplus/bus.hpp>
14#include <sdbusplus/server/object.hpp>
15#include <xyz/openbmc_project/Dump/Create/server.hpp>
Jayanth Othayotha320c7c2017-06-14 07:17:21 -050016
17namespace phosphor
18{
19namespace dump
20{
21namespace internal
22{
23
24class Manager;
25
26} // namespace internal
27
Jayanth Othayothbcb174b2017-07-02 06:29:24 -050028using UserMap = phosphor::dump::inotify::UserMap;
29
Jayanth Othayotha320c7c2017-06-14 07:17:21 -050030using Type =
31 sdbusplus::xyz::openbmc_project::Dump::Internal::server::Create::Type;
32
Jayanth Othayothcb65ffc2018-10-16 08:29:32 -050033using CreateIface = sdbusplus::server::object::object<
34 sdbusplus::xyz::openbmc_project::Collection::server::DeleteAll,
Dhruvaraj Subhashchandran33df5072020-01-30 01:48:02 -060035 sdbusplus::xyz::openbmc_project::Dump::server::Create,
36 sdbusplus::xyz::openbmc_project::Dump::server::NewDump>;
Jayanth Othayotha320c7c2017-06-14 07:17:21 -050037
Jayanth Othayoth671fc7f2017-06-14 08:01:41 -050038namespace fs = std::experimental::filesystem;
Jayanth Othayotha320c7c2017-06-14 07:17:21 -050039
Jayanth Othayoth764d1b22017-07-12 19:14:02 -050040using Watch = phosphor::dump::inotify::Watch;
41
Marri Devender Rao0deb2872018-11-12 07:45:54 -060042// Type to dreport type string map
43static const std::map<Type, std::string> TypeMap = {
44 {Type::ApplicationCored, "core"},
45 {Type::UserRequested, "user"},
46 {Type::InternalFailure, "elog"},
47 {Type::Checkstop, "checkstop"}};
48
Jayanth Othayotha320c7c2017-06-14 07:17:21 -050049/** @class Manager
50 * @brief OpenBMC Dump manager implementation.
51 * @details A concrete implementation for the
Nagaraju Goruganti3c899a42017-09-12 06:14:46 -050052 * xyz.openbmc_project.Dump.Create DBus API and
53 * xyz::openbmc_project::Collection::server::DeleteAll.
Jayanth Othayotha320c7c2017-06-14 07:17:21 -050054 */
55class Manager : public CreateIface
56{
Jayanth Othayothcb65ffc2018-10-16 08:29:32 -050057 friend class internal::Manager;
58 friend class Entry;
Jayanth Othayotha320c7c2017-06-14 07:17:21 -050059
Jayanth Othayothcb65ffc2018-10-16 08:29:32 -050060 public:
61 Manager() = delete;
62 Manager(const Manager&) = default;
63 Manager& operator=(const Manager&) = delete;
64 Manager(Manager&&) = delete;
65 Manager& operator=(Manager&&) = delete;
66 virtual ~Manager() = default;
Jayanth Othayotha320c7c2017-06-14 07:17:21 -050067
Jayanth Othayothcb65ffc2018-10-16 08:29:32 -050068 /** @brief Constructor to put object onto bus at a dbus path.
69 * @param[in] bus - Bus to attach to.
70 * @param[in] event - Dump manager sd_event loop.
71 * @param[in] path - Path to attach at.
72 */
73 Manager(sdbusplus::bus::bus& bus, const EventPtr& event, const char* path) :
74 CreateIface(bus, path), bus(bus), eventLoop(event.get()),
75 lastEntryId(0),
76 dumpWatch(
77 eventLoop, IN_NONBLOCK, IN_CLOSE_WRITE | IN_CREATE, EPOLLIN,
78 BMC_DUMP_PATH,
79 std::bind(std::mem_fn(&phosphor::dump::Manager::watchCallback),
80 this, std::placeholders::_1))
81 {
82 }
Jayanth Othayotha320c7c2017-06-14 07:17:21 -050083
Jayanth Othayothcb65ffc2018-10-16 08:29:32 -050084 /** @brief Implementation for CreateDump
85 * Method to create Dump.
86 *
87 * @return id - The Dump entry id number.
88 */
89 uint32_t createDump() override;
Jayanth Othayotha320c7c2017-06-14 07:17:21 -050090
Jayanth Othayothcb65ffc2018-10-16 08:29:32 -050091 /** @brief Implementation of dump watch call back
92 * @param [in] fileInfo - map of file info path:event
93 */
94 void watchCallback(const UserMap& fileInfo);
Jayanth Othayothbcb174b2017-07-02 06:29:24 -050095
Jayanth Othayothcb65ffc2018-10-16 08:29:32 -050096 /** @brief Construct dump d-bus objects from their persisted
97 * representations.
98 */
99 void restore();
Jayanth Othayoth43096592017-07-20 02:17:37 -0500100
Dhruvaraj Subhashchandran33df5072020-01-30 01:48:02 -0600101 /** @brief Notify the dump manager about creation of a new dump.
102 * @param[in] dumpType - Type of the Dump.
103 * @param[in] dumpId - Id from the source of the dump.
104 * @param[in] size - Size of the dump.
105 */
106 void notify(NewDump::DumpType dumpType, uint32_t dumpId, uint64_t size);
107
Jayanth Othayothcb65ffc2018-10-16 08:29:32 -0500108 private:
109 /** @brief Create Dump entry d-bus object
110 * @param[in] fullPath - Full path of the Dump file name
111 */
112 void createEntry(const fs::path& fullPath);
Jayanth Othayotha320c7c2017-06-14 07:17:21 -0500113
Jayanth Othayothcb65ffc2018-10-16 08:29:32 -0500114 /** @brief Capture BMC Dump based on the Dump type.
115 * @param[in] type - Type of the Dump.
116 * @param[in] fullPaths - List of absolute paths to the files
117 * to be included as part of Dump package.
118 * @return id - The Dump entry id number.
119 */
120 uint32_t captureDump(Type type, const std::vector<std::string>& fullPaths);
Jayanth Othayotha320c7c2017-06-14 07:17:21 -0500121
Jayanth Othayothcb65ffc2018-10-16 08:29:32 -0500122 /** @brief Erase specified entry d-bus object
123 *
124 * @param[in] entryId - unique identifier of the entry
125 */
126 void erase(uint32_t entryId);
Jayanth Othayotha320c7c2017-06-14 07:17:21 -0500127
Jayanth Othayothcb65ffc2018-10-16 08:29:32 -0500128 /** @brief Erase all BMC dump entries and Delete all Dump files
129 * from Permanent location
130 *
131 */
132 void deleteAll() override;
Nagaraju Goruganti3c899a42017-09-12 06:14:46 -0500133
Jayanth Othayothcb65ffc2018-10-16 08:29:32 -0500134 /** @brief sd_event_add_child callback
135 *
136 * @param[in] s - event source
137 * @param[in] si - signal info
138 * @param[in] userdata - pointer to Watch object
139 *
140 * @returns 0 on success, -1 on fail
141 */
142 static int callback(sd_event_source* s, const siginfo_t* si, void* userdata)
143 {
144 // No specific action required in
145 // the sd_event_add_child callback.
146 return 0;
147 }
148 /** @brief Remove specified watch object pointer from the
149 * watch map and associated entry from the map.
150 * @param[in] path - unique identifier of the map
151 */
152 void removeWatch(const fs::path& path);
Jayanth Othayotha320c7c2017-06-14 07:17:21 -0500153
Jayanth Othayothcb65ffc2018-10-16 08:29:32 -0500154 /** @brief Calculate per dump allowed size based on the available
155 * size in the dump location.
156 * @returns dump size in kilobytes.
157 */
158 size_t getAllowedSize();
Jayanth Othayothab7f9202017-08-02 06:24:58 -0500159
Jayanth Othayothcb65ffc2018-10-16 08:29:32 -0500160 /** @brief sdbusplus DBus bus connection. */
161 sdbusplus::bus::bus& bus;
Jayanth Othayotha320c7c2017-06-14 07:17:21 -0500162
Jayanth Othayothcb65ffc2018-10-16 08:29:32 -0500163 /** @brief sdbusplus Dump event loop */
164 EventPtr eventLoop;
Jayanth Othayotha320c7c2017-06-14 07:17:21 -0500165
Jayanth Othayothcb65ffc2018-10-16 08:29:32 -0500166 /** @brief Dump Entry dbus objects map based on entry id */
167 std::map<uint32_t, std::unique_ptr<Entry>> entries;
Jayanth Othayotha320c7c2017-06-14 07:17:21 -0500168
Jayanth Othayothcb65ffc2018-10-16 08:29:32 -0500169 /** @brief Id of the last Dump entry */
170 uint32_t lastEntryId;
Jayanth Othayothbcb174b2017-07-02 06:29:24 -0500171
Jayanth Othayothcb65ffc2018-10-16 08:29:32 -0500172 /** @brief Dump main watch object */
173 Watch dumpWatch;
Jayanth Othayoth764d1b22017-07-12 19:14:02 -0500174
Jayanth Othayothcb65ffc2018-10-16 08:29:32 -0500175 /** @brief Child directory path and its associated watch object map
176 * [path:watch object]
177 */
178 std::map<fs::path, std::unique_ptr<Watch>> childWatchMap;
Jayanth Othayotha320c7c2017-06-14 07:17:21 -0500179};
180
181} // namespace dump
182} // namespace phosphor