1 #pragma once 2 3 #include "config.h" 4 #include "types.hpp" 5 #include "property_change_listener.hpp" 6 #include "settings.hpp" 7 8 #include <sdbusplus/bus.hpp> 9 #include <sdbusplus/bus/match.hpp> 10 11 #include <set> 12 #include <string> 13 14 namespace phosphor 15 { 16 namespace time 17 { 18 19 /** @class Manager 20 * @brief The manager to handle OpenBMC time. 21 * @details It registers various time related settings and properties signals 22 * on DBus and handle the changes. 23 * For certain properties it also notifies the changed events to listeners. 24 */ 25 class Manager 26 { 27 public: 28 friend class TestManager; 29 30 explicit Manager(sdbusplus::bus::bus& bus); 31 Manager(const Manager&) = delete; 32 Manager& operator=(const Manager&) = delete; 33 Manager(Manager&&) = delete; 34 Manager& operator=(Manager&&) = delete; 35 ~Manager() = default; 36 37 /** @brief Add a listener that will be called 38 * when property is changed 39 **/ 40 void addListener(PropertyChangeListner* listener); 41 42 private: 43 /** @brief Persistent sdbusplus DBus connection */ 44 sdbusplus::bus::bus& bus; 45 46 /** @brief The match of settings property change */ 47 std::vector<sdbusplus::bus::match::match> settingsMatches; 48 49 /** @brief The match of host state change */ 50 std::unique_ptr<sdbusplus::bus::match::match> hostStateChangeMatch; 51 52 /** @brief The container to hold all the listeners */ 53 std::set<PropertyChangeListner*> listeners; 54 55 /** @brief Settings objects of intereset */ 56 settings::Objects settings; 57 58 /** @brief The value to indicate if host is on */ 59 bool hostOn = false; 60 61 /** @brief The requested time mode when host is on*/ 62 std::string requestedMode; 63 64 /** @brief The requested time owner when host is on*/ 65 std::string requestedOwner; 66 67 /** @brief The current time mode */ 68 Mode timeMode = DEFAULT_TIME_MODE; 69 70 /** @brief The current time owner */ 71 Owner timeOwner = DEFAULT_TIME_OWNER; 72 73 /** @brief Restore saved settings */ 74 void restoreSettings(); 75 76 /** @brief Check if host is on and update hostOn variable */ 77 void checkHostOn(); 78 79 /** @brief Get setting from settingsd service 80 * 81 * @param[in] path - The dbus object path 82 * @param[in] interface - The dbus interface 83 * @param[in] setting - The string of the setting 84 * 85 * @return The setting value in string 86 */ 87 std::string getSetting(const char* path, 88 const char* interface, 89 const char* setting) const; 90 91 /** @brief Set current time mode from the time mode string 92 * 93 * @param[in] mode - The string of time mode 94 * 95 * @return - true if the mode is updated 96 * false if it's the same as before 97 */ 98 bool setCurrentTimeMode(const std::string& mode); 99 100 /** @brief Set current time owner from the time owner string 101 * 102 * @param[in] owner - The string of time owner 103 * 104 * @return - true if the owner is updated 105 * false if it's the same as before 106 */ 107 bool setCurrentTimeOwner(const std::string& owner); 108 109 /** @brief Called on time mode is changed 110 * 111 * Notify listeners that time mode is changed and update ntp setting 112 * 113 * @param[in] mode - The string of time mode 114 */ 115 void onTimeModeChanged(const std::string& mode); 116 117 /** @brief Called on time owner is changed 118 * 119 * Notify listeners that time owner is changed 120 */ 121 void onTimeOwnerChanged(); 122 123 /** @brief Callback to handle change in a setting 124 * 125 * @param[in] msg - sdbusplus dbusmessage 126 * 127 * @return 0 on success, < 0 on failure. 128 */ 129 int onSettingsChanged(sdbusplus::message::message& msg); 130 131 /** @brief Notified on settings property changed 132 * 133 * @param[in] key - The name of property that is changed 134 * @param[in] value - The value of the property 135 */ 136 void onPropertyChanged(const std::string& key, 137 const std::string& value); 138 139 /** @brief Notified on host state has changed 140 * 141 * @param[in] msg - sdbusplus dbusmessage 142 */ 143 void onHostStateChanged(sdbusplus::message::message& msg); 144 145 /** @brief Notified on host state has changed 146 * 147 * @param[in] on - Indicate if the host is on or off 148 */ 149 void onHostState(bool on); 150 151 /** @brief Set the property as requested time mode/owner 152 * 153 * @param[in] key - The property name 154 * @param[in] value - The property value 155 */ 156 void setPropertyAsRequested(const std::string& key, 157 const std::string& value); 158 159 /** @brief Set the current mode to user requested one 160 * if conditions allow it 161 * 162 * @param[in] mode - The string of time mode 163 */ 164 void setRequestedMode(const std::string& mode); 165 166 /** @brief Set the current owner to user requested one 167 * if conditions allow it 168 * 169 * @param[in] owner - The string of time owner 170 */ 171 void setRequestedOwner(const std::string& owner); 172 173 /** @brief Update the NTP setting to systemd time service 174 * 175 * @param[in] value - The time mode value, e.g. "NTP" or "MANUAL" 176 */ 177 void updateNtpSetting(const std::string& value); 178 179 /** @brief The static function called on settings property changed 180 * 181 * @param[in] msg - Data associated with subscribed signal 182 * @param[in] userData - Pointer to this object instance 183 * @param[out] retError - Not used but required with signal API 184 */ 185 static int onPropertyChanged(sd_bus_message* msg, 186 void* userData, 187 sd_bus_error* retError); 188 189 /** @brief The string of time mode property */ 190 static constexpr auto PROPERTY_TIME_MODE = "TimeSyncMethod"; 191 192 /** @brief The string of time owner property */ 193 static constexpr auto PROPERTY_TIME_OWNER = "TimeOwner"; 194 195 using Updater = std::function<void(const std::string&)>; 196 197 /** @brief Map the property string to functions that shall 198 * be called when the property is changed 199 */ 200 const std::map<std::string, Updater> propertyUpdaters = 201 { 202 {PROPERTY_TIME_MODE, std::bind(&Manager::setCurrentTimeMode, 203 this, std::placeholders::_1)}, 204 {PROPERTY_TIME_OWNER, std::bind(&Manager::setCurrentTimeOwner, 205 this, std::placeholders::_1)} 206 }; 207 208 /** @brief The properties that manager shall notify the 209 * listeners when changed 210 */ 211 static const std::set<std::string> managedProperties; 212 213 /** @brief The map that maps the string to Owners */ 214 static const std::map<std::string, Owner> ownerMap; 215 216 /** @brief The file name of saved time mode */ 217 static constexpr auto modeFile = "/var/lib/obmc/saved_time_mode"; 218 219 /** @brief The file name of saved time owner */ 220 static constexpr auto ownerFile = "/var/lib/obmc/saved_time_owner"; 221 }; 222 223 } 224 } 225