diff options
author | Lei YU <mine260309@gmail.com> | 2017-04-19 17:46:58 +0800 |
---|---|---|
committer | Lei YU <mine260309@gmail.com> | 2017-10-16 20:40:04 +0800 |
commit | dd8e9e4094dd36c43be44dc9ef14b65a124e0dda (patch) | |
tree | b328e5ae623a5b42d58c5af3c3724580872a1ec9 | |
parent | ddd5442801bce5901ec9a9939541d297bb7ea7d5 (diff) | |
download | phosphor-time-manager-dd8e9e4094dd36c43be44dc9ef14b65a124e0dda.tar.gz phosphor-time-manager-dd8e9e4094dd36c43be44dc9ef14b65a124e0dda.zip |
Use mapper to find service name
Use objectMapper to find the service name instead of using
hard-coded service name.
Change-Id: If436c65d9a9a4942eaf30ea20bc7b85e3e7694c1
Signed-off-by: Lei YU <mine260309@gmail.com>
-rw-r--r-- | epoch_base.cpp | 16 | ||||
-rw-r--r-- | manager.cpp | 61 | ||||
-rw-r--r-- | utils.cpp | 39 | ||||
-rw-r--r-- | utils.hpp | 12 |
4 files changed, 103 insertions, 25 deletions
diff --git a/epoch_base.cpp b/epoch_base.cpp index 07b3113..09337de 100644 --- a/epoch_base.cpp +++ b/epoch_base.cpp @@ -5,6 +5,14 @@ #include <iomanip> #include <sstream> +namespace // anonymous +{ +constexpr auto SYSTEMD_TIME_SERVICE = "org.freedesktop.timedate1"; +constexpr auto SYSTEMD_TIME_PATH = "/org/freedesktop/timedate1"; +constexpr auto SYSTEMD_TIME_INTERFACE = "org.freedesktop.timedate1"; +constexpr auto METHOD_SET_TIME = "SetTime"; +} + namespace phosphor { namespace time @@ -32,10 +40,10 @@ void EpochBase::onOwnerChanged(Owner owner) using namespace std::chrono; void EpochBase::setTime(const microseconds& usec) { - auto method = bus.new_method_call("org.freedesktop.timedate1", - "/org/freedesktop/timedate1", - "org.freedesktop.timedate1", - "SetTime"); + auto method = bus.new_method_call(SYSTEMD_TIME_SERVICE, + SYSTEMD_TIME_PATH, + SYSTEMD_TIME_INTERFACE, + METHOD_SET_TIME); method.append(static_cast<int64_t>(usec.count()), false, // relative false); // user_interaction diff --git a/manager.cpp b/manager.cpp index 36ff351..03992b1 100644 --- a/manager.cpp +++ b/manager.cpp @@ -7,7 +7,6 @@ namespace rules = sdbusplus::bus::match::rules; namespace // anonymous { -constexpr auto SETTINGS_SERVICE = "org.openbmc.settings.Host"; constexpr auto SETTINGS_PATH = "/org/openbmc/settings/host0"; constexpr auto SETTINGS_INTERFACE = "org.openbmc.settings.Host"; @@ -24,19 +23,17 @@ const auto MATCH_PGOOD_CHANGE = rules::path("/org/openbmc/control/power0") + rules::interface("org.freedesktop.DBus.Properties"); -constexpr auto POWER_SERVICE = "org.openbmc.control.Power"; constexpr auto POWER_PATH = "/org/openbmc/control/power0"; -constexpr auto POWER_INTERFACE = POWER_SERVICE; +constexpr auto POWER_INTERFACE = "org.openbmc.control.Power"; constexpr auto PGOOD_STR = "pgood"; constexpr auto SYSTEMD_TIME_SERVICE = "org.freedesktop.timedate1"; constexpr auto SYSTEMD_TIME_PATH = "/org/freedesktop/timedate1"; -constexpr auto SYSTEMD_TIME_INTERFACE = SYSTEMD_TIME_SERVICE; +constexpr auto SYSTEMD_TIME_INTERFACE = "org.freedesktop.timedate1"; constexpr auto METHOD_SET_NTP = "SetNTP"; -constexpr auto OBMC_NETWORK_SERVICE = "org.openbmc.NetworkManager"; constexpr auto OBMC_NETWORK_PATH = "/org/openbmc/NetworkManager/Interface"; -constexpr auto OBMC_NETWORK_INTERFACE = OBMC_NETWORK_SERVICE; +constexpr auto OBMC_NETWORK_INTERFACE = "org.openbmc.NetworkManager"; constexpr auto METHOD_UPDATE_USE_NTP = "UpdateUseNtpField"; } @@ -92,8 +89,17 @@ void Manager::restoreSettings() void Manager::checkHostOn() { + std::string powerService = utils::getService(bus, + POWER_PATH, + POWER_INTERFACE); + if (powerService.empty()) + { + log<level::ERR>("Failed to get power service, assume host is off"); + return; + } + int pgood = utils::getProperty<int>(bus, - POWER_SERVICE, + powerService.c_str(), POWER_PATH, POWER_INTERFACE, PGOOD_STR); @@ -102,12 +108,7 @@ void Manager::checkHostOn() void Manager::checkDhcpNtp() { - std::string useDhcpNtp = utils::getProperty<std::string>( - bus, - SETTINGS_SERVICE, - SETTINGS_PATH, - SETTINGS_INTERFACE, - PROPERTY_DHCP_NTP); + std::string useDhcpNtp = getSettings(PROPERTY_DHCP_NTP); updateDhcpNtpSetting(useDhcpNtp); } @@ -217,7 +218,16 @@ void Manager::updateNtpSetting(const std::string& value) void Manager::updateDhcpNtpSetting(const std::string& useDhcpNtp) { - auto method = bus.new_method_call(OBMC_NETWORK_SERVICE, + std::string networkService = utils::getService(bus, + OBMC_NETWORK_PATH, + OBMC_NETWORK_INTERFACE); + if (networkService.empty()) + { + log<level::ERR>("Failed to get network service, ignore dhcp ntp"); + return; + } + + auto method = bus.new_method_call(networkService.c_str(), OBMC_NETWORK_PATH, OBMC_NETWORK_INTERFACE, METHOD_UPDATE_USE_NTP); @@ -333,14 +343,23 @@ void Manager::onTimeOwnerChanged() } } -std::string Manager::getSettings(const char* value) const +std::string Manager::getSettings(const char* setting) const { - return utils::getProperty<std::string>( - bus, - SETTINGS_SERVICE, - SETTINGS_PATH, - SETTINGS_INTERFACE, - value); + std::string settingsService = utils::getService(bus, + SETTINGS_PATH, + SETTINGS_INTERFACE); + if (settingsService.empty()) + { + log<level::ERR>("Failed to get settings service, unable to get setting", + entry("SETTING=%s", setting)); + return {}; + } + + return utils::getProperty<std::string>(bus, + settingsService.c_str(), + SETTINGS_PATH, + SETTINGS_INTERFACE, + setting); } } @@ -10,6 +10,10 @@ namespace time namespace // anonymous { +constexpr auto MAPPER_BUSNAME = "xyz.openbmc_project.ObjectMapper"; +constexpr auto MAPPER_PATH = "/xyz/openbmc_project/object_mapper"; +constexpr auto MAPPER_INTERFACE = "xyz.openbmc_project.ObjectMapper"; + /** @brief The map that maps the string to Mode */ const std::map<std::string, Mode> modeMap = { @@ -32,6 +36,41 @@ namespace utils using namespace phosphor::logging; +std::string getService(sdbusplus::bus::bus& bus, + const char* path, + const char* interface) +{ + auto mapper = bus.new_method_call(MAPPER_BUSNAME, + MAPPER_PATH, + MAPPER_INTERFACE, + "GetObject"); + + mapper.append(path, std::vector<std::string>({interface})); + auto mapperResponseMsg = bus.call(mapper); + + if (mapperResponseMsg.is_method_error()) + { + // TODO: define repo specific errors and use elog report() + log<level::ERR>("Error in mapper call", + entry("PATH=%s", path), + entry("INTERFACE=%s", interface)); + return {}; + } + + std::map<std::string, std::vector<std::string>> mapperResponse; + mapperResponseMsg.read(mapperResponse); + if (mapperResponse.empty()) + { + // TODO: define repo specific errors and use elog report() + log<level::ERR>("Error reading mapper response", + entry("PATH=%s", path), + entry("INTERFACE=%s", interface)); + return {}; + } + + return mapperResponse.begin()->first; +} + Mode strToMode(const std::string& mode) { auto it = modeMap.find(mode); @@ -89,6 +89,18 @@ T getProperty(sdbusplus::bus::bus& bus, return value.template get<T>(); } +/** @brief Get service name from object path and interface + * + * @param[in] bus - The Dbus bus object + * @param[in] path - The Dbus object path + * @param[in] interface - The Dbus interface + * + * @return The name of the service + */ +std::string getService(sdbusplus::bus::bus& bus, + const char* path, + const char* interface); + /** @brief Convert a string to enum Mode * * Convert the time mode string to enum. |