Date: 20 Oct 2003 04:10:02 -0700 From: Matt Peterson <matt@peterson.org> To: FreeBSD-gnats-submit@FreeBSD.org Cc: phk@FreeBSD.org Subject: misc/58272: [patch] rc.d/diskless detection, dhcp rebuild Message-ID: <20031020111002.69371.qmail@mail.forko.com> Resent-Message-ID: <200310201120.h9KBKJAQ035197@freefall.freebsd.org>
next in thread | raw e-mail | index | archive | help
>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:
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20031020111002.69371.qmail>