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&&) = default;
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      */
50     Monitor(const std::string& sourceUnit, const std::string& targetUnit,
51             Action action) :
52         bus(std::move(sdbusplus::bus::new_default())),
53         source(sourceUnit), target(targetUnit), action(action)
54     {
55     }
56 
57     /**
58      * Analyzes the source unit to check if it is in a failed state.
59      * If it is, then it runs the action on the target unit.
60      */
61     void analyze();
62 
63   private:
64     /**
65      * Returns the dbus object path of the source unit
66      */
67     std::string getSourceUnitPath();
68 
69     /**
70      * Says if the unit object passed in has an
71      * ActiveState property equal to 'failed'.
72      *
73      * @param[in] path - the unit object path to check
74      *
75      * @return - true if this unit is in the failed state
76      */
77     bool inFailedState(const std::string&& path);
78 
79     /**
80      * Runs the action on the target unit.
81      */
82     void runTargetAction();
83 
84     /**
85      * The dbus object
86      */
87     sdbusplus::bus::bus bus;
88 
89     /**
90      * The source unit
91      */
92     const std::string source;
93 
94     /**
95      * The target unit
96      */
97     const std::string target;
98 
99     /**
100      * The action to run on the target if the source
101      * unit is in failed state.
102      */
103     const Action action;
104 };
105 } // namespace failure
106 } // namespace unit
107 } // namespace phosphor
108