| Andrew Geissler | 234a317 | 2019-08-09 14:30:02 -0500 | [diff] [blame] | 1 | #pragma once | 
|  | 2 |  | 
| Andrew Geissler | f3870c6 | 2022-02-10 16:15:28 -0600 | [diff] [blame] | 3 | #include "systemd_service_parser.hpp" | 
| Andrew Geissler | e426b58 | 2020-05-28 12:40:55 -0500 | [diff] [blame] | 4 | #include "systemd_target_parser.hpp" | 
|  | 5 |  | 
| Andrew Geissler | 234a317 | 2019-08-09 14:30:02 -0500 | [diff] [blame] | 6 | #include <sdbusplus/bus.hpp> | 
|  | 7 | #include <sdbusplus/bus/match.hpp> | 
| Andrew Geissler | 234a317 | 2019-08-09 14:30:02 -0500 | [diff] [blame] | 8 |  | 
|  | 9 | extern bool gVerbose; | 
|  | 10 |  | 
|  | 11 | namespace phosphor | 
|  | 12 | { | 
|  | 13 | namespace state | 
|  | 14 | { | 
|  | 15 | namespace manager | 
|  | 16 | { | 
|  | 17 | /** @class SystemdTargetLogging | 
|  | 18 | *  @brief Object to monitor input systemd targets and create corresponding | 
|  | 19 | *         input errors for on failures | 
|  | 20 | */ | 
|  | 21 | class 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 Geissler | f3870c6 | 2022-02-10 16:15:28 -0600 | [diff] [blame] | 32 | const ServiceMonitorData& serviceData, | 
| Patrick Williams | f053e6f | 2022-07-22 19:26:54 -0500 | [diff] [blame] | 33 | sdbusplus::bus_t& bus) : | 
| Andrew Geissler | 234a317 | 2019-08-09 14:30:02 -0500 | [diff] [blame] | 34 | targetData(targetData), | 
| Andrew Geissler | f3870c6 | 2022-02-10 16:15:28 -0600 | [diff] [blame] | 35 | serviceData(serviceData), bus(bus), | 
| Andrew Geissler | b558ae7 | 2019-11-07 10:40:06 -0600 | [diff] [blame] | 36 | systemdJobRemovedSignal( | 
| Andrew Geissler | 234a317 | 2019-08-09 14:30:02 -0500 | [diff] [blame] | 37 | 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 III | bd28f02 | 2022-11-22 17:11:49 -0800 | [diff] [blame] | 44 | [this](sdbusplus::message_t& m) { systemdUnitChange(m); }), | 
| Andrew Geissler | 38605ee | 2019-11-11 16:01:56 -0600 | [diff] [blame] | 45 | systemdNameOwnedChangedSignal( | 
|  | 46 | bus, sdbusplus::bus::match::rules::nameOwnerChanged(), | 
| William A. Kennington III | bd28f02 | 2022-11-22 17:11:49 -0800 | [diff] [blame] | 47 | [this](sdbusplus::message_t& m) { processNameChangeSignal(m); }) | 
| Andrew Geissler | e426b58 | 2020-05-28 12:40:55 -0500 | [diff] [blame] | 48 | {} | 
| Andrew Geissler | 234a317 | 2019-08-09 14:30:02 -0500 | [diff] [blame] | 49 |  | 
|  | 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 | */ | 
| Pavithra Barithaya | d7a15cb | 2024-06-21 11:24:46 -0500 | [diff] [blame] | 68 | std::string processError(const std::string& unit, | 
|  | 69 | const std::string& result); | 
| Andrew Geissler | 234a317 | 2019-08-09 14:30:02 -0500 | [diff] [blame] | 70 |  | 
|  | 71 | private: | 
| Andrew Geissler | 73d2ac9 | 2022-02-17 16:55:50 -0600 | [diff] [blame] | 72 | /** @brief Start BMC Quiesce Target to indicate critical service failure */ | 
|  | 73 | void startBmcQuiesceTarget(); | 
|  | 74 |  | 
| Andrew Geissler | 234a317 | 2019-08-09 14:30:02 -0500 | [diff] [blame] | 75 | /** @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 Geissler | e684103 | 2022-02-11 10:31:50 -0600 | [diff] [blame] | 79 | * @param[in]  unit       - The name of the failed unit | 
| Andrew Geissler | 234a317 | 2019-08-09 14:30:02 -0500 | [diff] [blame] | 80 | */ | 
| Andrew Geissler | e684103 | 2022-02-11 10:31:50 -0600 | [diff] [blame] | 81 | void logError(const std::string& error, const std::string& result, | 
|  | 82 | const std::string& unit); | 
| Andrew Geissler | 234a317 | 2019-08-09 14:30:02 -0500 | [diff] [blame] | 83 |  | 
|  | 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 Williams | f053e6f | 2022-07-22 19:26:54 -0500 | [diff] [blame] | 92 | void systemdUnitChange(sdbusplus::message_t& msg); | 
| Andrew Geissler | 234a317 | 2019-08-09 14:30:02 -0500 | [diff] [blame] | 93 |  | 
| Andrew Geissler | 38605ee | 2019-11-11 16:01:56 -0600 | [diff] [blame] | 94 | /** @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 Williams | f053e6f | 2022-07-22 19:26:54 -0500 | [diff] [blame] | 102 | void processNameChangeSignal(sdbusplus::message_t& msg); | 
| Andrew Geissler | 38605ee | 2019-11-11 16:01:56 -0600 | [diff] [blame] | 103 |  | 
| Andrew Geissler | 234a317 | 2019-08-09 14:30:02 -0500 | [diff] [blame] | 104 | /** @brief Systemd targets to monitor and error logs to create */ | 
|  | 105 | const TargetErrorData& targetData; | 
|  | 106 |  | 
| Andrew Geissler | f3870c6 | 2022-02-10 16:15:28 -0600 | [diff] [blame] | 107 | /** @brief Systemd targets to monitor and error logs to create */ | 
|  | 108 | const ServiceMonitorData& serviceData; | 
|  | 109 |  | 
| Andrew Geissler | 234a317 | 2019-08-09 14:30:02 -0500 | [diff] [blame] | 110 | /** @brief Persistent sdbusplus DBus bus connection. */ | 
| Patrick Williams | f053e6f | 2022-07-22 19:26:54 -0500 | [diff] [blame] | 111 | sdbusplus::bus_t& bus; | 
| Andrew Geissler | 234a317 | 2019-08-09 14:30:02 -0500 | [diff] [blame] | 112 |  | 
| Andrew Geissler | b558ae7 | 2019-11-07 10:40:06 -0600 | [diff] [blame] | 113 | /** @brief Used to subscribe to dbus systemd JobRemoved signals **/ | 
|  | 114 | sdbusplus::bus::match_t systemdJobRemovedSignal; | 
| Andrew Geissler | 38605ee | 2019-11-11 16:01:56 -0600 | [diff] [blame] | 115 |  | 
|  | 116 | /** @brief Used to know when systemd has registered on dbus **/ | 
|  | 117 | sdbusplus::bus::match_t systemdNameOwnedChangedSignal; | 
| Andrew Geissler | 234a317 | 2019-08-09 14:30:02 -0500 | [diff] [blame] | 118 | }; | 
|  | 119 |  | 
|  | 120 | } // namespace manager | 
|  | 121 | } // namespace state | 
|  | 122 | } // namespace phosphor |