1 #include "system_configuration.hpp"
2 
3 #include <phosphor-logging/elog-errors.hpp>
4 #include <phosphor-logging/log.hpp>
5 #include <xyz/openbmc_project/Common/error.hpp>
6 
7 namespace phosphor
8 {
9 namespace network
10 {
11 
12 // systemd service to kick start a target.
13 constexpr auto HOSTNAMED_SERVICE = "org.freedesktop.hostname1";
14 constexpr auto HOSTNAMED_SERVICE_PATH = "/org/freedesktop/hostname1";
15 constexpr auto HOSTNAMED_INTERFACE = "org.freedesktop.hostname1";
16 constexpr auto PROPERTY_INTERFACE = "org.freedesktop.DBus.Properties";
17 constexpr auto METHOD_GET = "Get";
18 constexpr auto METHOD_SET = "SetStaticHostname";
19 
20 using namespace phosphor::logging;
21 using namespace sdbusplus::xyz::openbmc_project::Common::Error;
22 
23 using SystemConfigIntf =
24     sdbusplus::xyz::openbmc_project::Network::server::SystemConfiguration;
25 
26 SystemConfiguration::SystemConfiguration(sdbusplus::bus_t& bus,
27                                          stdplus::const_zstring objPath) :
28     Iface(bus, objPath.c_str(), Iface::action::defer_emit),
29     bus(bus)
30 {
31     SystemConfigIntf::hostName(getHostNameFromSystem(), true);
32 
33     emit_object_added();
34 }
35 
36 std::string SystemConfiguration::hostName(std::string name)
37 {
38     if (SystemConfigIntf::hostName() == name)
39     {
40         return name;
41     }
42     auto method = bus.new_method_call(HOSTNAMED_SERVICE, HOSTNAMED_SERVICE_PATH,
43                                       HOSTNAMED_INTERFACE, METHOD_SET);
44 
45     method.append(name, true);
46 
47     if (!bus.call(method))
48     {
49         log<level::ERR>("Failed to set the hostname");
50         report<InternalFailure>();
51         return SystemConfigIntf::hostName();
52     }
53 
54     return SystemConfigIntf::hostName(name);
55 }
56 
57 std::string SystemConfiguration::getHostNameFromSystem() const
58 {
59     try
60     {
61         std::variant<std::string> name;
62         auto method =
63             bus.new_method_call(HOSTNAMED_SERVICE, HOSTNAMED_SERVICE_PATH,
64                                 PROPERTY_INTERFACE, METHOD_GET);
65 
66         method.append(HOSTNAMED_INTERFACE, "Hostname");
67 
68         auto reply = bus.call(method);
69 
70         reply.read(name);
71         return std::get<std::string>(name);
72     }
73     catch (const sdbusplus::exception_t& ex)
74     {
75         log<level::ERR>(
76             "Failed to get the hostname from systemd-hostnamed service",
77             entry("ERR=%s", ex.what()));
78     }
79     return "";
80 }
81 
82 } // namespace network
83 } // namespace phosphor
84