From b66e24c755ffbb380a243aebb8b7dbd59851bef8 Mon Sep 17 00:00:00 2001 From: Franco Fichtner Date: Thu, 28 Sep 2023 16:33:44 +0200 Subject: [PATCH] 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. --- .../scripts/interfaces/dhclient-script | 163 ++++-------------- 1 file changed, 32 insertions(+), 131 deletions(-) diff --git a/src/opnsense/scripts/interfaces/dhclient-script b/src/opnsense/scripts/interfaces/dhclient-script index 4d49bb49b..1883096c1 100755 --- a/src/opnsense/scripts/interfaces/dhclient-script +++ b/src/opnsense/scripts/interfaces/dhclient-script @@ -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 # Copyright (c) 2003 Kenneth R Westerback # # 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