interfaces: purge unused parts of the dhclient-script #6869

Once upon a time we tried to treat this script as an external one
since it's still maintained somewhat in FreeBSD but the approach
of integration is much different so the script ends up with half
of its code not doing anything and perhaps more than it should.
Upstream fixes are also not full applicable anymore.

* Clear the writing of the host name.  The system does that.  Simply
  keep the logging aspect of it (if given).
* Remove the $ARP flush on TIMEOUT/EXPIRE as it seems misplaced.
* Remove exit_with_hooks() and is_default_interface() as these are
  tools that are not needed in our integration approach.
* While trailing TIMEOUT/EXPIRE failure case make sure to run
  newwanip in optional mode in order to pick up missing configuration.
* Copyright the changes from 2021 onwards that offer substantial
  changes to the way the script integration works or cooperates with
  the rest of the system.
* Inline the one-time use of functions.
* Remove tip-toeing around $resolvconf_enable.
* Ignore dhclient-enter-hooks.
* Remove commented-out code.
This commit is contained in:
Franco Fichtner 2023-09-28 16:33:44 +02:00
parent 2e90f1cb5b
commit b66e24c755

View File

@ -1,8 +1,6 @@
#!/bin/sh
#
# $OpenBSD: dhclient-script,v 1.6 2004/05/06 18:22:41 claudio Exp $
# $FreeBSD: src/sbin/dhclient/dhclient-script,v 1.4 2005/06/10 03:41:18 brooks Exp $
#
# Copyright (c) 2021-2023 Franco Fichtner <franco@opnsense.org>
# Copyright (c) 2003 Kenneth R Westerback <krw@openbsd.org>
#
# Permission to use, copy, modify, and distribute this software for any
@ -16,49 +14,21 @@
# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
#
#
ARP=/usr/sbin/arp
HOSTNAME=/bin/hostname
IFCONFIG='/sbin/ifconfig -n'
LOCALHOST=127.0.0.1
if [ -x /usr/bin/logger ]; then
LOGGER="/usr/bin/logger -s -p user.notice -t dhclient dhclient-script:"
else
LOGGER=echo
fi
IFCONFIG="/sbin/ifconfig -n"
LOGGER="/usr/bin/logger -s -p user.notice -t dhclient dhclient-script:"
#
# Helper functions that implement common actions.
#
check_hostname() {
current_hostname=`$HOSTNAME`
if [ -z "$current_hostname" ]; then
$LOGGER "New Hostname ($interface): $new_host_name"
$HOSTNAME $new_host_name
elif [ "$current_hostname" = "$old_host_name" -a \
"$new_host_name" != "$old_host_name" ]; then
$LOGGER "New Hostname ($interface): $new_host_name"
$HOSTNAME $new_host_name
fi
}
arp_flush() {
arp -an -i $interface | \
sed -n -e 's/^.*(\(.*\)) at .*$/arp -d \1/p' | \
sh >/dev/null 2>&1
}
delete_old_address() {
delete_old_address()
{
eval "$IFCONFIG $interface inet -alias $old_ip_address $medium"
}
add_new_address() {
add_new_address()
{
eval "$IFCONFIG $interface \
inet $new_ip_address \
netmask $new_subnet_mask \
@ -75,22 +45,23 @@ add_new_address() {
fi
}
delete_old_alias() {
delete_old_alias()
{
if [ -n "$alias_ip_address" ]; then
$IFCONFIG $interface inet -alias $alias_ip_address > /dev/null 2>&1
#route delete $alias_ip_address $LOCALHOST > /dev/null 2>&1
fi
}
add_new_alias() {
add_new_alias()
{
if [ -n "$alias_ip_address" ]; then
$IFCONFIG $interface inet alias $alias_ip_address netmask \
$alias_subnet_mask
#route add $alias_ip_address $LOCALHOST
fi
}
fill_classless_routes() {
fill_classless_routes()
{
set $1
while [ $# -ge 5 ]; do
if [ $1 -eq 0 ]; then
@ -115,8 +86,8 @@ fill_classless_routes() {
done
}
delete_old_routes() {
#route delete "$old_ip_address" $LOCALHOST >/dev/null 2>&1
delete_old_routes()
{
if [ -n "$old_classless_routes" ]; then
fill_classless_routes "$old_classless_routes"
set $classless_routes
@ -127,13 +98,6 @@ delete_old_routes() {
return 0;
fi
# If we supported multiple default routes, we'd be removing each
# one here. We don't so just delete the default route if it's
# through our interface.
#if is_default_interface; then
#route delete default >/dev/null 2>&1
#fi
if [ -n "$old_static_routes" ]; then
set $old_static_routes
while [ $# -gt 1 ]; do
@ -144,12 +108,13 @@ delete_old_routes() {
/usr/local/sbin/ifctl -i ${interface} -4rd
arp_flush
arp -an -i $interface | \
sed -n -e 's/^.*(\(.*\)) at .*$/arp -d \1/p' | \
sh >/dev/null 2>&1
}
add_new_routes() {
#route add $new_ip_address $LOCALHOST >/dev/null 2>&1
add_new_routes()
{
# RFC 3442: If the DHCP server returns both a Classless Static
# Routes option and a Router option, the DHCP client MUST ignore
# the Router option.
@ -195,7 +160,8 @@ add_new_routes() {
fi
}
add_new_resolv_conf() {
add_new_resolv_conf()
{
$LOGGER "Creating resolv.conf"
ARGS="-i ${interface} -4nd"
@ -209,58 +175,10 @@ add_new_resolv_conf() {
return 0
}
# Must be used on exit. Invokes the local dhcp client exit hooks, if any.
exit_with_hooks() {
exit_status=$1
if [ -f /etc/dhclient-exit-hooks ]; then
. /etc/dhclient-exit-hooks
fi
# probably should do something with exit status of the local script
exit $exit_status
}
# Get the interface with the current ipv4 default route on it using only
# commands that are available prior to /usr being mounted.
is_default_interface()
{
routeget="`route -n get -inet default`"
oldifs="$IFS"
IFS="
"
defif=
for line in $routeget ; do
case $line in
*interface:*)
defif=${line##*: }
;;
esac
done
IFS=${oldifs}
if [ -z "$defif" -o "$defif" = "$interface" ]; then
return 0
else
return 1
fi
}
#
# Start of active code.
#
# Invoke the local dhcp client enter hooks, if they exist.
if [ -f /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 $exit_status
fi
fi
: ${resolvconf_enable="NO"}
$LOGGER "Reason $reason on $interface executing"
case $reason in
@ -280,7 +198,10 @@ ARPCHECK|ARPSEND)
;;
BOUND|RENEW|REBIND|REBOOT)
check_hostname
if [ -n "$new_host_name" ]; then
$LOGGER "New Hostname ($interface): $new_host_name"
fi
changes="no"
if [ -n "$old_ip_address" ]; then
if [ -n "$alias_ip_address" -a "$old_ip_address" != "$alias_ip_address" ]; then
@ -305,9 +226,7 @@ BOUND|RENEW|REBIND|REBOOT)
add_new_alias
changes="yes"
fi
#if is_default_interface; then
add_new_resolv_conf
#fi
add_new_resolv_conf
if [ "$changes" = "yes" ] ; then
/usr/local/sbin/configctl -d interface newip $interface force
fi
@ -319,24 +238,7 @@ EXPIRE|FAIL)
delete_old_address
delete_old_routes
fi
if [ -x $ARP ]; then
$ARP -d -a -i $interface
fi
# XXX Why add alias we just deleted above?
add_new_alias
if is_default_interface; then
case $resolvconf_enable in
# "no", "false", "off", or "0"
[Nn][Oo]|[Ff][Aa][Ll][Ss][Ee]|[Oo][Ff][Ff]|0)
if [ -f /etc/resolv.conf.save ]; then
cat /etc/resolv.conf.save > /etc/resolv.conf
fi
;;
*)
/sbin/resolvconf -d ${interface}
;;
esac
fi
;;
TIMEOUT)
@ -352,16 +254,15 @@ TIMEOUT)
fi
add_new_routes
add_new_resolv_conf
#if ! is_default_interface; then
/usr/local/sbin/configctl -d interface newip $interface force
exit_with_hooks 0
#fi
/usr/local/sbin/configctl -d interface newip $interface force
exit 0
fi
fi
eval "$IFCONFIG $interface inet -alias $new_ip_address $medium"
delete_old_routes
exit_with_hooks 1
/usr/local/sbin/configctl -d interface newip $interface
exit 1
;;
esac
exit_with_hooks 0
exit 0