blob: 0c672fa36dffaa4ff13f04c1eeb9d9554d78b606 [file] [log] [blame]
Lei YU415b9642017-02-09 11:37:26 +08001#pragma once
2
Lei YU1cd42482018-07-24 10:40:59 +08003#include "config.h"
Gunnar Millsab4cc6a2018-09-14 14:42:39 -05004
Lei YU415b9642017-02-09 11:37:26 +08005#include "property_change_listener.hpp"
Lei YU710d49b2017-08-01 17:10:17 +08006#include "settings.hpp"
Gunnar Millsab4cc6a2018-09-14 14:42:39 -05007#include "types.hpp"
Lei YU415b9642017-02-09 11:37:26 +08008
9#include <sdbusplus/bus.hpp>
10#include <sdbusplus/bus/match.hpp>
Lei YU415b9642017-02-09 11:37:26 +080011#include <set>
12#include <string>
13
14namespace phosphor
15{
16namespace 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 */
25class Manager
26{
Gunnar Millsab4cc6a2018-09-14 14:42:39 -050027 public:
28 friend class TestManager;
Lei YU7f4fca52017-02-23 15:15:51 +080029
Gunnar Millsab4cc6a2018-09-14 14:42:39 -050030 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;
Lei YU415b9642017-02-09 11:37:26 +080036
Gunnar Millsab4cc6a2018-09-14 14:42:39 -050037 /** @brief Add a listener that will be called
38 * when property is changed
39 **/
40 void addListener(PropertyChangeListner* listener);
Lei YU415b9642017-02-09 11:37:26 +080041
Gunnar Millsab4cc6a2018-09-14 14:42:39 -050042 private:
43 /** @brief Persistent sdbusplus DBus connection */
44 sdbusplus::bus::bus& bus;
Lei YU415b9642017-02-09 11:37:26 +080045
Gunnar Millsab4cc6a2018-09-14 14:42:39 -050046 /** @brief The match of settings property change */
47 std::vector<sdbusplus::bus::match::match> settingsMatches;
Lei YU710d49b2017-08-01 17:10:17 +080048
Gunnar Millsab4cc6a2018-09-14 14:42:39 -050049 /** @brief The match of host state change */
50 std::unique_ptr<sdbusplus::bus::match::match> hostStateChangeMatch;
Lei YUc6fe8692017-02-23 15:12:07 +080051
Gunnar Millsab4cc6a2018-09-14 14:42:39 -050052 /** @brief The container to hold all the listeners */
53 std::set<PropertyChangeListner*> listeners;
Lei YU415b9642017-02-09 11:37:26 +080054
Gunnar Millsab4cc6a2018-09-14 14:42:39 -050055 /** @brief Settings objects of intereset */
56 settings::Objects settings;
Lei YU710d49b2017-08-01 17:10:17 +080057
Gunnar Millsab4cc6a2018-09-14 14:42:39 -050058 /** @brief The value to indicate if host is on */
59 bool hostOn = false;
Lei YUc6fe8692017-02-23 15:12:07 +080060
Gunnar Millsab4cc6a2018-09-14 14:42:39 -050061 /** @brief The requested time mode when host is on*/
62 std::string requestedMode;
Lei YU7f4fca52017-02-23 15:15:51 +080063
Gunnar Millsab4cc6a2018-09-14 14:42:39 -050064 /** @brief The requested time owner when host is on*/
65 std::string requestedOwner;
Lei YU7f4fca52017-02-23 15:15:51 +080066
Gunnar Millsab4cc6a2018-09-14 14:42:39 -050067 /** @brief The current time mode */
68 Mode timeMode = DEFAULT_TIME_MODE;
Lei YU415b9642017-02-09 11:37:26 +080069
Gunnar Millsab4cc6a2018-09-14 14:42:39 -050070 /** @brief The current time owner */
71 Owner timeOwner = DEFAULT_TIME_OWNER;
Lei YU415b9642017-02-09 11:37:26 +080072
Gunnar Millsab4cc6a2018-09-14 14:42:39 -050073 /** @brief Restore saved settings */
74 void restoreSettings();
Lei YU7f4fca52017-02-23 15:15:51 +080075
Gunnar Millsab4cc6a2018-09-14 14:42:39 -050076 /** @brief Check if host is on and update hostOn variable */
77 void checkHostOn();
Lei YUc6fe8692017-02-23 15:12:07 +080078
Gunnar Millsab4cc6a2018-09-14 14:42:39 -050079 /** @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, const char* interface,
88 const char* setting) const;
Lei YU710d49b2017-08-01 17:10:17 +080089
Gunnar Millsab4cc6a2018-09-14 14:42:39 -050090 /** @brief Set current time mode from the time mode string
91 *
92 * @param[in] mode - The string of time mode
93 *
94 * @return - true if the mode is updated
95 * false if it's the same as before
96 */
97 bool setCurrentTimeMode(const std::string& mode);
Lei YUa5003ce2017-02-24 15:35:25 +080098
Gunnar Millsab4cc6a2018-09-14 14:42:39 -050099 /** @brief Set current time owner from the time owner string
100 *
101 * @param[in] owner - The string of time owner
102 *
103 * @return - true if the owner is updated
104 * false if it's the same as before
105 */
106 bool setCurrentTimeOwner(const std::string& owner);
Lei YUa5003ce2017-02-24 15:35:25 +0800107
Gunnar Millsab4cc6a2018-09-14 14:42:39 -0500108 /** @brief Called on time mode is changed
109 *
110 * Notify listeners that time mode is changed and update ntp setting
111 *
112 * @param[in] mode - The string of time mode
113 */
114 void onTimeModeChanged(const std::string& mode);
Lei YU415b9642017-02-09 11:37:26 +0800115
Gunnar Millsab4cc6a2018-09-14 14:42:39 -0500116 /** @brief Called on time owner is changed
117 *
118 * Notify listeners that time owner is changed
119 */
120 void onTimeOwnerChanged();
Lei YU415b9642017-02-09 11:37:26 +0800121
Gunnar Millsab4cc6a2018-09-14 14:42:39 -0500122 /** @brief Callback to handle change in a setting
123 *
124 * @param[in] msg - sdbusplus dbusmessage
125 *
126 * @return 0 on success, < 0 on failure.
127 */
128 int onSettingsChanged(sdbusplus::message::message& msg);
Lei YU710d49b2017-08-01 17:10:17 +0800129
Gunnar Millsab4cc6a2018-09-14 14:42:39 -0500130 /** @brief Notified on settings property changed
131 *
132 * @param[in] key - The name of property that is changed
133 * @param[in] value - The value of the property
134 */
135 void onPropertyChanged(const std::string& key, const std::string& value);
Lei YU415b9642017-02-09 11:37:26 +0800136
Gunnar Millsab4cc6a2018-09-14 14:42:39 -0500137 /** @brief Notified on host state has changed
138 *
139 * @param[in] msg - sdbusplus dbusmessage
140 */
141 void onHostStateChanged(sdbusplus::message::message& msg);
Lei YUdebe1d82017-10-13 13:21:37 +0800142
Gunnar Millsab4cc6a2018-09-14 14:42:39 -0500143 /** @brief Notified on host state has changed
144 *
145 * @param[in] on - Indicate if the host is on or off
146 */
147 void onHostState(bool on);
Lei YUc6fe8692017-02-23 15:12:07 +0800148
Gunnar Millsab4cc6a2018-09-14 14:42:39 -0500149 /** @brief Set the property as requested time mode/owner
150 *
151 * @param[in] key - The property name
152 * @param[in] value - The property value
153 */
154 void setPropertyAsRequested(const std::string& key,
155 const std::string& value);
Lei YU7f4fca52017-02-23 15:15:51 +0800156
Gunnar Millsab4cc6a2018-09-14 14:42:39 -0500157 /** @brief Set the current mode to user requested one
158 * if conditions allow it
159 *
160 * @param[in] mode - The string of time mode
161 */
162 void setRequestedMode(const std::string& mode);
Lei YU7f4fca52017-02-23 15:15:51 +0800163
Gunnar Millsab4cc6a2018-09-14 14:42:39 -0500164 /** @brief Set the current owner to user requested one
165 * if conditions allow it
166 *
167 * @param[in] owner - The string of time owner
168 */
169 void setRequestedOwner(const std::string& owner);
Lei YU7f4fca52017-02-23 15:15:51 +0800170
Gunnar Millsab4cc6a2018-09-14 14:42:39 -0500171 /** @brief Update the NTP setting to systemd time service
172 *
173 * @param[in] value - The time mode value, e.g. "NTP" or "MANUAL"
174 */
175 void updateNtpSetting(const std::string& value);
Lei YUa7417132017-02-23 15:24:05 +0800176
Gunnar Millsab4cc6a2018-09-14 14:42:39 -0500177 /** @brief The static function called on settings property changed
178 *
179 * @param[in] msg - Data associated with subscribed signal
180 * @param[in] userData - Pointer to this object instance
181 * @param[out] retError - Not used but required with signal API
182 */
183 static int onPropertyChanged(sd_bus_message* msg, void* userData,
184 sd_bus_error* retError);
Lei YU415b9642017-02-09 11:37:26 +0800185
Gunnar Millsab4cc6a2018-09-14 14:42:39 -0500186 /** @brief The string of time mode property */
187 static constexpr auto PROPERTY_TIME_MODE = "TimeSyncMethod";
Lei YU7f4fca52017-02-23 15:15:51 +0800188
Gunnar Millsab4cc6a2018-09-14 14:42:39 -0500189 /** @brief The string of time owner property */
190 static constexpr auto PROPERTY_TIME_OWNER = "TimeOwner";
Lei YU7f4fca52017-02-23 15:15:51 +0800191
Gunnar Millsab4cc6a2018-09-14 14:42:39 -0500192 using Updater = std::function<void(const std::string&)>;
Lei YU415b9642017-02-09 11:37:26 +0800193
Gunnar Millsab4cc6a2018-09-14 14:42:39 -0500194 /** @brief Map the property string to functions that shall
195 * be called when the property is changed
196 */
197 const std::map<std::string, Updater> propertyUpdaters = {
198 {PROPERTY_TIME_MODE,
199 std::bind(&Manager::setCurrentTimeMode, this, std::placeholders::_1)},
200 {PROPERTY_TIME_OWNER, std::bind(&Manager::setCurrentTimeOwner, this,
201 std::placeholders::_1)}};
Lei YU415b9642017-02-09 11:37:26 +0800202
Gunnar Millsab4cc6a2018-09-14 14:42:39 -0500203 /** @brief The properties that manager shall notify the
204 * listeners when changed
205 */
206 static const std::set<std::string> managedProperties;
Lei YU415b9642017-02-09 11:37:26 +0800207
Gunnar Millsab4cc6a2018-09-14 14:42:39 -0500208 /** @brief The map that maps the string to Owners */
209 static const std::map<std::string, Owner> ownerMap;
Lei YU7f4fca52017-02-23 15:15:51 +0800210
Gunnar Millsab4cc6a2018-09-14 14:42:39 -0500211 /** @brief The file name of saved time mode */
212 static constexpr auto modeFile = "/var/lib/obmc/saved_time_mode";
Lei YU7f4fca52017-02-23 15:15:51 +0800213
Gunnar Millsab4cc6a2018-09-14 14:42:39 -0500214 /** @brief The file name of saved time owner */
215 static constexpr auto ownerFile = "/var/lib/obmc/saved_time_owner";
Lei YU415b9642017-02-09 11:37:26 +0800216};
217
Gunnar Millsab4cc6a2018-09-14 14:42:39 -0500218} // namespace time
219} // namespace phosphor