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 */ 50 Monitor(const std::string& sourceUnit, const std::string& targetUnit, 51 Action action) : 52 bus(sdbusplus::bus::new_default()), 53 source(sourceUnit), 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::bus 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