diff options
author | Ratan Gupta <ratagupt@in.ibm.com> | 2017-06-15 08:39:15 +0530 |
---|---|---|
committer | Ratan Gupta <ratagupt@in.ibm.com> | 2017-06-21 14:50:47 +0530 |
commit | 82e1ef999fc207b0f307f4161e95d41d3d5f014a (patch) | |
tree | 39bec888fc6ccec9c4cd249700104d147fb15e55 | |
parent | b46497fe9c2ec0fe7ed1784ee9a94b386ce6c403 (diff) | |
download | phosphor-networkd-82e1ef999fc207b0f307f4161e95d41d3d5f014a.tar.gz phosphor-networkd-82e1ef999fc207b0f307f4161e95d41d3d5f014a.zip |
Implement system configuration Dbus interface
Change-Id: I713175e946af47990afcead00558ee4b90cbce8e
Signed-off-by: Ratan Gupta <ratagupt@in.ibm.com>
-rw-r--r-- | Makefile.am | 5 | ||||
-rw-r--r-- | ethernet_interface.cpp | 8 | ||||
-rw-r--r-- | ethernet_interface.hpp | 1 | ||||
-rw-r--r-- | system_configuration.cpp | 108 | ||||
-rw-r--r-- | system_configuration.hpp | 75 |
5 files changed, 189 insertions, 8 deletions
diff --git a/Makefile.am b/Makefile.am index 370709f..02ba4c2 100644 --- a/Makefile.am +++ b/Makefile.am @@ -16,7 +16,9 @@ noinst_HEADERS = \ network_manager.hpp \ ipaddress.hpp \ types.hpp \ - util.hpp + util.hpp \ + routing_table.hpp \ + system_configuration.hpp phosphor_network_manager_SOURCES = \ ethernet_interface.cpp \ @@ -24,6 +26,7 @@ phosphor_network_manager_SOURCES = \ network_config.cpp \ network_manager.cpp \ network_manager_main.cpp \ + system_configuration.cpp \ xyz/openbmc_project/Network/VLAN/Create/server.cpp \ xyz/openbmc_project/Network/IP/Create/server.cpp \ util.cpp \ diff --git a/ethernet_interface.cpp b/ethernet_interface.cpp index c824919..1f36815 100644 --- a/ethernet_interface.cpp +++ b/ethernet_interface.cpp @@ -89,11 +89,6 @@ void EthernetInterface::setAddressList(const AddrList& addrs) gateway))); } - // TODO:- will move the default gateway to conf object - // once we implement that. - - // TODO: openbmc/openbmc#1295 - manager.defaultGateway = routingTable.getDefaultGateway(); } void EthernetInterface::iP(IP::Protocol protType, @@ -104,6 +99,8 @@ void EthernetInterface::iP(IP::Protocol protType, if (dHCPEnabled()) { + log<level::INFO>("DHCP enabled on the interface"), + entry("INTERFACE=%s",interfaceName()); return; } @@ -277,7 +274,6 @@ std::string EthernetInterface::generateObjectPath(IP::Protocol addressType, objectPath /= type; objectPath /= generateId(ipaddress, prefixLength, gateway); return objectPath.string(); - } }//namespace network diff --git a/ethernet_interface.hpp b/ethernet_interface.hpp index 856f874..313a0b9 100644 --- a/ethernet_interface.hpp +++ b/ethernet_interface.hpp @@ -25,7 +25,6 @@ using Ifaces = using IP = sdbusplus::xyz::openbmc_project::Network::server::IP; class Manager; // forward declaration of network manager. -class Manager; // forward declaration of network manager. class TestEthernetInterface; using LinkSpeed = uint16_t; diff --git a/system_configuration.cpp b/system_configuration.cpp new file mode 100644 index 0000000..7913b96 --- /dev/null +++ b/system_configuration.cpp @@ -0,0 +1,108 @@ +#include "config.h" +#include "system_configuration.hpp" +#include "network_manager.hpp" +#include "routing_table.hpp" +#include "xyz/openbmc_project/Common/error.hpp" + +#include <phosphor-logging/log.hpp> +#include <phosphor-logging/elog-errors.hpp> + +namespace phosphor +{ +namespace network +{ + +// systemd service to kick start a target. +constexpr auto HOSTNAMED_SERVICE = "org.freedesktop.hostname1"; +constexpr auto HOSTNAMED_SERVICE_PATH = "/org/freedesktop/hostname1"; +constexpr auto HOSTNAMED_INTERFACE = "org.freedesktop.hostname1"; +constexpr auto PROPERTY_INTERFACE = "org.freedesktop.DBus.Properties"; +constexpr auto METHOD_GET = "Get"; +constexpr auto METHOD_SET = "SetStaticHostname"; + +using namespace phosphor::logging; +using namespace sdbusplus::xyz::openbmc_project::Common::Error; + +using SystemConfigIntf = + sdbusplus::xyz::openbmc_project::Network::server::SystemConfiguration; + +SystemConfiguration::SystemConfiguration(sdbusplus::bus::bus& bus, + const std::string& objPath, + Manager& parent) : + Iface(bus, objPath.c_str(), true), + bus(bus), + manager(parent) +{ + auto name = getHostNameFromSystem(); + route::Table routingTable; + + SystemConfigIntf::hostName(name); + SystemConfigIntf::defaultGateway(routingTable.getDefaultGateway()); + + this->emit_object_added(); +} + +std::string SystemConfiguration::hostName(std::string name) +{ + if (SystemConfigIntf::hostName() == name) + { + return name; + } + auto method = bus.new_method_call( + HOSTNAMED_SERVICE, + HOSTNAMED_SERVICE_PATH, + HOSTNAMED_INTERFACE, + METHOD_SET); + + method.append(name, true); + + if (!bus.call(method)) + { + log<level::ERR>("Failed to set the hostname"); + report<InternalFailure>(); + return SystemConfigIntf::hostName(); + } + + return SystemConfigIntf::hostName(name); +} + +std::string SystemConfiguration::getHostNameFromSystem() const +{ + sdbusplus::message::variant<std::string> name; + auto method = bus.new_method_call( + HOSTNAMED_SERVICE, + HOSTNAMED_SERVICE_PATH, + PROPERTY_INTERFACE, + METHOD_GET); + + method.append(HOSTNAMED_INTERFACE, "Hostname"); + + auto reply = bus.call(method); + + if (reply) + { + reply.read(name); + } + else + { + log<level::ERR>("Failed to get hostname"); + report<InternalFailure>(); + return ""; + } + return name.get<std::string>(); +} + + +std::string SystemConfiguration::defaultGateway(std::string gateway) +{ + if (SystemConfigIntf::defaultGateway() == gateway) + { + return gateway; + } + auto gw = SystemConfigIntf::defaultGateway(gateway); + manager.writeToConfigurationFile(); + return gw; +} + +}// namespace network +}// namespace phosphor diff --git a/system_configuration.hpp b/system_configuration.hpp new file mode 100644 index 0000000..3ebe647 --- /dev/null +++ b/system_configuration.hpp @@ -0,0 +1,75 @@ +#pragma once + +#include "xyz/openbmc_project/Network/SystemConfiguration/server.hpp" + +#include <sdbusplus/bus.hpp> +#include <sdbusplus/server/object.hpp> + +#include <string> + +namespace phosphor +{ +namespace network +{ + +using SystemConfigIntf = + sdbusplus::xyz::openbmc_project::Network::server::SystemConfiguration; + +using Iface = + sdbusplus::server::object::object<SystemConfigIntf>; + +class Manager; // forward declaration of network manager. + +/** @class SystemConfiguration + * @brief Network system configuration. + * @details A concrete implementation for the + * xyz.openbmc_project.Network.SystemConfiguration DBus API. + */ +class SystemConfiguration : public Iface +{ + public: + SystemConfiguration() = default; + SystemConfiguration(const SystemConfiguration&) = delete; + SystemConfiguration& operator=(const SystemConfiguration&) = delete; + SystemConfiguration(SystemConfiguration&&) = delete; + SystemConfiguration& operator=(SystemConfiguration&&) = delete; + virtual ~SystemConfiguration() = default; + + /** @brief Constructor to put object onto bus at a dbus path. + * @param[in] bus - Bus to attach to. + * @param[in] objPath - Path to attach at. + * @param[in] parent - Parent object. + */ + SystemConfiguration(sdbusplus::bus::bus& bus, + const std::string& objPath, + Manager& parent); + + /** @brief set the hostname of the system. + * @param[in] name - host name of the system. + */ + std::string hostName(std::string name) override; + + /** @brief set the default gateway of the system. + * @param[in] gateway - default gateway of the system. + */ + std::string defaultGateway(std::string gateway) override; + + using SystemConfigIntf::defaultGateway; + + private: + + /** @brief get the hostname from the system by doing + * dbus call to hostnamed service. + */ + std::string getHostNameFromSystem() const; + + /** @brief Persistent sdbusplus DBus bus connection. */ + sdbusplus::bus::bus& bus; + + /** @brief Network Manager object. */ + Manager& manager; + +}; + +} // namespace network +} // namespace phosphor |