1 #pragma once
2 
3 #include <sdbusplus/bus.hpp>
4 
5 namespace phosphor
6 {
7 namespace unit
8 {
9 namespace 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  */
24 class Monitor
25 {
26   public:
27     /**
28      * The valid actions - either starting or stopping a unit
29      */
30     enum class Action
31     {
32         start,
33         stop
34     };
35 
36     Monitor() = delete;
37     Monitor(const Monitor&) = delete;
38     Monitor(Monitor&&) = default;
39     Monitor& operator=(const Monitor&) = delete;
40     Monitor& operator=(Monitor&&) = delete;
41     ~Monitor() = default;
42 
43     /**
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      */
Monitor(const std::string & sourceUnit,const std::string & targetUnit,Action action)50     Monitor(const std::string& sourceUnit, const std::string& targetUnit,
51             Action action) :
52         bus(sdbusplus::bus::new_default()), source(sourceUnit),
53         target(targetUnit), action(action)
54     {}
55 
56     /**
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();
61 
62   private:
63     /**
64      * Returns the dbus object path of the source unit
65      */
66     std::string getSourceUnitPath();
67 
68     /**
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      */
76     bool inFailedState(const std::string& path);
77 
78     /**
79      * Runs the action on the target unit.
80      */
81     void runTargetAction();
82 
83     /**
84      * The dbus object
85      */
86     sdbusplus::bus_t bus;
87 
88     /**
89      * The source unit
90      */
91     const std::string source;
92 
93     /**
94      * The target unit
95      */
96     const std::string target;
97 
98     /**
99      * The action to run on the target if the source
100      * unit is in failed state.
101      */
102     const Action action;
103 };
104 } // namespace failure
105 } // namespace unit
106 } // namespace phosphor
107