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