Date: Thu, 18 May 2000 13:40:03 -0700 (PDT) From: Brooks Davis <brooks@one-eyed-alien.net> To: freebsd-bugs@FreeBSD.org Subject: Re: conf/18583: [PATCH] DHCP should be able to override hostname. Message-ID: <200005182040.NAA65448@freefall.freebsd.org>
next in thread | raw e-mail | index | archive | help
The following reply was made to PR conf/18583; it has been noted by GNATS.
From: Brooks Davis <brooks@one-eyed-alien.net>
To: "David O'Brien" <obrien@FreeBSD.org>
Cc: Brooks Davis <brooks@one-eyed-alien.net>,
Sheldon Hearn <sheldonh@uunet.co.za>,
FreeBSD-gnats-submit@FreeBSD.org
Subject: Re: conf/18583: [PATCH] DHCP should be able to override hostname.
Date: Thu, 18 May 2000 13:31:41 -0700
On Tue, May 16, 2000 at 02:19:03PM -0700, David O'Brien wrote:
> On Tue, May 16, 2000 at 02:06:44PM -0700, Brooks Davis wrote:
> > I'll try a re-write of the dhclient-script with an eye towards that
> > degree of flexability under a more friendly license.
>
> Cool.
Here is is. It looks similar to the on in the other PR because I took
some ideas from it, but it's a new rewrite. It seems to work in general
and it has been running on my laptop since last night. It does want to
/etc/defaults/rc.conf and /etc/rc.network portions of my previous patch
with it, but I believe it will work without them.
-- Brooks
--
Any statement of the form "X is the one, true Y" is FALSE.
#!/bin/sh
#############################################################################
# Copyright (c) 2000 Brooks Davis <brooks@one-eyed-alien.net>
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
# SUCH DAMAGE.
#
#############################################################################
# Many of the ideas behind this file are based on a version submitted as
# pr bin/15342 by Patrick Bihan-Faou, patrick@mindstep.com. The actual
# file is a # complete rewrite derived from FreeBSD's v1.9. This should
# be almost identical in function to v1.9 except for the support for
# the default_hostname variable to allow proper disconnected operation.
#############################################################################
# Use logger(1) if it's available
#
if [ -x /usr/bin/logger ]; then
LOGGER="/usr/bin/logger -s -p user.notice -t dhclient"
else
LOGGER=echo
fi
# These functions are to be overridden as necessicary in the optional
# /etc/dhclient-enter-hooks file. The pre_state_*_hook functions are
# called before the (non-overable) if_state_* functions which are
# followed by calls to the post_state_*_functions.
#
pre_state_ARPCHECK_hook() { }
pre_state_APRSEND_hook() { }
pre_state_BOUND_hook() { }
pre_state_EXPIRE_hook() { }
pre_state_FAIL_hook() { }
pre_state_MEDIUM_hook() { }
pre_state_PREINIT_hook() { }
pre_state_REBIND_hook() { }
pre_state_REBOOT_hook() { }
pre_state_RENEW_hook() { }
pre_state_TIMEOUT_hook() { }
post_state_ARPCHECK_hook() { }
post_state_APRSEND_hook() { }
post_state_BOUND_hook() { }
post_state_EXPIRE_hook() { }
post_state_FAIL_hook() { }
post_state_MEDIUM_hook() { }
post_state_PREINIT_hook() { }
post_state_REBIND_hook() { }
post_state_REBOOT_hook() { }
post_state_RENEW_hook() { }
post_state_TIMEOUT_hook() { }
# The make_resolv_conf() function may be overridden as well.
#
make_resolv_conf() {
echo search $new_domain_name >/etc/resolv.conf
for nameserver in $new_domain_name_servers; do
echo nameserver $nameserver >>/etc/resolv.conf
done
}
# This must be used on exit to allow any exit hooks to be called.
#
exit_with_hooks() {
exit_status=$1
if [ -x /etc/dhclient-exit-hooks ]; then
. /etc/dhclient-exit-hooks
fi
exit $exit_status
}
# This function does the overriding of functions. If the local script
# wishes to, it may abort processing of this state. The local script
# must set exit_status to a nonzero value to do so.
#
enter_with_hooks() {
if [ -x /etc/dhclient-enter-hooks ]; then
exit_status=0
. /etc/dhclient-enter-hooks
# allow the local script to abort processing of this state
# local script must set exit_status variable to nonzero.
if [ $exit_status -ne 0 ]; then
exit_with_hooks $exit_status
fi
fi
}
# This function prints any important changes in network config.
#
print_net_changes() {
if [ -n "$new_host_name" ]; then
$LOGGER "New Hostname: $new_host_name"
fi
if [ -n "$new_ip_address" ]; then
$LOGGER "New IP Address ($interface): $new_ip_address"
fi
if [ -n "$new_subnet_mask" ]; then
$LOGGER "New Subnet Mask ($interface): $new_subnet_mask"
fi
if [ -n "$new_broadcast_address" ]; then
$LOGGER "New Broadcast Address ($interface): $new_broadcast_address"
fi
if [ -n "$new_routers" ]; then
$LOGGER "New Routers: $new_routers"
fi
if [ -n "$new_static_routes" ]; then
$LOGGER "New Static Routes: $new_static_routes"
fi
}
# Utility functions.
#
add_route() {
route add $1 $2 > /dev/null 2>&1
}
delete_route() {
route delete $1 $2 > /dev/null 2>&1
}
add_routers() {
eval routers="\$${1}_routers"
for router in $routers; do
add_route default $router
done
}
delete_routers() {
eval routers="\$${1}_routers"
for router in $routers; do
delete_route default $router
done
}
add_static_routes() {
eval static_routes="\$${1}_static_routes"
set "$static_routes"
while [ $# -gt 1 ]; do
add_route $1 $2
shift; shift
done
}
delete_static_routes() {
eval static_routes="\$${1}_static_routes"
set "$static_routes"
while [ $# -gt 1 ]; do
delete_route $1 $2
shift; shift
done
}
config_ip_address() {
eval address="\$${1}_ip_address"
eval netmask="\$${1}_subnet_mask"
eval broadcast="\$${1}_broadcast_address"
if [ -n "$address" ]; then
ifconfig $interface inet $address netmask $netmask \
broadcast $broadcast $medium
fi
}
delete_ip_address() {
eval address="\$${1}_ip_address"
if [ -n "$address" ]; then
ifconfig inet delete $address $medium
fi
}
clear_arp_table() {
arp -d -a
}
get_rc_conf_var() {
(
if [ -r /etc/defaults/rc.conf ]; then
. /etc/defaults/rc.conf
source_rc_confs
elif [ -r /etc/rc.conf ]; then
. /etc/rc.conf
fi
eval echo \$${1}
)
}
set_hostname() {
current_hostname=`hostname`
if [ "$current_hostname" = "`get_rc_conf_var default_hostname`" ] || \
[ "$current_hostname" = "$old_host_name" ]; then
if [ "$new_host_name" != "$old_host_name" ] && \
[ -n "$new_host_name" ]; then
hostname $new_host_name
fi
fi
}
config_alias() {
if [ -n "$alias_ip_address" ]; then
ifconfig $interface inet $alias_ip_address \
netmask $alias_subnet_mask
fi
}
delete_alias() {
if [ -n "$alias_ip_address" ]; then
delete_ip_address alias
delete_route $alias_ip_address 127.0.0.1
fi
}
test_lease() {
if [ -n "$new_routers" ]; then
config_ip_address new
set $new_routers
if ping -q -c $1; then
rval=0
else
rval=1
fi
delete_ip_address new
else
rval=1
fi
return $rval
}
config_new() {
config_ip_address new
if [ "$alias_ip_address" != "$new_ip_address" ]; then
config_alias
fi
add_routers new
add_static_routes new
make_resolv_conf
}
delete_old() {
delete_ip_address old
delete_routers old
delete_static_routes old
clear_arp_table
}
# in_state_* functions. These should not be overridden in the hooks files.
#
in_state_ARPCHECK() {
exit_status=0
}
in_state_APRSEND() {
exit_status=0;
}
in_state_BOUND() {
set_hostname
if [ "$alias_ip_address" != "$old_ip_address" ]; then
delete_alias
fi
if [ -n "$old_ip_address" ] && \
[ "$old_ip_address" != "$new_ip_address" ]; then
delete_old
fi
config_new
exit_status=0
}
in_state_EXPIRE() {
if_state_FAIL
}
in_state_FAIL() {
delete_alias
delete_old
config_alias
exit_status=0
}
in_state_MEDIUM() {
ifconfig $interface $medium
ifconfig $interface inet delete 0.0.0.0 $medium >/dev/null 2>&1
sleep 1
exit_status=0
}
in_state_PREINIT() {
delete_alias
ifconfig $interface inet 0.0.0.0 netmask 0.0.0.0 \
broadcast 255.255.255.255 up
exit_status=0
}
in_state_REBIND() {
set_hostname
if [ "$alias_ip_address" != "$old_ip_address" ]; then
delete_alias
fi
if [ "$old_ip_address" != "$new_ip_address" ]; then
delete_old
config_new
fi
exit_status=0
}
in_state_REBOOT() {
in_state_BOUND
}
in_state_RENEW() {
in_state_REBIND
}
in_state_TIMEOUT() {
delete_alias
if test_lease; then
config_new
exit_status=0
else
delete_old
config_alias
exit_status=1
fi
}
# Actually do something
#
enter_with_hooks
print_net_changes
pre_state_${reason}_hook
in_state_${reason}
post_state_${reason}_hook
exit_with_hooks $exit_status
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-bugs" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200005182040.NAA65448>
