1 #pragma once 2 3 #include "config.h" 4 5 #include "property_change_listener.hpp" 6 #include "settings.hpp" 7 #include "types.hpp" 8 9 #include <sdbusplus/bus.hpp> 10 #include <sdbusplus/bus/match.hpp> 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 current time mode */ 65 Mode timeMode = DEFAULT_TIME_MODE; 66 67 /** @brief Restore saved settings */ 68 void restoreSettings(); 69 70 /** @brief Check if host is on and update hostOn variable */ 71 void checkHostOn(); 72 73 /** @brief Get setting from settingsd service 74 * 75 * @param[in] path - The dbus object path 76 * @param[in] interface - The dbus interface 77 * @param[in] setting - The string of the setting 78 * 79 * @return The setting value in string 80 */ 81 std::string getSetting(const char* path, const char* interface, 82 const char* setting) const; 83 84 /** @brief Set current time mode from the time mode string 85 * 86 * @param[in] mode - The string of time mode 87 * 88 * @return - true if the mode is updated 89 * false if it's the same as before 90 */ 91 bool setCurrentTimeMode(const std::string& mode); 92 93 /** @brief Called on time mode is changed 94 * 95 * Notify listeners that time mode is changed and update ntp setting 96 * 97 * @param[in] mode - The string of time mode 98 */ 99 void onTimeModeChanged(const std::string& mode); 100 101 /** @brief Callback to handle change in a setting 102 * 103 * @param[in] msg - sdbusplus dbusmessage 104 * 105 * @return 0 on success, < 0 on failure. 106 */ 107 int onSettingsChanged(sdbusplus::message::message& msg); 108 109 /** @brief Notified on settings property changed 110 * 111 * @param[in] key - The name of property that is changed 112 * @param[in] value - The value of the property 113 */ 114 void onPropertyChanged(const std::string& key, const std::string& value); 115 116 /** @brief Notified on host state has changed 117 * 118 * @param[in] msg - sdbusplus dbusmessage 119 */ 120 void onHostStateChanged(sdbusplus::message::message& msg); 121 122 /** @brief Notified on host state has changed 123 * 124 * @param[in] on - Indicate if the host is on or off 125 */ 126 void onHostState(bool on); 127 128 /** @brief Set the property as requested time mode 129 * 130 * @param[in] key - The property name 131 * @param[in] value - The property value 132 */ 133 void setPropertyAsRequested(const std::string& key, 134 const std::string& value); 135 136 /** @brief Set the current mode to user requested one 137 * if conditions allow it 138 * 139 * @param[in] mode - The string of time mode 140 */ 141 void setRequestedMode(const std::string& mode); 142 143 /** @brief Update the NTP setting to systemd time service 144 * 145 * @param[in] value - The time mode value, e.g. "NTP" or "MANUAL" 146 */ 147 void updateNtpSetting(const std::string& value); 148 149 /** @brief The static function called on settings property changed 150 * 151 * @param[in] msg - Data associated with subscribed signal 152 * @param[in] userData - Pointer to this object instance 153 * @param[out] retError - Not used but required with signal API 154 */ 155 static int onPropertyChanged(sd_bus_message* msg, void* userData, 156 sd_bus_error* retError); 157 158 /** @brief The string of time mode property */ 159 static constexpr auto PROPERTY_TIME_MODE = "TimeSyncMethod"; 160 161 using Updater = std::function<void(const std::string&)>; 162 163 /** @brief Map the property string to functions that shall 164 * be called when the property is changed 165 */ 166 const std::map<std::string, Updater> propertyUpdaters = { 167 {PROPERTY_TIME_MODE, 168 std::bind(&Manager::setCurrentTimeMode, this, std::placeholders::_1)}}; 169 170 /** @brief The properties that manager shall notify the 171 * listeners when changed 172 */ 173 static const std::set<std::string> managedProperties; 174 175 /** @brief The file name of saved time mode */ 176 static constexpr auto modeFile = "/var/lib/obmc/saved_time_mode"; 177 }; 178 179 } // namespace time 180 } // namespace phosphor 181