From f21fb793f282545dbfc4877fd404b71d345e7f74 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Thu, 19 May 2016 16:43:48 +0200 Subject: [PATCH] dns: add configure option "--with-config-dns-rc-manager-default" for default of main.rc-manager Downstream might want to choose a different default value for main.rc-manager setting (and it can does so, by compiling with explicit resolvconf or netconfig support). Make the default configurable at build-time and also embed it into the manual page of "NetworkManager.conf". https://bugzilla.redhat.com/show_bug.cgi?id=1337222 (cherry picked from commit 51791c4772e7a9c26a1afc088069e9d4d862d36c) --- configure.ac | 15 +++++++ man/NetworkManager.conf.xml | 4 +- man/common.ent.in | 1 + src/dns-manager/nm-dns-manager.c | 73 ++++++++++++-------------------- 4 files changed, 47 insertions(+), 46 deletions(-) diff --git a/configure.ac b/configure.ac index 6067a88fbe..d7c804e4e4 100644 --- a/configure.ac +++ b/configure.ac @@ -763,6 +763,11 @@ fi # resolvconf and netconfig support AC_ARG_WITH(resolvconf, AS_HELP_STRING([--with-resolvconf=yes|no|path], [Enable resolvconf support])) AC_ARG_WITH(netconfig, AS_HELP_STRING([--with-netconfig=yes|no], [Enable SUSE netconfig support])) +AC_ARG_WITH(config-dns-rc-manager-default, AS_HELP_STRING([--with-config-dns-rc-manager-default=symlink|file|netconfig|resolvconf], [Configure default value for main.rc-manager setting]), [config_dns_rc_manager_default=$withval]) +if test "$config_dns_rc_manager_default" != symlink -a "$config_dns_rc_manager_default" != file -a "$config_dns_rc_manager_default" != netconfig -a "$config_dns_rc_manager_default" != resolvconf; then + AC_MSG_WARN([Unknown --with-config-dns-rc-manager-default=$config_dns_rc_manager_default setting.]) + config_dns_rc_manager_default= +fi # Use netconfig by default on SUSE AS_IF([test -z "$with_netconfig"], AC_CHECK_FILE(/etc/SuSE-release, with_netconfig=yes)) # Otherwise default to "no" @@ -772,9 +777,16 @@ AS_IF([test -z "$with_netconfig"], with_netconfig=no) if test "$with_resolvconf" = "yes"; then AC_PATH_PROGS(with_resolvconf, resolvconf, no, /sbin:/usr/sbin:/usr/local/sbin) fi +if test "$with_resolvconf" != "no"; then + AS_IF([test -z "$config_dns_rc_manager_default"], config_dns_rc_manager_default=resolvconf) +fi if test "$with_netconfig" = "yes"; then AC_PATH_PROGS(with_netconfig, netconfig, no, /sbin:/usr/sbin:/usr/local/sbin) fi +if test "$with_netconfig" != "no"; then + AS_IF([test -z "$config_dns_rc_manager_default"], config_dns_rc_manager_default=netconfig) +fi +AS_IF([test -z "$config_dns_rc_manager_default"], config_dns_rc_manager_default=symlink) # Define resolvconf and netconfig paths if test "$with_resolvconf" != "no"; then AC_DEFINE_UNQUOTED(RESOLVCONF_PATH, "$with_resolvconf", [Path to resolvconf]) @@ -782,6 +794,8 @@ fi if test "$with_netconfig" != "no"; then AC_DEFINE_UNQUOTED(NETCONFIG_PATH, "$with_netconfig", [Path to netconfig]) fi +AC_DEFINE_UNQUOTED(NM_CONFIG_DEFAULT_DNS_RC_MANAGER, "$config_dns_rc_manager_default", [Default value for main.rc-manager setting (--with-config-dns-rc-manager-default)]) +AC_SUBST(NM_CONFIG_DEFAULT_DNS_RC_MANAGER, $config_dns_rc_manager_default) # iptables path AC_ARG_WITH(iptables, AS_HELP_STRING([--with-iptables=/path/to/iptables], [path to iptables])) @@ -1164,6 +1178,7 @@ echo echo "Handlers for /etc/resolv.conf:" echo " resolvconf: ${with_resolvconf}" echo " netconfig: ${with_netconfig}" +echo " config-dns-rc-manager-default: ${config_dns_rc_manager_default}" echo echo "DHCP clients:" diff --git a/man/NetworkManager.conf.xml b/man/NetworkManager.conf.xml index 54ad4e1584..8127f5b7fc 100644 --- a/man/NetworkManager.conf.xml +++ b/man/NetworkManager.conf.xml @@ -312,7 +312,9 @@ no-auto-default=* rc-manager Set the resolv.conf management mode. The default value depends on how NetworkManager - was built. Regardless of this setting, NetworkManager will + was built, whereas this version of NetworkManager was build with + a default of "&NM_CONFIG_DEFAULT_DNS_RC_MANAGER;". + Regardless of this setting, NetworkManager will always write resolv.conf to its runtime state directory. symlink: NetworkManager will symlink /etc/resolv.conf to its private diff --git a/man/common.ent.in b/man/common.ent.in index ae8897eb8a..ec91e8a6a2 100644 --- a/man/common.ent.in +++ b/man/common.ent.in @@ -4,3 +4,4 @@ + diff --git a/src/dns-manager/nm-dns-manager.c b/src/dns-manager/nm-dns-manager.c index 45d17deedd..a6aef6fe92 100644 --- a/src/dns-manager/nm-dns-manager.c +++ b/src/dns-manager/nm-dns-manager.c @@ -67,15 +67,11 @@ G_DEFINE_TYPE (NMDnsManager, nm_dns_manager, G_TYPE_OBJECT) #define HASH_LEN 20 -#ifdef RESOLVCONF_PATH -#define RESOLVCONF_SELECTED -#else +#ifndef RESOLVCONF_PATH #define RESOLVCONF_PATH "/sbin/resolvconf" #endif -#ifdef NETCONFIG_PATH -#define NETCONFIG_SELECTED -#else +#ifndef NETCONFIG_PATH #define NETCONFIG_PATH "/sbin/netconfig" #endif @@ -1482,41 +1478,6 @@ _clear_plugin (NMDnsManager *self) return FALSE; } -static NMDnsManagerResolvConfManager -_get_resolv_conf_manager_default (void) -{ -#if defined(RESOLVCONF_SELECTED) - return NM_DNS_MANAGER_RESOLV_CONF_MAN_RESOLVCONF; -#elif defined(NETCONFIG_SELECTED) - return NM_DNS_MANAGER_RESOLV_CONF_MAN_NETCONFIG; -#else - return NM_DNS_MANAGER_RESOLV_CONF_MAN_SYMLINK; -#endif -} - -static NMDnsManagerResolvConfManager -_get_resolv_conf_manager (NMConfig *config) -{ - const char *man; - - man = nm_config_data_get_rc_manager (nm_config_get_data (config)); - if (!man) - return _get_resolv_conf_manager_default (); - - if (NM_IN_STRSET (man, "symlink", "none")) - return NM_DNS_MANAGER_RESOLV_CONF_MAN_SYMLINK; - if (nm_streq (man, "file")) - return NM_DNS_MANAGER_RESOLV_CONF_MAN_FILE; - if (nm_streq (man, "resolvconf")) - return NM_DNS_MANAGER_RESOLV_CONF_MAN_RESOLVCONF; - if (nm_streq (man, "netconfig")) - return NM_DNS_MANAGER_RESOLV_CONF_MAN_NETCONFIG; - if (nm_streq (man, "unmanaged")) - return NM_DNS_MANAGER_RESOLV_CONF_MAN_UNMANAGED; - - return NM_DNS_MANAGER_RESOLV_CONF_MAN_UNKNOWN; -} - static bool _get_resconf_immutable (void) { @@ -1549,11 +1510,33 @@ init_resolv_conf_mode (NMDnsManager *self) else if (_get_resconf_immutable ()) rc_manager = NM_DNS_MANAGER_RESOLV_CONF_MAN_IMMUTABLE; else { - rc_manager = _get_resolv_conf_manager (priv->config); + const char *man; + + rc_manager = NM_DNS_MANAGER_RESOLV_CONF_MAN_UNKNOWN; + man = nm_config_data_get_rc_manager (nm_config_get_data (priv->config)); + +again: + if (!man) { + /* nop */ + } else if (NM_IN_STRSET (man, "symlink", "none")) + rc_manager = NM_DNS_MANAGER_RESOLV_CONF_MAN_SYMLINK; + else if (nm_streq (man, "file")) + rc_manager = NM_DNS_MANAGER_RESOLV_CONF_MAN_FILE; + else if (nm_streq (man, "resolvconf")) + rc_manager = NM_DNS_MANAGER_RESOLV_CONF_MAN_RESOLVCONF; + else if (nm_streq (man, "netconfig")) + rc_manager = NM_DNS_MANAGER_RESOLV_CONF_MAN_NETCONFIG; + else if (nm_streq (man, "unmanaged")) + rc_manager = NM_DNS_MANAGER_RESOLV_CONF_MAN_UNMANAGED; + if (rc_manager == NM_DNS_MANAGER_RESOLV_CONF_MAN_UNKNOWN) { - _LOGW ("init: unknown resolv.conf manager '%s'", - nm_config_data_get_rc_manager (nm_config_get_data (priv->config))); - rc_manager = _get_resolv_conf_manager_default (); + if (man) { + _LOGW ("init: unknown resolv.conf manager \"%s\", fallback to \"%s\"", + man, ""NM_CONFIG_DEFAULT_DNS_RC_MANAGER); + } + man = ""NM_CONFIG_DEFAULT_DNS_RC_MANAGER; + rc_manager = NM_DNS_MANAGER_RESOLV_CONF_MAN_SYMLINK; + goto again; } }