Remove Deferred Updates

Remove deferred consumption of settings Manual/NTP and allow instant
consumption.

Tested:
Manually set the timeMode to NTP on the WEB and successfully.
busctl get-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"

Manually set the date time successfully by D-Bus when timeMode is MANUAL
busctl set-property xyz.openbmc_project.Time.Manager
/xyz/openbmc_project/time/bmc xyz.openbmc_project.Time.EpochTime Elapsed
t 1514765953791262

Manually set the date time failed by D-Bus when timeMode is NTP.
busctl set-property xyz.openbmc_project.Time.Manager
/xyz/openbmc_project/time/bmc xyz.openbmc_project.Time.EpochTime Elapsed
t 1514765953791262
Failed to set property Elapsed on interface
xyz.openbmc_project.TIme.EpochTime: The operation failed

~# journalctl -b | grep timemanager
   Jan 01 00:15:26 fp5280g2 phosphor-timemanager[309]: Error in setting
system time
   Jan 01 00:15:26 fp5280g2 phosphor-timemanager[309]: The operation
failed

Refer: https://lists.ozlabs.org/pipermail/openbmc/2020-April/021409.html

Signed-off-by: George Liu <liuxiwei@inspur.com>
Change-Id: I7be25a9d0f56615bad6800a0b07df7f84fc0acc3
diff --git a/manager.cpp b/manager.cpp
index 92a7a3c..4cc0b57 100644
--- a/manager.cpp
+++ b/manager.cpp
@@ -2,17 +2,17 @@
 
 #include "utils.hpp"
 
+#include <assert.h>
+
 #include <phosphor-logging/elog-errors.hpp>
 #include <phosphor-logging/elog.hpp>
 #include <phosphor-logging/log.hpp>
 #include <xyz/openbmc_project/Common/error.hpp>
-#include <xyz/openbmc_project/State/Host/server.hpp>
 
 namespace rules = sdbusplus::bus::match::rules;
 
 namespace // anonymous
 {
-constexpr auto HOST_CURRENT_STATE = "CurrentHostState";
 
 constexpr auto SYSTEMD_TIME_SERVICE = "org.freedesktop.timedate1";
 constexpr auto SYSTEMD_TIME_PATH = "/org/freedesktop/timedate1";
@@ -27,26 +27,14 @@
 
 using namespace phosphor::logging;
 
-const std::set<std::string> Manager::managedProperties = {PROPERTY_TIME_MODE};
-
 Manager::Manager(sdbusplus::bus::bus& bus) : bus(bus), settings(bus)
 {
     using namespace sdbusplus::bus::match::rules;
-    hostStateChangeMatch =
-        std::make_unique<decltype(hostStateChangeMatch)::element_type>(
-            bus, propertiesChanged(settings.hostState, settings::hostStateIntf),
-            std::bind(std::mem_fn(&Manager::onHostStateChanged), this,
-                      std::placeholders::_1));
     settingsMatches.emplace_back(
         bus, propertiesChanged(settings.timeSyncMethod, settings::timeSyncIntf),
         std::bind(std::mem_fn(&Manager::onSettingsChanged), this,
                   std::placeholders::_1));
 
-    checkHostOn();
-
-    // Restore settings from persistent storage
-    restoreSettings();
-
     // Check the settings daemon to process the new settings
     auto mode = getSetting(settings.timeSyncMethod.c_str(),
                            settings::timeSyncIntf, PROPERTY_TIME_MODE);
@@ -54,53 +42,14 @@
     onPropertyChanged(PROPERTY_TIME_MODE, mode);
 }
 
-void Manager::addListener(PropertyChangeListner* listener)
-{
-    // Notify listener about the initial value
-    listener->onModeChanged(timeMode);
-
-    listeners.insert(listener);
-}
-
-void Manager::restoreSettings()
-{
-    auto mode = utils::readData<std::string>(modeFile);
-    if (!mode.empty())
-    {
-        timeMode = utils::strToMode(mode);
-    }
-}
-
-void Manager::checkHostOn()
-{
-    using Host = sdbusplus::xyz::openbmc_project::State::server::Host;
-    auto hostService = utils::getService(bus, settings.hostState.c_str(),
-                                         settings::hostStateIntf);
-    auto stateStr = utils::getProperty<std::string>(
-        bus, hostService.c_str(), settings.hostState.c_str(),
-        settings::hostStateIntf, HOST_CURRENT_STATE);
-    auto state = Host::convertHostStateFromString(stateStr);
-    hostOn = (state == Host::HostState::Running);
-}
-
 void Manager::onPropertyChanged(const std::string& key,
                                 const std::string& value)
 {
-    if (hostOn)
-    {
-        // If host is on, set the values as requested time mode.
-        // And when host becomes off, notify the listeners.
-        setPropertyAsRequested(key, value);
-    }
-    else
-    {
-        // If host is off, notify listeners
-        if (key == PROPERTY_TIME_MODE)
-        {
-            setCurrentTimeMode(value);
-            onTimeModeChanged(value);
-        }
-    }
+    assert(key == PROPERTY_TIME_MODE);
+
+    // Notify listeners
+    setCurrentTimeMode(value);
+    onTimeModeChanged(value);
 }
 
 int Manager::onSettingsChanged(sdbusplus::message::message& msg)
@@ -123,30 +72,6 @@
     return 0;
 }
 
-void Manager::setPropertyAsRequested(const std::string& key,
-                                     const std::string& value)
-{
-    if (key == PROPERTY_TIME_MODE)
-    {
-        setRequestedMode(value);
-    }
-    else
-    {
-        // The key shall be already the supported one
-        using InvalidArgumentError =
-            sdbusplus::xyz::openbmc_project::Common::Error::InvalidArgument;
-        using namespace xyz::openbmc_project::Common;
-        elog<InvalidArgumentError>(
-            InvalidArgument::ARGUMENT_NAME(key.c_str()),
-            InvalidArgument::ARGUMENT_VALUE(value.c_str()));
-    }
-}
-
-void Manager::setRequestedMode(const std::string& mode)
-{
-    requestedMode = mode;
-}
-
 void Manager::updateNtpSetting(const std::string& value)
 {
     bool isNtp =
@@ -168,50 +93,6 @@
     }
 }
 
-void Manager::onHostStateChanged(sdbusplus::message::message& msg)
-{
-    using Interface = std::string;
-    using Property = std::string;
-    using Value = std::string;
-    using Properties = std::map<Property, std::variant<Value>>;
-    using Host = sdbusplus::xyz::openbmc_project::State::server::Host;
-
-    Interface interface;
-    Properties properties;
-
-    msg.read(interface, properties);
-
-    for (const auto& p : properties)
-    {
-        if (p.first == HOST_CURRENT_STATE)
-        {
-            auto state = Host::convertHostStateFromString(
-                std::get<std::string>(p.second));
-            onHostState(state == Host::HostState::Running);
-            break;
-        }
-    }
-}
-
-void Manager::onHostState(bool on)
-{
-    hostOn = on;
-    if (hostOn)
-    {
-        log<level::INFO>("Changing time settings is *deferred* now");
-        return;
-    }
-    log<level::INFO>("Changing time settings allowed now");
-    if (!requestedMode.empty())
-    {
-        if (setCurrentTimeMode(requestedMode))
-        {
-            onTimeModeChanged(requestedMode);
-        }
-        setRequestedMode({}); // Clear requested mode
-    }
-}
-
 bool Manager::setCurrentTimeMode(const std::string& mode)
 {
     auto newMode = utils::strToMode(mode);
@@ -220,7 +101,6 @@
         log<level::INFO>("Time mode is changed",
                          entry("MODE=%s", mode.c_str()));
         timeMode = newMode;
-        utils::writeData(modeFile, mode);
         return true;
     }
     else
@@ -231,10 +111,6 @@
 
 void Manager::onTimeModeChanged(const std::string& mode)
 {
-    for (const auto listener : listeners)
-    {
-        listener->onModeChanged(timeMode);
-    }
     // When time_mode is updated, update the NTP setting
     updateNtpSetting(mode);
 }