This made me go nuts for a long time. As soon as you have two interfaces
running dhclient those two will start fighting over /etc/resolv.conf
which is realy bad when short lease times are used and one interface is
not getting new leases.

This diff extends the dhclient-script in such a way that dhclient will
only restore the "old" resolv.conf file if it actually is in charge of the
current file. With this the fighting does not stop but is less
noticable.
-- 
:wq Claudio


Index: dhclient-script
===================================================================
RCS file: /cvs/src/sbin/dhclient/dhclient-script,v
retrieving revision 1.17
diff -u -p -r1.17 dhclient-script
--- dhclient-script     2 Jun 2010 09:57:16 -0000       1.17
+++ dhclient-script     4 Nov 2010 11:18:59 -0000
@@ -111,21 +111,21 @@ add_new_resolv_conf() {
        # $new_domain_name are provided. As reported in PR#3135, some ISPs
        # provide only $new_domain_name_servers.
 
-       rm -f /etc/resolv.conf.std
+       rm -f /etc/resolv.conf.$interface.std
 
        if [ -n "$new_domain_name" ]; then
-               echo "search $new_domain_name" >>/etc/resolv.conf.std
+               echo "search $new_domain_name" >>/etc/resolv.conf.$interface.std
        fi
 
        if [ -n "$new_domain_name_servers" ]; then
                for nameserver in $new_domain_name_servers; do
-                       echo "nameserver $nameserver" >>/etc/resolv.conf.std
+                       echo "nameserver $nameserver" 
>>/etc/resolv.conf.$interface.std
                done
        fi
 
-       if [ -f /etc/resolv.conf.std ]; then
+       if [ -f /etc/resolv.conf.$interface.std ]; then
                if [ -f /etc/resolv.conf.tail ]; then
-                       cat /etc/resolv.conf.tail >>/etc/resolv.conf.std
+                       cat /etc/resolv.conf.tail 
>>/etc/resolv.conf.$interface.std
                fi
 
                # In case (e.g. during OpenBSD installs) /etc/resolv.conf
@@ -133,10 +133,9 @@ add_new_resolv_conf() {
                # the new data in the correct location.
 
                if [ -f /etc/resolv.conf ]; then
-                       cat /etc/resolv.conf > /etc/resolv.conf.save
+                       cat /etc/resolv.conf > /etc/resolv.conf.$interface.save
                fi
-               cat /etc/resolv.conf.std > /etc/resolv.conf
-               rm -f /etc/resolv.conf.std
+               cat /etc/resolv.conf.$interface.std > /etc/resolv.conf
 
                # Try to ensure correct ownership and permissions.
                chown -RL root:wheel /etc/resolv.conf
@@ -152,21 +151,21 @@ ip6_add_new_resolv_conf() {
        # Create resolv.conf when either $new_dhcp6_name_servers or
        # $new_dhcp6_domain_search are provided.
 
-       rm -f /etc/resolv.conf.std6
+       rm -f /etc/resolv.conf.$interface.std6
 
        if [ -n "$new_dhcp6_domain_search" ]; then
-               echo "search $new_dhcp6_domain_search" >>/etc/resolv.conf.std6
+               echo "search $new_dhcp6_domain_search" 
>>/etc/resolv.conf.$interface.std6
        fi
 
        if [ -n "$new_dhcp6_name_servers" ]; then
                for nameserver in $new_dhcp6_name_servers; do
-                       echo "nameserver $nameserver" >>/etc/resolv.conf.std6
+                       echo "nameserver $nameserver" 
>>/etc/resolv.conf.$interface.std6
                done
        fi
 
-       if [ -f /etc/resolv.conf.std6 ]; then
+       if [ -f /etc/resolv.conf.$interface.std6 ]; then
                if [ -f /etc/resolv.conf.tail ]; then
-                       cat /etc/resolv.conf.tail >>/etc/resolv.conf.std6
+                       cat /etc/resolv.conf.tail 
>>/etc/resolv.conf.$interface.std6
                fi
 
                # In case (e.g. during OpenBSD installs) /etc/resolv.conf
@@ -174,10 +173,9 @@ ip6_add_new_resolv_conf() {
                # the new data in the correct location.
 
                if [ -f /etc/resolv.conf ]; then
-                       cat /etc/resolv.conf > /etc/resolv.conf.save
+                       cat /etc/resolv.conf > /etc/resolv.conf.$interface.save
                fi
-               cat /etc/resolv.conf.std6 > /etc/resolv.conf
-               rm -f /etc/resolv.conf.std6
+               cat /etc/resolv.conf.$interface.std6 > /etc/resolv.conf
 
                # Try to ensure correct ownership and permissions.
                chown -RL root:wheel /etc/resolv.conf
@@ -256,8 +254,13 @@ EXPIRE|FAIL)
        fi
        # XXX Why add alias we just deleted above?
        add_new_alias
-       if [ -f /etc/resolv.conf.save ]; then
-               cat /etc/resolv.conf.save > /etc/resolv.conf
+       if [ -f /etc/resolv.conf.$interface.std ]; then
+               cmp -s /etc/resolv.conf /etc/resolv.conf.$interface.std
+               if [ $? -eq 0 -a -f /etc/resolv.conf.$interface.save ]; then
+                       cat /etc/resolv.conf.$interface.save > /etc/resolv.conf
+               fi
+               rm -f /etc/resolv.conf.$interface.save
+               rm -f /etc/resolv.conf.$interface.std
        fi
        ;;

Reply via email to