blob: c2d448c0bc3b1ac3d12e83a16f444bfe21706ffa [file] [log] [blame]
Gunnar Mills57d9c502018-09-14 14:42:34 -05001#include "config.h"
2
Ratan Gupta82e1ef92017-06-15 08:39:15 +05303#include "system_configuration.hpp"
Patrick Venture189d44e2018-07-09 12:30:59 -07004
Ratan Gupta82e1ef92017-06-15 08:39:15 +05305#include "network_manager.hpp"
6#include "routing_table.hpp"
Ratan Gupta82e1ef92017-06-15 08:39:15 +05307
Ratan Gupta82e1ef92017-06-15 08:39:15 +05308#include <phosphor-logging/elog-errors.hpp>
Patrick Venture189d44e2018-07-09 12:30:59 -07009#include <phosphor-logging/log.hpp>
10#include <xyz/openbmc_project/Common/error.hpp>
Ratan Gupta82e1ef92017-06-15 08:39:15 +053011
12namespace phosphor
13{
14namespace network
15{
16
17// systemd service to kick start a target.
Gunnar Mills57d9c502018-09-14 14:42:34 -050018constexpr auto HOSTNAMED_SERVICE = "org.freedesktop.hostname1";
19constexpr auto HOSTNAMED_SERVICE_PATH = "/org/freedesktop/hostname1";
20constexpr auto HOSTNAMED_INTERFACE = "org.freedesktop.hostname1";
Ratan Gupta82e1ef92017-06-15 08:39:15 +053021constexpr auto PROPERTY_INTERFACE = "org.freedesktop.DBus.Properties";
22constexpr auto METHOD_GET = "Get";
23constexpr auto METHOD_SET = "SetStaticHostname";
24
25using namespace phosphor::logging;
26using namespace sdbusplus::xyz::openbmc_project::Common::Error;
Gunnar Millsa3629222018-06-19 16:32:04 -050027using InvalidArgumentMetadata = xyz::openbmc_project::Common::InvalidArgument;
Ratan Gupta82e1ef92017-06-15 08:39:15 +053028
29using SystemConfigIntf =
30 sdbusplus::xyz::openbmc_project::Network::server::SystemConfiguration;
31
32SystemConfiguration::SystemConfiguration(sdbusplus::bus::bus& bus,
33 const std::string& objPath,
34 Manager& parent) :
Gunnar Mills57d9c502018-09-14 14:42:34 -050035 Iface(bus, objPath.c_str(), true),
36 bus(bus), manager(parent)
Ratan Gupta82e1ef92017-06-15 08:39:15 +053037{
38 auto name = getHostNameFromSystem();
39 route::Table routingTable;
40
41 SystemConfigIntf::hostName(name);
42 SystemConfigIntf::defaultGateway(routingTable.getDefaultGateway());
William A. Kennington IIId3c249c2019-02-01 21:12:02 -080043 SystemConfigIntf::defaultGateway6(routingTable.getDefaultGateway6());
Ratan Gupta82e1ef92017-06-15 08:39:15 +053044
45 this->emit_object_added();
46}
47
48std::string SystemConfiguration::hostName(std::string name)
49{
50 if (SystemConfigIntf::hostName() == name)
51 {
52 return name;
53 }
Gunnar Mills57d9c502018-09-14 14:42:34 -050054 auto method = bus.new_method_call(HOSTNAMED_SERVICE, HOSTNAMED_SERVICE_PATH,
55 HOSTNAMED_INTERFACE, METHOD_SET);
Ratan Gupta82e1ef92017-06-15 08:39:15 +053056
57 method.append(name, true);
58
59 if (!bus.call(method))
60 {
61 log<level::ERR>("Failed to set the hostname");
62 report<InternalFailure>();
63 return SystemConfigIntf::hostName();
64 }
65
66 return SystemConfigIntf::hostName(name);
67}
68
69std::string SystemConfiguration::getHostNameFromSystem() const
70{
Patrick Williamsf15503e2020-05-13 17:58:23 -050071 std::variant<std::string> name;
Gunnar Mills57d9c502018-09-14 14:42:34 -050072 auto method = bus.new_method_call(HOSTNAMED_SERVICE, HOSTNAMED_SERVICE_PATH,
73 PROPERTY_INTERFACE, METHOD_GET);
Ratan Gupta82e1ef92017-06-15 08:39:15 +053074
75 method.append(HOSTNAMED_INTERFACE, "Hostname");
76
77 auto reply = bus.call(method);
78
79 if (reply)
80 {
81 reply.read(name);
82 }
83 else
84 {
85 log<level::ERR>("Failed to get hostname");
86 report<InternalFailure>();
87 return "";
88 }
Patrick Williams902d0ef2020-05-13 11:49:58 -050089 return std::get<std::string>(name);
Ratan Gupta82e1ef92017-06-15 08:39:15 +053090}
91
Ratan Gupta82e1ef92017-06-15 08:39:15 +053092std::string SystemConfiguration::defaultGateway(std::string gateway)
93{
Nagaraju Gorugantie44acde2017-11-02 05:22:21 -050094 auto gw = SystemConfigIntf::defaultGateway();
95 if (gw == gateway)
Ratan Gupta82e1ef92017-06-15 08:39:15 +053096 {
Nagaraju Gorugantie44acde2017-11-02 05:22:21 -050097 return gw;
Ratan Gupta82e1ef92017-06-15 08:39:15 +053098 }
Nagaraju Gorugantie44acde2017-11-02 05:22:21 -050099
100 if (!isValidIP(AF_INET, gateway))
101 {
William A. Kennington IIId3c249c2019-02-01 21:12:02 -0800102 log<level::ERR>("Not a valid v4 Gateway",
Gunnar Mills57d9c502018-09-14 14:42:34 -0500103 entry("GATEWAY=%s", gateway.c_str()));
104 elog<InvalidArgument>(
105 InvalidArgumentMetadata::ARGUMENT_NAME("GATEWAY"),
106 InvalidArgumentMetadata::ARGUMENT_VALUE(gateway.c_str()));
Nagaraju Gorugantie44acde2017-11-02 05:22:21 -0500107 }
108 gw = SystemConfigIntf::defaultGateway(gateway);
Ratan Gupta82e1ef92017-06-15 08:39:15 +0530109 manager.writeToConfigurationFile();
110 return gw;
111}
112
William A. Kennington IIId3c249c2019-02-01 21:12:02 -0800113std::string SystemConfiguration::defaultGateway6(std::string gateway)
114{
115 auto gw = SystemConfigIntf::defaultGateway6();
116 if (gw == gateway)
117 {
118 return gw;
119 }
120
121 if (!isValidIP(AF_INET6, gateway))
122 {
123 log<level::ERR>("Not a valid v6 Gateway",
124 entry("GATEWAY=%s", gateway.c_str()));
125 elog<InvalidArgument>(
126 InvalidArgumentMetadata::ARGUMENT_NAME("GATEWAY"),
127 InvalidArgumentMetadata::ARGUMENT_VALUE(gateway.c_str()));
128 }
129 gw = SystemConfigIntf::defaultGateway6(gateway);
130 manager.writeToConfigurationFile();
131 return gw;
132}
133
Gunnar Mills57d9c502018-09-14 14:42:34 -0500134} // namespace network
135} // namespace phosphor