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