-
Notifications
You must be signed in to change notification settings - Fork 9
/
dump_manager_bmc.hpp
134 lines (111 loc) · 4.21 KB
/
dump_manager_bmc.hpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
#pragma once
#include "dump_entry.hpp"
#include "dump_manager.hpp"
#include "dump_utils.hpp"
#include "watch.hpp"
#include <sdeventplus/source/child.hpp>
#include <xyz/openbmc_project/Dump/Create/server.hpp>
#include <filesystem>
#include <map>
namespace phosphor
{
namespace dump
{
namespace bmc
{
using CreateIface = sdbusplus::server::object_t<
sdbusplus::xyz::openbmc_project::Dump::server::Create>;
using UserMap = phosphor::dump::inotify::UserMap;
using Watch = phosphor::dump::inotify::Watch;
using ::sdeventplus::source::Child;
/** @class Manager
* @brief OpenBMC Dump manager implementation.
* @details A concrete implementation for the
* xyz.openbmc_project.Dump.Create DBus API
*/
class Manager :
virtual public CreateIface,
virtual public phosphor::dump::Manager
{
public:
Manager() = delete;
Manager(const Manager&) = default;
Manager& operator=(const Manager&) = delete;
Manager(Manager&&) = delete;
Manager& operator=(Manager&&) = delete;
virtual ~Manager() = default;
/** @brief Constructor to put object onto bus at a dbus path.
* @param[in] bus - Bus to attach to.
* @param[in] event - Dump manager sd_event loop.
* @param[in] path - Path to attach at.
* @param[in] baseEntryPath - Base path for dump entry.
* @param[in] filePath - Path where the dumps are stored.
*/
Manager(sdbusplus::bus_t& bus, const EventPtr& event, const char* path,
const std::string& baseEntryPath, const char* filePath) :
CreateIface(bus, path),
phosphor::dump::Manager(bus, path, baseEntryPath),
eventLoop(event.get()),
dumpWatch(
eventLoop, IN_NONBLOCK, IN_CLOSE_WRITE | IN_CREATE, EPOLLIN,
filePath,
std::bind(std::mem_fn(&phosphor::dump::bmc::Manager::watchCallback),
this, std::placeholders::_1)),
dumpDir(filePath)
{}
/** @brief Implementation of dump watch call back
* @param [in] fileInfo - map of file info path:event
*/
void watchCallback(const UserMap& fileInfo);
/** @brief Construct dump d-bus objects from their persisted
* representations.
*/
void restore() override;
/** @brief Implementation for CreateDump
* Method to create a BMC dump entry when user requests for a new BMC dump
*
* @return object_path - The object path of the new dump entry.
*/
sdbusplus::message::object_path
createDump(phosphor::dump::DumpCreateParams params) override;
private:
/** @brief Create Dump entry d-bus object
* @param[in] fullPath - Full path of the Dump file name
*/
void createEntry(const std::filesystem::path& fullPath);
/** @brief Capture BMC Dump based on the Dump type.
* @param[in] type - Type of the dump to pass to dreport
* @param[in] path - An absolute path to the file
* to be included as part of Dump package.
* @return id - The Dump entry id number.
*/
uint32_t captureDump(DumpTypes type, const std::string& path);
/** @brief Remove specified watch object pointer from the
* watch map and associated entry from the map.
* @param[in] path - unique identifier of the map
*/
void removeWatch(const std::filesystem::path& path);
/** @brief Calculate per dump allowed size based on the available
* size in the dump location.
* @returns dump size in kilobytes.
*/
size_t getAllowedSize();
/** @brief sdbusplus Dump event loop */
EventPtr eventLoop;
/** @brief Dump main watch object */
Watch dumpWatch;
/** @brief Path to the dump file*/
std::string dumpDir;
/** @brief Flag to reject user intiated dump if a dump is in progress*/
// TODO: https://github.com/openbmc/phosphor-debug-collector/issues/19
static bool fUserDumpInProgress;
/** @brief Child directory path and its associated watch object map
* [path:watch object]
*/
std::map<std::filesystem::path, std::unique_ptr<Watch>> childWatchMap;
/** @brief map of SDEventPlus child pointer added to event loop */
std::map<pid_t, std::unique_ptr<Child>> childPtrMap;
};
} // namespace bmc
} // namespace dump
} // namespace phosphor