diff options
-rw-r--r-- | Redfish.md | 1 | ||||
-rw-r--r-- | redfish-core/lib/managers.hpp | 44 |
2 files changed, 45 insertions, 0 deletions
diff --git a/Redfish.md b/Redfish.md index ba58c55ba0..3739581c54 100644 --- a/Redfish.md +++ b/Redfish.md @@ -404,6 +404,7 @@ Fields common to all schemas - Links/ManagerForServers - Links/ManagerForServers@odata.count - Links/ManagerInChassis +- Links/ServiceRootUptime - Links/SoftwareImages - Links/SoftwareImages@odata.count - LogServices diff --git a/redfish-core/lib/managers.hpp b/redfish-core/lib/managers.hpp index 376f70c52b..0be135400f 100644 --- a/redfish-core/lib/managers.hpp +++ b/redfish-core/lib/managers.hpp @@ -33,6 +33,7 @@ #include <algorithm> #include <array> +#include <chrono> #include <cstdint> #include <memory> #include <sstream> @@ -1769,6 +1770,47 @@ inline void }); } +inline void + afterGetManagerStartTime(const std::shared_ptr<bmcweb::AsyncResp>& aResp, + const boost::system::error_code& ec, + uint64_t bmcwebResetTime) +{ + if (ec) + { + return; + } + using std::chrono::steady_clock; + std::chrono::microseconds usReset{bmcwebResetTime}; + steady_clock::time_point resetTime{usReset}; + + steady_clock::time_point now = steady_clock::now(); + + steady_clock::duration run = now - resetTime; + + if (run < steady_clock::duration::zero()) + { + BMCWEB_LOG_CRITICAL << "Uptime was negative????"; + messages::internalError(aResp->res); + return; + } + + using Milli = std::chrono::milliseconds; + Milli uptimeMs = std::chrono::duration_cast<Milli>(run); + + using redfish::time_utils::toDurationString; + aResp->res.jsonValue["ServiceRootUptime"] = toDurationString(uptimeMs); +} + +inline void + managerGetServiceRootUptime(const std::shared_ptr<bmcweb::AsyncResp>& aResp) +{ + sdbusplus::asio::getProperty<uint64_t>( + *crow::connections::systemBus, "org.freedesktop.systemd1", + "/org/freedesktop/systemd1/unit/bmcweb_2eservice", + "org.freedesktop.systemd1.Unit", "ActiveEnterTimestampMonotonic", + std::bind_front(afterGetManagerStartTime, aResp)); +} + /** * @brief Set the running firmware image * @@ -2026,6 +2068,8 @@ inline void requestRoutesManager(App& app) managerGetLastResetTime(asyncResp); + managerGetServiceRootUptime(asyncResp); + // ManagerDiagnosticData is added for all BMCs. nlohmann::json& managerDiagnosticData = asyncResp->res.jsonValue["ManagerDiagnosticData"]; |