blob: 79048a4e3debb7c708328b041227d6499c0d5413 [file] [log] [blame]
#include "dbus_handler.hpp"
#include "boot_manager.hpp"
#include <fmt/printf.h>
#include <boost/container/flat_map.hpp>
#include <sdbusplus/asio/object_server.hpp>
#include <sdbusplus/bus/match.hpp>
#include <xyz/openbmc_project/Common/error.hpp>
#include <xyz/openbmc_project/State/Host/server.hpp>
#include <xyz/openbmc_project/Time/Boot/Checkpoint/server.hpp>
#include <xyz/openbmc_project/Time/Boot/Duration/server.hpp>
#include <xyz/openbmc_project/Time/Boot/Statistic/server.hpp>
#include <tuple>
namespace boot_time_monitor
{
DbusHandler::DbusHandler(sdbusplus::bus::bus& dbus, const std::string& objPath,
std::shared_ptr<BootManagerIface> bootManager,
std::shared_ptr<UtilIface> util) :
sdbusplus::server::object::object<Duration>(dbus, objPath.c_str()),
sdbusplus::server::object::object<Checkpoint>(dbus, objPath.c_str()),
sdbusplus::server::object::object<Statistic>(dbus, objPath.c_str()),
bootManager(bootManager), util(util)
{}
void DbusHandler::setCheckpoint(std::string checkpointName, int64_t wallTime,
int64_t selfMeasuredDuration)
{
if (!util->isValidName(checkpointName))
{
throw sdbusplus::xyz::openbmc_project::Common::Error::InvalidArgument();
}
bootManager->setCheckpoint(checkpointName, wallTime, selfMeasuredDuration);
}
std::vector<std::tuple<std::string, int64_t, int64_t>>
DbusHandler::getCheckpointList()
{
std::vector<std::tuple<std::string, int64_t, int64_t>> result;
for (const auto& cp :
(bootManager->isRebooting() ? bootManager->getCheckpoints()
: bootManager->getPreCheckpoints()))
{
result.emplace_back(std::make_tuple(cp.name, cp.wallTime, cp.monoTime));
}
return result;
}
void DbusHandler::rebootComplete()
{
if (!isRebooting())
{
fmt::print(stderr,
"[{}]: Not rebooting. Skip this `rebootComplete` command\n",
__FUNCTION__);
return;
}
bootManager->notifyComplete();
}
void DbusHandler::setDuration(std::string durationName, int64_t duration)
{
if (!util->isValidName(durationName))
{
throw sdbusplus::xyz::openbmc_project::Common::Error::InvalidArgument();
}
bootManager->setDuration(durationName, duration);
}
std::vector<std::tuple<std::string, int64_t>>
DbusHandler::getAdditionalDurations()
{
std::vector<std::tuple<std::string, int64_t>> result;
for (const auto& dur :
(bootManager->isRebooting() ? bootManager->getDurations()
: bootManager->getPreDurations()))
{
result.emplace_back(std::make_tuple(dur.name, dur.duration));
}
return result;
}
bool DbusHandler::isRebooting() const
{
return bootManager->isRebooting();
}
} // namespace boot_time_monitor