blob: 9c98fdf842cb494ac61f63201b534aca721c7e0a [file] [log] [blame]
Matt Spinler7c33bff2017-06-02 12:29:41 -05001#pragma once
2
3#include <sdbusplus/bus.hpp>
4
5namespace phosphor
6{
7namespace unit
8{
9namespace failure
10{
11
12/**
13 * @class Monitor
14 *
15 * This class will analyze a unit to see if it is in the failed
16 * state. If it is, it will either start or stop a target unit.
17 *
18 * The use case is for running from the OnFailure directive in a
19 * unit file. If that unit keeps failing and restarting, it will
20 * eventually exceed its rate limits and stop being restarted.
21 * This application will allow another unit to be started when that
22 * occurs.
23 */
24class Monitor
25{
Ed Tanous167e2372018-05-07 11:59:10 -070026 public:
27 /**
28 * The valid actions - either starting or stopping a unit
29 */
30 enum class Action
31 {
32 start,
33 stop
34 };
Matt Spinler7c33bff2017-06-02 12:29:41 -050035
Ed Tanous167e2372018-05-07 11:59:10 -070036 Monitor() = delete;
37 Monitor(const Monitor&) = delete;
38 Monitor(Monitor&&) = default;
39 Monitor& operator=(const Monitor&) = delete;
Brad Bishop1f623802022-05-31 18:22:10 -040040 Monitor& operator=(Monitor&&) = delete;
Ed Tanous167e2372018-05-07 11:59:10 -070041 ~Monitor() = default;
Matt Spinler7c33bff2017-06-02 12:29:41 -050042
Ed Tanous167e2372018-05-07 11:59:10 -070043 /**
44 * Constructor
45 *
46 * @param[in] sourceUnit - the source unit
47 * @param[in] targetUnit - the target unit
48 * @param[in] action - the action to run on the target
49 */
50 Monitor(const std::string& sourceUnit, const std::string& targetUnit,
51 Action action) :
Brad Bishop1f623802022-05-31 18:22:10 -040052 bus(sdbusplus::bus::new_default()),
Ed Tanous167e2372018-05-07 11:59:10 -070053 source(sourceUnit), target(targetUnit), action(action)
Brad Bishop23520882022-05-26 21:39:53 -040054 {}
Matt Spinler7c33bff2017-06-02 12:29:41 -050055
Ed Tanous167e2372018-05-07 11:59:10 -070056 /**
57 * Analyzes the source unit to check if it is in a failed state.
58 * If it is, then it runs the action on the target unit.
59 */
60 void analyze();
Matt Spinler7c33bff2017-06-02 12:29:41 -050061
Ed Tanous167e2372018-05-07 11:59:10 -070062 private:
63 /**
64 * Returns the dbus object path of the source unit
65 */
66 std::string getSourceUnitPath();
Matt Spinler7c33bff2017-06-02 12:29:41 -050067
Ed Tanous167e2372018-05-07 11:59:10 -070068 /**
69 * Says if the unit object passed in has an
70 * ActiveState property equal to 'failed'.
71 *
72 * @param[in] path - the unit object path to check
73 *
74 * @return - true if this unit is in the failed state
75 */
Brad Bishop1f623802022-05-31 18:22:10 -040076 bool inFailedState(const std::string& path);
Matt Spinler7c33bff2017-06-02 12:29:41 -050077
Ed Tanous167e2372018-05-07 11:59:10 -070078 /**
79 * Runs the action on the target unit.
80 */
81 void runTargetAction();
Matt Spinler7c33bff2017-06-02 12:29:41 -050082
Ed Tanous167e2372018-05-07 11:59:10 -070083 /**
84 * The dbus object
85 */
Patrick Williamscc8070b2022-07-22 19:26:55 -050086 sdbusplus::bus_t bus;
Matt Spinler7c33bff2017-06-02 12:29:41 -050087
Ed Tanous167e2372018-05-07 11:59:10 -070088 /**
89 * The source unit
90 */
91 const std::string source;
Matt Spinler7c33bff2017-06-02 12:29:41 -050092
Ed Tanous167e2372018-05-07 11:59:10 -070093 /**
94 * The target unit
95 */
96 const std::string target;
Matt Spinler7c33bff2017-06-02 12:29:41 -050097
Ed Tanous167e2372018-05-07 11:59:10 -070098 /**
99 * The action to run on the target if the source
100 * unit is in failed state.
101 */
102 const Action action;
Matt Spinler7c33bff2017-06-02 12:29:41 -0500103};
Matt Spinlercc6ee9c2018-09-19 13:23:13 -0500104} // namespace failure
105} // namespace unit
106} // namespace phosphor