blob: 755c8171865a9b20195e943c43cd742f5c062b34 [file] [log] [blame]
Andrew Geissler234a3172019-08-09 14:30:02 -05001#pragma once
2
Andrew Geisslerf3870c62022-02-10 16:15:28 -06003#include "systemd_service_parser.hpp"
Andrew Geisslere426b582020-05-28 12:40:55 -05004#include "systemd_target_parser.hpp"
5
Andrew Geissler234a3172019-08-09 14:30:02 -05006#include <sdbusplus/bus.hpp>
7#include <sdbusplus/bus/match.hpp>
Andrew Geissler234a3172019-08-09 14:30:02 -05008
9extern bool gVerbose;
10
11namespace phosphor
12{
13namespace state
14{
15namespace manager
16{
17/** @class SystemdTargetLogging
18 * @brief Object to monitor input systemd targets and create corresponding
19 * input errors for on failures
20 */
21class SystemdTargetLogging
22{
23 public:
24 SystemdTargetLogging() = delete;
25 SystemdTargetLogging(const SystemdTargetLogging&) = delete;
26 SystemdTargetLogging& operator=(const SystemdTargetLogging&) = delete;
27 SystemdTargetLogging(SystemdTargetLogging&&) = delete;
28 SystemdTargetLogging& operator=(SystemdTargetLogging&&) = delete;
29 virtual ~SystemdTargetLogging() = default;
30
31 SystemdTargetLogging(const TargetErrorData& targetData,
Andrew Geisslerf3870c62022-02-10 16:15:28 -060032 const ServiceMonitorData& serviceData,
Andrew Geissler234a3172019-08-09 14:30:02 -050033 sdbusplus::bus::bus& bus) :
34 targetData(targetData),
Andrew Geisslerf3870c62022-02-10 16:15:28 -060035 serviceData(serviceData), bus(bus),
Andrew Geisslerb558ae72019-11-07 10:40:06 -060036 systemdJobRemovedSignal(
Andrew Geissler234a3172019-08-09 14:30:02 -050037 bus,
38 sdbusplus::bus::match::rules::type::signal() +
39 sdbusplus::bus::match::rules::member("JobRemoved") +
40 sdbusplus::bus::match::rules::path(
41 "/org/freedesktop/systemd1") +
42 sdbusplus::bus::match::rules::interface(
43 "org.freedesktop.systemd1.Manager"),
44 std::bind(std::mem_fn(&SystemdTargetLogging::systemdUnitChange),
Andrew Geissler38605ee2019-11-11 16:01:56 -060045 this, std::placeholders::_1)),
46 systemdNameOwnedChangedSignal(
47 bus, sdbusplus::bus::match::rules::nameOwnerChanged(),
48 std::bind(
49 std::mem_fn(&SystemdTargetLogging::processNameChangeSignal),
50 this, std::placeholders::_1))
Andrew Geisslere426b582020-05-28 12:40:55 -050051 {}
Andrew Geissler234a3172019-08-09 14:30:02 -050052
53 /**
54 * @brief subscribe to the systemd signals
55 *
56 * This object needs to monitor systemd target changes so it can create
57 * the required error logs on failures
58 *
59 **/
60 void subscribeToSystemdSignals();
61
62 /** @brief Process the target fail and return error to log
63 *
64 * @note This is public for unit testing purposes
65 *
66 * @param[in] unit - The systemd unit that failed
67 * @param[in] result - The failure code from the system unit
68 *
69 * @return valid pointer to error to log, otherwise nullptr
70 */
Andrew Geisslerf3870c62022-02-10 16:15:28 -060071 const std::string processError(const std::string& unit,
72 const std::string& result);
Andrew Geissler234a3172019-08-09 14:30:02 -050073
74 private:
Andrew Geissler21d305e2022-02-11 16:49:51 -060075 /** @brief Call phosphor-dump-manager to create BMC dump */
76 void createBmcDump();
77
Andrew Geissler73d2ac92022-02-17 16:55:50 -060078 /** @brief Start BMC Quiesce Target to indicate critical service failure */
79 void startBmcQuiesceTarget();
80
Andrew Geissler234a3172019-08-09 14:30:02 -050081 /** @brief Call phosphor-logging to create error
82 *
83 * @param[in] error - The error to log
84 * @param[in] result - The failure code from the systemd unit
Andrew Geisslere6841032022-02-11 10:31:50 -060085 * @param[in] unit - The name of the failed unit
Andrew Geissler234a3172019-08-09 14:30:02 -050086 */
Andrew Geisslere6841032022-02-11 10:31:50 -060087 void logError(const std::string& error, const std::string& result,
88 const std::string& unit);
Andrew Geissler234a3172019-08-09 14:30:02 -050089
90 /** @brief Check if systemd state change is one to monitor
91 *
92 * Instance specific interface to handle the detected systemd state
93 * change
94 *
95 * @param[in] msg - Data associated with subscribed signal
96 *
97 */
98 void systemdUnitChange(sdbusplus::message::message& msg);
99
Andrew Geissler38605ee2019-11-11 16:01:56 -0600100 /** @brief Wait for systemd to show up on dbus
101 *
102 * Once systemd is on dbus, this application can subscribe to systemd
103 * signal changes
104 *
105 * @param[in] msg - Data associated with subscribed signal
106 *
107 */
108 void processNameChangeSignal(sdbusplus::message::message& msg);
109
Andrew Geissler234a3172019-08-09 14:30:02 -0500110 /** @brief Systemd targets to monitor and error logs to create */
111 const TargetErrorData& targetData;
112
Andrew Geisslerf3870c62022-02-10 16:15:28 -0600113 /** @brief Systemd targets to monitor and error logs to create */
114 const ServiceMonitorData& serviceData;
115
Andrew Geissler234a3172019-08-09 14:30:02 -0500116 /** @brief Persistent sdbusplus DBus bus connection. */
117 sdbusplus::bus::bus& bus;
118
Andrew Geisslerb558ae72019-11-07 10:40:06 -0600119 /** @brief Used to subscribe to dbus systemd JobRemoved signals **/
120 sdbusplus::bus::match_t systemdJobRemovedSignal;
Andrew Geissler38605ee2019-11-11 16:01:56 -0600121
122 /** @brief Used to know when systemd has registered on dbus **/
123 sdbusplus::bus::match_t systemdNameOwnedChangedSignal;
Andrew Geissler234a3172019-08-09 14:30:02 -0500124};
125
126} // namespace manager
127} // namespace state
128} // namespace phosphor