summaryrefslogtreecommitdiffstats
path: root/README.md
blob: a3fea5ebee061462129f3bfbdc27aef5a8746ce3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
# Introduction
`phosphor-time-manager` is the time manager service that implements D-Bus
interface `xyz/openbmc_project/Time/EpochTime.interface.yaml`.
The user can get or set the BMC's or HOST's time via this interface.

### General usage
The service `xyz.openbmc_project.Time.Manager` provides two objects on D-Bus:
* /xyz/openbmc_project/time/bmc
* /xyz/openbmc_project/time/host

where each object implements interface `xyz.openbmc_project.Time.EpochTime`.

The user can directly get or set the property `Elapsed` of the objects to get or set
the time. For example on an authenticated session:

* To get BMC's time:
   ```
   ### With busctl on BMC
   busctl get-property xyz.openbmc_project.Time.Manager \
       /xyz/openbmc_project/time/bmc xyz.openbmc_project.Time.EpochTime Elapsed

   ### With REST API on remote host
   curl -b cjar -k https://${BMC_IP}/xyz/openbmc_project/time/bmc
   ```
* To set HOST's time:
   ```
   ### With busctl on BMC
   busctl set-property xyz.openbmc_project.Time.Manager \
       /xyz/openbmc_project/time/host xyz.openbmc_project.Time.EpochTime \
       Elapsed t <value-in-microseconds>

   ### With REST API on remote host
   curl -b cjar -k -H "Content-Type: application/json" -X PUT \
       -d '{"data": 1487304700000000}' \
       https://${BMC_IP}/xyz/openbmc_project/time/host/attr/Elapsed
   ```

### Time settings
Getting BMC or HOST time is always allowed, but setting the time may not be
allowed depending on the below two settings in the settings manager.

* TimeSyncMethod
   * NTP: The time is set via NTP server.
   * MANUAL: The time is set manually.
* TimeOwner
   * BMC: BMC owns the time and can set the time.
   * HOST: Host owns the time and can set the time.
   * SPLIT: BMC and Host own separate time.
   * BOTH: Both BMC and Host can set the time.

A summary of which cases the time can be set on BMC or HOST:

Mode      | Owner | Set BMC Time  | Set Host Time
--------- | ----- | ------------- | -------------------
NTP       | BMC   | Fail to set   | Not allowed
NTP       | HOST  | Not allowed   | Not allowed
NTP       | SPLIT | Fail to set   | OK
NTP       | BOTH  | Fail to set   | Not allowed
MANUAL    | BMC   | OK            | Not allowed
MANUAL    | HOST  | Not allowed   | OK
MANUAL    | SPLIT | OK            | OK
MANUAL    | BOTH  | OK            | OK

* To set an NTP [server](https://tf.nist.gov/tf-cgi/servers.cgi):
   ```
   ### With busctl on BMC
   busctl set-property  xyz.openbmc_project.Network \
      /xyz/openbmc_project/network/eth0 \
      xyz.openbmc_project.Network.EthernetInterface NTPServers \
      as 1 "<ntp_server>"

   ### With REST API on remote host
   curl -c cjar -b cjar -k -H "Content-Type: application/json" -X  PUT  -d \
       '{"data": ["<ntp_server>"] }' \
       https://${BMC_IP}/xyz/openbmc_project/network/eth0/attr/NTPServers
   ```

* To go into NTP mode
   ```
   ### With busctl on BMC
   busctl set-property xyz.openbmc_project.Settings \
       /xyz/openbmc_project/time/sync_method xyz.openbmc_project.Time.Synchronization \
       TimeSyncMethod s "xyz.openbmc_project.Time.Synchronization.Method.NTP"

   ### With REST API on remote host
   curl -c cjar -b cjar -k -H "Content-Type: application/json" -X  PUT  -d \
       '{"data": "xyz.openbmc_project.Time.Synchronization.Method.NTP" }' \
       https://${BMC_IP}/xyz/openbmc_project/time/sync_method/attr/TimeSyncMethod
   ```

* To change owner
   ```
   ### With busctl on BMC
   busctl set-property xyz.openbmc_project.Settings \
       /xyz/openbmc_project/time/owner xyz.openbmc_project.Time.Owner \
       TimeOwner s xyz.openbmc_project.Time.Owner.Owners.BMC

   ### With REST API on remote host
   curl -c cjar -b cjar -k -H "Content-Type: application/json" -X  PUT  -d \
       '{"data": "xyz.openbmc_project.Time.Owner.Owners.BMC" }' \
       https://${BMC_IP}/xyz/openbmc_project/time/owner/attr/TimeOwner
   ```

### Special note on changing NTP setting
Starting from OpenBMC 2.6 (with systemd v239), systemd's timedated introduces
a new beahvior that it checks the NTP services' status during setting time,
instead of checking the NTP setting:

* When NTP server is set to disabled, and the NTP service is stopping but not
   stopped, setting time will get an error.

In OpenBMC 2.4 (with systemd v236), the above will always succeed.

This results in [openbmc/openbmc#3459][1], and the related test cases are
updated to cooperate with this behavior change.

### Special note on host on
When the host is on, the changes of the above time mode/owner are not applied but
deferred. The changes of the mode/owner are saved to persistent storage.

When the host is off, the saved mode/owner are read from persistent storage and are
applied.

Note: A user can set the time mode and owner in the settings daemon at any time,
but the time manager applying them is governed by the above condition.


[1]: https://github.com/openbmc/openbmc/issues/3459
OpenPOWER on IntegriCloud