[PATCH] resolvconf support (Re: NM 0.7 Debian Lenny - strangest issue...)



On Mon, Jul 07, 2008 at 03:51:22PM -0400, Dan Williams wrote:
> On Mon, 2008-07-07 at 20:26 +0200, Michael Biebl wrote:
> > 
> > 2.) If resolvconf is installed, change NM to not manage /etc/resolv.conf 
> >   itself, but only pass the dns information to resolvconf (which then 
> > will write /etc/resolv.conf).
> > The downside is, that resolvconf might have own dns configuration. So 
> > the resulting /etc/resolv.conf might differ from what NM expects it to be.
> > 
> > I'm leaning towards 2.), but I'm open to other suggestions and comments.
> 
> I'm fine with #2 also; I'll take patches for this upstream.
> 
> But I have one question that I pointed out earlier.  If you install
> resolvconf, does that _necessarily_ imply that it is turned on?  i.e. I
> can install apache, but I don't actually have to run apache even if it's
> installed.  Does resolvconf have an on/off switch somewhere, or do you
> have to uninstall it to turn it off?


Below a first patch introducing basic resolvconf support. I decided to
not add/delete nameserver entries for individual NMIP4Config's, but
instead just add/delete _one_ config named "NetworkManager", which is
based on the merged NMIP4Config that NM uses in rewrite_resolv_conf.

The code will fall back to normal resolv.conf rewriting if
resolvconf fails. Further I guarded the new code by #ifdef
WITH_RESOLVCONF. However, I didnt add a configure flag.

Comments?


--- src/named-manager/nm-named-manager.c	2008-06-26 19:33:13 +0000
+++ src/named-manager/nm-named-manager.c	2008-07-08 10:07:08 +0000
@@ -29,25 +29,30 @@
 #include <glib.h>
 
 #include <glib/gi18n.h>
 
 #include "nm-named-manager.h"
 #include "nm-ip4-config.h"
 #include "nm-utils.h"
 #include "NetworkManagerSystem.h"
+#include "NetworkManagerUtils.h"
 
 #ifdef HAVE_SELINUX
 #include <selinux/selinux.h>
 #endif
 
 #ifndef RESOLV_CONF
 #define RESOLV_CONF "/etc/resolv.conf"
 #endif
 
+#ifndef RESOLV_CONF_PATH
+#define RESOLV_CONF_PATH "/sbin/resolvconf"
+#endif
+
 G_DEFINE_TYPE(NMNamedManager, nm_named_manager, G_TYPE_OBJECT)
 
 #define NM_NAMED_MANAGER_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), \
                                          NM_TYPE_NAMED_MANAGER, \
                                          NMNamedManagerPrivate))
 
 
 struct NMNamedManagerPrivate {
@@ -291,23 +296,51 @@ rewrite_resolv_conf (NMNamedManager *mgr
 				     g_strerror (errno));
 		}
 	}
 
 	g_free (domain);
 	g_free (searches);
 
 	if (*error == NULL) {
-		if (rename (tmp_resolv_conf, RESOLV_CONF) < 0) {
+		gboolean do_rewrite = TRUE;
+
+#ifdef WITH_RESOLVCONF
+		gint exit_code;
+		char *cmd;
+
+		// delete NM resolvconf
+		nm_spawn_process(RESOLV_CONF_PATH " -d NetworkManager");
+		cmd = g_strconcat (RESOLV_CONF_PATH " -a nm1 ",
+					 tmp_resolv_conf,
+					 NULL);
+		if(cmd)
+		  exit_code = nm_spawn_process(cmd);
+		else
+		  exit_code = 1;
+
+		if(exit_code)
+			g_warning("%s failed (%d). "
+				  "updating /etc/resolv.conf directly.",
+					  cmd,
+				  exit_code);
+		else
+			do_rewrite = FALSE;
+		g_free(cmd);
+
+#else	/* WITH_RESOLVCONF */
+		do_rewrite = TRUE;
+#endif
+		if (do_rewrite && rename (tmp_resolv_conf, RESOLV_CONF) < 0) {
 			g_set_error (error,
 				     NM_NAMED_MANAGER_ERROR,
 				     NM_NAMED_MANAGER_ERROR_SYSTEM,
 				     "Could not replace " RESOLV_CONF ": %s\n",
 				     g_strerror (errno));
-		} else {
+		} else if (do_rewrite) {
 			nm_system_update_dns ();
 		}
 	}
 
 	return *error ? FALSE : TRUE;
 }
 
 gboolean






 - Alexander



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]