misc/58272: [patch] rc.d/diskless detection, dhcp rebuild

Matt Peterson matt at peterson.org
Mon Oct 20 04:20:22 PDT 2003


>Number:         58272
>Category:       misc
>Synopsis:       [patch] rc.d/diskless detection, dhcp rebuild
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    freebsd-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          change-request
>Submitter-Id:   current-users
>Arrival-Date:   Mon Oct 20 04:20:16 PDT 2003
>Closed-Date:
>Last-Modified:
>Originator:     Matt Peterson
>Release:        FreeBSD 5.1-CURRENT i386
>Organization:
Bay Area Wireless Users Group
>Environment:
>Description:

The following patch fixes a few issues with the rc.d/diskless script:

1. Add detection based on read-only / (popular for embedded systems
which are booting from flash, not NFS/PXE/etc).

2. Require syslog & named before, since they may require a writable
/var

3. Move newalias rebuild, only if sendmail is enabled

4. Re-work DHCP domain-name & DNS to use kenv dhcp.* values (plumbed
from PXE boot loader) OR read from dhclient.leases (in the case of
r/o flash using DHCP).

Much of these tweaks are down right ugly, I welcome a more sanatized
version to be committed.  Quick glance from phk was postive, request
this PR assigned to DougB; thx!

>How-To-Repeat:
>Fix:

--- diskless.orig	Mon Oct 13 01:18:05 2003
+++ diskless	Mon Oct 20 03:59:59 2003
@@ -29,11 +29,20 @@
 
 # PROVIDE: diskless
 # REQUIRE: initdiskless rcconf mountcritlocal
-# BEFORE: addswap random
+# BEFORE: addswap random named syslogd
 # KEYWORD: FreeBSD
 
-dlv=`/sbin/sysctl -n vfs.nfs.diskless_valid 2> /dev/null`
-[ ${dlv:=0} -eq 0 ] && exit 0
+# Detect boot from flash (read-only /) or PXE (nfs /)
+### TODO: grep requires /usr, re-work to use /sbin/something?
+rootdev=`sysctl -n kern.rootdev`
+ro_test=`mount | grep $rootdev | grep read`
+
+if [ -n "$ro_test" ]; then
+ dlv="2"
+else
+ dlv=`/sbin/sysctl -n vfs.nfs.diskless_valid 2> /dev/null`
+ [ ${dlv:=0} -eq 0 ] && exit 0
+fi
 
 name="diskless2"
 
@@ -87,11 +96,15 @@
 #
 echo "+++ populate /var using /etc/mtree/BSD.var.dist"
 /usr/sbin/mtree -deU -f /etc/mtree/BSD.var.dist -p /var > /dev/null
+
+# Make sendmail happy
+#
 case ${sendmail_enable} in
 [Nn][Oo][Nn][Ee])
 	;;
 *)
 	/usr/sbin/mtree -deU -f /etc/mtree/BSD.sendmail.dist -p / > /dev/null
+	/usr/bin/newaliases
 	;;
 esac
 
@@ -104,11 +117,6 @@
 echo "+++ create lastlog"
 /usr/bin/touch /var/log/lastlog
 
-# Make sure our aliases database is uptodate, the aliases may have
-# been overriden in /conf.
-#
-/usr/bin/newaliases
-
 # XXX make sure to create one dir for each printer as requested by lpd
 #
 # If we do not have a writable /tmp, create a memory
@@ -145,23 +153,43 @@
 
 # generate our hostname
 #
-if [ -z "`hostname -s`" -a \
-    "x`/bin/kenv dhcp.host-name`" != "x" ]; then
-        hostname=`/bin/kenv dhcp.host-name`
-        hostname $hostname
-	echo "Hostname is $hostname"
-fi
-
-# if the info is available via dhcp/kenv
-# build the resolv.conf
-#
-if [ ! -e /etc/resolv.conf -a \
-    "x`/bin/kenv dhcp.domain-name-servers`" != "x" ]; then
-        echo domain `/bin/kenv dhcp.domain-name` > /etc/resolv.conf
-
-        set `/bin/kenv dhcp.domain-name-servers`
-        for ns in `IFS=','; echo $*`; do
-                echo nameserver $ns >> /etc/resolv.conf;
-        done
+if [ -z "`hostname -s`" ] ; then
+ if [ $dlv = 2 ] ; then
+  hostname="`grep 'host-name ' /var/db/dhclient.leases | \
+  sed -e 's/^.*me \"//' -e 's/\"\;$//'`"
+  kenv dhcp.host-name="$hostname"
+  echo here
+ fi
+ echo two
+ hostname "`kenv dhcp.host-name`"
+ echo "Hostname is $hostname"
+fi
+
+# populate resolv.conf with domain and name servers 
+# TODO: snarf dhclient_flags for -lf different leases file location
+#
+# writable?
+if [ -w /etc/resolv.conf -o ! -f /etc/resolv.conf ] ; then
+# domain already exist?
+ if [ -z "`grep 'domain' /etc/resolv.conf > /dev/null 2>&1`" ] ; then
+# non-PXE boot, snarf from dhclient leases file, fill in kernel enviro
+  if [ $dlv = 2 ] ; then
+   /bin/kenv dhcp.domain-name=`grep 'domain-name ' \
+   /var/db/dhclient.leases | sed -e 's/^.*me \"//' -e 's/\"\;$//'` \
+   > /dev/null 2>&1;
+  fi		
+ echo domain `/bin/kenv dhcp.domain-name` > /etc/resolv.conf
+ fi
+
+ if [ -z "`grep 'nameserver' /etc/resolv.conf > /dev/null 2>&1`" ] ; then
+  if [ $dlv = 2 ] ; then
+   /bin/kenv dhcp.domain-name-servers=`grep domain-name-servers \
+   /var/db/dhclient.leases | sed -e 's/^.*ers //' -e 's/;//'` \
+   > /dev/null 2>&1;
+  fi
+ set `/bin/kenv dhcp.domain-name-servers`
+  for ns in `IFS=','; echo $*`; do
+   echo nameserver $ns >> /etc/resolv.conf;
+  done
+ fi
 fi
-

>Release-Note:
>Audit-Trail:
>Unformatted:


More information about the freebsd-bugs mailing list