diff options
author | Vishwanatha Subbanna <vishwa@linux.vnet.ibm.com> | 2017-10-17 15:22:46 +0530 |
---|---|---|
committer | Vishwanatha Subbanna <vishwa@linux.vnet.ibm.com> | 2017-10-24 22:57:54 +0530 |
commit | 18891c68b5f61df10f60a52f2e65f4e61c3df8c6 (patch) | |
tree | 12599f9403effb0dca521f350a2f06aa13943f87 | |
parent | ca4ce1b402f402edfe65f69eb6e6782b10cee473 (diff) | |
download | phosphor-networkd-18891c68b5f61df10f60a52f2e65f4e61c3df8c6.tar.gz phosphor-networkd-18891c68b5f61df10f60a52f2e65f4e61c3df8c6.zip |
Integrate inotify watcher into network daemon
This commit integrates watching for DNS entries and updating
/etc/resolv.conf functionality into network manager daemon
as opposed to having another daemon doing just that.
Change-Id: Id858815675ed4a23ee8c6a31ba3ae6e5ee0054fd
Signed-off-by: Vishwanatha Subbanna <vishwa@linux.vnet.ibm.com>
-rw-r--r-- | configure.ac | 4 | ||||
-rw-r--r-- | dns_updater.cpp | 4 | ||||
-rw-r--r-- | dns_updater.hpp | 6 | ||||
-rw-r--r-- | netman_watch_dns.c | 12 | ||||
-rw-r--r-- | network_manager_main.cpp | 22 | ||||
-rw-r--r-- | rtnetlink_server.cpp | 12 | ||||
-rw-r--r-- | rtnetlink_server.hpp | 23 | ||||
-rw-r--r-- | test/test_dns_updater.cpp | 2 |
8 files changed, 52 insertions, 33 deletions
diff --git a/configure.ac b/configure.ac index bbf5c4f..e195d91 100644 --- a/configure.ac +++ b/configure.ac @@ -69,6 +69,10 @@ AS_IF([test "x$enable_oe_sdk" == "xyes"], AC_SUBST([OESDK_TESTCASE_FLAGS], [$testcase_flags]) ) +AC_ARG_VAR(DNS_ENTRY_FILE, [File having DNS entries supplied by DHCP]) +AS_IF([test "x$DNS_ENTRY_FILE" == "x"], [DNS_ENTRY_FILE="/run/systemd/netif/state"]) +AC_DEFINE_UNQUOTED([DNS_ENTRY_FILE], ["$DNS_ENTRY_FILE"], [File having DNS entries supplied by DHCP]) + AC_ARG_VAR(BUSNAME_NETWORK, [The Dbus busname to own]) AS_IF([test "x$BUSNAME_NETWORK" == "x"], [BUSNAME_NETWORK="xyz.openbmc_project.Network"]) AC_DEFINE_UNQUOTED([BUSNAME_NETWORK], ["$BUSNAME_NETWORK"], [The DBus busname to own]) diff --git a/dns_updater.cpp b/dns_updater.cpp index 5c4d058..1b3b8ea 100644 --- a/dns_updater.cpp +++ b/dns_updater.cpp @@ -17,8 +17,8 @@ namespace dns namespace updater { -void processDNSEntries(const fs::path& inFile, - const fs::path& outFile) +void updateDNSEntries(const fs::path& inFile, + const fs::path& outFile) { using namespace phosphor::logging; using namespace sdbusplus::xyz::openbmc_project::Common::Error; diff --git a/dns_updater.hpp b/dns_updater.hpp index 44c0e32..84646c6 100644 --- a/dns_updater.hpp +++ b/dns_updater.hpp @@ -20,8 +20,8 @@ constexpr auto RESOLV_CONF = "/etc/resolv.conf"; * @param[in] inFile - File having DNS entries supplied by DHCP * @param[in] outFile - File to write the nameserver entries to */ -void processDNSEntries(const fs::path& inFile, - const fs::path& outFile); +void updateDNSEntries(const fs::path& inFile, + const fs::path& outFile); /** @brief User callback handler invoked by inotify watcher * @@ -32,7 +32,7 @@ void processDNSEntries(const fs::path& inFile, */ inline void processDNSEntries(const fs::path& inFile) { - return processDNSEntries(inFile, RESOLV_CONF); + return updateDNSEntries(inFile, RESOLV_CONF); } } // namepsace updater diff --git a/netman_watch_dns.c b/netman_watch_dns.c index 33e6f14..b60b699 100644 --- a/netman_watch_dns.c +++ b/netman_watch_dns.c @@ -380,12 +380,20 @@ int main(int argc, char *argv[]) printf("Watching for changes in DNS settings..\n"); - /* Now that we have checked it once. rest is all notification bases. */ + /* Commenting since this functionality has been built into network + * manager and this file will be deleted in the very next commit + */ + /* rc = watch_for_dns_change(netif_dir, state_file); if(rc < 0) { fprintf(stderr,"Error watching for DNS changes\n"); } + */ - return 0; + // Returning will result in app getting launched again per Restart + // policy in service file + pause(); + + return rc; } diff --git a/network_manager_main.cpp b/network_manager_main.cpp index 0c95c8d..b08d5ac 100644 --- a/network_manager_main.cpp +++ b/network_manager_main.cpp @@ -2,6 +2,8 @@ #include "network_manager.hpp" #include "rtnetlink_server.hpp" #include "timer.hpp" +#include "watch.hpp" +#include "dns_updater.hpp" #include <memory> @@ -83,8 +85,6 @@ int main(int argc, char *argv[]) OBJ_NETWORK, NETWORK_CONF_DIR); - phosphor::network::rtnetlink::Server svr(eventPtr); - // create the network interface dbus objects and system config phosphor::network::manager->createChildObjects(); @@ -99,6 +99,22 @@ int main(int argc, char *argv[]) // will create it. phosphor::network::restartNetwork(); } - return svr.run(); + + // RTNETLINK event handler + phosphor::network::rtnetlink::Server svr(eventPtr); + + // DNS entry handler + phosphor::network::inotify::Watch watch(eventPtr, DNS_ENTRY_FILE, + std::bind(&phosphor::network::dns::updater::processDNSEntries, + std::placeholders::_1)); + + // At this point, we have registered for the notifications for future + // events. However, if the file is already populated before this, then + // they won't ever get notified and thus we need to read once before + // waiting on change events + phosphor::network::dns::updater::processDNSEntries(DNS_ENTRY_FILE); + + // Run the server + sd_event_loop(eventPtr.get()); } diff --git a/rtnetlink_server.cpp b/rtnetlink_server.cpp index 31dbfd1..c0e5ad5 100644 --- a/rtnetlink_server.cpp +++ b/rtnetlink_server.cpp @@ -13,6 +13,8 @@ #include <unistd.h> #include <phosphor-logging/log.hpp> +#include <phosphor-logging/elog-errors.hpp> +#include <xyz/openbmc_project/Common/error.hpp> #include <memory> @@ -63,10 +65,11 @@ static int eventHandler(sd_event_source* es, int fd, uint32_t revents, return 0; } -int Server::run() +Server::Server(EventPtr& eventPtr) { using namespace phosphor::logging; - + using InternalFailure = sdbusplus::xyz::openbmc_project::Common:: + Error::InternalFailure; struct sockaddr_nl addr {}; int fd = -1; @@ -132,17 +135,14 @@ int Server::run() goto finish; } - r = sd_event_loop(eventPtr.get()); - finish: if (r < 0) { log<level::ERR>("Failure Occured in starting of server:", entry("errno = %d", errno)); + elog<InternalFailure>(); } - - return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS; } diff --git a/rtnetlink_server.hpp b/rtnetlink_server.hpp index 51cf7bb..a00e6b7 100644 --- a/rtnetlink_server.hpp +++ b/rtnetlink_server.hpp @@ -1,6 +1,7 @@ #pragma once #include "types.hpp" +#include "util.hpp" #include <systemd/sd-event.h> @@ -26,28 +27,18 @@ class Server /** @brief Constructor * - * @param[in] event - Unique ptr reference to sd_event. + * @details Sets up the server to handle incoming RTNETLINK events + * + * @param[in] eventPtr - Unique ptr reference to sd_event. */ + Server(EventPtr& eventPtr); - Server(EventPtr& event): - eventPtr(event) {}; - + Server() = delete; + ~Server() = default; Server(const Server&) = delete; Server& operator=(const Server&) = delete; Server(Server&&) = default; Server& operator=(Server &&) = default; - - /** @brief Initialise the event loop and add the handler for incoming - * RTNETLINK events. - * - * @return EXIT_SUCCESS on success and EXIT_FAILURE on failure. - */ - int run(); - - private: - /** @brief reference to sd_event wrapped in unique_ptr */ - EventPtr& eventPtr; - }; } //namespace rtnetlink diff --git a/test/test_dns_updater.cpp b/test/test_dns_updater.cpp index 8fb4bcb..5d92cd3 100644 --- a/test/test_dns_updater.cpp +++ b/test/test_dns_updater.cpp @@ -53,7 +53,7 @@ class DnsUpdateTest : public ::testing::Test */ TEST_F(DnsUpdateTest, validateOutFile) { - phosphor::network::dns::updater::processDNSEntries(IN_FILE, OUT_FILE); + phosphor::network::dns::updater::updateDNSEntries(IN_FILE, OUT_FILE); // Read files and compare std::ifstream resolv(OUT_FILE); |