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