blob: 29c2660f56925ddd004f40785a0c1b7a2ff33898 [file] [log] [blame]
#include "hyp_sys_config.hpp"
#include "hyp_network_manager.hpp"
#include <phosphor-logging/elog-errors.hpp>
#include <phosphor-logging/log.hpp>
#include <xyz/openbmc_project/Common/error.hpp>
namespace phosphor
{
namespace network
{
constexpr auto BIOS_SERVICE = "xyz.openbmc_project.BIOSConfigManager";
constexpr auto BIOS_OBJPATH = "/xyz/openbmc_project/bios_config/manager";
constexpr auto BIOS_MGR_INTF = "xyz.openbmc_project.BIOSConfig.Manager";
using namespace phosphor::logging;
using namespace sdbusplus::xyz::openbmc_project::Common::Error;
using InvalidArgumentMetadata = xyz::openbmc_project::Common::InvalidArgument;
using SysConfigIntf =
sdbusplus::xyz::openbmc_project::Network::server::SystemConfiguration;
void HypSysConfig::setHostName()
{
auto name = getHostNameFromBios();
SysConfigIntf::hostName(std::move(name));
}
std::string HypSysConfig::hostName(std::string name)
{
if (SysConfigIntf::hostName() == name)
{
return name;
}
name = SysConfigIntf::hostName(name);
setHostNameInBios(name);
return name;
}
std::string HypSysConfig::getHostNameFromBios() const
{
try
{
using getAttrRetType =
std::tuple<std::string, std::variant<std::string, int64_t>,
std::variant<std::string, int64_t>>;
getAttrRetType name;
auto method = bus.new_method_call(BIOS_SERVICE, BIOS_OBJPATH,
BIOS_MGR_INTF, "GetAttribute");
method.append("vmi_hostname");
auto reply = bus.call(method);
std::string type;
std::variant<std::string, int64_t> currValue;
std::variant<std::string, int64_t> defValue;
reply.read(type, currValue, defValue);
return std::get<std::string>(currValue);
}
catch (const sdbusplus::exception::SdBusError& ex)
{
log<level::ERR>("Failed to get the hostname from bios table",
entry("ERR=%s", ex.what()));
}
return std::string();
}
void HypSysConfig::setHostNameInBios(const std::string& name)
{
auto properties = bus.new_method_call(BIOS_SERVICE, BIOS_OBJPATH,
BIOS_MGR_INTF, "SetAttribute");
properties.append("vmi_hostname");
properties.append(std::variant<std::string>(name));
auto result = bus.call(properties);
if (result.is_method_error())
{
throw std::runtime_error("Set attribute api failed");
}
}
} // namespace network
} // namespace phosphor