[RFC] Automated generation of /etc/resolv.conf from the rc.d script

From: Eygene Ryabinkin <rea-fbsd_at_codelabs.ru>
Date: Fri, 14 Dec 2007 12:47:51 +0300
Good day.

I happened to use my notebook in the variety of the networks and
some of them have no DHCP servers.  So I had made my network settings
in the /etc/rc.conf to be conditional.  But there is one bit that
I am missing with the current /etc/rc.d scripts: automated construction
of /etc/resolv.conf basing on the variables from /etc/rc.conf.

I know that just now I can achieve my needs by doing something like
-----
rm -f /etc/resolv.conf
kenv dhcp.domain-name-servers="IP1,IP2,IP3"
kenv dhcp.domain-name="domain"
-----
but the use of variables in /etc/rc.conf sounds a bit better to me.
After all, dhcp.* values belong to the DHCP data, so playing with
kenv looks like a hack.

Below is the patch that adds two variables that are recognized by
/etc/rc.d/resolv: resolv_domain and resolv_nameservers.  If any of
two has some value, then /etc/resolv.conf will be built from scratch.
Values from kenv take higher precedence, so the default behaviour
is not changed.

Can this modification hit the tree, or it is completely unneeded,
or it should be reworked?  Any comments?

The patch follows.
-----
--- resolv.orig	2007-12-13 11:57:17.000000000 +0300
+++ resolv	2007-12-13 11:57:17.000000000 +0300
_at__at_ -37,6 +37,23 _at__at_
 
 load_rc_config $name
 
+# Helper that echoes the contents of the resolv.conf to the stdout.
+# Arguments:
+# 1. domain name,
+# 2. list of name servers separated by ','.
+# Either argument can be empty.  If so, it won't be included to the output.
+
+build_resolv () {
+	if [ -n "$1" ]; then
+		echo domain "$1" > /etc/resolv.conf
+	fi
+
+	set -- "$2"
+	for ns in `IFS=','; echo $*`; do
+		echo nameserver $ns >> /etc/resolv.conf;
+	done
+}
+
 # if the info is available via dhcp/kenv
 # build the resolv.conf
 #
_at__at_ -44,13 +61,13 _at__at_
     -n "`/bin/kenv dhcp.domain-name-servers 2> /dev/null`" ]; then
 	> /etc/resolv.conf
 
-	if [ -n "`/bin/kenv dhcp.domain-name 2> /dev/null`" ]; then
-		echo domain `/bin/kenv dhcp.domain-name` > /etc/resolv.conf
-	fi
+	build_resolv \
+	    "`/bin/kenv dhcp.domain-name 2> /dev/null`" \
+	    "`/bin/kenv dhcp.domain-name-servers`"
+elif [ -n "${resolv_domain}" -o -n "${resolv_nameservers}" ]; then
+	> /etc/resolv.conf
 
-	set -- `/bin/kenv dhcp.domain-name-servers`
-	for ns in `IFS=','; echo $*`; do
-		echo nameserver $ns >> /etc/resolv.conf;
-	done
+	build_resolv \
+	    "${resolv_domain}" "${resolv_nameservers}"
 fi
 
-----
-- 
Eygene
Received on Fri Dec 14 2007 - 08:47:55 UTC

This archive was generated by hypermail 2.4.0 : Wed May 19 2021 - 11:39:24 UTC