Handle SdBusError exception in setting NTP

sdbusplus now throws SdBusError exception when a sd bus call fails.
When setting NTP via systemd timedatectl service, it may potentially
fail.
So handle this exception.

Also fix a typo in logging, where it should use `=` in meta.

Change-Id: I6c5669b7f06cef47c8d62cb0cbcb0c7fbd2a46e7
Tested: Verify it sets NTP setting OK.
1 file changed
tree: 4084705d09f5980233cd06a113ca1e402dbaac2b
  1. test/
  2. .gitignore
  3. bmc_epoch.cpp
  4. bmc_epoch.hpp
  5. bmc_time_change_listener.hpp
  6. bootstrap.sh
  7. configure.ac
  8. epoch_base.cpp
  9. epoch_base.hpp
  10. host_epoch.cpp
  11. host_epoch.hpp
  12. LICENSE
  13. main.cpp
  14. MAINTAINERS
  15. Makefile.am
  16. manager.cpp
  17. manager.hpp
  18. property_change_listener.hpp
  19. README.md
  20. settings.cpp
  21. settings.hpp
  22. types.hpp
  23. utils.cpp
  24. utils.hpp
README.md

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:

ModeOwnerSet BMC TimeSet Host Time
NTPBMCFail to setNot allowed
NTPHOSTNot allowedNot allowed
NTPSPLITFail to setOK
NTPBOTHFail to setNot allowed
MANUALBMCOKNot allowed
MANUALHOSTNot allowedOK
MANUALSPLITOKOK
MANUALBOTHOKOK
  • To set an NTP server:

    ### 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 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.