xref: /openbmc/phosphor-state-manager/systemd_target_signal.hpp (revision 1b2c3c035ecd647cef996982df00378506f93887)
1234a3179SAndrew Geissler #pragma once
2234a3179SAndrew Geissler 
3f3870c62SAndrew Geissler #include "systemd_service_parser.hpp"
4e426b589SAndrew Geissler #include "systemd_target_parser.hpp"
5e426b589SAndrew Geissler 
6234a3179SAndrew Geissler #include <sdbusplus/bus.hpp>
7234a3179SAndrew Geissler #include <sdbusplus/bus/match.hpp>
8234a3179SAndrew Geissler 
9234a3179SAndrew Geissler extern bool gVerbose;
10234a3179SAndrew Geissler 
11234a3179SAndrew Geissler namespace phosphor
12234a3179SAndrew Geissler {
13234a3179SAndrew Geissler namespace state
14234a3179SAndrew Geissler {
15234a3179SAndrew Geissler namespace manager
16234a3179SAndrew Geissler {
17234a3179SAndrew Geissler /** @class SystemdTargetLogging
18234a3179SAndrew Geissler  *  @brief Object to monitor input systemd targets and create corresponding
19234a3179SAndrew Geissler  *         input errors for on failures
20234a3179SAndrew Geissler  */
21234a3179SAndrew Geissler class SystemdTargetLogging
22234a3179SAndrew Geissler {
23234a3179SAndrew Geissler   public:
24234a3179SAndrew Geissler     SystemdTargetLogging() = delete;
25234a3179SAndrew Geissler     SystemdTargetLogging(const SystemdTargetLogging&) = delete;
26234a3179SAndrew Geissler     SystemdTargetLogging& operator=(const SystemdTargetLogging&) = delete;
27234a3179SAndrew Geissler     SystemdTargetLogging(SystemdTargetLogging&&) = delete;
28234a3179SAndrew Geissler     SystemdTargetLogging& operator=(SystemdTargetLogging&&) = delete;
29234a3179SAndrew Geissler     virtual ~SystemdTargetLogging() = default;
30234a3179SAndrew Geissler 
SystemdTargetLogging(const TargetErrorData & targetData,const ServiceMonitorData & serviceData,sdbusplus::bus_t & bus)31234a3179SAndrew Geissler     SystemdTargetLogging(const TargetErrorData& targetData,
32f3870c62SAndrew Geissler                          const ServiceMonitorData& serviceData,
33f053e6feSPatrick Williams                          sdbusplus::bus_t& bus) :
34*1b2c3c03SPatrick Williams         targetData(targetData), serviceData(serviceData), bus(bus),
35b558ae77SAndrew Geissler         systemdJobRemovedSignal(
36234a3179SAndrew Geissler             bus,
37234a3179SAndrew Geissler             sdbusplus::bus::match::rules::type::signal() +
38234a3179SAndrew Geissler                 sdbusplus::bus::match::rules::member("JobRemoved") +
39234a3179SAndrew Geissler                 sdbusplus::bus::match::rules::path(
40234a3179SAndrew Geissler                     "/org/freedesktop/systemd1") +
41234a3179SAndrew Geissler                 sdbusplus::bus::match::rules::interface(
42234a3179SAndrew Geissler                     "org.freedesktop.systemd1.Manager"),
43bd28f025SWilliam A. Kennington III             [this](sdbusplus::message_t& m) { systemdUnitChange(m); }),
4438605ee2SAndrew Geissler         systemdNameOwnedChangedSignal(
4538605ee2SAndrew Geissler             bus, sdbusplus::bus::match::rules::nameOwnerChanged(),
__anonedb643ec0202(sdbusplus::message_t& m) 46bd28f025SWilliam A. Kennington III             [this](sdbusplus::message_t& m) { processNameChangeSignal(m); })
47e426b589SAndrew Geissler     {}
48234a3179SAndrew Geissler 
49234a3179SAndrew Geissler     /**
50234a3179SAndrew Geissler      * @brief subscribe to the systemd signals
51234a3179SAndrew Geissler      *
52234a3179SAndrew Geissler      * This object needs to monitor systemd target changes so it can create
53234a3179SAndrew Geissler      * the required error logs on failures
54234a3179SAndrew Geissler      *
55234a3179SAndrew Geissler      **/
56234a3179SAndrew Geissler     void subscribeToSystemdSignals();
57234a3179SAndrew Geissler 
58234a3179SAndrew Geissler     /** @brief Process the target fail and return error to log
59234a3179SAndrew Geissler      *
60234a3179SAndrew Geissler      * @note This is public for unit testing purposes
61234a3179SAndrew Geissler      *
62234a3179SAndrew Geissler      * @param[in]  unit       - The systemd unit that failed
63234a3179SAndrew Geissler      * @param[in]  result     - The failure code from the system unit
64234a3179SAndrew Geissler      *
65234a3179SAndrew Geissler      * @return valid pointer to error to log, otherwise nullptr
66234a3179SAndrew Geissler      */
67d7a15cb1SPavithra Barithaya     std::string processError(const std::string& unit,
68234a3179SAndrew Geissler                              const std::string& result);
69234a3179SAndrew Geissler 
70234a3179SAndrew Geissler   private:
7173d2ac96SAndrew Geissler     /** @brief Start BMC Quiesce Target to indicate critical service failure */
7273d2ac96SAndrew Geissler     void startBmcQuiesceTarget();
7373d2ac96SAndrew Geissler 
74234a3179SAndrew Geissler     /** @brief Call phosphor-logging to create error
75234a3179SAndrew Geissler      *
76234a3179SAndrew Geissler      * @param[in]  error      - The error to log
77234a3179SAndrew Geissler      * @param[in]  result     - The failure code from the systemd unit
78e6841034SAndrew Geissler      * @param[in]  unit       - The name of the failed unit
79234a3179SAndrew Geissler      */
80e6841034SAndrew Geissler     void logError(const std::string& error, const std::string& result,
81e6841034SAndrew Geissler                   const std::string& unit);
82234a3179SAndrew Geissler 
83234a3179SAndrew Geissler     /** @brief Check if systemd state change is one to monitor
84234a3179SAndrew Geissler      *
85234a3179SAndrew Geissler      * Instance specific interface to handle the detected systemd state
86234a3179SAndrew Geissler      * change
87234a3179SAndrew Geissler      *
88234a3179SAndrew Geissler      * @param[in]  msg       - Data associated with subscribed signal
89234a3179SAndrew Geissler      *
90234a3179SAndrew Geissler      */
91f053e6feSPatrick Williams     void systemdUnitChange(sdbusplus::message_t& msg);
92234a3179SAndrew Geissler 
9338605ee2SAndrew Geissler     /** @brief Wait for systemd to show up on dbus
9438605ee2SAndrew Geissler      *
9538605ee2SAndrew Geissler      * Once systemd is on dbus, this application can subscribe to systemd
9638605ee2SAndrew Geissler      * signal changes
9738605ee2SAndrew Geissler      *
9838605ee2SAndrew Geissler      * @param[in]  msg       - Data associated with subscribed signal
9938605ee2SAndrew Geissler      *
10038605ee2SAndrew Geissler      */
101f053e6feSPatrick Williams     void processNameChangeSignal(sdbusplus::message_t& msg);
10238605ee2SAndrew Geissler 
103234a3179SAndrew Geissler     /** @brief Systemd targets to monitor and error logs to create */
104234a3179SAndrew Geissler     const TargetErrorData& targetData;
105234a3179SAndrew Geissler 
106f3870c62SAndrew Geissler     /** @brief Systemd targets to monitor and error logs to create */
107f3870c62SAndrew Geissler     const ServiceMonitorData& serviceData;
108f3870c62SAndrew Geissler 
109234a3179SAndrew Geissler     /** @brief Persistent sdbusplus DBus bus connection. */
110f053e6feSPatrick Williams     sdbusplus::bus_t& bus;
111234a3179SAndrew Geissler 
112b558ae77SAndrew Geissler     /** @brief Used to subscribe to dbus systemd JobRemoved signals **/
113b558ae77SAndrew Geissler     sdbusplus::bus::match_t systemdJobRemovedSignal;
11438605ee2SAndrew Geissler 
11538605ee2SAndrew Geissler     /** @brief Used to know when systemd has registered on dbus **/
11638605ee2SAndrew Geissler     sdbusplus::bus::match_t systemdNameOwnedChangedSignal;
117234a3179SAndrew Geissler };
118234a3179SAndrew Geissler 
119234a3179SAndrew Geissler } // namespace manager
120234a3179SAndrew Geissler } // namespace state
121234a3179SAndrew Geissler } // namespace phosphor
122