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