blob: cddb358670980371e47479af8b296d7a922709c7 [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,
Patrick Williamsf053e6f2022-07-22 19:26:54 -050033 sdbusplus::bus_t& bus) :
Andrew Geissler234a3172019-08-09 14:30:02 -050034 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"),
William A. Kennington IIIbd28f022022-11-22 17:11:49 -080044 [this](sdbusplus::message_t& m) { systemdUnitChange(m); }),
Andrew Geissler38605ee2019-11-11 16:01:56 -060045 systemdNameOwnedChangedSignal(
46 bus, sdbusplus::bus::match::rules::nameOwnerChanged(),
William A. Kennington IIIbd28f022022-11-22 17:11:49 -080047 [this](sdbusplus::message_t& m) { processNameChangeSignal(m); })
Andrew Geisslere426b582020-05-28 12:40:55 -050048 {}
Andrew Geissler234a3172019-08-09 14:30:02 -050049
50 /**
51 * @brief subscribe to the systemd signals
52 *
53 * This object needs to monitor systemd target changes so it can create
54 * the required error logs on failures
55 *
56 **/
57 void subscribeToSystemdSignals();
58
59 /** @brief Process the target fail and return error to log
60 *
61 * @note This is public for unit testing purposes
62 *
63 * @param[in] unit - The systemd unit that failed
64 * @param[in] result - The failure code from the system unit
65 *
66 * @return valid pointer to error to log, otherwise nullptr
67 */
Andrew Geisslerf3870c62022-02-10 16:15:28 -060068 const std::string processError(const std::string& unit,
69 const std::string& result);
Andrew Geissler234a3172019-08-09 14:30:02 -050070
71 private:
Andrew Geissler73d2ac92022-02-17 16:55:50 -060072 /** @brief Start BMC Quiesce Target to indicate critical service failure */
73 void startBmcQuiesceTarget();
74
Andrew Geissler234a3172019-08-09 14:30:02 -050075 /** @brief Call phosphor-logging to create error
76 *
77 * @param[in] error - The error to log
78 * @param[in] result - The failure code from the systemd unit
Andrew Geisslere6841032022-02-11 10:31:50 -060079 * @param[in] unit - The name of the failed unit
Andrew Geissler234a3172019-08-09 14:30:02 -050080 */
Andrew Geisslere6841032022-02-11 10:31:50 -060081 void logError(const std::string& error, const std::string& result,
82 const std::string& unit);
Andrew Geissler234a3172019-08-09 14:30:02 -050083
84 /** @brief Check if systemd state change is one to monitor
85 *
86 * Instance specific interface to handle the detected systemd state
87 * change
88 *
89 * @param[in] msg - Data associated with subscribed signal
90 *
91 */
Patrick Williamsf053e6f2022-07-22 19:26:54 -050092 void systemdUnitChange(sdbusplus::message_t& msg);
Andrew Geissler234a3172019-08-09 14:30:02 -050093
Andrew Geissler38605ee2019-11-11 16:01:56 -060094 /** @brief Wait for systemd to show up on dbus
95 *
96 * Once systemd is on dbus, this application can subscribe to systemd
97 * signal changes
98 *
99 * @param[in] msg - Data associated with subscribed signal
100 *
101 */
Patrick Williamsf053e6f2022-07-22 19:26:54 -0500102 void processNameChangeSignal(sdbusplus::message_t& msg);
Andrew Geissler38605ee2019-11-11 16:01:56 -0600103
Andrew Geissler234a3172019-08-09 14:30:02 -0500104 /** @brief Systemd targets to monitor and error logs to create */
105 const TargetErrorData& targetData;
106
Andrew Geisslerf3870c62022-02-10 16:15:28 -0600107 /** @brief Systemd targets to monitor and error logs to create */
108 const ServiceMonitorData& serviceData;
109
Andrew Geissler234a3172019-08-09 14:30:02 -0500110 /** @brief Persistent sdbusplus DBus bus connection. */
Patrick Williamsf053e6f2022-07-22 19:26:54 -0500111 sdbusplus::bus_t& bus;
Andrew Geissler234a3172019-08-09 14:30:02 -0500112
Andrew Geisslerb558ae72019-11-07 10:40:06 -0600113 /** @brief Used to subscribe to dbus systemd JobRemoved signals **/
114 sdbusplus::bus::match_t systemdJobRemovedSignal;
Andrew Geissler38605ee2019-11-11 16:01:56 -0600115
116 /** @brief Used to know when systemd has registered on dbus **/
117 sdbusplus::bus::match_t systemdNameOwnedChangedSignal;
Andrew Geissler234a3172019-08-09 14:30:02 -0500118};
119
120} // namespace manager
121} // namespace state
122} // namespace phosphor