diff --git a/ChangeLog b/ChangeLog index b9b338ca8..8fa2377fc 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,17 @@ +2006-02-28 Robert Love + + * src/NetworkManagerSystem.h: Add nm_system_should_modify_resolv_conf. + * src/backends/NetworkManagerSuSE.c: Implement the interface + nm_system_should_modify_resolv_conf() for SUSE. + * src/backends/NetworkManagerDebian.c, + src/backends/NetworkManagerGentoo.c, + src/backends/NetworkManagerRedHat.c, + src/backends/NetworkManagerSlackware.c: Add stub. + * src/named-manager/Makefile.am: Grab includes from src. + * src/named-manager/nm-named-manager.c: Allow backends to disable the + automatic updating of resolv.conf. This is useful for testing, + broken static configurations, and administrator lock-down. + 2006-02-28 Dan Williams * src/nm-device-802-11-wireless.c diff --git a/src/NetworkManagerSystem.h b/src/NetworkManagerSystem.h index 9b66e03a6..e6f3f80dd 100644 --- a/src/NetworkManagerSystem.h +++ b/src/NetworkManagerSystem.h @@ -81,4 +81,6 @@ void nm_system_set_hostname (NMIP4Config *config); void nm_system_activate_nis (NMIP4Config *config); void nm_system_shutdown_nis (void); +gboolean nm_system_should_modify_resolv_conf (void); + #endif diff --git a/src/backends/NetworkManagerDebian.c b/src/backends/NetworkManagerDebian.c index 569a67749..db90fad3d 100644 --- a/src/backends/NetworkManagerDebian.c +++ b/src/backends/NetworkManagerDebian.c @@ -672,3 +672,12 @@ void nm_system_set_hostname (NMIP4Config *config) { } +/* + * nm_system_should_modify_resolv_conf + * + * Can NM update resolv.conf, or is it locked down? + */ +gboolean nm_system_should_modify_resolv_conf (void) +{ + return TRUE; +} diff --git a/src/backends/NetworkManagerGentoo.c b/src/backends/NetworkManagerGentoo.c index 0e3acbab5..c77855b56 100644 --- a/src/backends/NetworkManagerGentoo.c +++ b/src/backends/NetworkManagerGentoo.c @@ -574,3 +574,12 @@ void nm_system_set_hostname (NMIP4Config *config) { } +/* + * nm_system_should_modify_resolv_conf + * + * Can NM update resolv.conf, or is it locked down? + */ +gboolean nm_system_should_modify_resolv_conf (void) +{ + return TRUE; +} diff --git a/src/backends/NetworkManagerRedHat.c b/src/backends/NetworkManagerRedHat.c index 5d267b3bf..2676ca51f 100644 --- a/src/backends/NetworkManagerRedHat.c +++ b/src/backends/NetworkManagerRedHat.c @@ -920,3 +920,13 @@ void nm_system_set_hostname (NMIP4Config *config) { } + +/* + * nm_system_should_modify_resolv_conf + * + * Can NM update resolv.conf, or is it locked down? + */ +gboolean nm_system_should_modify_resolv_conf (void) +{ + return TRUE; +} diff --git a/src/backends/NetworkManagerSlackware.c b/src/backends/NetworkManagerSlackware.c index 915a8679e..91dbb0aa8 100644 --- a/src/backends/NetworkManagerSlackware.c +++ b/src/backends/NetworkManagerSlackware.c @@ -414,3 +414,12 @@ void nm_system_set_hostname (NMIP4Config *config) { } +/* + * nm_system_should_modify_resolv_conf + * + * Can NM update resolv.conf, or is it locked down? + */ +gboolean nm_system_should_modify_resolv_conf (void) +{ + return TRUE; +} diff --git a/src/backends/NetworkManagerSuSE.c b/src/backends/NetworkManagerSuSE.c index 42a86f1d6..43cc79e63 100644 --- a/src/backends/NetworkManagerSuSE.c +++ b/src/backends/NetworkManagerSuSE.c @@ -337,12 +337,12 @@ void nm_system_device_add_ip6_link_address (NMDevice *dev) } -typedef struct SuSESystemConfigData +typedef struct SuSEDeviceConfigData { NMIP4Config * config; gboolean use_dhcp; gboolean system_disabled; -} SuSESystemConfigData; +} SuSEDeviceConfigData; /* * set_ip4_config_from_resolv_conf @@ -435,7 +435,7 @@ void *nm_system_device_get_system_config (NMDevice *dev) struct stat statbuf; shvarFile *file; char *buf = NULL; - SuSESystemConfigData *sys_data = NULL; + SuSEDeviceConfigData *sys_data = NULL; struct ether_addr hw_addr; FILE *f = NULL; char buffer[512]; @@ -446,7 +446,7 @@ void *nm_system_device_get_system_config (NMDevice *dev) g_return_val_if_fail (dev != NULL, NULL); - sys_data = g_malloc0 (sizeof (SuSESystemConfigData)); + sys_data = g_malloc0 (sizeof (SuSEDeviceConfigData)); sys_data->use_dhcp = TRUE; if (nm_device_is_802_3_ethernet (dev)) @@ -643,7 +643,7 @@ out: */ void nm_system_device_free_system_config (NMDevice *dev, void *system_config_data) { - SuSESystemConfigData *sys_data = (SuSESystemConfigData *)system_config_data; + SuSEDeviceConfigData *sys_data = (SuSEDeviceConfigData *)system_config_data; g_return_if_fail (dev != NULL); @@ -664,7 +664,7 @@ void nm_system_device_free_system_config (NMDevice *dev, void *system_config_dat */ gboolean nm_system_device_get_use_dhcp (NMDevice *dev) { - SuSESystemConfigData *sys_data; + SuSEDeviceConfigData *sys_data; g_return_val_if_fail (dev != NULL, FALSE); @@ -683,7 +683,7 @@ gboolean nm_system_device_get_use_dhcp (NMDevice *dev) */ gboolean nm_system_device_get_disabled (NMDevice *dev) { - SuSESystemConfigData *sys_data; + SuSEDeviceConfigData *sys_data; g_return_val_if_fail (dev != NULL, FALSE); @@ -697,7 +697,7 @@ gboolean nm_system_device_get_disabled (NMDevice *dev) NMIP4Config *nm_system_device_new_ip4_system_config (NMDevice *dev) { - SuSESystemConfigData *sys_data; + SuSEDeviceConfigData *sys_data; NMIP4Config *new_config = NULL; g_return_val_if_fail (dev != NULL, NULL); @@ -1080,3 +1080,36 @@ out_close: out_gfree: g_free (filename); } + +/* + * nm_system_should_modify_resolv_conf + * + * Can NM update resolv.conf, or is it locked down? + */ +gboolean nm_system_should_modify_resolv_conf (void) +{ + char *name, *buf; + shvarFile *file; + gboolean ret = TRUE; + + name = g_strdup_printf (SYSCONFDIR"/sysconfig/network/config"); + file = svNewFile (name); + if (!file) + goto out_gfree; + + buf = svGetValue (file, "MODIFY_RESOLV_CONF_DYNAMICALLY"); + if (!buf) + goto out_close; + + if (strcmp (buf, "no") == 0) + ret = FALSE; + + free (buf); +out_close: + svCloseFile (file); +out_gfree: + g_free (name); + + return ret; +} + diff --git a/src/named-manager/Makefile.am b/src/named-manager/Makefile.am index e0326fb6d..cf099199b 100644 --- a/src/named-manager/Makefile.am +++ b/src/named-manager/Makefile.am @@ -1,4 +1,4 @@ -INCLUDES = -I${top_srcdir}/utils -I${top_srcdir}/src +INCLUDES = -I${top_srcdir}/utils -I${top_srcdir}/src -I${top_srcdir}/include noinst_LTLIBRARIES = libnamed-manager.la diff --git a/src/named-manager/nm-named-manager.c b/src/named-manager/nm-named-manager.c index 3a5dcbe0d..8b3755076 100644 --- a/src/named-manager/nm-named-manager.c +++ b/src/named-manager/nm-named-manager.c @@ -21,6 +21,7 @@ #include "config.h" #include "nm-named-manager.h" + #include #include #include @@ -34,8 +35,10 @@ #include #include #include + #include "nm-ip4-config.h" #include "nm-utils.h" +#include "NetworkManagerSystem.h" #ifdef HAVE_SELINUX #include @@ -51,10 +54,6 @@ #define NAMED_DBUS_PATH "/com/redhat/named" #endif - -/* From NetworkManagerSystem.h/.c */ -void nm_system_update_dns (void); - enum { PROP_0, @@ -358,6 +357,13 @@ rewrite_resolv_conf (NMNamedManager *mgr, NMIP4Config *config, GError **error) if (!config) return TRUE; + /* If the sysadmin disabled modifying resolv.conf, exit silently */ + if (!nm_system_should_modify_resolv_conf ()) + { + nm_info ("DHCP returned name servers but system has disabled dynamic modification!"); + return TRUE; + } + if ((f = fopen (tmp_resolv_conf, "w")) == NULL) goto lose;