[dhcp/f14/master] Add domain part of hostname to 'search' statement in resolv.conf

Jiří Popelka jpopelka at fedoraproject.org
Fri Nov 5 08:06:50 UTC 2010


commit ee317e0c655d079bf2d6bc19d4e339acdae4f2dc
Author: Jiri Popelka <jpopelka at redhat.com>
Date:   Thu Nov 4 20:05:33 2010 +0100

    Add domain part of hostname to 'search' statement in resolv.conf

 dhclient-script |   72 +++++++++++++++++++++++++++++++++++++++++++++++++++----
 dhcp.spec       |    2 +
 2 files changed, 69 insertions(+), 5 deletions(-)
---
diff --git a/dhclient-script b/dhclient-script
index 72f4103..af8b822 100755
--- a/dhclient-script
+++ b/dhclient-script
@@ -67,6 +67,51 @@ save_previous() {
     fix_context ${savefile}
 }
 
+eventually_add_hostnames_domain_to_search() {
+# For the case when hostname for this machine has a domain that is not in domain_search list
+# 1) get a hostname with `ipcalc --hostname` or `hostname`
+# 2) get the domain from this hostname
+# 3) add this domain to search line in resolv.conf if it's not already
+#    there (domain list that we have recently added there is a parameter of this function)
+# We can't do this directly when generating resolv.conf in make_resolv_conf(), because
+# we need to first save the resolv.conf with obtained values before we can call `ipcalc --hostname`.
+# See bug 637763
+    search="${1}"
+    if need_hostname; then
+        status=1
+        if [ -n "${new_ip_address}" ]; then
+            eval $(/bin/ipcalc --silent --hostname ${new_ip_address} ; echo "status=$?")
+        elif [ -n "${new_ip6_address}" ]; then
+            eval $(/bin/ipcalc --silent --hostname ${new_ip6_address} ; echo "status=$?")
+        fi
+
+        if [ ${status} -eq 0 ]; then
+            domain=$(echo $HOSTNAME | cut -s -d "." -f 2-)
+        fi
+    else
+          domain=$(hostname 2>/dev/null | cut -s -d "." -f 2-)
+    fi
+
+    if [ -n "${domain}" ] &&
+       [ ! "${domain}" = "localdomain" ] &&
+       [ ! "${domain}" = "localdomain6" ] &&
+       [ ! "${domain}" = "(none)" ] &&
+       [[ ! "${domain}" = *\ * ]]; then
+       is_in="false"
+       for s in ${search}; do
+           if [ "${s}" = "${domain}" ] ||
+              [ "${s}" = "${domain}." ]; then
+              is_in="true"
+           fi
+       done
+
+       if [ "${is_in}" = "false" ]; then
+          # Add domain name to search list (#637763)
+          sed -i -e "s/${search}/${search} ${domain}/" /etc/resolv.conf
+       fi
+    fi
+}
+
 make_resolv_conf() {
     [ "${PEERDNS}" = "no" ] && return
 
@@ -84,18 +129,23 @@ make_resolv_conf() {
         echo "; generated by /sbin/dhclient-script" > ${rscf}
 
         if [ -n "${SEARCH}" ]; then
-            echo "search ${SEARCH}" >> $rscf
+            search="${SEARCH}"
         else
             if [ -n "${new_domain_search}" ]; then
-                echo "search ${new_domain_search//\\032/ }" >> ${rscf}
+                # Remove instaces of \032 (#450042)
+                search="${new_domain_search//\\032/ }"
             elif [ -n "${new_domain_name}" ]; then
                 # Note that the DHCP 'Domain Name Option' is really just a domain
                 # name, and that this practice of using the domain name option as
                 # a search path is both nonstandard and deprecated.
-                echo "search ${new_domain_name//\\032/ }" >> ${rscf}
+                search="${new_domain_name}"
             fi
         fi
 
+        if [ -n "${search}" ]; then
+            echo "search ${search}" >> $rscf
+        fi
+
         if [ -n "${RES_OPTIONS}" ]; then
             echo "options ${RES_OPTIONS}" >> ${rscf}
         fi
@@ -107,6 +157,10 @@ make_resolv_conf() {
         change_resolv_conf ${rscf}
         rm -f ${rscf}
 
+        if [ -n "${search}" ]; then
+            eventually_add_hostnames_domain_to_search "${search}"
+        fi
+
         fix_context /etc/resolv.conf
     elif [ -n "${new_dhcp6_name_servers}" ] ||
          [ -n "${new_dhcp6_domain_search}" ]; then
@@ -115,13 +169,17 @@ make_resolv_conf() {
         echo "; generated by /sbin/dhclient-script" > ${rscf}
 
         if [ -n "${SEARCH}" ]; then
-            echo "search ${SEARCH}" >> $rscf
+            search="${SEARCH}"
         else
             if [ -n "${new_dhcp6_domain_search}" ]; then
-                echo "search ${new_dhcp6_domain_search//\\032/ }" >> ${rscf}
+                search="${new_dhcp6_domain_search//\\032/ }"
             fi
         fi
 
+        if [ -n "${search}" ]; then
+            echo "search ${search}" >> $rscf
+        fi
+
         if [ -n "${RES_OPTIONS}" ]; then
             echo "options ${RES_OPTIONS}" >> ${rscf}
         fi
@@ -133,6 +191,10 @@ make_resolv_conf() {
         change_resolv_conf ${rscf}
         rm -f ${rscf}
 
+        if [ -n "${search}" ]; then
+            eventually_add_hostnames_domain_to_search "${search}"
+        fi
+
         fix_context /etc/resolv.conf
     fi
 }
diff --git a/dhcp.spec b/dhcp.spec
index 3a86c3b..796b8ed 100644
--- a/dhcp.spec
+++ b/dhcp.spec
@@ -538,6 +538,8 @@ fi
 %changelog
 * Thu Nov 04 2010 Jiri Popelka <jpopelka at redhat.com> - 12:4.2.0-13.P1
 - 4.2.0-P1: fix for CVE-2010-3611 (#649880)
+- dhclient-script: when updating 'search' statement in resolv.conf,
+  add domain part of hostname if it's not already there (#637763)
 
 * Wed Oct 13 2010 Jiri Popelka <jpopelka at redhat.com> - 12:4.2.0-12
 - Server was ignoring client's


More information about the scm-commits mailing list