summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Gundersen <teg@jklm.no>2014-05-16 19:44:22 +0200
committerTom Gundersen <teg@jklm.no>2014-05-16 19:48:25 +0200
commit2dcf7ec6ec0c28297311108acba119cd6e055e64 (patch)
tree1af3869990bd995f5826e7387887bfc73d54fd5e
parentd4920165fe753751aaa274fdc568927d26284eea (diff)
networkd: manager - read fallback DNS servers from config file
We will still use the compiled-in defaults if no DNS entry exists in the config file.
-rw-r--r--Makefile.am33
-rw-r--r--src/network/.gitignore2
-rw-r--r--src/network/networkd-manager.c65
-rw-r--r--src/network/networkd.h6
4 files changed, 94 insertions, 12 deletions
diff --git a/Makefile.am b/Makefile.am
index ddfec1bdef..f6c195b263 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -4223,7 +4223,8 @@ libsystemd_networkd_core_la_SOURCES = \
nodist_libsystemd_networkd_core_la_SOURCES = \
src/network/networkd-network-gperf.c \
- src/network/networkd-netdev-gperf.c
+ src/network/networkd-netdev-gperf.c \
+ src/network/networkd-gperf.c
libsystemd_networkd_core_la_LIBADD = \
libudev-internal.la \
@@ -4232,14 +4233,6 @@ libsystemd_networkd_core_la_LIBADD = \
libsystemd-label.la \
libsystemd-shared.la
-nodist_systemunit_DATA += \
- units/systemd-networkd.service \
- units/systemd-networkd-wait-online.service
-
-GENERAL_ALIASES += \
- $(systemunitdir)/systemd-networkd.service $(pkgsysconfdir)/system/multi-user.target.wants/systemd-networkd.service \
- $(systemunitdir)/systemd-networkd.service $(pkgsysconfdir)/system/network-online.target.wants/systemd-networkd-wait-online.service
-
rootlibexec_PROGRAMS += \
systemd-networkd-wait-online
@@ -4269,15 +4262,30 @@ test_network_LDADD = \
tests += \
test-network
+nodist_systemunit_DATA += \
+ units/systemd-networkd.service \
+ units/systemd-networkd-wait-online.service
+
+GENERAL_ALIASES += \
+ $(systemunitdir)/systemd-networkd.service $(pkgsysconfdir)/system/multi-user.target.wants/systemd-networkd.service \
+ $(systemunitdir)/systemd-networkd.service $(pkgsysconfdir)/system/network-online.target.wants/systemd-networkd-wait-online.service
+
+nodist_pkgsysconf_DATA += \
+ src/network/networkd.conf
+
EXTRA_DIST += \
src/network/networkd-network-gperf.gperf \
src/network/networkd-netdev-gperf.gperf \
+ src/network/networkd-gperf.gperf \
units/systemd-networkd.service.in \
- units/systemd-networkd-wait-online.service.in
+ units/systemd-networkd-wait-online.service.in \
+ src/network/networkd.conf.in
CLEANFILES += \
src/network/networkd-network-gperf.c \
- src/network/networkd-netdev-gperf.c
+ src/network/networkd-netdev-gperf.c \
+ src/network/networkd-gperf.c \
+ src/network/networkd.conf
endif
# ------------------------------------------------------------------------------
@@ -4831,7 +4839,8 @@ substitutions = \
'|RC_LOCAL_SCRIPT_PATH_STOP=$(RC_LOCAL_SCRIPT_PATH_STOP)|' \
'|PYTHON=$(PYTHON)|' \
'|PYTHON_BINARY=$(PYTHON_BINARY)|' \
- '|NTP_SERVERS=$(NTP_SERVERS)|'
+ '|NTP_SERVERS=$(NTP_SERVERS)|' \
+ '|DNS_SERVERS=$(DNS_SERVERS)|'
SED_PROCESS = \
$(AM_V_GEN)$(MKDIR_P) $(dir $@) && \
diff --git a/src/network/.gitignore b/src/network/.gitignore
index 8858596489..04bce2e8b4 100644
--- a/src/network/.gitignore
+++ b/src/network/.gitignore
@@ -1,2 +1,4 @@
/networkd-network-gperf.c
/networkd-netdev-gperf.c
+/networkd-gperf.c
+/networkd.conf
diff --git a/src/network/networkd-manager.c b/src/network/networkd-manager.c
index 013b1dc975..ad36553f2b 100644
--- a/src/network/networkd-manager.c
+++ b/src/network/networkd-manager.c
@@ -23,6 +23,7 @@
#include <linux/if.h>
#include <libkmod.h>
+#include "conf-parser.h"
#include "path-util.h"
#include "networkd.h"
#include "network-internal.h"
@@ -110,6 +111,60 @@ static int set_fallback_dns(Manager *m, const char *string) {
return 0;
}
+int config_parse_dnsv(
+ const char *unit,
+ const char *filename,
+ unsigned line,
+ const char *section,
+ unsigned section_line,
+ const char *lvalue,
+ int ltype,
+ const char *rvalue,
+ void *data,
+ void *userdata) {
+
+ Manager *m = userdata;
+ Address *address;
+
+ assert(filename);
+ assert(lvalue);
+ assert(rvalue);
+ assert(m);
+
+ while ((address = m->fallback_dns)) {
+ LIST_REMOVE(addresses, m->fallback_dns, address);
+ address_free(address);
+ }
+
+ set_fallback_dns(m, rvalue);
+
+ return 0;
+}
+
+static int manager_parse_config_file(Manager *m) {
+ static const char fn[] = "/etc/systemd/networkd.conf";
+ _cleanup_fclose_ FILE *f = NULL;
+ int r;
+
+ assert(m);
+
+ f = fopen(fn, "re");
+ if (!f) {
+ if (errno == ENOENT)
+ return 0;
+
+ log_warning("Failed to open configuration file %s: %m", fn);
+ return -errno;
+ }
+
+ r = config_parse(NULL, fn, f, "Network\0", config_item_perf_lookup,
+ (void*) networkd_gperf_lookup, false, false, m);
+ if (r < 0)
+ log_warning("Failed to parse configuration file: %s", strerror(-r));
+
+ return r;
+}
+
int manager_new(Manager **ret) {
_cleanup_manager_free_ Manager *m = NULL;
int r;
@@ -126,6 +181,10 @@ int manager_new(Manager **ret) {
if (r < 0)
return r;
+ r = manager_parse_config_file(m);
+ if (r < 0)
+ return r;
+
r = sd_event_default(&m->event);
if (r < 0)
return r;
@@ -182,6 +241,7 @@ void manager_free(Manager *m) {
Network *network;
NetDev *netdev;
Link *link;
+ Address *address;
if (!m)
return;
@@ -197,6 +257,11 @@ void manager_free(Manager *m) {
sd_event_source_unref(m->sigint_event_source);
sd_event_unref(m->event);
+ while ((address = m->fallback_dns)) {
+ LIST_REMOVE(addresses, m->fallback_dns, address);
+ address_free(address);
+ }
+
while ((link = hashmap_first(m->links)))
link_unref(link);
hashmap_free(m->links);
diff --git a/src/network/networkd.h b/src/network/networkd.h
index ebb3075534..eaaf2593f9 100644
--- a/src/network/networkd.h
+++ b/src/network/networkd.h
@@ -282,6 +282,12 @@ int manager_save(Manager *m);
DEFINE_TRIVIAL_CLEANUP_FUNC(Manager*, manager_free);
#define _cleanup_manager_free_ _cleanup_(manager_freep)
+const struct ConfigPerfItem* networkd_gperf_lookup(const char *key, unsigned length);
+
+int config_parse_dnsv(const char *unit, const char *filename, unsigned line,
+ const char *section, unsigned section_line, const char *lvalue,
+ int ltype, const char *rvalue, void *data, void *userdata);
+
/* NetDev */
int netdev_load(Manager *manager);